指标
在 OpenTelemetry 中,指标 是服务运行时捕获的数值。某一时刻的数值也叫指标事件(metric event),包含数值本身、时间和一些元信息。
指标仪器
指标仪器(metric instrument) 是代码中某一指标的捕获器,一个 指标仪器 包含 [1]:
- 指标名
- 类型
- 单位(可选)
- 描述(可选)
指标类型
OpenTelemetry 定义了六种指标类型 [1:1]:
同步仪器 需要在操作进行时主动调用:
- Counter
- UpDownCounter
- Histogram
异步仪器 需要提供回调函数,在特定条件下被调用,因此也无法和操作上下文关联:
- Asynchronous Counter
- Asynchronous UpDownCounter
- Asynchronous Gauge
他们的对比汇总:
类型 | 传递值方式 | 单调 | 可求和 | 调用方式 | 例子 |
---|---|---|---|---|---|
Counter | delta /cumulative |
Yes | Yes | Add() | 请求数量;请求大小 |
Asynchronous Counter | delta /cumulative |
Yes | Yes | Callback | CPU 时间 |
UpDownCounter | cumulative |
No | No | Add() | 连接数量 |
Asynchronous UpDownCounter | cumulative |
No | No | Add() | 内存使用大小 |
Histogram | delta /cumulative |
No | N/A | Record() | 请求耗时; 请求大小 |
Asynchronous Gauge | cumulative |
No | No | Callback | 内存利用率 |
对于 Counter、Asynchronous Counter 和 Histogram 类型,强烈建议使用 delta
指标而不是 cumulative
[2],这样传输的数据更小,并且对于 ClickHouse 等非 prometheus 的后端存储而言,delta
类型可以有更多计算方式。
-
方法一:环境变量
export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=DELTA
-
方法二:SDK 代码调用
import ( "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp" sdkmetric "go.opentelemetry.io/otel/sdk/metric" ) exporter, err := otlpmetrichttp.New(ctx, otlpmetrichttp.WithEndpoint(...), ... otlpmetrichttp.WithTemporalitySelector(func (kind sdkmetric.InstrumentKind) metricdata.Temporality { switch kind { case sdkmetric.InstrumentKindCounter, sdkmetric.InstrumentKindObservableCounter, sdkmetric.InstrumentKindHistogram: return metricdata.DeltaTemporality default: return metricdata.CumulativeTemporality } }), )
选择仪器
参考 uptrace[3]:
- 需要直方图、热力图或者百分位数:Histogram
- 需要统计增量值
- 如果是单调的:Counter
- 否则:UpDownCounter
- 需要统计实际值
- 数值可累加
- 如果是单调的:Asynchronous Counter
- 否则:Asynchronous UpDownCounter
- 否则:Gauge
- 数值可累加
聚合
在 OTLP 协议中,指标会被聚合后传输,专门用于展示系统的统计信息。共有三种聚合类型 [4]:
- Sum Aggregation:将窗口内测量值汇总
- Last Value Aggregation:只记录窗口内最后一个测量值
- Explicit Bucket Histogram Aggregation:记录测量值分布到不同桶(预先在视图中配置)的数量,以及最大、最小值等统计信息
视图
视图 是 SDK 中重要能力,用于调整哪些仪器被处理、被忽略,以及调整 聚合 方式。
每个指标类型都有默认聚合类型:
指标类型 | 聚合类型 |
---|---|
Counter | Sum Aggregation |
Asynchronous Counter | Sum Aggregation |
UpDownCounter | Sum Aggregation |
Asynchronous UpDownCounter | Sum Aggregation |
Histogram | Explicit Bucket Histogram Aggregation |
Asynchronous Gauge | Last Value Aggregation |
A metric is a measurement of a service captured at runtime. The moment of capturing a measurements is known as a metric event, which consists not only of the measurement itself, but also the time at which it was captured and associated metadata.[5]
https://opentelemetry.io/docs/concepts/signals/metrics/#metric-instruments ↩︎ ↩︎
https://uptrace.dev/get/opentelemetry-go.html#already-using-otlp-exporter ↩︎
https://uptrace.dev/opentelemetry/metrics.html#choosing-instruments ↩︎
https://github.com/open-telemetry/opentelemetry-go/blob/4242228103c19cabc435a75b02d7aea82aa8bf36/sdk/metric/reader.go#L158 ↩︎