开源工具
Prometheus(普罗米修斯)和Grafana
1.prometheus简介
Prometheus 是一个开源的服务监控系统和时间序列数据库。
Prometheus通过targets的http 入口点抓取和收集指标。它自己也以同样的方式暴露自己的数据,因此它也能抓取和监控自己的健康。
1)启动前的常规配置
Scrape_configs:
抓取目标指标的时间间隔:scrape_interval: 5s
Job的名字:- job_name: ‘prometheus’
抓取指标的目标对象配置:
static_configs:
- targets: [‘localhost:9090’]
2)指定配置的prometheus启动
./prometheus -config.file=prometheus.yml
3)注意事项
Prometheus默认使用3G内存,若机器内存较小,可以调整prometheus使用更少的内存。
4)一个job几个组的endpoints
scrape_configs:
- job_name: 'example-random'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:8080', 'localhost:8081']
labels:
group: 'production'
- targets: ['localhost:8082']
labels:
group: 'canary'
5)预先把表达式记录成完整的持久化的时间序列,可以加速聚合查询的效率。
新建prometheus.rules文件,并输入如下内容:
job_service:rpc_durations_seconds_count:avg_rate5m = avg(rate(rpc_durations_seconds_count[5m])) by (job, service)
然后配置到prometheus.yml文件中,
rule_files:
- 'prometheus.rules'
现在,指标名字job_service:rpc_durations_seconds_count:avg_rate5m就是可查询和可以抓取的。
6)Prometheus内置的表达式浏览器
http://localhost:9090/graph 和../metrics,以及可进入表达式console。
允许键入任何的表达式,并查看结果不管是table或随着时间的graphed。
2.Prometheus查询语法
参考网址:https://prometheus.io/docs/querying/basics/
1)表达式的四种数据类型
Instant vector:包含单一采样的时间序列集合,共享相同的时间戳;
Range vector:包含一个区间数据点的时间序列集合;
Scalar:数字型的浮点值;
String:字符串值,当前未使用。
2)Intant vector时间序列选择器
直接使用指标的name表示选择所有该name的时间序列。添加一个大括号{},指明label和对应value可以进一步过滤该时间序列。Label和value的匹配可以有四种形式:
=:选择label的值与value相等的
!=:选择label的值与value不相等的
=~:匹配正则表达式值的
!~:不匹配正则表达式值的
示例查询如下:
http_requests_total{job="prometheus",group="canary"}
http_requests_total{environment=~"staging|testing|development",method!="GET"}
很明显,可以使用多个label进行多条件的过滤。
3)Range vector时间序列选择器
可以使用的时间区间的单位可以有以下六种:
S秒、m分钟、h小时、d天、w星期、y年
表示从当前往前推一段时间之内的指标的值的统计量,示例查询如下:
http_requests_total{job="prometheus"}[5m]
主要是在{}之后紧跟一个[5m],进行时间区间的选择。当然可以进行时间基准的向前偏移,这里使用offset,示例查询如下:
http_requests_total offset 5m
rate(http_requests_total[5m] offset 1w)
4)二元和聚合算子
参考网址:https://prometheus.io/docs/querying/operators/
二元算术算子:+、-、*、/、%、^(power/exponentiation)
二元比较算子:==、!=、>、<、>=、<=
二元集合算子:and(交集)、or(并集)、unless(补集)
算子使用的语法示例如下:
ignoring()
on()
聚合算子类似于SQL中的select中的函数的功能,能够聚合单一的instant vector并产生一个新的有聚合值的更少元素的vector,主要包含以下聚合算子:
Sum:每一个维度求和
Min:选择每一维度的最小值
Max:选择每一维度的最大值
Avg:每一维度求平均
Stddev:计算每一个维度的总体标准偏差
Stdvar:计算每一维度的总体标准方差
Count:统计vector中元素的个数
Count_values:统计有相同值元素的个数
Bottomk:相同值最小的k个元素
Topk:相同值最大的k个元素
Quantile:计算每一维度的α-quantile
聚合算子的语法示例如下:
([parameter,] ) [without|by ()] [keep_common]
其示例的代码如下:
sum(http_requests_total) without (instance)
count_values("version", build_version)
topk(5, http_requests_total)
5)函数
对vector中的所有元素的样例值进行处理,或者对vector进行一些逻辑判断并返回符合逻辑的vector或vector的数量。更详细的内容可以查看参考:
https://prometheus.io/docs/querying/functions/
3.常用组件
1)dashboard看板
每一个看板可以认为是一个监控的主题,每个看板有row和panel的概念。Row占一行的空间,每一个row又可以包含最多十二个panel。每一个panel具体显示监控的时间序列指标,显示的方式可以是折线图、饼图等。对于不同的图形可设置的属性不同,大体包括标题、图注、显示样式以及最重要的指标的查询语句和数据源的设置。
随后点击panel的标题,跳出panel的菜单项,点击编辑进入panel的编辑模式。
2)Templating变量
参考网址:http://docs.grafana.org/reference/templating/
自定义查询语句中可用的变量,其类型可以是query、interval、custom、constant等。其中较为常用的query表示的是指标的查询结果,常用的有label_values(label)、label_values(metric, label)、metric(metric)、query_result(query)。
在panel的query中定义查询语句时,变量的使用有两种写法:$/[[varname]]。
完成变量的定义之后,会在看板的第一个row之上显示成dropdown下拉列表的形式,通过选择不同的值来动态改变变量的值,从而完成panel中显示指标的差异化。
3)Annotations标注
在某个事件发生时,可以在对应的图上标注点标记,常用来与alert事件关联。首先,在某个具体的panel中定义alert事件,注意alert name的定义。然后选择面板正上方的设置,选择annotations选项,添加一个annotations,这里主要注意Query中Search expression的写法,一种通用的写法是:
ALERTS{alertname="per_above_test_alert", alertstate="pending|firing"}
其中alertname就是之前定义的alert的name,而之中的alertstate就是在alert的状态是什么的时候出发annotation的标记。以及这里的step表示做标记这个时间隔多长时间出发一次。