Skip to main content
Version: 1.1.1

概述

本部分将阐述监控以及监控的实现 tally。以下章节将展开介绍tally中的监控指标,统计实现,监控收集等细节。

什么是tally

tally是多线程环境下的监控指标收集库。支持prometheus指标收集和聚合。并集成了系统指标 统计的监控和计数库。

指标模型

指标是用来衡量性能、消耗、效率和许多其他软件属性随时间的变化趋势。它们允许工程师通过警报和仪表盘来监控一系列测量值的演变(如CPU或内存使 用量、请求持续时间、延迟等)。指标在IT监控领域有着悠久的历史,并被工程师广泛使用,与日志和链路追踪一起被用来检测系统是否有不符合预期的表现。 在其最基本的形式中,一个指标数据点是由以下三个部分构成:

  • 一个指标名称
  • 收集该数据点的时间戳
  • 一个由数字表示的测量值

计数器(Counter)

Counter类型指标被用于单调增加的测量结果。因此它们总是累积的数值,值只能上升。唯一的例外是Counter重启,在这种情况下,它的值会被重置为零。 Counter的实际值通常本身并不十分有用。一个计数器的值经常被用来计算两个时间戳之间的delta或者随时间变化的速率。

  • 计数器类型,只增不减
  • 适用于机器启动时间、访问量、
  • 具有很好的不相关性,不会因为机器重启而置0

仪表(Gauge)

Gauge指标用于可以任意增加或减少的测量。这是你可能更熟悉的指标类型,因为即使没有经过额外处理的实际值也是有意义的,它们经常被使 用到。例如,测量温度、CPU和内存使用的指标,或者队列的大小都是Gauge。

  • 仪表盘,表征指标的实时变化情况。
  • 可增可减,CPU和内存使用量。
  • 大部分监控数据类型都是Gauge类型的

直方图(Histogram)

Histogram指标对于表示测量的分布很有用。它们经常被用来测量请求持续时间或响应大小。 直方图将整个测量范围划分为一组区间,称为桶,并计算每个桶中有多少测量值。

指标定义

<metric name>{<label name>=<label value>, ...}

指标名称(metric name)

用于说明指标的含义 指标名称必须有字母、数字、下划线或者冒号组成 符合正则表达式 [a-zA-Z:][a-zA-Z0-9:] 冒号不能用于exporter

标签(label)

体现指标的维度特性,用于过滤和聚合 通过标签名和标签值组成,键值对形式形成多种维度

指标格式化

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"为一个label对。

实现

它利用了thread local存储减少了cache bouncing,相比std::mutex几乎不会给程序增加性能开销,也快于竞 争频繁的原子操作。tally variable设计使用场景是多写少读场景,对于读相对较为频繁的场景,不应该 使用tally variable。

集成tally

    kmpkg install tally

或参见kmpkg,在项目中的kmpkg.json中集成tally。