4

Aus unerklärlichen Gründen, Google bietet keine Stackdriver API für appengine, also bin ich fest, eine zu implementieren. Keine Sorge - ich dachte - ich habe bereits mit den API-Builder gearbeitet, um BigQuery zu sprechen, also baute ich einen Client und fing an zu versuchen, Ereignisse zu senden:In Python, Kommunikation mit Stackdriver immer Erfolg, sendet nichts

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() 

ich die Definition von traces_json weggelassen, denn egal was Ich sende, der Dienst antwortet immer mit einem Fehler. Wenn 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'}} 

Aber selbst wenn ich einen Körper verwenden, in Handarbeit aus dem Google documentation, ich immer noch die gleichen Fehler.

Ich führe einen Paket-Sniffer auf der Maschine, wo ich dies versuche, und sehe es nur sehr selten tatsächlich mit googleapis.com kommunizieren.

Also ist die Frage, wirklich, was fehlt mir das wird mich Ereignisse an Stackdriver schicken?

UPDATE

Hier ist die neueste Iteration von dem, was ich mit, gearbeitet hatte produziert das Google-Dokument Beispiel wörtlich obwohl mit (mit Ausnahme der Änderung des Projekts id) das gleiche Ergebnis.

{ 
    "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", 
       }, 
      ], 
     }, 
    ], 
} 

Und die Fehlermeldung, die mit ihm kommt:

{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'}} 

SECOND UPDATE

Dadurch im Explorer erzeugt etwa das gleiche Ergebnis. Ich musste zu einer numerischen span_id wechseln, weil ich trotz der Anweisung der Dokumentation, dass es nur eine eindeutige Zeichenkette sein muss, Fehler erhalte, wenn ich eine 64-Bit-Ganzzahl benötige, immer wenn ich etwas anderes zur Verfügung stelle.

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" 
    } 
    ] 
    } 
] 
} 

Antwort:

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

Traces definition from the API "Try It!" page

+0

Ihre Fehler zu sagen, es ist eine falsch formatierte Anfrage. Wenn Sie die [formale Definition] (https://cloud.google.com/trace/api/reference/rest/v1/projects/patchTraces#traces) der JSON-Anfrage betrachten, gibt es Einschränkungen für die Daten, die Sie als Stichprobe verwenden verknüpft mit erfüllt nicht. Haben Sie versucht, Werte festzulegen, die exakt der Spezifikation entsprechen? Wenn ja, wie sieht Ihre Anfrage aus und welcher Fehler ist aufgetreten? –

Antwort

2

Das Problem ist in dem Format Ihrer Daten. Sie können auch keine leeren Nachrichten senden. Der beste Weg, um herauszufinden, wie die API zu verwenden, ist auf den Stackdriver Trace-API-Explorer zu gehen, werden Sie die genaue Datenstruktur herauszufinden senden: https://cloud.google.com/trace/api/reference/rest/v1/projects/patchTraces#traces

Achten Sie besonders auf das Format von traceid.Es braucht 32 Zeichen Hex-String so sein: 7d9d1a6e2d1f3f27484992f33d97e5cb

Hier ist ein Arbeits Python Beispiel zu zeigen, wie die drei Methoden auf Github Stackdriver Spur zu verwenden: https://github.com/qike/cloud-trace-samples-python

Copy Paste Code unten:



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) 

AKTUALISIERT Fehler von API Explorer

In Bezug auf die Fehler zu beantworten erhalten Sie von der Verwendung API Explorer bekam, war es aufgrund 0 zur Verwendung von als span_id. Es sollte ein 64-Bit-Int anders als 0 sein.

Ich beobachtete auch, dass die Span_id, die Sie festlegen, in einem anderen Span-Objekt als das ist, das Sie beabsichtigten. Stellen Sie sicher, dass Sie nicht versehentlich auf ein "+" - Zeichen klicken, um ein neues Span-Objekt hinzuzufügen.

Nachfolgend finden Sie eine erfolgreiche Patch-Anforderung ich mein Projekt über die API-Explorer gesendet:

{ 
"traces": [ 
    { 
    "projectId": "<project ID>", // I used string ID, not numeric number 
    "traceId": "1234123412341234aaaabb3412347891", 
    "spans": [ 
    { 
    "spanId": "1", 
    "name": "foo", 
    "startTime": "2016-06-01T05:01:23.045123456Z", 
    "endTime": "2016-06-01T05:01:25.045123456Z" 
    } 
    ] 
    } 
] 
} 
Response 

200 
+0

Nachdem ich alles installiert habe, um dieses Beispiel zum Laufen zu bringen, erhalte ich Fehler und sage, dass die Trace-API nicht aktiviert wurde. Die project_id, die es für dieses Projekt gibt, gehört jedoch nicht mir. Unabhängig davon, welche project_id ich anbiete oder ob ich den Namen oder die numerische ID zur Verfügung stelle, schlägt es immer fehl # 32555940559: NetworkError (code = StatusCode.PERMISSION_DENIED, details = "Stackdriver Trace API wurde vorher nicht im Projekt 32555940559 verwendet oder es wurde deaktiviert. Aktivieren Sie es unter https://console.developers.google.com/apis/api/cloudtrace/overview?project=32555940559 und versuchen Sie es erneut. – Sniggerfardimungus

+0

Der Fehler ist im Aufruf von ListTraces in Zeile 94. – Sniggerfardimungus

+0

Das ist ein Fehler, den Sie bekommen wenn Sie "gcloud login" anstelle von "gcloud beta auth application-default login" ausführen. Bitte folgen Sie den Anweisungen in der Readme-Datei, insbesondere Schritt # 2 – user6441650

Verwandte Themen