监控(Monitoring)
本章节介绍监控及其通过 tally 的实现。后续章节将详细说明监控指标、统计实现、指标收集等 tally 的相关内容。
什么是 tally
tally 是一个面向多线程环境的监控指标收集库。它支持 Prometheus 指标收集和聚合,并整合了系统指标统计的监控和计数功能。
指标模型(Metric Model)
指标用于衡量性能、资源消耗、效率等软件属性随时间的变化趋势。它们可以帮助工程师通过告警和仪表盘监控一系列测量值(如 CPU/内存使用量、请求时长、延迟等)的演化。指标在 IT 监控领域有着悠久的历史,并与日志、分布式追踪一起被广泛使用,用于发现系统异常行为。
最基本的形式中,一个指标数据点包含三个组成部分:
- 指标名称
- 数据点采集的时间戳
- 数值测量值
计数器(Counter)
计数器类型指标用于单调递增的测量。因此,其值总是累积的,只能增加。唯一的例外是计数器被重置(例如系统重启后),此时其值会被置为零。
计数器的绝对值通常单独使用意义不大。计数器值常用于计算两个时间点之间的增量或随时间的变化率。
- 计数器类型,值单调递增(不减少)
- 适用于测量运行时间、请求量等
- 对系统重启具有抗性(大多数实现中,重启不会将值重置为零)
仪表(Gauge)
仪表指标用于测量值可以任意增加或减少的情况。这是许多工程师更熟悉的指标类型,因为原始值本身就有意义,无需额外处理。例如温度、CPU/内存使用率或队列长度等指标。
- 仪表类型,反映指标的实时变化
- 支持增加和减少;适用于 CPU/内存使用率
- 大多数监控数据类型属于仪表类型
直方图(Histogram)
直方图指标用于表示测量值的分布。它们常用于测量请求时长、响应大小等指标。
直方图将测量值的整个范围划分为若干区间(称为桶),并统计每个桶中落入的测量次数。
指标定义(Metric Definition)
<metric name>{<label name>=<label value>, ...}
指标名称(Metric Name)
描述指标的含义。
指标名称必须由字母、数字、下划线或冒号组成,符合正则表达式 [a-zA-Z:][a-zA-Z0-9:]。
冒号不得用于 exporter 中。
标签(Label)
反映指标的维度特征,用于过滤和聚合。 标签由键值对组成,可形成指标的多个维度。
指标格式(Metric Formatting)
tally 内置支持 Prometheus 格式,也允许自定义输出格式。
以下是 Prometheus 暴露格式的示例:
# HELP http_requests_total Total number of http api requests
# TYPE http_requests_total counter
http_requests_total{api="add_product"} 4633433
# HELP 提供指标说明,# TYPE 指定指标类型。4633433 是具体指标值,api="add_product" 是标签键值对。
实现(Implementation)
它利用 线程局部存储 来减少缓存抖动。与 std::mutex 相比,对程序几乎没有性能开销,而且比频繁争用的原子操作更快。
tally 变量设计用于 写操作远多于读操作的场景。不适用于读操作相对频繁的场景。
集成 tally(Integrating tally)
kmpkg install tally
或者参考 kmpkg 文档,将 tally 集成到项目的 kmpkg.json 文件中。