Prometheus监控(二)

Prometheus监控(二)

数据类型

Counter(计数器类型)html

Counter类型的指标的工做方式和计数器同样,只增不减(除非系统发生了重置),Counter通常用于累计值。node

Gauges(仪表盘类型)linux

Gauges是可增可减的指标类,能够用于反应当前应用的状态。好比在监控主机时,可用内存大小。ios

Histograms(直方图类型)nginx

主要用于表示一段时间范围内对数据进行采样(一般是请求持续时间或响应大小),并可以对其指定区间以及总数进行统计,表明的是⼀种近似的百分⽐估算数值。举例说明: 若是你想监控用户的访问时间,将nginx日志的http_response_time列的数据所有采集下来,而后算一下总的平均值便可。可是这没有意义,若是只有一个用户请求特别慢,那么就会拉低总的平均值,并且你也发现不了小部分的问题。这时可使用histogram来比较~=0.05秒的量有多少,0 ~ 0.05秒的有多少,>2秒的有多少,>10秒的有多少。git

Summary(摘要类型)github

Summary 和 Histogram 相似,主要用于表示一段时间内数据采样结果(一般时请求持续时间或响应大小),它直接存储了quantile数据,而不是根据统计区间计算出来的。web

标签匹配运算符

  • =:选择与提供的字符串彻底相同的标签。
  • !=:选择不等于提供的字符串的标签。
  • =~:选择正则表达式匹配提供的字符串(或子字符串)的标签。
  • !~:选择不与提供的字符串(或子字符串)匹配的标签。

注释: 标签名称的匹配可使用以下方示例:正则表达式

(1)http_requests_total{environment=~"staging|testing|development",method!="GET"}
(2)http_requests_total{job=~".+",method!="GET"}
(3)http_requests_total{job=~".",method!="GET"}*vim

范围向量选择器

时间长度被追加在向量选择器尾部的方括号[]中,用以指定对于每一个样本范围区间中的每一个元素应该抓取的时间范围样本区间。

  • 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) : 区间向量内每一个度量指标的整体标准差。
#整体标准差计算方法:
步骤1、(每一个样本数据 减去整体所有数据的平均值)。
步骤2、把步骤一所得的各个数值的平方相加。
步骤3、把步骤二的结果除以 n (“n”指整体数目)。
步骤4、从步骤三所得的数值之平方根就是整体的标准误差。
- 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
相关文章
相关标签/搜索