排查 Google 构建的 OpenTelemetry 收集器的问题

本文档介绍了使用 OpenTelemetry 收集器(例如 Google 构建的 OpenTelemetry 收集器)将数据发送到 Google Cloud Observability 时的问题排查步骤和常见问题。

排查数据收集问题

本部分介绍了可用于排查数据收集问题的策略。

使用 debug 导出器

debug 导出器是在 OpenTelemetry 收集器级别查看数据的最佳方式。导出器会接收任何数据,并以直观易懂的格式将其写入标准输出。当您需要验证流水线中的任何转换是否产生了预期结果时,此功能最为有用。

debug 导出器包含在 Google 构建的 OpenTelemetry 收集器中。您可以使用 verbosity: detailed 配置 debug 导出器,以查看整个遥测载荷。

exporters:
  debug:
    verbosity: detailed

您可以在流水线中添加导出器:

service:
  pipelines:
    metrics:
      receivers: [
        # ...
      ]
      processors: [
        # ...
      ]
      exporters: [
        debug, # can be added alongside any other configured exporters
        # ...
      ]

使用 OTTL Playground 在线测试 OpenTelemetry 转换语言 (OTTL)

OTTL Playground 是一款由社区开发的工具,可让您以交互方式开发 OpenTelemetry Transformation Language 流水线。首先,您需要提供 OTLP JSON 作为输入,然后使用与 OpenTelemetry 收集器相同的配置编写流水线,最后直观地检查结果。

从流水线获取 OTLP JSON 的最佳方式是在转换处理器之前的位置放置一个 file 指标导出器。首先,配置 file 导出器:

exporters:
  file:
    path: example.json

如果您有如下流水线:

service:
  pipelines:
    metrics:
      receivers: [hostmetrics]
      processors: [
        memorylimiter,
        groupbyattrs,
        transform, # where your OTTL pipeline will go
        cumulativetodelta,
        metricstarttime,
      ]
      exporters: [
        otlp,
      ]

您可以暂时修改流水线,以导出数据,使其看起来与您正在使用的 transform 处理器的输入数据相同。

service:
  pipelines:
    metrics:
      receivers: [hostmetrics]
      processors: [
        memorylimiter,
        groupbyattrs,
        # transform,
        # cumulativetodelta,
        # metricstarttime,
      ]
      exporters: [
        # otlp,
        file,
      ]

file 输出器会将收到的每个载荷写入文件中的一行。您可以使用单行数据作为 OTTL Playground 的输入。

已知问题

本部分介绍了 OpenTelemetry 收集器/Google 构建的 OpenTelemetry 收集器的已知问题,以及在可能的情况下如何解决这些问题。

使用 otlp 导出器时出现过多的 connect: network is unreachable 错误

注意:此问题仅适用于 gRPC otlp 指标导出器,而不适用于名为 otlphttp 的 HTTP 等效指标导出器。

注意:到目前为止,我们仅在 Compute Engine 环境中直接观察到此问题,但由于此问题的性质,我们无法确认它是否确实仅限于 Compute Engine。

从 Google 构建的 OpenTelemetry 收集器版本 0.147.0 和上游 OpenTelemetry 收集器版本 0.145.0 开始,otlp 出口将默认采用客户端负载均衡策略 round_robin,而之前采用的是 pick_first。当导出器之前使用 pick_first 策略时,它在 IPV6 无法正常工作的情况下也具有完全正常的 IPV4 回退功能。round_robin 策略没有此属性,并且会反复尝试向导出器启动时解析的所有地址发送数据,即使这些地址无法正常运行也是如此。

因此,如果您使用 otlp 指标导出器将数据发送到 Telemetry API,则可能会看到如下错误消息:

2026-02-13T20:50:00.665Z        warn    grpc@v1.78.0/clientconn.go:1526 [core] [Channel #1 SubChannel #18] grpc: addrConn.createTransport failed to connect to {Addr: "[2607:f8b0:4001:c62::5f]:443", ServerName: "telemetry.googleapis.com:443", }. Err: connection error: desc = "transport: Error while dialing: dial tcp [2607:f8b0:4001:c62::5f]:443: connect: network is unreachable"   {"resource": {"service.instance.id": "feb467f0-ecc6-4a0c-b1e2-90c908131fdd", "service.name": "otelcol-google", "service.version": "v0.147.0"}, "grpc_log": true}

隔离日志的实际错误:

transport: Error while dialing: dial tcp [2607:f8b0:4001:c62::5f]:443: connect: network is unreachable

如需解决此错误,您可以切换到 otlphttp 导出器(有关示例,请参阅我们的 OTLP 指标用户指南),也可以手动配置 otlp 导出器上的 pick_first 均衡器:

exporters:
  otlp:
    # ...
    balancer_name: pick_first
    # ...

如果采用任一解决方法后错误仍然存在,则此错误消息很可能是实际网络连接问题的症状,因此您需要确保收集器确实可以访问网络。