菜单
开源

Span 指标

Span 指标处理器从采集的追踪数据生成指标,包括请求、错误和持续时间 (RED) 指标。

Span 指标生成两种指标

  • 计算请求数的计数器
  • 跟踪所有请求持续时间分布的直方图

如果您的系统尚未进行指标监控,但已实现了分布式追踪,那么 Span 指标将特别有用。您可以直接从追踪流水线中获得开箱即用的指标。

即使您已有指标,Span 指标也能为您的系统提供深入的监控。生成的指标将展示应用程序级别的监控洞察,前提是追踪数据能够贯穿您的应用程序传播。

最后但同样重要的是,Span 指标降低了使用 Exemplars 的门槛。Exemplar 是在给定时间间隔内测量的代表性追踪数据。由于追踪数据和指标在 Metrics-generator 中共存,Exemplars 可以自动添加,为这些指标提供额外价值。

如何运行

要在 Tempo 或 Grafana Enterprise Traces 中启用 Span 指标,请启用 Metrics-generator 并添加一个 overrides 部分来启用 span-metrics 处理器。请参阅配置详情

如果您想为您的 Grafana Cloud 账户启用 Metrics-generator,请参阅Grafana Cloud 中 Metrics-generator 的文档

工作原理

Span 指标处理器通过检查每个接收到的 Span,并计算每个唯一维度组合的 Span 总计数和持续时间。维度可以是服务名称、操作、Span 类型、状态码以及 Span 中存在的任何属性。

此处理器复制了 OpenTelemetry Collector 中同名处理器的实现。OTel spanmetricsprocessor 现已弃用,并替换为Span metric connector

注意

要了解更多关于基数以及如何执行 Metrics-generator 干运行的信息,请参阅基数文档

指标

导出以下指标

指标类型标签描述
traces_spanmetrics_latency直方图维度Span 的持续时间
traces_spanmetrics_calls_total计数器维度Span 的总计数
traces_spanmetrics_size_total计数器维度采集的 Span 总大小

注意

在 Tempo 1.4 和 1.4.1 版本中,直方图指标名为 traces_spanmetrics_duration_seconds。此名称后来被更改,以与 Grafana Agent 和 OpenTelemetry Collector 生成的指标保持一致。

默认情况下,指标处理器会为每个指标添加以下标签:servicespan_namespan_kindstatus_codestatus_messagejobinstance

  • service - 生成 Span 的服务名称
  • span_name - Span 的唯一名称
  • span_kind - Span 的类型,可以是以下五种值之一
    • SPAN_KIND_SERVER - Span 由来自另一个服务的调用生成
    • SPAN_KIND_CLIENT - Span 调用了另一个服务
    • SPAN_KIND_INTERNAL - Span 没有与生成它的服务之外进行交互
    • SPAN_KIND_PUBLISHER - Span 创建了被推送到总线或消息代理的数据
    • SPAN_KIND_CONSUMER - Span 消费了总线或消息系统中的数据
  • status_code - Span 的结果,可以是以下三种值之一
    • STATUS_CODE_UNSET - Span 结果未设置/未知
    • STATUS_CODE_OK - Span 操作成功完成
    • STATUS_CODE_ERROR - Span 操作完成但出现错误
  • status_message (可选启用) - 详细说明 status_code 标签原因的消息
  • job - 作业名称,是命名空间和服务组合;仅在 metrics_generator.processor.span_metrics.enable_target_info: true 时添加
  • instance - 实例 ID;仅在 metrics_generator.processor.span_metrics.enable_target_info: true 时添加

可以使用dimensions 配置选项创建其他用户定义的标签。当配置的维度与默认标签之一(例如 status_code)冲突时,相应维度的标签会加上双下划线前缀(例如 __status_code)。

还支持使用dimension_mapping 配置选项进行维度的自定义标记。

可以使用enable_target_info 配置选项启用一个名为 traces_target_info 的可选指标,该指标将所有资源级别属性用作维度。

如果您使用基于比例的采样器,可以使用下面的自定义采样器来避免丢失指标信息。但是,您还需要将 metrics_generator.processor.span_metrics.span_multiplier_key 设置为 "X-SampleRatio"

Go
package tracer
import (
	"go.opentelemetry.io/otel/attribute"
	tracesdk "go.opentelemetry.io/otel/sdk/trace"
)

type RatioBasedSampler struct {
	innerSampler        tracesdk.Sampler
	sampleRateAttribute attribute.KeyValue
}

func NewRatioBasedSampler(fraction float64) RatioBasedSampler {
	innerSampler := tracesdk.TraceIDRatioBased(fraction)
	return RatioBasedSampler{
		innerSampler:        innerSampler,
		sampleRateAttribute: attribute.Float64("X-SampleRatio", fraction),
	}
}

func (ds RatioBasedSampler) ShouldSample(parameters tracesdk.SamplingParameters) tracesdk.SamplingResult {
	sampler := ds.innerSampler
	result := sampler.ShouldSample(parameters)
	if result.Decision == tracesdk.RecordAndSample {
		result.Attributes = append(result.Attributes, ds.sampleRateAttribute)
	}
	return result
}

func (ds RatioBasedSampler) Description() string {
	return "Ratio Based Sampler which gives information about sampling ratio"
}

过滤

在某些情况下,您可能希望减少 spanmetrics 处理器生成的指标数量。您可以配置处理器使用 include 过滤器来匹配 Span 中必须存在的条件以便包含它。在 include 过滤器之后,您可以使用 exclude 过滤器来拒绝先前通过过滤策略包含的部分数据。

目前,仅支持按资源和 Span 属性进行过滤,支持以下值类型:

  • bool
  • double
  • int
  • string

此外,还可以对这些固有 Span 属性进行过滤

  • name
  • status (code)
  • kind

可用于过滤的固有类型如下。

  • SPAN_KIND_SERVER
  • SPAN_KIND_INTERNAL
  • SPAN_KIND_CLIENT
  • SPAN_KIND_PRODUCER
  • SPAN_KIND_CONSUMER

在实现过滤策略时,可以直接对固有键进行操作。例如:

yaml
---
metrics_generator:
  processor:
    span_metrics:
      filter_policies:
        - include:
            match_type: strict
            attributes:
              - key: kind
                value: SPAN_KIND_SERVER

在此示例中,kind 为“server”的 Span 将被包含以进行指标导出。

基于非固有属性选择 Span 时,需要指定属性的作用域,类似于在 TraceQL 中指定的方式。例如,如果 resource 包含要在过滤策略中使用的 location 属性,则需要将其引用指定为 resource.location。这要求用户知道并指定属性应在哪个作用域中找到,避免了不同作用域中值冲突的歧义。以下内容可能有助于说明。

yaml
---
metrics_generator:
  processor:
    span_metrics:
      filter_policies:
        - include:
            match_type: strict
            attributes:
              - key: resource.location
                value: earth

在上面的示例中,我们使用了 match_typestrict,这是值的直接比较。您可以使用 regex,这是 match_type 的另一个选项,来构建正则表达式进行匹配。

yaml
---
metrics_generator:
  processor:
    span_metrics:
      filter_policies:
        - include:
            match_type: regex
            attributes:
              - key: resource.location
                value: eu-.*
        - exclude:
            match_type: regex
            attributes:
              - key: resource.tier
                value: dev-.*

在上面,我们首先使用 include 语句包含所有 resource.locationeu- 开头的 Span,然后排除那些以 dev- 开头的 Span。通过这种方式,可以实现灵活的过滤方法,以确保只生成重要的指标。

示例

Span metrics overview