适用于 Docker CLI 的 OpenTelemetry

Docker Engine 26.1.0 版本中引入

Docker CLI 支持 OpenTelemetry检测来发出有关命令调用的指标。默认情况下禁用此功能。您可以配置 CLI 以开始向您指定的端点发送指标。这允许您捕获有关docker命令调用的信息,以便更深入地了解 Docker 使用情况。

导出指标是可选的,您可以通过指定指标收集器的目标地址来控制数据的发送位置。

什么是开放遥测?

OpenTelemetry,简称 OTel,是一个开放的可观察性框架,用于创建和管理遥测数据,例如跟踪、指标和日志。 OpenTelemetry 与供应商和工具无关,这意味着它可以与各种可观察性后端一起使用。

Docker CLI 中对 OpenTelemetry 检测的支持意味着 CLI 可以使用 Open Telemetry 规范中定义的协议和约定发出有关发生的事件的信息。

怎么运行的

默认情况下,Docker CLI 不会发出遥测数据。仅当您在系统上设置了环境变量时,Docker CLI 才会尝试将 OpenTelemetry 指标发送到您指定的端点。

DOCKER_CLI_OTEL_EXPORTER_OTLP_ENDPOINT=<endpoint>

该变量指定 OpenTelemetry 收集器的端点,docker应将有关 CLI 调用的遥测数据发送到该端点。要捕获数据,您需要一个在该端点上侦听的 OpenTelemetry 收集器。

收集器的目的是接收遥测数据、处理数据并将其导出到后端。后端是存储遥测数据的地方。您可以从许多不同的后端中进行选择,例如 Prometheus 或 InfluxDB。

一些后端提供了直接可视化指标的工具。或者,您还可以运行支持生成更有用的图表的专用前端,例如 Grafana。

设置

要开始为 Docker CLI 捕获遥测数据,您需要:

  • 设置DOCKER_CLI_OTEL_EXPORTER_OTLP_ENDPOINT环境变量以指向 OpenTelemetry 收集器端点
  • 运行 OpenTelemetry 收集器来接收来自 CLI 命令调用的信号
  • 运行后端来存储从收集器接收到的数据

以下 Docker Compose 文件引导一组服务以开始使用 OpenTelemetry。它包括一个 OpenTelemetry 收集器(CLI 可以将指标发送到该收集器)以及一个 Prometheus 后端(可以从收集器中获取指标)。

compose.yml
name: cli-otel
services:
  prometheus:
    image: prom/prometheus
    command:
      - "--config.file=/etc/prometheus/prom.yml"
    ports:
      # Publish the Prometheus frontend on localhost:9091
      - 9091:9090
    restart: always
    volumes:
      # Store Prometheus data in a volume:
      - prom_data:/prometheus
      # Mount the prom.yml config file
      - ./prom.yml:/etc/prometheus/prom.yml
  otelcol:
    image: otel/opentelemetry-collector
    restart: always
    depends_on:
      - prometheus
    ports:
      - 4317:4317
    volumes:
      # Mount the otelcol.yml config file
      - ./otelcol.yml:/etc/otelcol/config.yaml

volumes:
  prom_data:

该服务假设以下两个配置文件并存 compose.yml

  • otelcol.yml
    # Receive signals over gRPC and HTTP
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    
    # Establish an endpoint for Prometheus to scrape from
    exporters:
      prometheus:
        endpoint: "0.0.0.0:8889"
    
    service:
      pipelines:
        metrics:
          receivers: [otlp]
          exporters: [prometheus]
  • 舞会.yml
    # Configure Prometheus to scrape the OpenTelemetry collector endpoint
    scrape_configs:
      - job_name: "otel-collector"
        scrape_interval: 1s
        static_configs:
          - targets: ["otelcol:8889"]

有了这些文件:

  1. 启动 Docker Compose 服务:

    $ docker compose up
    
  2. 配置 Docker CLI 以将遥测数据导出到 OpenTelemetry 收集器。

    $ export DOCKER_CLI_OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
    
  3. 运行docker命令以触发 CLI 向 OpenTelemetry 收集器发送指标信号。

    $ docker version
    
  4. 要查看 CLI 创建的遥测指标,请转至 http://localhost:9091/graph打开 Prometheus 表达式浏览器。

  5. 查询字段中,输入command_time_milliseconds_total,然后执行查询以查看遥测数据。

可用指标

Docker CLI 当前导出单个指标 ,command.time该指标以毫秒为单位测量命令的执行持续时间。该指标具有以下属性:

  • command.name:命令的名称
  • command.status.code:命令的退出代码
  • command.stderr.isatty:如果 stderr 附加到 TTY,则为 true
  • command.stdin.isatty:如果 stdin 连接到 TTY,则为 true
  • command.stdout.isatty:如果 stdout 连接到 TTY,则为 true