用於 Docker CLI 的 OpenTelemetry

要求: Docker Engine 26.1.0 及更高版本

Docker CLI 支援 OpenTelemetry 檢測,用於發出有關命令呼叫的指標。此功能預設停用。您可以配置 CLI,使其開始向您指定的端點發送指標。這使您可以捕獲有關 docker 命令呼叫的資訊,從而更深入地瞭解您的 Docker 使用情況。

匯出指標是可選的,您可以透過指定指標收集器的目標地址來控制資料傳送到哪裡。

什麼是 OpenTelemetry?

OpenTelemetry,簡稱 OTel,是一個用於建立和管理遙測資料(如跟蹤、指標和日誌)的開放可觀測性框架。OpenTelemetry 與供應商和工具無關,這意味著它可以與各種可觀測性後端一起使用。

Docker CLI 中對 OpenTelemetry 檢測的支援意味著 CLI 可以使用 OpenTelemetry 規範中定義的協議和約定來發出有關發生的事件的資訊。

工作原理

預設情況下,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。它包括一個 CLI 可以向其傳送指標的 OpenTelemetry 收集器,以及一個從收集器抓取指標的 Prometheus 後端。

compose.yaml
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.yaml 一起存在以下兩個配置檔案:

  • 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]
  • prom.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=https://:4317
    
  3. 執行一個 docker 命令,以觸發 CLI 向 OpenTelemetry 收集器傳送指標訊號。

    $ docker version
    
  4. 要檢視 CLI 建立的遙測指標,請透過訪問 https://:9091/graph 開啟 Prometheus 表示式瀏覽器。

  5. Query 欄位中,輸入 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