使用 SpanMetrics Connector 將 OpenTelemetry 跟蹤轉換為指標

SRETalk發表於2024-08-26

原文:https://last9.io/blog/convert-opentelemetry-traces-to-metrics-using-spanconnector/

如果您已經實施了跟蹤但缺乏強大的指標功能怎麼辦? SpanConnector 是一個透過將跟蹤資料轉換為可操作指標來彌補這一差距的工具。這篇文章詳細介紹了 SpanConnector 的工作原理,提供了有關其配置和實現的指南。

OpenTelemetry 的一個常見問題是語言支援跟蹤檢測(Trace埋點),但指標方面正在進行中或尚不可用。在這種情況下,您可以使用 SpanConnector 將跟蹤生成的跨度(Span)轉換為指標。

什麼是 Connector?

SpanConnector 是 OpenTelemetry Collector 中的一個元件,允許您從跨度(Span)資料中獲取指標。當您擁有強大的跟蹤功能但您的語言或框架缺乏原生指標支援時,這尤其有用。

將跟蹤(Trace)轉換為指標可以提供有關係統效能和執行狀況的寶貴見解,而無需單獨的插樁埋點。這種統一的方法建立了更全面的可觀測性視野,並減少了管理兩個不同埋點系統的開銷。

SpanMetrics 聯結器的工作原理

SpanMetrics 相關配置

聚合跨度(Span)資料中的請求(Request)、錯誤(Error)和持續時間(Duration) (R.E.D) OpenTelemetry 指標。

connectors:
  spanmetrics:
    histogram:
      explicit:
        buckets: [100us, 1ms, 2ms, 6ms, 10ms, 100ms, 250ms]
    dimensions:
      - name: http.method
        default: GET
      - name: http.status_code
      - name: host.name
    exemplars:
      enabled: true
    dimensions_cache_size: 1000
    aggregation_temporality: "AGGREGATION_TEMPORALITY_CUMULATIVE"
    metrics_flush_interval: 15s
    metrics_expiration: 5m
    events:
      enabled: true
      dimensions:
        - name: exception.type
        - name: exception.message
    resource_metrics_key_attributes:
      - service.name
      - telemetry.sdk.language
      - telemetry.sdk.name

瞭解 SpanMetrics 配置

讓我們分解一下此配置的關鍵部分:

  • Histogram Buckets:histogram.explicit.buckets 欄位定義指標的延遲桶。這使您可以檢視請求持續時間的分佈。
  • Dimensions:這些是 Span 中的屬性,將用於為指標建立標籤。在此示例中,我們使用 http.methodhttp.status_codehost.name
  • Exemplars:啟用後,您可以將指標連結回特定的跟蹤示例,從而為您的指標提供更多上下文。
  • Dimensions Cache:設​​置要儲存的“維度組合”的最大數量。它有助於管理記憶體使用情況。
  • Aggregation Temporality:這決定了指標如何隨時間聚合。 “CUMULATIVE” 意味著指標從流程開始就累積。
  • Metrics Flush Interval:從聯結器生成指標的頻率。
  • Metrics Expiration:這定義了指標在未更新時被丟棄之前在記憶體中保留的時間。
  • Events:啟用後,您可以從跨度事件(例如異常)建立指標。
  • Resource Metrics Key Attributes:與跨度(Span)關聯的資源中的這些屬性將作為標籤新增到所有生成的指標中。

使用 SpanMetrics 聯結器的好處

  • 統一的可觀察性:將跟蹤轉換為指標可以讓您更全面地瞭解系統的效能,而無需單獨的指標檢測。
  • 一致性:確保您的指標與來自同一來源的跟蹤完美一致。
  • 減少開銷:消除了應用程式程式碼中雙重檢測(跟蹤和指標)的需要。
  • 靈活性:您可以根據您的需求和跨度屬性生成自定義指標。

實施 SpanMetrics 的指南

1. 設定 OpenTelemetry 跟蹤:首先,確保您的應用程式已正確檢測以進行跟蹤。

下面是一個使用 Python 的簡單示例:

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
    ConsoleSpanExporter,
    BatchSpanProcessor,
)
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

# Set up the tracer provider
trace.set_tracer_provider(TracerProvider())

# Create an OTLP exporter
otlp_exporter = OTLPSpanExporter(endpoint="http://localhost:4317", insecure=True)

# Create a BatchSpanProcessor and add the exporter to it
span_processor = BatchSpanProcessor(otlp_exporter)

# Add the span processor to the tracer provider
trace.get_tracer_provider().add_span_processor(span_processor)

# Get a tracer
tracer = trace.get_tracer(__name__)

# Use the tracer to create spans in your code
with tracer.start_as_current_span("main"):
    # Your application code here
    pass

2. 安裝和配置 OpenTelemetry Collector

a. 下載 OpenTelemetry 收集器:

curl -OL https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.81.0/otelcol-contrib_0.81.0_linux_amd64.tar.gz
tar xzf otelcol-contrib_0.81.0_linux_amd64.tar.gz

b. 建立名為otel-collector-config.yaml的配置檔案

receivers:
  otlp:
    protocols:
      grpc:
      http:

processors:
  batch:

connectors:
  spanmetrics:
    histogram:
      explicit:
        buckets: [100us, 1ms, 2ms, 6ms, 10ms, 100ms, 250ms]
    dimensions:
      - name: http.method
        default: GET
      - name: http.status_code
      - name: host.name
    exemplars:
      enabled: true
    dimensions_cache_size: 1000
    aggregation_temporality: "AGGREGATION_TEMPORALITY_CUMULATIVE"
    metrics_flush_interval: 15s
    metrics_expiration: 5m
    events:
      enabled: true
      dimensions:
        - name: exception.type
        - name: exception.message
    resource_metrics_key_attributes:
      - service.name
      - telemetry.sdk.language
      - telemetry.sdk.name

exporters:
  prometheus:
    endpoint: "0.0.0.0:8889"
  logging:
    verbosity: detailed

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging, spanmetrics]
    metrics:
      receivers: [spanmetrics]
      exporters: [logging, prometheus]

3. 啟動 OpenTelemetry 收集器

使用您的配置執行收集器:

./otelcol-contrib --config otel-collector-config.yaml

4. 將跟蹤傳送到收集器

修改您的應用程式以將跟蹤傳送到收集器。如果您使用步驟1中的 Python 示例,則您已設定為將跟蹤傳送到 http://localhost:4317

5. 檢視生成的指標

Otel Collector 會在 http://localhost:8889/metrics 公開指標,您可以透過 curl 檢視原始指標:

curl http://localhost:8889/metrics

為了獲得更使用者友好的檢視,您可以設定 Prometheus 來抓取這些指標,建立 prometheus.yml 檔案:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'otel-collector'
    static_configs:
      - targets: ['localhost:8889']

啟動 Prometheus(假設您已經下載了它):

./prometheus --config.file=prometheus.yml

您現在可以透過 http://localhost:9090 訪問 Prometheus UI 來查詢和視覺化您的指標。

小結

SpanConnector 是 OpenTelemetry 生態系統中的一個強大工具,它彌合了跟蹤和指標之間的 gap。透過利用現有跟蹤資料生成有意義的指標,您可以增強可觀察性策略,而無需額外的埋點開銷。這種方法對於過渡到 OpenTelemetry 特別有價值,對於那些指標埋點不太完備的語言,也很有價值。

相關文章