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 生成的指标保持一致。
默认情况下,指标处理器会为每个指标添加以下标签:service
、span_name
、span_kind
、status_code
、status_message
、job
和 instance
。
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"
。
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
在实现过滤策略时,可以直接对固有键进行操作。例如:
---
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
。这要求用户知道并指定属性应在哪个作用域中找到,避免了不同作用域中值冲突的歧义。以下内容可能有助于说明。
---
metrics_generator:
processor:
span_metrics:
filter_policies:
- include:
match_type: strict
attributes:
- key: resource.location
value: earth
在上面的示例中,我们使用了 match_type
为 strict
,这是值的直接比较。您可以使用 regex
,这是 match_type
的另一个选项,来构建正则表达式进行匹配。
---
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.location
以 eu-
开头的 Span,然后排除那些以 dev-
开头的 Span。通过这种方式,可以实现灵活的过滤方法,以确保只生成重要的指标。