指标模型
2 分钟阅读
简要概述
使用 OTLP 模型传输数据,然后导出到现有系统中,数据模型可以明确转换为 Prometheus Remote Write 协议,而不会丢失数据。
主要有三种保留语义的数据转换,它们在构建指标收集系统时非常有用,可以控制成本、可靠性和资源分配。该模型在数据产生时可选择在 SDK 内转换,或在 OTEL 收集器内处理数据转换,这三种转换分别为:
- 时间重新聚合
将高频收集的指标重新聚合为更长的间隔,从而可预先计算或使用低分辨率时间序列来代替原始指标数据。
- 空间重新聚合
对不需要的属性的指标可以重新聚合,以丢弃这些属性,降低存储空间。
- 累积或计算增量
具有增量时间性的输入和输出指标减轻了客户端保持高基数状态的负担。
增量的使用允许下游服务承担转换为累积时间序列的成本,或者放弃成本并直接计算费率。
模型详情
事件
是记录数据的地方,它的基础是仪器(Instruments),主要数据是指标数据点(时间戳+值),用于通过事件记录观测数据,然后将这些原始事件发送到其他系统之前以某种方式进行转换。
上图显示了仪器(Instruments)如何将事件转换为多种类型的指标流。
尽管观测事件数据可以直接报告给后端,但在生产环境中这是不建议的,因为可观测性系统中使用的数据量太大,但可用于遥测收集的网络等资源有限,所以在上报数据前最后要想办法降低指标基数,如采用直方图指标类型压缩指标等。
时间序列
表示后端如何存储指标数据。
时间序列由几个元数据属性组成的实体定义:
- 指标名称:Metric name
- 属性(维度):Attributes (dimensions)
- 数据点的值(整数、浮点等):Value type of the point (integer, floating point, etc)
- 计量单位:Unit of measurement
每个时间序列的主要数据都是按顺序排列的(时间戳、值)点,具有以下值类型之一:
- 计数器(单调,累计):Counter (Monotonic, Cumulative)
- 测量:Gauge
- 直方图:Histogram
- 指数直方图:Exponential Histogram
这个模型类似 Prometheus Remote Write 协议,但它并不是 OTLP 映射的唯一时间序列模型。
数据传输
OpenTelemetry Protocol(OTLP)数据模型由指标数据流组成(由多个指标数据点组成)。指标数据流可以直接转换为时间序列。
指标流被分组为各个度量对象,由以下各项标识:
- 原始资源属性
Resource
- 检测范围(例如,检测库名称、版本)
Scope
- 指标流的名称
name
包括名称在内,指标对象由以下属性定义:
- 数据点类型:Sum, Gauge, Histogram ExponentialHistogram, Summary
- 指标流的单位:unit
- 指标流的描述:description
- 内在数据点属性,如适用:聚合临时性、单调性
数据点类型、指标流的单位和内在数据点属性被认为是可识别的,而指标流的描述在本质上显然不是可识别的。
特定点的外在特性不被认为是可识别的;这些包括但不限于:
- 直方图数据点的桶边界
- 指数直方图数据点的刻度或桶计数。
Metric对象包含由属性集标识的各个流。在各个流中,点由一个或两个时间戳标识,细节因数据点类型而异。
在某些数据点类型(例如总和和仪表)中,允许数值点值发生变化;在这种情况下,相关的变化(即浮点与整数)不被认为是可识别的。
指标点(Metric points)
Sums
一组数据点,聚合方式为增量(Delta)或累积(Cumulative),每个数据点包含独立的属性名称值对。
在各种用例中,具体使用哪种聚合方式存在各种权衡,例如:
- 检测进程重新启动(累积值重新由 0 开始)
- 计算费率(计算增量,当前时间指标值 - 前一个时间指标值)
- 基于推送与拉取的指标报告
OTLP 支持这两种模型,并允许 API、SDK 和用户为其用例确定最佳折衷方案。
- 对指标做临时增量(Delta)
当聚合时间性是增量时(类似 prometheus rate 计算函数),指标流的时间窗口没有重叠,值不会出现负数。
- 对指标做临时累积(Cumulative)
当聚合时间性是累积时,计算自应用启动以来的时间窗口(起始,结束])所有值的求和,值为单调递增,也就是当前值不会小于前一个。
Gauge
一组数据点,表示在给定时间的采样值,每个数据点包含一组独立的属性名称值对。
指标流中的一个点表示给定时间窗口内的最后采样事件,一般用于以下场景:
- 采样值(例如当前CPU温度)
- 对值进行采样时的时间戳(time_unix_ano)
- 时间戳(start_time_unix_ano),它最能代表可以记录测量的第一个可能时刻。这通常设置为度量收集系统启动时的时间戳。
使用 Gauge 进行采样的基本时间序列,在给定的时间间隔内进行多次采样,但只有最后一个值通过 OTLP 在指标流中报告。
区别于 Sum 该不提供聚合语义,而是在执行时间窗口或调整精度等操作时使用“最后样本值”。
可以通过转换为直方图或其他度量类型来聚合度量。默认情况下不会执行这些操作,并且需要直接的用户配置。
Histogram
直方图以压缩格式记录测量的总体,它将一组事件捆绑成具有总体事件计数和所有事件的总和。
指标会自动压缩聚合,默认以 “bucket” “sum” “count” 三中类型组成:
- “count” 该指标被观测到的次数,计数累计值
- “sum” 该指标被观测到的值总和,值累计总和
- “bucket” 该指标被观测到的值被放到一个预先定义好值边界 (le1, le2] 范围内,计数累计值
以 otelgrpc 中指标 “rpc.server.duration” 为示例,并以 prometheus 风格导出:
# HELP rpc_server_duration_milliseconds
# TYPE rpc_server_duration_milliseconds histogram
rpc_server_duration_milliseconds_bucket{rpc_grpc_status_code="0",rpc_method="Test",rpc_system="grpc",le="0"} 0
rpc_server_duration_milliseconds_bucket{rpc_grpc_status_code="0",rpc_method="Test",rpc_system="grpc",le="5"} 0
......
rpc_server_duration_milliseconds_bucket{rpc_grpc_status_code="0",rpc_method="Test",rpc_system="grpc",le="10000"} 1
rpc_server_duration_milliseconds_bucket{rpc_grpc_status_code="0",rpc_method="Test",rpc_system="grpc",le="+Inf"} 1
rpc_server_duration_milliseconds_sum{rpc_grpc_status_code="0",rpc_method="Test",rpc_system="grpc"} 369
rpc_server_duration_milliseconds_count{rpc_grpc_status_code="0",rpc_method="Test",rpc_system="grpc"} 1
Bucket 的上界是包含的(上界为 +Inf 的情况除外),而 Bucket 的下界是互斥。也就是说,bucket 表示大于其下界且小于或等于其上界的值的数量。
ExponentialHistogram
指数直方图。
TODO;
Summary(已废弃)
概要统计,不建议使用已被废弃。
在 Go 语言中使用
同步或异步
仪器(Instruments)支持同步或异步导出指标值,且值类型为 int64 或 float64 两个类型。
同步行为
是在被调用时进行测量,测量在程序执行期间作为另一个调用来完成,就像执行其他业务函数一样。 这些测量值的聚合由配置的导出器定期导出。由于测量与导出值解耦,因此导出周期可能包含零个或多个聚合测量。
异步行为
是在 SDK 导出时才会调用创建提供给仪器(Instruments)的回调函数。 此回调为 SDK 提供了一个立即导出的指标值,异步仪器上的所有测量在每个输出周期执行一次。
异步主要在以下几种场景使用:
- 当更新指标值在函数内代价较高,并且不希望当前执行线程等待测量函数;
- 导出指标需要以与程序执行无关的频率发生(即当与请求生命周期联系在一起时,无法准确测量);
- 测量值没有已知的时间戳。
计数器 Counter
累积计数器,支持非负增量的仪器,也就是这些值永远不会减少(服务重启时重置为0),运行期间逐渐累加:
Int64Counter
Int64ObservableCounter
Float64Counter
Float64ObservableCounter
导出为 prometheus 格式时自动添加 “_count” 后缀。
计数器 UpDown
递增或者递减计数器,允许您观察递增或递减的累积值:
Int64UpDownCounter
Int64ObservableUpDownCounter
Float64UpDownCounter
Float64ObservableUpDownCounter
导出为 prometheus 格式时同 Gauge 类型。
测量 Gauge
比较随机值非累加,当只需要传达关于异步测量的最新数据时使用:
Int64ObservableGauge
Float64ObservableGauge
直方图 Histogram
当需要传达更多关于采集周期内进行的所有同步测量的信息时,应使用直方图:
Int64Histogram
Float64Histogram