原文:https://last9.io/blog/convert-opentelemetry-traces-to-metrics-using-spanconnector/
如果您已經實施了跟蹤但缺乏強大的指標功能怎麼辦? SpanConnector 是一個透過將跟蹤資料轉換為可操作指標來彌補這一差距的工具。這篇文章詳細介紹了 SpanConnector 的工作原理,提供了有關其配置和實現的指南。
OpenTelemetry 的一個常見問題是語言支援跟蹤檢測(Trace埋點),但指標方面正在進行中或尚不可用。在這種情況下,您可以使用 SpanConnector 將跟蹤生成的跨度(Span)轉換為指標。
什麼是 Connector?
SpanConnector 是 OpenTelemetry Collector 中的一個元件,允許您從跨度(Span)資料中獲取指標。當您擁有強大的跟蹤功能但您的語言或框架缺乏原生指標支援時,這尤其有用。
將跟蹤(Trace)轉換為指標可以提供有關係統效能和執行狀況的寶貴見解,而無需單獨的插樁埋點。這種統一的方法建立了更全面的可觀測性視野,並減少了管理兩個不同埋點系統的開銷。
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.method
、http.status_code
和host.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 特別有價值,對於那些指標埋點不太完備的語言,也很有價值。