oracle竖列的数据怎么变成一行
807
2022-09-08
prometheus promsql常用查询以及告警rule配置
prometheus通过指标名称以及对应的一组标签唯一定义一条时间序列。指标名称反映了监控样本的基本标识,而label在基本特征上为采集到的数据提供了多种特征的维度。用户可以基于这些特征维度过滤,聚合,统计从而产生的新的计算后的一条时间序列。
PromQl是prometheus内值的数据查询语言,其提供对时间序列数据的丰富查询,聚合以及逻辑运算能力的支持。
数据类型
在表达式中,任何表达式或者子表达式都可以归为四种类型:
instant vector瞬时向量:一组时间序列,包含每个时间序列的单个样本,所有的时间序列都共享相同的时间戳range vector 向量范围,一组时间序列,包含每个时间序列随时间变化的一些列数据点scalar标量 一个简单的浮点值string字符串,一个当前没有被使用的简单字符串
瞬时向量
允许在给点的时间戳(即时)为每个选择一组时间和单个样本值。支持用户根据时间序列的标签值匹配模式来对时间序列进行过滤,目前主要支持两种模式,完全匹配和正则匹配
示例:
#通过标签查询promethesu_| 进行分离
示例:
#查询多个环节下的时间序列,promethesu_secondsm miniutesh hoursd daysw weeksy years
示例
promethesu_offset 5m#返回昨天一天的数据样本prometheus_offset 1d
标量浮点值
标量浮点值可以直接写成形式-[.(digtis)],标量只有一个数字,没有时许。
字符串string
直接使用字符串
操作符
数学运算
+ 加法- 减法* 乘法/ 除去% 求余数^ 幂运算#查询主机内存大小,返回的是bytes,转换成Gnode_memory_MemToal_bytes /1024/1024/1024#返回多块磁盘之间的读写ionode_disk_written_bytes_total + node_disk_read_bytes_total
布尔运算
支持用户根据时间序列中的样本的值,对时间序列进行过滤,经常使用在告警规则当中。
== 相等!= 不等于> 大于< 小于>= 大于等于<= 小于等于#查询所有主机节点的内存使用率(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total#编写告警规则,内存超过95%的主机,告警(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total > 0.95
集合计算
支持的集合计算
and
or
unless 排除
运算符优先级
优先级顺序
*, /, % +, - ==, !=, <=,<,>,>=, >; and, unlessor
聚合运算
通过内置的聚合操作符号,将瞬时向量表达式返回的样本数据进行聚合,形成一个行动时间序列。
min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准差异) count (计数) count_values (对value进行计数) bottomk (后n条时序) topk (前n条时序)
聚合操作语法
其中只有count_values, quantile, topk, bottomk支持参数(parameter)。
without用于从计算结果中移除列举的标签,而保留其它标签。by则正好相反,结果向量中只保留列出的标签,其余标签则移除。通过without和by可以按照样本的问题对数据进行聚合。
举例
#查询求和sum(/120
rate()
取counter在这个时间段中平均每秒增量
rate(node_cpu_seconds_total[2m])
sum()
实际工作中cpu 大多是多核的,而node_cpu会将每个核的数据单独显示出来,我们其实不关心每个核心的单独情况,而是关心总CPU的情况。使用sum()将机器所有的数据都进行了求和,所以还要使用by(intstance)或者by(cluster_name)取出单个服务器或者一组服务器的CPU数据。
#先找出每一一个,然后在合并sum(increase(node_cpu_seconds_total[1m]))
topk()
可以从大量数据中取出排行前N的数值,N可以自定义。比如监控了100台服务器的320个cpu,使用该函数就可以查看当前负载较高的那几个,用于报警。
topk(3,node_disk_io_now)
predict_linear()
对曲线变化的速率进行计算,起到一定的预测作用。比如当前这一个小时磁盘可用率下降,这种情况可能导致磁盘很快被写满,此时使用该函数,用当前1小时的数据取预测未来几个小时的状态,实现提前告警。
#如果未来4小时后磁盘使用率为负数,则会报警predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h],4*3600)<0
常用表达式
计算cpu的使用率
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m]))by(instance)*100)
内存使用率
(node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100
磁盘使用率
100 - (node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs|rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs|rootfs"} * 100)
主机节点cpu iowait占百分比
avg(irate(node_cpu_seconds_total{mode="iowait"}[5m])) by (instance) * 100
系统1分钟负载
sum by (instance) (node_load1)
网卡流量
avg(irate(node_network_receive_bytes_total{device=~"eth0|eth1|ens33|ens37"}[1m]))by (environment,instance,device)
告警rule
prometheus进行数据采集,存储和定制告警规则;数据展示是基于grafna,告警是由alertmanager来实现。
告警过程
在prometheus server中定义告警规则以及产生的告警,alertermanager组件用处理这些告警。
prometheus触发告警过程:
本次不涉及alertmanger配置,只涉及promtherus的rule的配置
定义告警规则rule
一条典型的告警规则如下所示:
groups:- name: example rules: - alert: HighErrorRate expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 for: 10m labels: severity: page annotations: summary: High request latency description: description info
在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)。一条告警规则主要由以下几部分组成:
alert:告警规则的名称。expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
为了能够让Prometheus能够启用定义的告警规则,我们需要在Prometheus全局配置文件中通过rule_files指定一组告警规则文件的访问路径,Prometheus启动后会自动扫描这些路径下规则文件中定义的内容,并且根据这些规则计算是否向外部发送通知:
rule_files: [ -
默认情况下Prometheus会每分钟对这些告警规则进行计算,如果用户想定义自己的告警计算周期,则可以通过evaluation_interval来覆盖默认的计算周期:
global: [ evaluation_interval:
模板化
般来说,在告警规则文件的annotations中使用summary描述告警的概要信息,description用于描述告警的详细信息。同时Alertmanager的UI也会根据这两个标签值,显示告警信息。为了让告警信息具有更好的可读性,Prometheus支持模板化label和annotations的中标签的值。
# To insert a firing element's label values:{{ $labels.
配置prometheus的rule
定义告警文件
修改promethues的配置文件,按照如下修改
#前提安装好prometheus#新建url目录mkdir /usr/local/prometheus/rule#编辑prometheus的配置文件vim /usr/local/prometheus/prometheus.yml
意思是说读取rule目录下的yaml文件作为告警规则
告警规则定义举例1
配置举例,从简单的主机down高级处理
#vim node_monitor.yamlgroups:- name: node-up #告警分组 rules: - alert: node-up #监控项名称 expr: up{job="localhost-node"}==0 #正则表达式,也可以自己定义监控状态 for: 15s #for选项定义表达式的持续时长,0的话就代表一定满足 labels: severity: critical #定义了一个标签,因为上面是基于标签路由 #annnotations: #邮件注释内存,可引用变量 # summary: "{{$labels.instance}}已经停止超过15s!"
在编写完成rule之后,可以使用prometool测试rules 文件是否正确,如果不正确可能会导致prometheus服务启动失败
./promtool check config prometheus.yml./promtool check rules rule/node_monitor.yaml
说明:
1 prometheus支持使用变量来获取指定标签的值。比如#labels.
2 在创建规则文件的时候,建议不同对象建立不同的文件,比如web.yaml,mysql.yaml等
3 expr是告警表达式编写,可以根据promql来写查询表达式
4 保存退出,重启prometheus服务,查看rule是否生效
5 测试告警规则是否生效。关闭node_exporter的监控。
systemctl stop node_exporter
状态说明
incative: 非活动状态,表示正在监控,但是还未有任何报警触发Pending :表示这个警报必须触发。由于报警可以被分组,压抑/抑制或者静默/静音,所以等待验证,一旦所有验证通过,则转为firing状态firing 将警报发送到AlertManger,他将按照配置将警报发送给所有接收者。但是一旦警报解除,就会恢复到incative状态,如此循环
告警规则定义举例2
创建hoststats-alert.yaml
groups:- name: hostStatsAlert rules: - alert: hostCpuUsageAlert expr: sum(avg without (cpu)(irate(node_cpu{mode!='idle'}[5m]))) by (instance) > 0.85 for: 1m labels: severity: page # annotations: # summary: "Instance {{ $labels.instance }} CPU usgae high" # description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})" - alert: hostMemUsageAlert expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85 for: 1m labels: severity: page #annotations: # summary: "Instance {{ $labels.instance }} MEM usgae high" # description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
重启prometheus,查看当前加载的规则文件
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~