2016-08-04 78 views
0

我正在尝试对我的Google Cloud Trace项目执行简单的推送跟踪操作,而且我似乎无法发送数据。如何在Java中执行简单的Google Cloud Trace请求

这里是我的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) } 
} 

并与该项目ID虚拟信息下面的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.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(); 
    } 

} 

我目前得到以下错误包含没有有用的指示,除了一些似乎是错误的我的startTime值:

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) 

我曾尝试用下面的值来代替开始时间:

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

这给了我:

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) 

我也尝试添加一个结束时间有:

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

这也给了我同样的错误。

我几乎在迷失在需要完成的事情上,因为我无法找到一个适用于此的单个工作Java示例。 预先感谢您提供工作解决方案的任何指示。

回答

1

终于搞明白了。这里有一个有强制性和可选字段的工作示例。

的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(); 
    } 

} 

虽然有些值是可选的,比如开始时间和结束时间,它是有道理的把东西存在。

我设法把它一起感谢this question显示预期值来看,在REST API文档描述每个领域,尤其是像跟踪ID神秘的值:

+0

我得到的代码工作,但我无法找到谷歌云控制台中的痕迹。例如https://console.cloud.google.com/traces/details/A096D4956A424EEB98AE7863505B1E1F?project=myprojectid它总是会显示“对不起,有问题,如果您输入了信息,请检查并再试一次,否则问题可能会消失 “ – SoulMan

+0

这些值本身只是一个例子,您可能想要修改它们,尤其是跟踪ID和开始/结束时间。 –

+0

感谢您的重播。我改变了我的ID,并花了30天的时间,以便它没有过期。仍然没有出现。你是否看到任何其他问题或有任何其他工作代码?最后一行的execute()返回一个带有项目ID的json,我希望这意味着成功。 – SoulMan