2016-08-04 7 views
0

Ich versuche, einen einfachen Push-Trace-Vorgang in meinem Google Cloud Trace-Projekt durchzuführen, und ich kann einfach keine Daten senden.So machen Sie eine einfache Google Cloud Trace-Anfrage in Java

Hier ist meine build.gradle Datei:

apply plugin: 'java' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.google.oauth-client:google-oauth-client-java6:1.20.0' 
    compile 'com.google.apis:google-api-services-cloudtrace:v1-rev6-1.22.0' 
} 

jar { 
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
} 

und die folgenden Java-Code mit Dummy-Info für das Projekt ID und meine Geheimnisse Datei:

package test; 

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.cloudtrace.v1.CloudTrace; 
import com.google.api.services.cloudtrace.v1.CloudTraceScopes; 
import com.google.api.services.cloudtrace.v1.model.Trace; 
import com.google.api.services.cloudtrace.v1.model.TraceSpan; 
import com.google.api.services.cloudtrace.v1.model.Traces; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.time.Instant; 
import java.util.Collections; 

public class Test { 

    public static void main(String[] args) throws IOException, GeneralSecurityException { 
     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

     GoogleCredential cred = GoogleCredential 
       .fromStream(
         new FileInputStream("/path/to/secrets.json"), 
         httpTransport, 
         jsonFactory) 
       .createScoped(Collections.singletonList(CloudTraceScopes.TRACE_APPEND)); 

     CloudTrace gceTrace = new CloudTrace.Builder(httpTransport, jsonFactory, cred) 
       .setApplicationName("Google Cloud Trace test app") 
       .build(); 

     TraceSpan span1 = new TraceSpan(); 
     span1.setName("test"); 
     span1.setStartTime(Long.toString(Instant.now().toEpochMilli()*1000000)+"Z"); 
     Trace trace = new Trace(); 
     trace.setSpans(Collections.singletonList(span1)); 
     Traces traces = new Traces(); 
     traces.setTraces(Collections.singletonList(trace)); 
     gceTrace.projects().patchTraces("myprojectid", traces).execute(); 
    } 

} 

bekomme ich folgende Fehler derzeit, dass enthält keine hilfreiche Anzeige, außer etwas scheint mit meinem StartTime-Wert nicht in Ordnung zu sein:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Invalid value at 'traces.traces[0].spans[0].start_time' (type.googleapis.com/google.protobuf.Timestamp), Field 'startTime', Invalid time format: Failed to parse input", 
    "reason" : "badRequest" 
    } ], 
    "message" : "Invalid value at 'traces.traces[0].spans[0].start_time' (type.googleapis.com/google.protobuf.Timestamp), Field 'startTime', Invalid time format: Failed to parse input", 
    "status" : "INVALID_ARGUMENT" 
} 
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) 
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
    at test.Test.main(Test.java:44) 

Ich habe versucht, die Startzeit mit dem folgenden Wert zu ersetzen:

span1.setStartTime("2016-08-04T01:00:00Z"); 

, die mir gibt:

Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Request contains an invalid argument.", 
    "reason" : "badRequest" 
    } ], 
    "message" : "Request contains an invalid argument.", 
    "status" : "INVALID_ARGUMENT" 
} 
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) 
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
    at test.Test.main(Test.java:44) 

Ich habe auch versucht eine endTime mit Zugabe:

span1.setEndTime("2016-08-04T01:00:01Z"); 

das gibt mir auch der gleiche Fehler.

Ich bin ziemlich verloren bei dem, was getan werden muss, da ich kein einziges funktionierendes Java-Beispiel dafür finden kann. Vielen Dank im Voraus für Hinweise für eine funktionierende Lösung.

Antwort

1

Endlich herausgefunden. Hier ist ein Arbeitsbeispiel mit Pflichtfeldern und optionalen Feldern.

build.gradle

apply plugin: 'java' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.google.oauth-client:google-oauth-client-java6:1.20.0' 
    compile 'com.google.apis:google-api-services-cloudtrace:v1-rev6-1.22.0' 
} 

jar { 
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
} 

Test.java

package test; 

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.cloudtrace.v1.CloudTrace; 
import com.google.api.services.cloudtrace.v1.CloudTraceScopes; 
import com.google.api.services.cloudtrace.v1.model.Trace; 
import com.google.api.services.cloudtrace.v1.model.TraceSpan; 
import com.google.api.services.cloudtrace.v1.model.Traces; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.math.BigInteger; 
import java.security.GeneralSecurityException; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.Map; 

public class Test { 

    public static void main(String[] args) throws IOException, GeneralSecurityException { 
     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

     GoogleCredential cred = GoogleCredential 
       .fromStream(
         new FileInputStream("/path/to/secrets.json"), 
         httpTransport, 
         jsonFactory) 
       .createScoped(Collections.singletonList(CloudTraceScopes.TRACE_APPEND)); 

     CloudTrace gceTrace = new CloudTrace.Builder(httpTransport, jsonFactory, cred) 
       .setApplicationName("Google Cloud Trace test app") 
       .build(); 

     // They are optional 
     Map<String, String> labels = new HashMap<>(); 
     labels.put("key1", "val1"); 

     TraceSpan span = new TraceSpan(); 
     span.setSpanId(new BigInteger("1")); // Mandatory 
     span.setName("test"); // Optional 
     span.setKind("RPC_SERVER"); // Optional 
     span.setStartTime("2016-08-04T01:00:00Z"); // Optional 
     span.setEndTime("2016-08-04T01:00:01Z"); // Optional 
     span.setLabels(labels); // Optional 
     Trace trace = new Trace(); 
     trace.setProjectId("myprojectid"); // Mandatory 
     trace.setTraceId("A096D4956A424EEB98AE7863505B1E1F"); // Mandatory 
     trace.setSpans(Collections.singletonList(span)); // Mandatory 
     Traces traces = new Traces(); 
     traces.setTraces(Collections.singletonList(trace)); // Mandatory 
     gceTrace.projects().patchTraces("myprojectid", traces).execute(); 
    } 

} 

Während einige Werte sind optional, wie Startzeit oder endTime, es Sinn, etwas dort zu setzen macht.

schaffte ich es, um gemeinsam durch this question die erwarteten Werte zeigen und an der REST-API doc suchen jedes Feld beschreiben, vor allem für kryptische Werte wie Trace-ID:

+0

Ich habe den Code funktioniert, aber ich konnte den Trace nicht in der Google Cloud Console finden. Zum Beispiel https://console.cloud.google.com/traces/details/A096D4956A424EEB98AE7863505B1E1F?project=myprojectid es sagt immer "Entschuldigung, es gibt ein Problem. Wenn Sie Informationen eingegeben haben, überprüfen Sie es und versuchen Sie es erneut. Andernfalls könnte das Problem behoben werden allein. Überprüfen Sie das später noch einmal. " – SoulMan

+0

Die Werte selbst sind nur ein Beispiel, Sie möchten sie vielleicht anpassen, insbesondere die Trace ID und die Start-/Endzeit. –

+0

Danke für die Wiedergabe. Ich wechselte zu meiner ID und gab eine Zeit mit 30 Tagen, so dass sie nicht abgelaufen ist. Immer noch nicht auftauchen. Sehen Sie ein anderes Problem oder einen anderen funktionierenden Code?Die execute() der letzten Zeile hat einen json mit nur der Projekt-ID zurückgegeben. Ich hoffe, das war ein Erfolg. – SoulMan