跳到主要内容

prometheus部署文档输出

1、介绍:

介绍相关: https://z.itpub.net/article/detail/362B4F22826584EA1D15C840CFB0FCDE

Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。

其大概的工作流程是:

  • Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
  • Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
  • Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
  • 在Grafana图形界面中,可视化查看采集数据

2、Prometheus的特性

  • 多维度数据模型。
  • 灵活的查询语言。
  • 不依赖分布式存储,单个服务器节点是自主的。
  • 通过基于HTTP的pull方式采集时序数据。
  • 可以通过中间网关进行时序列数据推送。
  • 通过服务发现或者静态配置来发现目标服务对象。
  • 支持多种多样的图表和界面展示,比如Grafana等。

3、Prometheus的组件

  • Prometheus Server 主要负责数据采集和存储,提供PromQL查询语言的支持。
  • Alertmanager 警告管理器,用来进行报警。
  • Push Gateway 支持临时性Job主动推送指标的中间网关。
  • Exporters 输出被监控组件信息的HTTP接口。
  • Grafana 监控数据展示Web UI。

Prometheus 支持多种服务发现机制,可以自动获取要收集的 targets,包含的服务发现机制包括:azure、consul、dns、ec2、openstack、file、gce、kubernetes、marathon、triton、zookeeper(nerve、serverset),配置方法可以参考手册的配置页面。可以说 SD 机制是非常丰富的,但目前由于开发资源有限,已经不再开发新的 SD 机制,只对基于文件的 SD 机制进行维护。针对我们现有的系统情况,我们选择了静态配置方式。

使用docker部署官方参考文档:

https://github.com/prometheus/prometheus

4、prometheus部署

自定义prometheus镜像

[root@loaclhost data]# ls -l
total 71384
drwxrwxrwx 3 root root 45 Nov 3 19:52 alertmanager
-rw-r--r-- 1 root root 526 Nov 3 17:59 Dockerfile
drwxr-xr-x 5 root root 144 Nov 3 18:28 prometheus
-rw-r--r-- 1 root root 73091480 Nov 3 16:31 prometheus-2.31.0.linux-amd64.tar.gz
[root@loaclhost data]# cat Dockerfile
FROM centos:centos7
ADD prometheus-2.31.0.linux-amd64.tar.gz /
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && mv prometheus-2.31.0.linux-amd64 prometheus
WORKDIR /prometheus
ENTRYPOINT ["/prometheus/prometheus"]
CMD [ "--config.file=/prometheus/prometheus.yml", \
"--storage.tsdb.path=/prometheus/data", \
"--web.console.libraries=/prometheus/console_libraries", \
"--web.enable-lifecycle", \
"--web.console.templates=/prometheus/consoles" ]

#说明,创建镜像使用 docker build -t myprometheus:1 .

部署prometheus

1、创建prometheus保存文件的数据目录
mkdir -p /data/prometheus

2、创建prometheus容器
docker run -d --restart=always --name prometheus -p 9090:9090 myprometheus:1

3、拷贝prometheus的配置文档
docker cp prometheus:/prometheus/ /data/prometheus

4、启动prometheus容器
docker run -d --restart=always --name prometheus -p 9090:9090 -v /data/prometheus:/prometheus myprometheus:1

部署alertmanager服务

参考官方: https://github.com/prometheus/alertmanager

1、创建目录
mkdir -p /data/alertmanager /data/alertmanager/storage

2、启动容器
docker run -d -p 9093:9093 --name alertmanager --restart=always -v /etc/localtime:/etc/localtime -v /data/alertmanager/storage:/alertmanager prom/alertmanager

3、拷贝容器中的alertmanager.yml文件
docker cp alertmanager:/etc/alertmanager/alertmanager.yml /data/alertmanager

4、对alertmanager.yml文件进行挂载
docker run -d -p 9093:9093 --name alertmanager --restart=always -v /etc/localtime:/etc/localtime -v /data/alertmanager:/etc/alertmanager -v /data/alertmanager/storage:/alertmanager prom/alertmanager

prometheus添加alertmanager地址

image-20211103201601827

添加之后 参考如下:

image-20211103201620941

Node_exporter安装

1、wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz

2、下载之后 cd node_exporter-xxx && nohup ./node_exporter运行即可

3、 在prometheus.yml中指定添加的节点

钉钉插件官方安装链接:

https://github.com/timonwong/prometheus-webhook-dingtalk/releases

PromQL语言

PromQL是Prometheus自定义的一套强大的数据查询语言,除了使用监控指标作为查询关键字以为,还内置了大量的函数,帮助用户进一步对时序数据进行处理。例如使用rate()函数,可以计算在单位时间内样本数据的变化情况即增长率,因此通过该函数我们可以近似的通过CPU使用时间计算CPU的利用率:

查看node是否启动:

up{instance="192.168.100.232:9100",job="Host-test-232"}  #过滤

参考文档:

https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/promql/prometheus-promql-operators-v2

钉钉测试发送消息:

curl  https://oapi.dingtalk.com/robot/send?access_token=d79446f315feb6b0207870151d8146f65b18fe262af19d661787408ab24ad56   -H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content":"我就是我, 是不一样的烟火"}}'

重载prometheus的配置文件

curl -XPOST  http://10.51.8.110:9090/-/reload

5、back_box_exporter监控

目前在使用的TCP,ICMP,HTTPS服务状态监控 Prometheus Blackbox Exporter,在一个看板里面展示,做了展示效果的优化,支持多服务同时展示,需要使用的可以参考下,记得根据自己的实际情况修改下变量。

blackbox_exporter是Prometheus 官方提供的 exporter 之一,可以提供 http、dns、tcp、icmp 的监控数据采集。

blackbox_exporter 应用场景:

  • HTTP 测试: 定义 Request Header 信息,判断 Http status / Http Respones Header / Http Body 内容
  • **TCP 测试:**业务组件端口状态监听, 应用层协议定义与监听
  • **ICMP 测试:**主机探活机制
  • **POST 测试:**接口联通性
  • SSL 证书过期时间

安装blackbox_exporter

# wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.16.0/blackbox_exporter-0.16.0.linux-amd64.tar.gz

# tar xf blackbox_exporter-0.16.0.linux-amd64.tar.gz -C /usr/local/
# ln -s /usr/local/blackbox_exporter-0.16.0.linux-amd64/ /usr/local/blackbox_exporter

# 使用systemd管理blackbox_exporter服务
# vim /usr/lib/systemd/system/blackbox_exporter.service
[Unit]
Description=blackbox_exporter
After=network.target

[Service]
User=root
Type=simple
ExecStart=/usr/local/blackbox_exporter/blackbox_exporter --config.file=/usr/local/blackbox_exporter/blackbox.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl start blackbox_exporter
# systemctl enable blackbox_exporter

模板下载地址: https://grafana.com/grafana/dashboards/9965

grafana插件安装地址:

docker exec -it  grafana /bin/sh 
grafana-cli plugins install grafana-piechart-panel

相关监控指标参考:

1、probe_success 指标可以判断我们的 icmp、tcp、http、post 监测是否正常。值为 1 正常,0不正常。 
2、probe_http_status_code 指标可以知道某个http请求返回的响应码。
3、probe_ssl_earliest_cert_expiry 指标可以知道ssl证书何时过期。

6、常见函数

  1. round

#counter类型,统计各个网卡的入流量 node_network_receive_bytes_total

统计某一个节点
round((irate(node_network_receive_bytes_total{instance="172.17.224.119"}[1m]) / 1048576 ),0.001)

统计所有节点的网卡入流量大于20M
round((irate(node_network_receive_bytes_total{device!="lo"}[1m]) / 1048576 ),0.001) > 20

使用round可以精确到后三位。

image-20220114201924748

#节点网卡出流量超过8M
round((irate(node_network_transmit_bytes_total{device!="lo"}[1m]) / 1048576 ),0.001) > 8

10、白盒监控和黑盒监控

我们监控主机的资源用量、容器的运行状态、数据库中间件的运行数据。这些都是支持业务和服务的基础设施,通过白盒能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化。而从完整的监控逻辑的角度,除了大量的应用白盒监控以外,还应该添加适当的黑盒监控。黑盒监控即以用户的身份测试服务的外部可见性,常见的黑盒监控包括HTTP探针、TCP探针等用于检测站点或者服务的可访问性,以及访问效率等。

黑盒监控相较于白盒监控最大的不同在于黑盒监控是以故障为导向当故障发生时,黑盒监控能快速发现故障,而白盒监控则侧重于主动发现或者预测潜在的问题。一个完善的监控目标是要能够从白盒的角度发现潜在问题,能够在黑盒的角度快速发现已经发生的问题。

image-20211110104346812

11、自定义模板

官方连接: https://prometheus.io/docs/alerting/latest/notifications/#aler

压力测试:

stress  -c  1 -m  1  -d 1  -t   3500

告警模板配置详情

image-20220111095525131

alertmanager主题配置模板参考

image-20220111095323334

语法检查

alertmanager: 
docker exec alertmanager amtool check-config /etc/alertmanager/alertmanager.yml
amtool check-config alertmanager.yml

11、常用指标监控

非常好的学习网址:

https://www.kancloud.cn/pshizhsysu/prometheus/1803793

https://www.zhukun.net/archives/8285

11.1 round #四舍五入取整

有两个作用:

第一取整数

round(avg_over_time(node_netstat_Tcp_CurrEstab{instance=~"172.17.224.51"}[4h]))

第二保留小数位后三位

round(avg_over_time(node_netstat_Tcp_CurrEstab{instance=~"172.17.224.51"}[4h]),0.001)
11.2 topk 函数

topk (统计最大的几个值) ---统计所有url中耗时最多的一条

topk(1,avg_over_time(probe_duration_seconds[4h]))*1000)
11.3 avg_over_time

#查询一天空闲空间的平均值,相关的还有如下

avg_over_time() #指定间隔内所有点的平均值。 min_over_time() #指定间隔中所有点的最小值。 max_over_time() #指定间隔内所有点的最大值。 sum_over_time() #指定时间间隔内所有值的总和

avg_over_time(probe_duration_seconds[4h])) ###统计4小时之前的延迟值

max_over_time

max_over_time(rate(http_request_total[5m])[1h:1m])

#总的来说就是统计prometheus上/metrics页面在5分钟内区间向量的平均值的点
#在1个小时中每个点的值

rate(http_request_total[5m])[1h:1m]
#它将五分钟的数据聚合成一个瞬时向量。
#[1h就像范围向量选择器一样,它定义了相对于查询求值时间的范围大小。

#:1m]要使用的间隔值。如果没有定义,它默认为全局计算区间
11.4 sort_desc 从大到小排序
sort_desc(round((1 - (node_memory_MemAvailable_bytes{} / (node_memory_MemTotal_bytes{})))*100,0.01))
11.5 sort 从小到大排序
sort_desc(round((1 - (node_memory_MemAvailable_bytes{} / (node_memory_MemTotal_bytes{})))*100,0.01))
11.6 0 OR on() vector(0) 如何对控制设置为0
node_tcp_connection_states{state="syn_recv",instance="172.17.113.100"} > 0 OR on() vector(0)

如何查詢不到,那么该值赋值为0

其他函数:

absent()               #取布尔值
abs() #绝对值
sqrt() #平方根
ceil() #向上取整
floor() #向下取整
changes() #显示变更次数
round() #四舍五入取整
clamp_max() #当大于最大值时,则为最大值
clamp_min() #当小于最小值时,则为最小值
lable_join() #新增标签
lable_replace() #替换标签
predict_linear() #基于一段时间内的增长值来预测多久后会溢出
rate() #计算区间向量里的平均增长率
irate() #计算区间向量内最新和最后的瞬时向量的增长率
sort() #升序排序
sort_desc() #降序排序
delta() #计算区间向量里最大最小的差值
increase() #计算区间向量里最后一个值和第一个值的差值

12、alertmanager-routing-tree-editor

image-20220330150108489

13、prometheus 监控连接数

1、实现系统级别的连接数监控

如何监控 netstat -ant | grep ESTABLISHED | wc -l #查看连接数

netstat -ntlp #获取listen

node_netstat_Tcp_CurrEstab

规则文件:

  - alert: "正常连接数超过10000"
expr: node_netstat_Tcp_CurrEstab{instance!~"172.17.224.50|172.17.224.51"} > 8000
for: 3m
labels: {resType: 'Node', severity: 'warning'}
annotations:
summary: "正常连接数超过10000[阶值提醒]"
description: "{{$labels.device}}: 正常连接数超过10000 (当前的连接数是: {{ $value }})"
monname: "进程连接数监控"

#以下节点为负载,连接数较多单独告警
- alert: "正常连接数超过43000"
expr: node_netstat_Tcp_CurrEstab{instance=~"172.17.224.50|172.17.224.51"} > 43000
for: 3m
labels: {resType: 'Node', severity: 'warning'}
annotations:
summary: "正常连接数超过43000[阶值提醒]"
description: "{{$labels.device}}: 正常连接数超过43000 (当前的连接数是: {{ $value }})"
monname: "进程连接数监控"

2、tomcat监控

配置

监控tomcat连接数,其他组件可以参考官方文档即可

官方文档: https://github.com/prometheus/jmx_exporter/tree/master/example_configs

配置参考:

---   
lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
name: tomcat_$3_total
labels:
port: "$2"
protocol: "$1"
help: Tomcat global $3
type: COUNTER
- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):'
name: tomcat_servlet_$3_total
labels:
module: "$1"
servlet: "$2"
help: Tomcat servlet $3 total
type: COUNTER
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):'
name: tomcat_threadpool_$3
labels:
port: "$2"
protocol: "$1"
help: Tomcat threadpool $3
type: GAUGE
- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
name: tomcat_session_$3_total
labels:
context: "$2"
host: "$1"
help: Tomcat session $3 total
type: COUNTER

指标说明:

tomcat_threadpool_connectioncount    #tomcat连接数

规则文件


- alert: "jvm堆内存超过85%"
expr: jvm_memory_bytes_used{area="heap",job="jvm_tomcat_monitor"} / jvm_memory_bytes_max{area="heap",job="jvm_tomcat_monitor"} * 100 > 85
for: 30s
labels: {resType: 'Node', severity: 'warning'}
annotations:
summary: "jvm堆内存使用率"
description: "{{$labels.instance}}: 内存使用率超过85% (当前的使用率是: {{ $value }}"
hostname: "{{$labels.job}}"

- alert: "tomcat连接数超过400"
expr: tomcat_threadpool_connectioncount > 400
for: 30s
labels: {resType: 'Node', severity: 'warning'}
annotations:
summary: "tomcat连接数监控"
description: "{{$labels.instance}}: tomcat连接数超过400 (当前连接数是: {{ $value }}"
hostname: "{{$labels.job}}"

14、按照等级进行告警

在rules.yml文件中,severity直接写在labels中,有三种等级,分别为warning、critical和emergency。严重等级依次递增。如果同一个rule规则告警,满足多个等级的时候,告警的时候按照登记最高的告警

如:网卡告警在rule中定义

    ###网卡入口流量
- alert: "节点网卡入流量超过25M"
expr: round((irate(node_network_receive_bytes_total{device!="lo",instance!="172.17.113.105",instance!="172.17.224.119"}[1m]) / 1048576 ),0.001) > 25
for: 30s
labels: {resType: 'Node', severity: 'warning'}
annotations:
summary: "明细网卡入口流量超过25M"
description: "{{$labels.device}}: 网卡入口流量超过25M,明细流量可以根据情况忽略 !!!(当前1分钟的使用率是: {{ $value }}M)"
hostname: "{{$labels.job}}"


- alert: "节点网卡入流量超过50M"
expr: round((irate(node_network_receive_bytes_total{device!="lo",instance!="172.17.113.105",instance!="172.17.224.119"}[1m]) / 1048576 ),0.001) > 50
for: 30s
labels: {resType: 'Node', severity: 'critical'}
annotations:
summary: "网卡入口流量超过50M"
description: "{{$labels.device}}: 网卡入口流量超过50M,等级-严重,请前往服务器查看 !!!(当前1分钟的使用率是: {{ $value }}M)"
hostname: "{{$labels.job}}"

在alertmanager中配置

inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['instance']

以上告警满足equal同一节点,注意,equal如果有多个,必须同时满足; 会抑制告警,只会告警critical。

15、windows_exporter监控

官方地址:

https://github.com/prometheus-community/windows_exporter

下载官方msi文件

prometheus配置windows_exporter

在c盘创建 C:\windows_exporter 目录

访问文件 windows_exporter-0.18.0-386.msi

image-20230220120000395

安装: 精简版 - 不支持统计进程-目前生产在用

C:\Users\Administrator>msiexec /i C:\windows_exporter\windows_exporter-0.18.0-386.msi ENABLED_COLLECTORS=ad,memory,os,cs,cpu,logical_disk  LISTEN_PORT=9100

标准监控指标

msiexec /i C:\windows_exporter\windows_exporter-0.18.0-386.msi ENABLED_COLLECTORS=ad,iis,logon,memory,process,os,cs,cpu,logical_disk  LISTEN_PORT=9100

安裝完之后可以验证

image-20230220120244275

具体安装文档可以参考官方:

https://github.com/prometheus-community/windows_exporter?spm=a2c4g.11186623.0.0.84e8490bysmVRG#using-a-configuration-file

访问: http://x.x.x.x:9100/metrics

默认端口 9182

CPU高负荷

100 - (avg by (instance,job) (irate(windows_cpu_time_total{mode="idle"}[2m])) * 100) > 30

内存使用率过高

100 - 100 * windows_os_physical_memory_free_bytes / windows_cs_physical_memory_bytes > 90

内存利用率

100 - 100 * windows_os_physical_memory_free_bytes / windows_cs_physical_memory_bytes

硬盘使用率

100- 100 * (windows_logical_disk_free_bytes / windows_logical_disk_size_bytes)

网卡sent速率

((sum(rate (windows_net_bytes_sent_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance,job)) / 100)

网卡received速率

((sum(rate (windows_net_bytes_received_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance,job)) / 100)

相关指标监控链接:

https://www.modb.pro/db/569736

16、生产巡检统计

通过api统计所有主机的IP ,如果只想显示一列hostname,或者Ip,需要做汇聚

通过post方式来实现获取所有的主机名

curl  -sd 'query=sum(node_uname_info) by(hostname)' -d "time=1674973283"  -d "end=1674973283" -d 'step=15s' -X  POST  http://39.105.15.20:9090/api/v1/query?  |jq -r '.data.result' | jq .[].metric.hostname

获取所有的ip

curl  -sd 'query=sum(node_uname_info) by(instance)' -d "time=1674973283"  -d "end=1674973283" -d 'step=15s' -X  POST  http://39.105.15.20:9090/api/v1/query?  |jq -r '.data.result' | jq .[].metric.instance

相关链接

jq参考链接:https://www.cnblogs.com/liwenchao1995/p/16284648.html

prometheus rule相关参考文档:**

https://segmentfault.com/a/1190000023533570

docker-compose参考文档:

https://blog.51cto.com/hongchen99/2308932

https://www.cnblogs.com/namedgx/p/14919857.html

https://blog.51cto.com/hongchen99/2308932

https://prometheus.io/docs/instrumenting/writing_clientlibs/

blackbox Exporter参考文档

​ #官方文档

https://prometheus.io/docs/guides/multi-target-exporter/

https://github.com/prometheus/blackbox_exporter/blob/master/example.yml

https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md

​ #相关指标的解释

http://itocm.com/a/FE5EB54826E3475C97E77A671E2AF533

​ #配置案例

https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/commonly-eporter-usage/install_blackbox_exporter

https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/commonly-eporter-usage/install_blackbox_exporter

https://www.cnblogs.com/abner123/p/13226239.html

alertmanager参考文档

https://www.ibm.com/docs/en/netcoolomnibus/8?topic=monitoring-configuring-prometheus-in-kubernetes-from-command-line

dingtalk参考

https://www.cnblogs.com/Atonement/p/14688870.html

promehteus存储相关

https://prometheus.io/docs/prometheus/latest/storage/