Prometheus客户库提供了四个核心的metrics类型。这四种类型目前仅在客户库和wire协议中区分。
每一个时间序列数据由metric度量指标名称和它的标签labels键值对集合唯一确定。
这个metric度量指标名称指定监控目标系统的测量特征(如:http_requests_total- 接收http请求的总计数). metric度量指标命名ASCII字母、数字、下划线和冒号,他必须配正则表达式。
标签开启了Prometheus的多维数据模型:对于相同的度量名称,通过不同标签列表的结合, 会形成特定的度量维度实例。(例如:所有包含度量名称为/api/tracks的http请求,打上method=POST的标签,则形成了具体的http请求)。这个查询语言在这些度量和标签列表的基础上进行过滤和聚合。改变任何度量上的任何标签值,则会形成新的时间序列图
标签label名称可以包含ASCII字母、数字和下划线。它们必须匹配正则表达式。带有_下划线的标签名称被保留内部使用。
标签labels值包含任意的Unicode码。
counter 是一个累计度量指标,它是一个只能递增的数值。计数器主要用于统计服务的请求数、任务完成数和错误出现的次数等等。计数器是一个递增的值。反例:统计goroutines的数量。
gauge是一个度量指标,它表示一个既可以递增, 又可以递减的值。
测量器主要测量类似于温度、当前内存使用量等,也可以统计当前服务运行随时增加或者减少的数量,比如线程池的相关指标就可以使用gauge来进行统计。
histogram,是柱状图,在Prometheus系统中的查询语言中,有三种作用:
对每个采样点进行统计,打到各个分类值中(bucket)
对每个采样点值累计和(sum)
对采样点的次数累计和(count)
度量指标名称: [basename]的柱状图, 上面三类的作用度量指标名称
[basename]_bucket{le=”上边界”}, 这个值为小于等于上边界的所有采样点数量
[basename]_sum
[basename]_count
小结:所以如果定义一个度量类型为Histogram,则Prometheus系统会自动生成三个对应的指标
使用histogram_quantile()函数, 计算直方图或者是直方图聚合计算的分位数阈值。一个直方图计算Apdex值也是合适的, 当在buckets上操作时,记住直方图是累计的。
类似histogram柱状图,summary是采样点分位图统计,(通常的使用场景:请求持续时间和响应大小)。它也有三种作用:
对于每个采样点进行统计,并形成分位图。(如:正态分布一样,统计低于60分不及格的同学比例,统计低于80分的同学比例,统计低于95分的同学比例)
统计班上所有同学的总成绩(sum)
统计班上同学的考试总人数(count)
带有度量指标的[basename]的summary 在抓取时间序列数据展示。
观察时间的φ-quantiles (0 ≤ φ ≤ 1), 显示为[basename]{分位数=“[φ]”}
[basename]_sum, 是指所有观察值的总和
[basename]_count, 是指已观察到的事件计数值
公司原先skywalking-agent的对连接池指标的采集实现的原理是在池构造器时拦截,创建定时线程去采集池的指标并使用的 Counter 来记录,这种记录会导致指标值一直上涨,所以有增加了记录采集次数的指标以此来做除获取平均值。这样子的实现不仅浪费了存储还导致出来的数据不准确,因为可能变化的数据被平均了。
那么是否存在一种方式可以直接获取池的指标值呢?答案是存在的。gauge 就可以很好地实现。
既然 gauge 用来记录一个可变的值,那么应该有相应的API来实现这个功能。我们使用 micrometer-core 来做prometheus的客户端sdk,它里面的
Metrics.gauge就可以来处理。
public static <T> T gauge(String name, Iterable<Tag> tags, T obj, ToDoubleFunction<T> valueFunction) {
return globalRegistry.gauge(name, tags, obj, valueFunction);
}
name:就是我们要指定的指标名
tags:代表标签列表
obj:监控的对象
valueFunction:监控对象执行的方法
对于我们要监控连接池的指标信息,那么 obj 就是数据源,要是druid连接池这里就是 DruidDataSource ,要获取活跃连接数,那么 valueFunction 就是 getActiveCount 。完整的demo案例如下:
Metrics.gauge(MetricsConfig.SERVICE_MYSQL_CLI_POOL_ACTIVE_CONN, tags, druidDataSource, DruidDataSource::getActiveCount);