使用 SpanMetrics Connector 将 OpenTelemetry 跟踪转换为指标

当应用已经接入 OpenTelemetry Trace,但指标埋点还不完善时,可以使用 SpanMetrics Connector 从 Span 中生成 RED 指标。本文说明 SpanMetrics 的配置项、Collector 管道和 Prometheus 抓取方式。

作者 Prathamesh Sonpatki

使用 SpanMetrics Connector 将 OpenTelemetry 跟踪转换为指标

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

如果您已经实施了跟踪但缺乏强大的指标功能怎么办? SpanConnector 是一个通过将跟踪数据转换为可操作指标来弥补这一差距的工具。这篇文章详细介绍了 SpanConnector 的工作原理,提供了有关其配置和实现的指南。

核心要点

  • SpanMetrics Connector 适合已经有 Trace 数据、但缺少请求数、错误数和耗时分布等指标的场景。
  • 它通过 OpenTelemetry Collector 管道消费 Span,再生成可被 Prometheus 抓取的指标。
  • 配置重点包括延迟桶、维度、exemplar、缓存大小、聚合方式、刷新间隔和指标过期时间。
  • 这类方案可以减少重复埋点,但也要控制标签维度,避免生成过高基数的指标。
  • Trace 转指标不是替代原生指标,而是在过渡期或语言/框架指标能力不足时补齐可观测性视图。

OpenTelemetry 的一个常见问题是语言支持跟踪检测(Trace埋点),但指标方面正在进行中或尚不可用。在这种情况下,您可以使用 SpanConnector 将跟踪生成的跨度(Span)转换为指标。

什么是 Connector?

SpanConnector 是 OpenTelemetry Collector 中的一个组件,允许您从跨度(Span)数据中获取指标。当您拥有强大的跟踪功能但您的语言或框架缺乏原生指标支持时,这尤其有用。

将跟踪(Trace)转换为指标可以提供有关系统性能和运行状况的宝贵见解,而无需单独的插桩埋点。这种统一的方法创建了更全面的可观测性视野,并减少了管理两个不同埋点系统的开销。

从工程落地看,它主要回答一个问题:如果请求路径已经产生 Span,能不能复用这些 Span 生成请求量、错误数、耗时分布等指标?SpanMetrics Connector 的价值就在这里。

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 将指标样本链接回特定 Trace 示例 适合从异常指标下钻到 Trace
Dimensions Cache 限制维度组合缓存数量 用于控制内存使用
Aggregation Temporality 决定指标如何随时间聚合 示例中 CUMULATIVE 表示从进程开始累积
Metrics Flush Interval 生成并刷新指标的频率 影响指标新鲜度和 Collector 开销
Metrics Expiration 指标多久未更新后从内存中丢弃 避免过期维度长期占用内存
Events 从 Span 事件中创建指标,例如异常类型和异常信息 事件字段也需要控制基数
Resource Metrics Key Attributes 将资源属性作为生成指标的标签 常用于保留 service.name 和 SDK 信息

使用 SpanMetrics 连接器的好处

  • 统一的可观测性:将跟踪转换为指标可以让您更全面地了解系统的性能,而无需单独的指标检测。
  • 一致性:确保您的指标与来自同一来源的跟踪完美一致。
  • 减少开销:消除了应用程序代码中双重检测(跟踪和指标)的需要。
  • 灵活性:您可以根据您的需求和跨度属性生成自定义指标。

也要注意边界:SpanMetrics Connector 依赖 Trace 数据质量。如果服务没有正确打点、Span 缺少关键属性,或者标签字段不稳定,生成的指标也会受到影响。因此它更适合补齐请求维度的 RED 指标,而不是替代所有业务指标和基础设施指标。

实施 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 特别有价值,对于那些指标埋点不太完备的语言,也很有价值。

FAQ

SpanMetrics Connector 适合什么场景?

适合已经有 OpenTelemetry Trace,但缺少请求量、错误数、耗时分布等指标的服务。它可以帮助团队在不增加大量应用代码埋点的情况下,快速补齐基础服务指标。

它能替代 Prometheus 原生指标吗?

不能完全替代。Trace 转指标适合从请求 Span 中生成 RED 类指标,但业务指标、基础设施指标、队列长度、缓存命中率等仍然需要对应的数据来源。

配置 Dimensions 时最容易踩什么坑?

最常见的问题是维度过多或维度值不稳定,导致指标基数过高。优先选择稳定、低基数、排障价值明确的字段,例如服务名、接口、方法和状态码。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云