概述
本部分将阐述监控以及监控的实现 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。