OpenTelemetry#

Arrow C++ 的部分组件已使用 OpenTelemetry C++ SDK 进行了检测(instrumented),这使得生成详细的跟踪信息成为可能,并可在其他工具中进行分析。

启用 OpenTelemetry 跟踪的构建#

OpenTelemetry 跟踪默认是不开启的,因此你必须首先创建一个开启了跟踪功能的 Arrow C++ 自定义构建版本。关于创建自定义构建的常规说明,请参阅 Building Arrow C++

要启用跟踪,请在生成构建时指定 ARROW_WITH_OPENTELEMETRY=ON。你可能还需要指定 CMAKE_BUILD_TYPE=RelWithDebInfo,以便在保留调试信息的同时获得具有代表性的时序数据。

导出跟踪信息#

默认情况下,除非指定了跟踪后端,否则不会导出任何跟踪信息。这通常由使用 Arrow 的可执行文件通过 OpenTelemetry SDK API 安装 TracerProvider 来完成。请参阅 OpenTelemetry SDK API C++ 文档

在极少数情况下,如果你希望 Arrow 控制 OpenTelemetry SDK 的全局资源,可以通过 ARROW_TRACING_BACKEND 环境变量指定跟踪后端。这会覆盖之前设置的任何 TracerProvider

ARROW_TRACING_BACKEND 的可选值如下:
  • ostream:将文本日志消息输出到 stdout

  • otlp_http:将 OTLP JSON 编码的跟踪信息发送到 HTTP 服务器(默认端点 URL 为 “https://:4318/v1/traces”)

  • arrow_otlp_stdout:将 JSON 跟踪信息输出到 stdout

  • arrow_otlp_stderr:将 JSON 跟踪信息输出到 stderr

例如,要启用将 JSON 跟踪信息导出到 stdout,请设置:

export ARROW_TRACING_BACKEND=arrow_otlp_stdout

此时,运行链接到你自定义 Arrow C++ 构建版本的程序,应该会在 stdout 上生成 JSON 跟踪信息。

使用 Jaeger UI 可视化跟踪信息#

分析导出到 stdout/stderr 的跟踪信息可能需要编写自定义的处理脚本。作为此过程的替代方案(甚至是补充),使用 “all-in-one” Jaeger Docker 镜像是一种相对简单直接的可视化跟踪数据的方法,适用于本地开发和测试。

注意:这假设你已经安装了 Docker

首先,将你的跟踪后端更改为 otlp_http

export ARROW_TRACING_BACKEND=otlp_http

然后启动 Jaeger all-in-one 容器

docker run \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  jaegertracing/all-in-one:1.35

现在,你应该可以运行程序并在 Web 浏览器中访问 https://:16686 查看任何跟踪信息。请注意,与其他导出跟踪信息的方法不同,此方法不会有输出到 stdout/stderr。但是,如果你查看 Docker 容器日志,应该会在容器接收到跟踪信息时看到输出。