Exporters

发送遥测数据到 OpenTelemetry Collector,以确保其正确导出。在生产环境中使用 Collector 是一种最佳实践。要可视化您的遥测数据,请将其导出到后端,例如 JaegerZipkinPrometheus特定厂商 的后端。

可用导出器

注册表包含一个 Erlang/Elixir 的 exporter 列表

在导出器中,OpenTelemetry Protocol (OTLP) 导出器是按照 OpenTelemetry 数据模型设计的,可以无损地发出 OTel 数据。此外,许多处理遥测数据的工具都支持 OTLP(例如 PrometheusJaeger 和大多数 厂商),为您提供高度的灵活性。要了解更多关于 OTLP 的信息,请参阅 OTLP 规范

此页面介绍了主要的 OpenTelemetry Erlang/Elixir exporter 及其设置方法。

导出到 OpenTelemetry Collector

Collector 提供了一种独立于供应商的方式来接收、处理和导出遥测数据。package opentelemetry_exporter 支持通过 HTTP(默认)和 gRPC 导出到 collector,后者可以将 Span 导出到自托管服务(如 Zipkin 或 Jaeger)以及商业服务。有关可用 exporter 的完整列表,请参阅 registry

设置 Collector

出于测试目的,您可以在项目根目录中使用以下 Collector 配置开始

# otel-collector-config.yaml

# OpenTelemetry Collector config that receives OTLP and exports to Jager
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: '0.0.0.0:4317'
      http:
        endpoint: '0.0.0.0:4318'
exporters:
  debug:
  otlp/jaeger:
    endpoint: jaeger-all-in-one:4317
    tls:
      insecure: true
    sending_queue:
      batch:
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug, otlp/jaeger]

有关更详细的示例,您可以查看 opentelemetry-erlang 用于测试的 配置

在本教程中,我们将把 Collector 作为 docker 镜像与我们的应用程序一起启动。本教程将继续介绍“入门指南”中的 Dice Roll 示例。

将此 docker-compose 文件添加到应用程序的根目录

# docker-compose.yml
version: '3'
services:
  otel:
    image: otel/opentelemetry-collector-contrib:0.98.0
    command: ['--config=/conf/otel-collector-config.yaml']
    ports:
      - 4317:4317
      - 4318:4318
    volumes:
      - ./otel-collector-config.yaml:/conf/otel-collector-config.yaml
    links:
      - jaeger-all-in-one

  jaeger-all-in-one:
    image: jaegertracing/all-in-one:latest
    ports:
      - '16686:16686'

此配置用于 docker-compose.yml,通过 docker-compose 启动 Collector,并使用 HTTP 和 gRPC 接收器,然后导出到 Zipkin。

要导出到正在运行的 Collector,必须在项目的依赖项中添加 opentelemetry_exporter package,早于其他 opentelemetry 依赖项

{deps, [{opentelemetry_exporter, "~> 1.8"},
        {opentelemetry_api, "~> 1.4"},
        {opentelemetry, "~> 1.5"}]}.
def deps do
  [
    {:opentelemetry_exporter, "~> 1.8"},
    {:opentelemetry_api, "~> 1.4"},
    {:opentelemetry, "~> 1.5"}
  ]
end

然后,应将其添加到 Release 的配置中,放在 SDK Application 之前,以确保 exporter 的依赖项在 SDK 尝试初始化和使用 exporter 之前启动。

rebar.config 中 Release 配置以及 mix 的 Release 任务的示例

%% rebar.config
{relx, [{release, {my_instrumented_release, "0.1.0"},
         [opentelemetry_exporter,
	      {opentelemetry, temporary},
          my_instrumented_app]},

       ...]}.
# mix.exs
def project do
  [
    releases: [
      my_instrumented_release: [
        applications: [opentelemetry_exporter: :permanent, opentelemetry: :temporary]
      ],

      ...
    ]
  ]
end

最后,将 opentelemetryopentelemetry_exporter Applications 的运行时配置设置为导出到 Collector。以下配置显示了在未设置任何值时使用的默认值,即 HTTP 协议,端点为 localhost,端口为 4318。注意

  • 如果为 otlp_protocol 使用 grpc,则端点应更改为 https://:4317
  • 如果您使用的是上面的 docker compose 文件,则应将 localhost 替换为 otel
%% config/sys.config.src
[
 {opentelemetry,
  [{span_processor, batch},
   {traces_exporter, otlp}]},

 {opentelemetry_exporter,
  [{otlp_protocol, http_protobuf},
   {otlp_endpoint, "https://:4318"}]}]}
].
# config/config.exs
config :opentelemetry,
  resource: %{service: %{name: "roll_dice_app"}},
  span_processor: :batch,
  traces_exporter: :otlp

config :opentelemetry_exporter,
  otlp_protocol: :http_protobuf,
  otlp_endpoint: "https://:4318"
  # otlp_endpoint: "http://otel:4318" if using docker compose file

您可以通过在一个终端中运行 docker compose up,然后在另一个终端中运行 mix phx.server 来查看您的 traces。在向应用程序发送一些请求后,转到 https://:16686,从 Service 下拉列表中选择 roll_dice_app,然后单击“Find Traces”。

注意事项

某些环境不允许容器以 root 用户身份执行。如果您在这样的环境中工作,可以在本教程中使用的 docker-compose.yml 文件的 otel 服务中,将 user: "1001" 添加为顶层键/值对。