Prometheus监控(二)

数据类型

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

Prometheus监控(二)的更多相关文章

  1. Prometheus(二):Prometheus 监控Windows机器

    一.安装wmi-exporter 首先在需要监控的Windows机器上安装wmi_exporter.wmi_exporter下载地址:https://github.com/martinlindhe/w ...

  2. Kubernetes集群部署史上最详细(二)Prometheus监控Kubernetes集群

    使用Prometheus监控Kubernetes集群 监控方面Grafana采用YUM安装通过服务形式运行,部署在Master上,而Prometheus则通过POD运行,Grafana通过使用Prom ...

  3. 二 prometheus 监控 Redis

    Prometheus 监控Redis需要用到redis_exporter客户端, Prometheus -> redis_exporter这个模式, 类似监控Mysql 一个思路. 1 ) 设置 ...

  4. prometheus监控系统

    关于Prometheus Prometheus是一套开源的监控系统,它将所有信息都存储为时间序列数据:因此实现一种Profiling监控方式,实时分析系统运行的状态.执行时间.调用次数等,以找到系统的 ...

  5. prometheus监控

    一. 部署prometheus 1.1 下载 wget https://github.com/prometheus/prometheus/releases/download/v2.7.1/promet ...

  6. 使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库

    一.背景 在平时开发过程当中需要针对 MySQL 数据库进行监控,这里我们可以使用 Grafana 和 Prometheus 来实现监控功能.Grafana 是一款功能强大的仪表盘面板,支持多种数据源 ...

  7. Prometheus监控学习记录

    官方文档 Prometheus基础文档 从零开始:Prometheus 进阶之路:Prometheus —— 技巧篇 进阶之路:Prometheus —— 理解篇 prometheus的数据类型介绍 ...

  8. Grafana + Prometheus 监控PostgreSQL

    效果图 部署环境 服务器名称 IP地址 部署业务 备注 部署agent sht-sgmhadoopcm-01 172.16.101.54 PostgreSQL 监控服务器.被监控服务器 node_ex ...

  9. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

随机推荐

  1. Android 网络编程(一)

    概述 一.Android平台网络相关API接口 1.java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见H ...

  2. 上手spring boot项目(四)之springboot如何返回json数据

    在springboot整合thymeleaf中,经常会在HTML页面中接收来自服务器的json数据,然后处理json数据并在页面上渲染.那么如何在服务器中返回json类型的数据呢? 1.使用@Resp ...

  3. CF547E Milk and Friends(AC自动机的fail指针上建主席树 或 广义后缀自动机的parent线段树合并)

    What-The-Fatherland is a strange country! All phone numbers there are strings consisting of lowercas ...

  4. HDU 1520 Anniversity party

    There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The Un ...

  5. 关于C 语言的字符串常量拼接

    问题记录: C语言中,字符串是否可以通过连续的常量创建直接编辑拼接在一起? 比如下述语句赋值: const char *path = “this is string one”   “this is s ...

  6. Linux源码编译安装httpd

    Linux安装软件采用源码编译安装灵活自由,适用于不同平台,维护也十分方便. 源码编译的安装方式一般由3个步骤组成: 1.配置(configure) 2.编译(make) 3.安装(make inst ...

  7. KafkaManager2.0.0.2安装与使用

    KafkaManager 是雅虎开源的一款 针对kafka集群的web管理工具, 具体功能和介绍就不再这细讲 kafka-manager github官网  https://github.com/ya ...

  8. 【Html5】使用学习

    Html5使用学习 目录 1.方式js文件被浏览器缓存 <script>document.write("<script src='y.js?v=" + Date. ...

  9. 区块链学习——HyperLedger-Fabric v0.6环境搭建详细教程

    v0.6 的架构相对简单,适合作为实验或学习来使用. 一.环境准备 一台云服务器(笔者使用的是阿里云的1核-2GB内存) Go语言环境 Docker安装 docker-compose安装 二.环境搭建 ...

  10. NTFS在openwrt下的挂载问题

    在openwrt上市可以挂载ntfs分区的,但是如果原来如果搞过win,或者异常关机,那么会遇到以下的错误: root@Openwrt:/etc/config# mount -t ntfs -o rw ...