なんらかの不可解な理由により、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"
}
}