4

なんらかの不可解な理由により、Google は appengine 用のスタックドライバー API を提供していないため、実装に行き詰まっています。心配いりません - 私は思っていました - 私はすでに API ビルダーを使って bigquery と通信しているので、クライアントを構築してイベントを送信しようとしました:

credentials = SignedJwtAssertionCredentials(STACKDRIVER_AUTH_GOOGLE_CLIENT_EMAIL,
                                            STACKDRIVER_AUTH_GOOGLE_PRIVATE_KEY,
                                            scope='https://www.googleapis.com/auth/trace.append')

http = httplib2.Http()
credentials.refresh(http) #Working around an oauth2client bug
credentials = credentials.authorize(http)
service = build('cloudtrace', 'v1', http=http)
batch = service.new_batch_http_request()
batch.add(service.projects().patchTraces(
        body=traces_json,
        projectId=STACKDRIVER_AUTH_GOOGLE_PROJECT_ID))
print batch.execute()

何を送信しても、サービスは常にエラーで応答するため、 traces_json の定義を省略しました。traces_json = '{}' の場合:

{u'error': {u'code': 400,
            u'errors': [{u'domain': u'global',
                         u'message': u'Invalid value at \'traces\' (type.googleapis.com/google.devtools.cloudtrace.v1.Traces), "{}"',
                         u'reason': u'badRequest'}],
            u'message': u'Invalid value at \'traces\' (type.googleapis.com/google.devtools.cloudtrace.v1.Traces), "{}"',
            u'status': u'INVALID_ARGUMENT'}}

しかし、Google のドキュメントから作成した body を使用しても、同じエラーが発生します。

これを試みているマシンでパケット スニファーを実行していますが、実際に googleapis.com と通信していることはほとんどありません。

問題は、実際に、スタックドライバーにイベントを送信するために何が欠けているのかということです。

アップデート

これは私が取り組んできたものの最新の反復ですが、Googleドキュメントの例をそのまま使用しても(プロジェクトIDの変更を除いて)同じ結果が得られます。

{
    "traces": [
        {
            "projectId": "projectname",
            "traceId": "1234123412341234aaaabb3412347890",
            "spans": [
                {
                    "kind": "RPC_SERVER",
                    "name": "trace_name",
                    "labels": {"label1": "value1", "label2": "value2"},
                    "spanId": "spanId1",
                    "startTime": "2016-06-01T05:01:23.045123456Z",
                    "endTime": "2016-06-01T05:01:23.945123456Z",
                },
            ],
        },
    ],
}

それに付随するエラーメッセージ:

{u'error': {u'code': 400,
            u'errors': [{u'domain': u'global',
                         u'message': u'Invalid value at \'traces\' (type.googleapis.com/google.devtools.cloudtrace.v1.Traces), "MY ENTIRE JSON IS REPEATED HERE"',
                         u'reason': u'badRequest'}],
            u'message': u'Invalid value at \'traces\' (type.googleapis.com/google.devtools.cloudtrace.v1.Traces), "MY ENTIRE JSON IS REPEATED HERE"',
            u'status': u'INVALID_ARGUMENT'}}

2回目の更新

Explorer でこれを行うと、ほぼ同じ結果が得られます。数値の span_id に切り替える必要がありました。これは、一意の文字列である必要があるというドキュメントのステートメントにもかかわらず、他の何かを提供するたびに、64 ビット整数のように見えるものを要求するというエラーが発生するためです。

PATCH https://cloudtrace.googleapis.com/v1/projects/[number or name]/traces?key={YOUR_API_KEY}
{
 "traces": [
  {
   "projectId": "[number or name]",
   "traceId": "1234123412341234aaaabb3412347891",
   "spans": [
    {
     "kind": "RPC_SERVER",
     "name": "trace_name",
     "labels": {
      "label1": "value1"
     },
     "startTime": "2016-06-01T05:01:23.045123456Z",
     "endTime": "2016-06-01T05:01:25.045123456Z"
    },
    {
     "spanId": "0"
    }
   ]
  }
 ]
}

応答:

{
 "error": {
  "code": 400,
  "message": "Request contains an invalid argument.",
  "status": "INVALID_ARGUMENT"
 }
}

API からのトレース定義

4

1 に答える 1