服务性能监控(SPM)

服务性能监控在 Jaeger UI 中以“Monitor”选项卡的形式呈现,可在无需预先了解 service 或 operation 名称的情况下帮助识别有价值的 trace。该功能会聚合 span 数据以生成 RED(Request、Error、Duration)指标。

UI 功能概览

Monitor 选项卡提供 service 级别和 operation 级别的聚合,包括:

  • 请求速率
  • 错误速率
  • 持续时间(P95、P75、P50)

“Impact”指标通过 latency 与 request rate 的乘积计算得出,有助于识别尽管延迟特征不同但业务影响较高的 operation。

架构

SpanMetrics Connector 接收 span 并生成导出到兼容 PromQL 的后端的指标。随后 Jaeger Query 检索这些预先计算的指标。此方法需要:

  • 在接收 trace 数据(span)并生成 RED 指标的 pipeline 中引入 SpanMetrics Connector
  • 一个支持 PromQL 查询的外部 Metrics Store。
  • jaeger_query extension 中配置对外部 metrics store 的引用。

由于该 connector 会将 span 聚合为内存中的 series,因此每个 (service, operation) time series 必须由单个 writer生成。使用一个 collector replica 时,这一要求会自动满足。要进行横向扩展,必须按 service 对 span 进行负载均衡,以便每个 service 恰好由一个 instance 进行聚合;否则 RED 指标会被重复统计,导致结果不准确。有关最终形成的两级部署,请参见配置

派生时间序列

SpanMetrics Connector 生成两个 metric 名称:

traces_span_metrics_calls(counter 类型)

  • 统计 span 总数,包括 error span
  • 通过 status_code label 区分调用计数与错误
  • 错误识别为 status_code = "STATUS_CODE_ERROR" 的 time series

traces_span_metrics_duration(histogram 类型)

  • span 持续时间/延迟的 histogram
  • 生成额外的 time series:
    • traces_span_metrics_duration_count:跨所有 bucket 的数据点总数
    • traces_span_metrics_duration_sum:所有数据点值的总和
    • traces_span_metrics_duration_bucket:每个 bucket 的 time series 集合

估算的 time series 计算:

num_status_codes * num_span_kinds * (1 + num_latency_buckets) * num_operations

Typical: 72 * num_operations
Max: 324 * num_operations

配置

SPM 以两级方式运行,这样有状态的 SpanMetrics Connector 始终会从单个 writer 看到每个 service,从而即使两个级别都运行多个 replica,RED 指标仍然保持准确。

前端 OpenTelemetry Collector —— 按 service 将 span 负载均衡到后端:

exporters:
  loadbalancing:
    routing_key: service # all spans of a service go to the same backend instance
    protocol:
      otlp:
        tls:
          insecure: true
    resolver:
      dns:
        hostname: jaeger-collector-headless.jaeger.svc.cluster.local
        port: "4317" # the dns resolver requires the port as a string

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [debug, loadbalancing]

Jaeger —— 运行 SpanMetrics Connector,并在 Prometheus endpoint 上暴露生成的指标:

exporters:
  prometheus:
    add_metric_suffixes: false # Jaeger expects standard OTel metric names without _total suffixes
    endpoint: "0.0.0.0:8889"
    resource_to_telemetry_conversion:
      enabled: true

connectors:
  spanmetrics:
    # connector configuration options

service:
  pipelines:
    traces:
      exporters: [jaeger_storage_exporter, spanmetrics]
    metrics/spanmetrics:
      receivers: [spanmetrics]
      exporters: [prometheus]

在 Jaeger 中定义一个兼容 PromQL 的远程存储:

extensions:
  jaeger_storage:
    backends:
      some_trace_storage:
        ...
    metric_backends:
      some_metrics_storage:
        prometheus:
          endpoint: http://prometheus:9090

jaeger_query extension 中引用该 metrics store:

extensions:
  jaeger_query:
    traces: some_trace_storage
    metrics: some_metrics_storage