在python中,与stackdriver通信总是返回success,不发送任何消息

2024-09-24 06:33:04 发布

您现在位置:Python中文网/ 问答频道 /正文

出于某种莫名其妙的原因,google没有为appengine提供stackdriver 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='{}':

^{pr2}$

但即使我使用的是googledocumentation制作的实体,我仍然会得到相同的错误。在

我在我尝试的机器上运行了一个包嗅探器,但很少看到它实际与googleapis.com网站. 在

所以问题是,真的,我缺少什么可以让我发送事件到stackdriver?在

更新

这是我最近使用的迭代,尽管逐字使用googledoc示例(除了更改项目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'}}

第二次更新

在资源管理器中执行此操作会产生大致相同的结果。我不得不切换到一个数字span峎u id,因为尽管docs声明它必须是一个唯一的字符串,但在我提供任何其他内容时,我都会遇到一些错误,即需要一个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"
 }
}

Traces definition from the API "Try It!" page


Tags: namecomauthhttpservicebatchgoogletrace
1条回答
网友
1楼 · 发布于 2024-09-24 06:33:04

问题出在你的数据格式上。你也不能发送空消息。探索如何使用API的最佳方法是转到StackDriver Trace API explorer,您将找到要发送的确切数据结构: https://cloud.google.com/trace/api/reference/rest/v1/projects/patchTraces#traces

特别注意traceId的格式。它需要像这样的32个字符的十六进制字符串:7d9d1a6e2d1f3f27484992f33d97e5cb

下面是一个工作的python示例,演示如何在github上使用StackDriver跟踪的3个方法:https://github.com/qike/cloud-trace-samples-python

复制粘贴代码如下:



def list_traces(stub, project_id):
    """Lists traces in the given project."""
    trace_id = None
    req = trace_pb2.ListTracesRequest(project_id=project_id)
    try:
        resp = stub.ListTraces(req, TIMEOUT)
        for t in resp.traces:
            trace_id = t.trace_id
            print("Trace is: {}".format(t.trace_id))
    except NetworkError, e:
        logging.warning('Failed to list traces: {}'.format(e))
        sys.exit(1)
    return trace_id


def patch_traces(stub, project_id):
    req = trace_pb2.PatchTracesRequest(project_id=project_id)
    trace_id = str(uuid.uuid1()).replace('-', '')
    now = time.time()

    trace = req.traces.traces.add()
    trace.project_id = project_id
    trace.trace_id = trace_id
    span1 = trace.spans.add()
    span1.span_id = 1
    span1.name = "/span1.{}".format(trace_id)
    span1.start_time.seconds = int(now)-10
    span1.end_time.seconds = int(now)

    span2 = trace.spans.add()
    span2.span_id = 2
    span2.name = "/span2"
    span2.start_time.seconds = int(now)-8
    span2.end_time.seconds = int(now)-5

    try:
        resp = stub.PatchTraces(req, TIMEOUT)
        print("Trace added successfully.\n"
              "To view list of traces, go to: "
              "http://console.cloud.google.com/traces/traces?project={}&tr=2\n"
              "To view this trace added, go to: "
              "http://console.cloud.google.com/traces/details/{}?project={}"
              .format(project_id, trace_id, project_id))
    except NetworkError, e:
        logging.warning('Failed to patch traces: {}'.format(e))
        sys.exit(1)


def get_trace(stub, project_id, trace_id):
    req = trace_pb2.GetTraceRequest(project_id=project_id,
                                    trace_id=trace_id)
    try:
        resp = stub.GetTrace(req, TIMEOUT)
        print("Trace retrieved: {}".format(resp))
    except NetworkError, e:
        logging.warning('Failed to get trace: {}'.format(e))
        sys.exit(1)

已更新以回答从API explorer收到的错误

由于使用的是0位的API,所以应该使用0位而不是0位的API。在

我还注意到,您设置的span斨u id与您想要的span对象位于不同的span对象中。请确保您没有错误地单击“+”符号来添加新的span对象。在

以下是我通过API explorer向我的项目发送的成功修补程序请求:

^{pr2}$

相关问题 更多 >