如何在 Java 中执行简单的 Google Cloud Trace 请求

Posted

技术标签:

【中文标题】如何在 Java 中执行简单的 Google Cloud Trace 请求【英文标题】:How to do a simple Google Cloud Trace request in Java 【发布时间】:2016-12-09 21:05:29 【问题描述】:

我正在尝试对我的 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) 

以下 Java 代码包含项目 ID 和我的秘密文件的虚拟信息:

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)

我已尝试将 startTime 替换为以下值:

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)

我还尝试使用以下命令添加 endTime:

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


虽然有些值是可选的,例如 startTime 或 endTime,但在其中放置一些内容是有意义的。

感谢this question 显示了预期值并查看了描述每个字段的 REST API 文档,特别是对于像 Trace ID 这样的神秘值,我设法将它们组合在一起:

patchTraces() Trace and TraceSpan

【讨论】:

我让代码正常工作,但在 Google Cloud Console 中找不到跟踪。例如console.cloud.google.com/traces/details/…它总是说“对不起,有问题。如果您输入了信息,请检查并重试。否则问题可能会自行解决,请稍后再检查。” 这些值本身只是一个示例,您可能需要调整它们,尤其是 Trace ID 和开始/结束时间。 感谢重播。我更改了我的 ID,并给了一个 30 天的时间,这样它就不会过期。还是没有出现。您是否看到任何其他问题或有任何其他工作代码?最后一行的 execute() 返回了一个只有项目 id 的 json 我希望这意味着成功。

以上是关于如何在 Java 中执行简单的 Google Cloud Trace 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中计时方法的执行?

如何在 Google Apps 脚本中使用 Cheerio 提取 HTML 表格数据(雅虎财经)?

如何在 azure app 服务中使用 cl.exe 编译 c++ 代码并生成可执行文件

cl 生成的可执行文件第一次运行非常慢

如何在 Google App Engine 中执行全文搜索?

在 Java 中,如何使用 Google 的 guava CharStreams.toString 进程中的 inputStream?