原文链接:https://www.cnblogs.com/SleepDragon/p/10642955.html
数据类型
Counter(计数器类型)
Counter类型的指标的工作方式和计数器一样,只增不减(除非系统发生了重置),Counter一般用于累计值。
Gauges(仪表盘类型)
Gauges是可增可减的指标类,可以用于反应当前应用的状态。比如在监控主机时,可用内存大小。
Histograms(直方图类型)
主要用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,代表的是⼀种近似的百分⽐估算数值。举例说明: 如果你想监控用户的访问时间,将nginx日志的http_response_time列的数据全部采集下来,然后算一下总的平均值即可。但是这没有意义,如果只有一个用户请求特别慢,那么就会拉低总的平均值,而且你也发现不了小部分的问题。这时可以使用histogram来比较~=0.05秒的量有多少,0 ~ 0.05秒的有多少,>2秒的有多少,>10秒的有多少。
Summary(摘要类型)
Summary 和 Histogram 类似,主要用于表示一段时间内数据采样结果(通常时请求持续时间或响应大小),它直接存储了quantile数据,而不是根据统计区间计算出来的。
标签匹配运算符
- =:选择与提供的字符串完全相同的标签。
- !=:选择不等于提供的字符串的标签。
- =~:选择正则表达式匹配提供的字符串(或子字符串)的标签。
- !~:选择不与提供的字符串(或子字符串)匹配的标签。
注释: 标签名称的匹配可以使用如下方示例:
(1)http_requests_total{environment=~"staging|testing|development",method!="GET"}
(2)http_requests_total{job=~".+",method!="GET"}
(3)http_requests_total{job=~".",method!="GET"}*
范围向量选择器
时间长度被追加在向量选择器尾部的方括号[]中,用以指定对于每个样本范围区间中的每个元素应该抓取的时间范围样本区间。
- s - seconds
- m - minutes
- h - hours
- d - days
- w - weeks
- y - years
示例: 取出过去5分钟内,度量指标名称为http_requests_total,标签为job="prometheus"的时间序列数据
http_requests_total{job="prometheus"}[5m]
位置修饰符
offset偏移修饰符,允许在查询中改变单个瞬时向量和范围向量中的时间偏移
示例: 取出相对于当前时间的前一周,过去五分钟的http_requests_total的速率:
rate(http_requests_total[5m] offset 1w)
逻辑/集二元运算符(逻辑/集合二元操作符)
- and 交集
- or 并集
- unless 补集
vector1 and vector2 的逻辑/集合二元操作符,规则:vector1瞬时向量中的每个样本数据与vector2向量中的所有样本数据进行"标签"匹配,不匹配的,全部丢弃。运算结果是保留左边的度量指标名称和值。
示例:
公式:
node_cpu_seconds_total{job='test',cpu='1',mode=~"idle|system|user"} and node_cpu_seconds_total{mode=~"system|user"}
返回的结果:
node_cpu_seconds_total{cpu="1",instance="gitlab:9100",job="test",mode="user"}
node_cpu_seconds_total{cpu="1",instance="gitlab:9100",job="test",mode="system"}
vector1 or vector2 的逻辑/集合二元操作符,规则:返回vector1中的所有元素和值,以及vector2中没有在vector1中匹配到的元素.
示例:
公式:
node_cpu_seconds_total{job='test',cpu='1',mode=~"user"} or node_cpu_seconds_total{cpu='1',job='test2',mode=~"system|user"}
返回的结果:
node_cpu_seconds_total{cpu="1",instance="gitlab:9100",job="test",mode="user"} 22.92
node_cpu_seconds_total{cpu="1",instance="gitlab:9100",job="test2",mode="system"} 54.14
node_cpu_seconds_total{cpu="1",instance="gitlab:9100",job="test2",mode="user"} 22.91
vector1 unless vector2的逻辑/集合二元操作符,又称差积。规则:包含在vector1中的元素,但是该元素不在vector2向量所有元素列表中,则写入到结果集中。
示例:
公式:
node_cpu_seconds_total{job='test',cpu='1',mode=~"user|system|idle"} unless node_cpu_seconds_total{mode=~"system|user"}
返回的结果:
node_cpu_seconds_total{cpu="1",instance="gitlab:9100",job="test",mode="idle"}
聚合运算符:
Prometheus支持下面的内置聚合操作符。这些聚合操作符被用于聚合单个即时向量的所有时间序列列表,把聚合的结果值存入到新的向量中。
(1). sum (在所有的value上求和)
sum(node_cpu_seconds_total{job="test"})
(2). max (在所有的value求最大值)
max(node_cpu_seconds_total{job="test"})
(3). min (在所有的value求最小值)
min(node_cpu_seconds_total{job="test"})
(4). avg (在所有的value上求平均值)
avg(node_cpu_seconds_total{job="test"})
(5). stddev (求标准差)
(6). stdvar (求方差)
(7). count (统计向量元素的个数)
count(node_cpu_seconds_total{job="test"})
(8). count_values (统计相同数据值的元素数量)
count_values("tag",node_cpu_seconds_total{cpu="0",mode="nice"}) #tag是标签名
(9). bottomk (在维度上取几个最小值)
bottomk(3,node_cpu_seconds_total{instance="gitlab:9100",cpu="0",mode=~"idle|nice|softirq"})
(10). topk (在维度上取几个最大值)
topk(3,node_cpu_seconds_total{instance="gitlab:9100",cpu="0",mode=~"idle|nice|softirq"})
(11). quantile (统计分位数)
quantile(0.99,prometheus_http_request_duration_seconds_sum{handler!="/metrics"}) #值为0.38代表百分之99的请求都在0.38ms下。
(12). sort(排序)
(13). time(打印当前时间戳)
(14). sqrt(计算元素的平方根)
(15). timestamp(返回样本的时间戳(不是当前时间戳))
功能性函数说明
(1). increase()
increase(node_cpu_seconds_total{mode="idle"}[1m])
#返回一个度量标准: last值-first值。取⼀段时间增量的总量
(2). by()
count(node_cpu_seconds_total{mode="idle"}) by(cpu)
#这个函数,可以把sum加合到⼀起的数值,按照指定的⼀个⽅式进⾏⼀层的拆分
(3). rate()
#rate函数是专门搭配counter类型数据使⽤的函数它的功能是按照设置⼀个时间段,(last值-first值)/时间差s,取⼀段时间增量的平均每秒数量.
(4). predict_limpar(预测函数)
predict_linear(node_filesystem_free_bytes{device="/dev/sda3",fstype="xfs",instance="jenkins:9100",job="test2",mountpoint="/"}[1m],300)
#根据磁盘1分钟内的变化,预测5分钟后的值
(5). abs()
#返回输入向量的所有样本的绝对值。
(6). absent()
#如果赋值给它的向量具有样本数据,则返回空向量;如果传递的瞬时向量参数没有样本数据,则返回不带度量指标名称且带有标签的样本值为1的结果,当监控度量指标时,如果获取到的样本数据是空的, 使用absent方法对告警是非常有用的.(有数据返回空,没数据返回1)
(7). ceil
#返回一个向上舍入为最接近的整数。
(8). changes()
changes(node_filesystem_free_bytes[1m])
#changes(v range-vector) 输入一个范围向量, 返回这个范围向量内每个样本数据值变化的次数。
(9). clamp_max()
#clamp_max(v instant-vector, max scalar)函数,输入一个瞬时向量和最大值,样本数据值若大于max,则改为max,否则不变
(10). clamp_min()
#输入一个瞬时向量和最大值,样本数据值小于min,则改为min。否则不变
(11). hour,minute,month,year,day_of_month(),day_of_week(),days_in_month()
#当前的小时,分钟,月,年,当天在这个月是第几天,当天在这个星期是第几天,这个月有多少天.
(12). delta()
delta(node_cpu_seconds_total{cpu="0",instance="gitlab:9100",job="test",mode="idle"}[1m])
#delta(v range-vector)函数,计算一个范围向量v的第一个元素和最后一个元素之间的差值。返回值:key:value=度量指标:差值
(13). floor()
#此函数,与ceil()函数相反。 4.3 为 4 。
(14). exp()
#输入一个瞬时向量, 返回各个样本值的e指数值,即为e^N次方,e=2.718281828,N=Value。
(15). idelta()
#idelta(v range-vector) 的参数是一个区间向量, 返回一个瞬时向量。它计算最新的 2 个样本值之间的差值。这个函数一般只用在 Gauge 类型的时间序列上。
(16). label_join()
label_join(up{instance="localhost:9091",job="pushgateway"},"foo", ",", "job","instance")
=》up{foo="pushgateway,localhost:9091",instance="localhost:9091",job="pushgateway"}
#函数可以将时间序列 v 中多个标签 src_label 的值,通过 separator作为连接符写入到一个新的标签 dst_label 中。可以有多个 src_label 标签。
(17). label_replace()
label_replace(up{instance="jenkins:9100",job="test2"},"port", "$2", "instance","(.*):(.*)")
=> up{instance="jenkins:9100",job="test2",port="9100"}
#label_replace 函数为时间序列添加额外的标签。该函数会依次对 v 中的每一条时间序列进行处理,通过 regex 匹配 src_label 的值,并将匹配部分 relacement 写入到 dst_label 标签中。
(18). round()
#round()函数与 ceil 和 floor 函数类似,返回向量中所有样本值的最接近的整数。
(19). vector()
#将标量返回s为没有标签的向量。
(20). irate()
irate(node_load1[1m])
#irate(v range-vector)函数, 输入:范围向量,输出:key: value = 度量指标: (last值-last前一个值)/时间戳差值,它是基于最后两个数据点。
(21). <aggregation>_over_time()
#以下函数允许聚合给定范围向量的每个系列随时间的变化并返回具有每系列聚合结果的即时向量:
- avg_over_time(range-vector):指定时间间隔内所有点的平均值。
avg_over_time(node_cpu_seconds_total{cpu="0",instance="gitlab:9100",job="test",mode="idle"}[1m])
- min_over_time(range-vector):指定时间间隔内所有点的最小值。
- max_over_time(range-vector):指定时间间隔内所有点的最大值。
- sum_over_time(range-vector):指定时间间隔内所有值的总和。
- count_over_time(range-vector):指定时间间隔内所有值的计数。
- quantile_over_time(scalar, range-vector):指定间隔中的值的φ-分位数(0≤φ≤1)。
#中分位的计算方法:如果数字个数为奇数,中位值就是中间那个数,如果是偶数,则是中间两个数的平均数。
#90百分位数的计算方式: a=[1,2,3,4]
a. (n-1)*p=(4-1)*0.9=2.7 #则整数部分i=2,小数部分j=0.7,n=数字个数,p=90百分位数。
b. a[i]=3;a[i+1]=4
c. (1-0.7)*3+(0.7*4)=3.7
- stddev_over_time(range-vector) : 区间向量内每个度量指标的总体标准差。
#总体标准差计算方法:
步骤一、(每个样本数据 减去总体全部数据的平均值)。
步骤二、把步骤一所得的各个数值的平方相加。
步骤三、把步骤二的结果除以 n (“n”指总体数目)。
步骤四、从步骤三所得的数值之平方根就是总体的标准偏差。
- stdvar_over_time(range-vector) : #区间向量内每个度量指标的总体标准方差,计算方法相当于没有第四步的总体标准差方法。
系统监控命令行
系统负载
node_load1 #系统一分钟内的负载
node_load5
node_load15
CPU
使用率:
100 - (avg(irate(node_cpu_seconds_total{instance=~"jenkins",mode="idle"}[5m])) * 100)
等待:
avg(irate(node_cpu_seconds_total{instance=~"jenkins",mode="iowait"}[5m])) * 100
内存
总大小:
node_memory_MemTotal_bytes{instance=~"jenkins"}
使用率:
(1 - (node_memory_MemAvailable_bytes{instance=~"jenkins"} / (node_memory_MemTotal_bytes{instance=~"jenkins"})))* 100
硬盘
总大小:
node_filesystem_size_bytes {instance=~"jenkins",fstype=~"ext4|xfs"}
剩余大小:
node_filesystem_avail_bytes {instance=~'jenkins:9100',fstype=~"ext4|xfs"}
使用率:
1-(node_filesystem_free_bytes{instance=~'jenkins:9100',fstype=~"ext4|xfs"} / node_filesystem_size_bytes{instance=~'jenkins:9100',fstype=~"ext4|xfs"})
IOPS:
磁盘每秒读取速率: irate(node_disk_reads_completed_total{instance=~"jenkins:9100"}[1m])
磁盘每秒写入速率: irate(node_disk_writes_completed_total{instance=~"jenkins:9100"}[1m])
磁盘读延迟(ms): irate(node_disk_read_time_seconds_total{instance=~"gitlab:9100"}[1m])
磁盘写延迟(ms): irate(node_disk_write_time_seconds_total{instance=~"gitlab:9100"}[1m])
文件句柄
系统当前打开的文件句柄:
node_filefd_allocated{instance=~"jenkins"} #这个值是从/proc/sys/fs/file-nr获取到的
网络
入网: irate(node_network_receive_bytes_total{instance=~'$node',device!~'tap.*'}[5m])
出网:irate(node_network_transmit_bytes_total{instance=~'$node',device!~'tap.*'}[5m])
监控报警(alertmanager)
安装alertmanager
wget http://github.com/prometheus/alertmanager/releases/download/v0.16.1/alertmanager-0.16.1.linux-amd64.tar.gz
tar xf alertmanager-0.16.1.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/alertmanager-0.16.1.linux-amd64 /usr/local/alertmanager
./alertmanager --config.file /usr/local/alertmanager/alertmanager.yml --web.external-url='http://192.168.18.213:9093' #--web.external-url是报警是显示的远程地址
邮件报警
1. prometheus.yml添加添加alertmanager信息
[root@nagios alertmanager]# cat ../prometheus/prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093 #alertmanager的远程地址
rule_files:
- "/usr/local/prometheus/rules.yml" #匹配的规则文件
2. 修改rules.yml文件
[root@nagios alertmanager]# cat /usr/local/prometheus/rules.yml
groups:
- name: node_memory
rules:
- alert: "内存告警" #报警名称
expr: (1- (node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes))*100 > 80
for: 15s #每隔15秒检测一次
labels: #标签
severity: warning
annotations: #描述
summary: "The percentage of memory exceeded the limit is now {{$value}} percent"
3.修改alertmanager配置文件
[root@nagios alertmanager]# cat alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.doormobi.com:25' # 邮箱smtp服务器代理
smtp_from: 'jenkins@doormobi.com' # 发送邮箱名称
smtp_auth_username: 'jenkins@doormobi.com' # 邮箱名称
smtp_auth_password: 'xxxxx' # 邮箱密码或授权码
smtp_require_tls: false #不使用tls加密
templates:
- 'template/*.tmpl' #配置要发送信息的模板,基于当前目录。
route: #定义路由信息
receiver: 'email' #发送警报的接收者的名称,以下receivers name的名称
group_by: ['alertname']
group_wait: 5s
group_interval: 1m
repeat_interval: 1m
receivers:
- name: 'email'
email_configs:
- to: 'yuliang.zhu@qizhixinxi.com'
headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
send_resolved: true #告警解除后否发送通知,这里选择发送
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
4. 编写报警模板
[root@nagios alertmanager]# cat template/test.tmpl
{{ define "email.default.html" }}
{{ range .Alerts }}
========start==========<br/>
告警程序: prometheus_alert<br/>
告警详情: {{ .Annotations.summary }}<br/>
告警级别: {{ .Labels.severity }}<br/>
告警类型: {{ .Labels.alertname }}<br/>
故障主机: {{ .Labels.instance }}<br/>
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}<br/>
========end==========<br/>
{{ end }}
{{ end }}
报警效果:
微信报警
1. 修改alertmanager配置文件
[root@nagios alertmanager]# vim alertmanager.yml
route:
receiver: 'email'
group_by: ['alertname']
group_wait: 5s
group_interval: 15s
repeat_interval: 15s
routes:
- receiver: 'weixing'
match_re:
severity: 'warning'
receivers:
- name: 'email'
email_configs:
- to: 'yuliang.zhu@qizhixinxi.com'
headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
- name: 'weixing'
wechat_configs:
- send_resolved: true #告警解除后否发送通知,这里选择发送
corp_id: 'wx7982c7fdf4eac184'
api_secret: 'kUc_0gVzCPe2qQ8E8ckY7qcaGEuIzuAknGjibh8xxx--'
to_party: '5'
agent_id: '1000003'
2. 添加报警模板
[root@nagios alertmanager]# cat template/wechat.tmpl
{{ define "wechat.default.message" }} #此处与邮件不同
{{ range .Alerts }}
========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }}
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
告警详情: {{ .Annotations.summary }}
========end==========
{{ end }}
{{ end }}
钉钉报警
1.安装prometheus,钉钉报警插件
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v0.3.0/prometheus-webhook-dingtalk-0.3.0.linux-amd64.tar.gz
tar xf prometheus-webhook-dingtalk-0.3.0.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/prometheus-webhook-dingtalk-0.3.0.linux-amd64 /usr/local/prometheus-webhook-dingtalk
/usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --ding.profile="ops_dingding=钉钉机器人地址" &
2. 修改alertmanager配置文件
[root@nagios alertmanager]# vim alertmanager.yml
route:
receiver: 'email'
group_by: ['alertname']
group_wait: 5s
group_interval: 15s
repeat_interval: 15s
routes:
- receiver: 'weixing'
match_re:
severity: 'warning'
- receiver: 'webhook'
match_re:
severity: 'warning'
receivers:
- name: 'email'
email_configs:
- to: 'yuliang.zhu@qizhixinxi.com'
headers: { Subject: "[WARN] 报警邮件"} #接收邮件的标题
- name: 'weixing'
wechat_configs:
- send_resolved: true #告警解除后否发送通知,这里选择发送
corp_id: 'wx7982c7fdf4eac184'
api_secret: 'kUc_0gVzCPe2qQ8E8ckY7qcaGEuIzuAknGjibh8xxx--'
to_party: '5'
agent_id: '1000003'
- name: 'webhook'
webhook_configs:
- url: http://localhost:8060/dingtalk/ops_dingding/send #刚才安装的钉钉插件
send_resolved: true