跳到主要内容

监控(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 文件中。