使用客户端轨迹监控性能

如需端到端地监控和调试 Datastore 模式 Firestore (Datastore) 请求,您可以在 Java 客户端库中启用轨迹。客户端跟踪可以提供有关应用体验到的性能的信号,以及有助于调试问题的分析洞见。

通过从客户端执行 RPC 收集的客户端轨迹可提供以下信息:

  • 包含以下时间戳的 span:客户端发送 RPC 请求的时间和客户端接收 RPC 响应的时间,包括网络和客户端系统引入的延迟时间
  • 用于显示有关客户端及其配置信息的属性(键值对)。
  • 与 span 中的关键事件关联的日志。
  • 如果客户端发生崩溃,则为堆栈轨迹。

OpenTelemetry

Java 客户端库的跟踪记录通过 OpenTelemetry API 进行插桩。OpenTelemetry 是一项业界标准,也是一个开源可观测性框架。OpenTelemetry 提供了各种工具,例如插桩 API 和 SDK、收集器、后端专用导出器以及灵活的配置选项(例如抽样控制、span 限制等)。

使用导出器和收集器导出轨迹

在配置过程中,您可以将轨迹导出到可观测性后端。大多数可观测性服务提供商都会提供供您使用的导出器,例如 Cloud Trace

除了导出器之外,OpenTelemetry 还建议设置收集器。借助收集器,您的服务可以快速分流数据,并让收集器负责重试、批处理和加密等其他处理工作。收集器与应用一起运行。收集器接收 OpenTelemetry 协议 (OTLP) 消息、处理消息,并将其导出到可观测性后端。

限制

跟踪 span 仅适用于 Java 客户端库。

结算

除了 Datastore 用量之外,客户端跟踪也可能会产生费用。

收集跟踪记录或使用 OpenTelemetry 框架不会产生任何费用。

将跟踪 span 提取到可观测性后端可能需要付费。 例如,如果您使用 Cloud Trace 作为后端,则需要按照 Cloud Trace 价格付费。如果您使用其他可观测性服务提供商,请了解其结算模式和相关费用。

为了更好地了解结算,请根据您的流量,先从较小的轨迹采样率(跟踪一小部分 RPC)开始。

准备工作

准备工作:

  • 确保您为应用向可观测性后端写入轨迹所使用的服务账号设置了必要的 Identity and Access Management 角色

    跟踪操作 IAM 角色
    读取轨迹 roles/cloudtrace.user
    写入轨迹 roles/cloudtrace.agent
    读写轨迹 roles/cloudtrace.admin
  • 验证此项目是否已启用 Trace API。

配置客户端跟踪记录

本部分提供了客户端轨迹的配置示例。您可以将跟踪记录导出到收集器,也可以直接导出到可观测性后端。 您还可以通过以下方式配置客户端轨迹:

使用 OpenTelemetry API 将轨迹导出到收集器

以下代码将 Datastore Java 客户端库配置为以 10% 的抽样比将 span 导出到 OpenTelemetry 收集器。

Java

Resource resource = Resource
  .getDefault().merge(Resource.builder().put(SERVICE_NAME, "My App").build());

OtlpGrpcSpanExporter otlpGrpcSpanExporter =
  OtlpGrpcSpanExporter
  .builder()
  .setEndpoint("http://localhost:4317") // Replace with your OTLP endpoint
  .build();

// Using a batch span processor
// You can use `.setScheduleDelay()`, `.setExporterTimeout()`,
// `.setMaxQueueSize`(), and `.setMaxExportBatchSize()` to further customize.
BatchSpanProcessor otlpGrpcSpanProcessor =
  BatchSpanProcessor.builder(otlpGrpcSpanExporter).build();

// Export to a collector that is expecting OTLP using gRPC.
OpenTelemetrySdk otel = OpenTelemetrySdk.builder()
        .setTracerProvider(SdkTracerProvider.builder()
            .setResource(resource)
            .addSpanProcessor(otlpGrpcSpanProcessor)
            .setSampler(Sampler.traceIdRatioBased(0.1))
            .build())
        .build();


DatastoreOptions datastoreOptions = DatastoreOptions
  .newBuilder()
  .setOpenTelemetryOptions(
    DatastoreOpenTelemetryOptions.newBuilder()
      .setTracingEnabled(true)
      .setOpenTelemetry(otel)
      .build())
  .build();

Datastore datastore = datastoreOptions.getService();

    

使用 OpenTelemetry API 直接导出到可观测性后端

以下代码将 Java 客户端库配置为直接将跟踪记录 span 导出到 Cloud Trace,并将跟踪记录抽样比率设置为 10%。您可以使用其他可观测性服务提供商的导出器直接导出到其后端。如果您的可观测性后端支持 OTLP 提取,您可以使用 OpenTelemetry OtlpGrpcSpanExporter 导出到后端,而不是使用自定义导出器。

Java

// TraceExporter needed for this use case
import com.google.cloud.opentelemetry.trace.TraceExporter;

Resource resource = Resource
  .getDefault().merge(Resource.builder().put(SERVICE_NAME, "My App").build());
SpanExporter gcpTraceExporter = TraceExporter.createWithDefaultConfiguration();

// Using a batch span processor
// You can use `.setScheduleDelay()`, `.setExporterTimeout()`,
// `.setMaxQueueSize`(), and `.setMaxExportBatchSize()` to further customize.
SpanProcessor gcpBatchSpanProcessor =
  BatchSpanProcessor.builder(gcpTraceExporter).build();

// Export directly to Cloud Trace with 10% trace sampling ratio
OpenTelemetrySdk otel = OpenTelemetrySdk.builder()
        .setTracerProvider(SdkTracerProvider.builder()
            .setResource(resource)
            .addSpanProcessor(gcpBatchSpanProcessor)
            .setSampler(Sampler.traceIdRatioBased(0.1))
            .build())
        .build();


DatastoreOptions datastoreOptions = DatastoreOptions
  .newBuilder()
  .setOpenTelemetryOptions(
    DatastoreOpenTelemetryOptions.newBuilder()
      .setTracingEnabled(true)
      .setOpenTelemetry(otel)
      .build())
  .build();

Datastore datastore = datastoreOptions.getService();

    

使用自动代理导出到收集器

运行 OpenTelemetry 收集器,并启用 OTLP gRPC 接收器。将代理的导出器设置为 otlp,并指定代理应将数据导出到的端点。以下示例使用 10% 的抽样比,并将轨迹发送到监听本地主机端口 4317 的收集器。

终端

DATASTORE_ENABLE_TRACING=ON                            \
java                                                   \
-javaagent:path/to/opentelemetry-javaagent.jar         \
-Dotel.traces.exporter=otlp                            \
-Dotel.exporter.otlp.endpoint="http://localhost:4317"  \
-Dotel.traces.sampler=traceidratio                     \
-Dotel.traces.sampler.arg=0.1                          \
-Dotel.service.name="My App"                           \
-jar myapp.jar

    

使用自动代理直接导出到可观测性后端

除了设置环境变量 DATASTORE_ENABLE_TRACING=ON 之外,您还需要为特定后端添加 OpenTelemetry Java 代理扩展程序。以下示例使用了轨迹导出器扩展程序和 10% 的轨迹采样率。

终端

DATASTORE_ENABLE_TRACING=ON                                                \
java                                                                       \
-javaagent:path/to/opentelemetry-javaagent.jar                             \
-Dotel.javaagent.extensions=/path/to/exporter-auto-0.26.0-alpha-shaded.jar \
-Dotel.traces.exporter=google_cloud_trace                                  \
-Dotel.traces.sampler=traceidratio                                         \
-Dotel.traces.sampler.arg=0.1                                              \
-Dotel.service.name="My Application"                                       \
-jar myapp.jar

    

跟踪记录示例

以下示例展示了跟踪信息在 Cloud Trace 中的显示方式。 如需详细了解可能的属性和值,请参阅跟踪范围属性和事件

跟踪 span 示例

从 Cloud Trace 查看的跟踪 span。

事件日志示例

从 Cloud Trace 查看的跟踪记录 span 事件日志。

属性值示例

从 Cloud Trace 查看的轨迹 span 的属性值。

后续步骤