前言

使用docker部署Prometheus+Grafana+Alertmanager监控系统,并集成钉钉告警

环境准备

(1)使用脚本安装docker、docker-compose

1
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)

(2)配置镜像加速

1
2
3
4
5
6
7
8
vi /etc/docker/daemon.json

{
"data-root": "/data/dockerData",
"registry-mirrors": ["https://docker.1ms.run"],
"log-driver":"json-file",
"log-opts":{"max-size" :"50m","max-file":"3"}
}

(3)启动docker服务,验证docker版本

1
2
3
4
systemctl restart docker
systemctl enable docker
systemctl status docker
docker --version && docker compose version

(4)创建所需目录和文件

1
2
3
mkdir -p /data/scripts /data/alertmanager /data/grafana /data/notice /data/prometheus /data/grafana/data
mkdir -p /data/prometheus/config /data/prometheus/config/rules /data/prometheus/pstorage
touch /data/prometheus/config/prometheus.yml

(5)编写Prometheus配置文件prometheus.yml(注意修改IP)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vi /data/prometheus/config/prometheus.yml

*****************************************************
global:
scrape_interval: 15s
evaluation_interval: 15s

alerting:
alertmanagers:
- static_configs:
- targets:
- "本机IP:9093"

rule_files:
- "rules/*.yml"

scrape_configs:

- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
*****************************************************

(6)编写Alertmanager的配置文件alertmanager.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
vi /data/alertmanager/alertmanager.yml

*****************************************************
global:
resolve_timeout: 5m

route:
group_by: ['alertname']
group_wait: 30s
group_interval: 1m
repeat_interval: 5m
receiver: 'dingtalk.webhook1'
routes:
- receiver: "dingtalk.webhook1"
match_re:
alertname: ".*"
continue: true

receivers:
- name: 'dingtalk.webhook1'
webhook_configs:
- url: 'http://本机ip:8060/dingtalk/webhook1/send'
send_resolved: true

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

(7)创建临时Grafana容器,提取grafana.ini文件

1
2
3
docker run -d --name=grafana grafana/grafana
docker cp grafana:/etc/grafana/grafana.ini /data/grafana/data/grafana.ini
docker rm -f grafana

集成钉钉告警

(1)在要添加告警通知的钉钉群里选择自定义钉钉机器人。

(2)在添加机器人的安全设置中勾选加签,并将密钥保存(可选自定义关键词)。

(3)完成创建后,复制Webhook地址保存。

(4)创建钉钉告警模板

模板default0.tmpl

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
vi /data/notice/default0.tmpl

*****************************************************
{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}

{{ define "__severity_icon" }}
{{ if eq .Labels.severity "严重" }}🔴{{ else if eq .Labels.severity "警告" }}🟠{{ else if eq .Labels.severity "提示" }}🟡{{ else }}⚪️{{ end }}
{{ end }}

{{ define "__alert_list" }}{{ range . }}
---

{{ if .Labels.owner }}@{{ .Labels.owner }} {{ end }}

{{ template "__severity_icon" . }} `告警主题`: {{ .Annotations.summary }}

> `告警类型`: {{ .Labels.alertname }}
> `告警级别`: {{ .Labels.severity }}
> `告警来源`: 【{{ .Labels.instance }}】
> `告警信息`: {{ index .Annotations "description" }}

⏱ `触发时间`: {{ dateInZone "2006-01-02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
{{ end }}{{ end }}


{{ define "__resolved_list" }}{{ range . }}
---

{{ if .Labels.owner }}@{{ .Labels.owner }} {{ end }}

🟢 `恢复主题`: {{ .Annotations.summary }}

> `告警类型`: {{ .Labels.alertname }}
> `告警级别`: {{ .Labels.severity }}
> `告警来源`: 【{{ .Labels.instance }}】

⏱ `故障时长`: {{ dateInZone "15:04:05" (.StartsAt) "Asia/Shanghai" }} ~ {{ dateInZone "15:04:05" (.EndsAt) "Asia/Shanghai" }}
{{ end }}{{ end }}


{{ define "default.title" }}
{{ template "__subject" . }}
{{ end }}

{{ define "default.content" }}
{{ if gt (len .Alerts.Firing) 0 }}

**==== 🚨 侦测到 {{ .Alerts.Firing | len }} 个故障 ====**

{{ template "__alert_list" .Alerts.Firing }}

{{ end }}

{{ if gt (len .Alerts.Resolved) 0 }}

---

**==== ✅ 恢复 {{ .Alerts.Resolved | len }} 个故障 ====**

{{ template "__resolved_list" .Alerts.Resolved }}

{{ end }}
{{ end }}


{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}
{{ template "default.title" . }}
{{ template "default.content" . }}
*****************************************************

效果图

模板default1.tmpl

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
vi /data/notice/default1.tmpl

*****************************************************
{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}


{{ define "__alert_list" }}{{ range . }}
---

{{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}

**告警主题**: {{ .Annotations.summary }}

**告警类型**: {{ .Labels.alertname }}

**告警级别**: {{ .Labels.severity }}

**告警来源**: {{ .Labels.instance }}

**告警信息**: {{ index .Annotations "description" }}

**告警时间**: {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
{{ end }}{{ end }}

{{ define "__resolved_list" }}{{ range . }}
---

{{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}

**告警主题**: {{ .Annotations.summary }}

**告警类型**: {{ .Labels.alertname }}

**告警级别**: {{ .Labels.severity }}

**告警来源**: {{ .Labels.instance }}

**告警信息**: {{ index .Annotations "description" }}

**告警时间**: {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**恢复时间**: {{ dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}
{{ end }}{{ end }}


{{ define "default.title" }}
{{ template "__subject" . }}
{{ end }}

{{ define "default.content" }}
{{ if gt (len .Alerts.Firing) 0 }}
**====侦测到{{ .Alerts.Firing | len }}个故障====**

{{ template "__alert_list" .Alerts.Firing }}
---

{{ end }}

{{ if gt (len .Alerts.Resolved) 0 }}
**====恢复{{ .Alerts.Resolved | len }}个故障====**
{{ template "__resolved_list" .Alerts.Resolved }}
{{ end }}
{{ end }}


{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}
{{ template "default.title" . }}
{{ template "default.content" . }}

*****************************************************

效果图

(5)创建钉钉告警配置文件config.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
vi  /data/notice/config.yml

*****************************************************
templates: #模板文件路径
- /etc/prometheus-webhook-dingtalk/default0.tmpl


targets:
webhook1:
url: 钉钉机器人Webhook地址
secret: 密钥

*****************************************************

部署Prometheus

撰写docker compose文件,创建Prometheus、Grafana、Alertmanager、Prometheus-webhook-dingtalk容器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
vi /data/scripts/pga.yml

*****************************************************
services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
user: "0"
volumes:
- /data/prometheus/config:/etc/prometheus/
- /data/prometheus/pstorage:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
ports:
- "9090:9090"
networks:
net:
ipv4_address: 172.20.112.11

grafana:
image: grafana/grafana
container_name: grafana
restart: always
user: "0"
volumes:
- /data/grafana/data:/var/lib/grafana
- /data/grafana/data/grafana.ini:/etc/grafana/grafana.ini
environment:
- GF_USERS_ALLOW_SIGN_UP=false #禁止新用户注册
ports:
- "3000:3000"
networks:
net:
ipv4_address: 172.20.112.12

alertmanager:
image: prom/alertmanager
container_name: alertmanager
restart: always
volumes:
- /data/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
ports:
- "9093:9093"
networks:
net:
ipv4_address: 172.20.112.13


dingtalk-webhook:
image: timonwong/prometheus-webhook-dingtalk
container_name: dingtalk-webhook
restart: always
volumes:
- /data/notice:/etc/prometheus-webhook-dingtalk
ports:
- "8060:8060"
networks:
net:
ipv4_address: 172.20.112.14


networks:
net:
driver: bridge
ipam:
config:
- subnet: 172.20.112.0/24

*****************************************************

(4)执行命令,创建容器

1
docker compose -f /data/scripts/pga.yml up -d

(5)允许端口通过防火墙

1
2
3
firewall-cmd --permanent --add-port={9090,3000,9093,8060}/tcp
firewall-cmd --reload
firewall-cmd --list-all

(6)访问系统web界面

名称访问地址备注
Prometheushttp://本机IP:9090
Grafanahttp://本机IP:3000默认账户:admin默认密码:admin
Alertmanagerhttp://本机IP:9093

配置Grafana

(1)修改默认语言;在Administration-General-Default preferences-Language选项中,选择语言为中文(简体),保存设置即可。

(2)集成Prometheus;在连接-添加新连接中搜索Prometheus,选择Prometheus数据源,点击添加新数据源,在设置页填写Prometheus的访问地址,点击保存并测试,提示Successfully queried the Prometheus API.,即为连接成功。

(3)选择仪表板-新建-Import dashboard,添加对应监控服务的仪表板:

Linux主机模板选择推荐ID:16098

Windows主机模板选择推荐ID:16523

blackbox_exporter模板选择推荐ID:14792

安装node_exporter

(1)下载node_exporter

1
wget https://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz

(2)创建node_exporter服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tar -vzxf node_exporter-1.11.1.linux-amd64.tar.gz
mv node_exporter-1.11.1.linux-amd64/node_exporter /usr/local/bin
chmod +x /usr/local/bin/node_exporter
chown root:root /usr/local/bin/node_exporter

# 修改文件的 SELinux 安全上下文为标准二进制文件 context
chcon -t bin_t /usr/local/bin/node_exporter
vi /etc/systemd/system/node-exporter.service

[Unit]
Description=Node Exporter for Prometheus
Documentation=https://prometheus.io/docs/guides/node-exporter/
After=network.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=0.0.0.0:9100 \
--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($|/) \
--no-collector.ipvs

[Install]
WantedBy=multi-user.target

(3)启动node_exporter服务

1
2
3
4
systemctl daemon-reload
systemctl start node-exporter
systemctl enable node-exporter
systemctl status node-exporter

(4)允许端口通过防火墙

1
2
3
firewall-cmd --permanent --add-port=9100/tcp
firewall-cmd --reload
firewall-cmd --list-all

(5)编写告警规则文件

node_alived.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi /data/prometheus/config/rules/node_alived.yml

*****************************************************
groups:
- name: 主机宕机报警规则
rules:
- alert: 主机宕机告警
expr: up == 0
for: 1m
labels:
severity: '严重'
annotations:
summary: "主机宕机告警"
description: "主机 【{{ $labels.instance }}】 已经宕机,宕机已超过 1 分钟"
*****************************************************

linux.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
vi /data/prometheus/config/rules/linux.yml

*****************************************************
groups:
- name: Linux基础资源报警规则
rules:
- alert: LinuxCPU使用率告警
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]))) * 100 > 95
for: 2m
labels:
severity: '警告'
annotations:
summary: "主机 【{{ $labels.instance }}】CPU使用率正在飙升。"
description: "主机 【{{ $labels.instance }}】CPU使用率超过95%(当前值:{{ $value | printf \"%.2f\" }}%)"

- alert: Linux磁盘使用率告警
expr: (1 - (node_filesystem_avail_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"})) * 100 > 90
for: 2m
labels:
severity: '严重'
annotations:
summary: "主机 【{{ $labels.instance }}】 磁盘空间不足"
description: "主机 【{{ $labels.instance }}】分区 {{ $labels.mountpoint }} (设备: {{ $labels.device }}) 使用率大于 90%,当前值:{{ $value | printf \"%.1f\" }}%"

- alert: Linux内存使用率异常告警
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 95
for: 2m
labels:
severity: '警告'
annotations:
summary: "主机 【{{ $labels.instance }}】Linux服务器可用内存不足。"
description: "主机 【{{ $labels.instance }}】内存使用率异常已超过95%(当前值:{{ $value | printf \"%.2f\" }}%)"

- alert: Linux网卡接收流量过高
expr: sum by (instance, device) (rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[1m])) * 8 > 80000000
for: 1m
labels:
severity: '警告'
annotations:
summary: "主机 【{{ $labels.instance }}】 网卡 【{{ $labels.device }}】 接收流量过高"
description: "主机 【{{ $labels.instance }}】 网卡 【{{ $labels.device }}】 持续1分钟接收速率超过 10MB/s(当前值:{{ $value | printf \"%.2f\" }} bps)"

- alert: Linux网卡发送流量过高
expr: sum by (instance, device) (rate(node_network_transmit_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[1m])) * 8 > 80000000
for: 1m
labels:
severity: '警告'
annotations:
summary: "主机 【{{ $labels.instance }}】 网卡 【{{ $labels.device }}】 发送流量过高"
description: "主机 【{{ $labels.instance }}】 网卡 【{{ $labels.device }}】 持续1分钟发送速率超过 10MB/s(当前值:{{ $value | printf \"%.2f\" }} bps)"

- alert: Linux网卡接收流量异常飙升
expr: predict_linear(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[5m], 60) * 8 > 80000000 and on(instance, device) rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[1m]) * 8 > 8000000
for: 3m
labels:
severity: '严重'
annotations:
summary: "主机 【{{ $labels.instance }}】 【网卡 {{ $labels.device }}】 接收流量异常飙升"
description: "主机 【{{ $labels.instance }}】 【网卡 {{ $labels.device }}】 流量在3分钟内急剧上升,预测1分钟后将超过10MB/s,可能存在异常业务或DDoS攻击。(当前预测值:{{ $value | printf \"%.2f\" }} bps)"

- alert: Linux网卡状态异常
expr: node_network_operstate{device!~"lo|veth.*|docker.*|br-.*", operstate!="up"} == 1
for: 1m
labels:
severity: '严重'
annotations:
summary: "主机 【{{ $labels.instance }}】 【网卡 {{ $labels.device }}】 状态异常"
description: "主机 【{{ $labels.instance }}】 【网卡 {{ $labels.device }}】 当前状态为 {{ $labels.operstate }},非 up 状态,可能导致网络中断。"
*****************************************************

(6)将要监控的Linux主机加入prometheus.yml

1
2
3
4
5
- job_name: node-exporter
static_configs:
- targets: ['xxxx:9100']
labels:
instance: xxxx

安装windows_exporter

(1)在要监控的Windows系统下载windows_exporter

1
https://github.com/prometheus-community/windows_exporter/releases/download/v0.31.7/windows_exporter-0.31.7-amd64.msi

(2)编写告警规则文件windows.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
vi /data/prometheus/config/rules/windows.yml

*****************************************************
groups:
- name: Windows基础资源报警规则
rules:
# -------------------------
# 内存告警 (使用物理内存剩余率)
# -------------------------

- alert: Windows内存严重不足告警
expr: (1 - (windows_cs_physical_memory_available_bytes / windows_cs_physical_memory_total_bytes)) * 100 > 95
for: 3m
labels:
severity: '警告'
annotations:
summary: "节点 【{{ $labels.instance }}】 内存即将耗尽"
description: "节点 【{{ $labels.instance }}】 的内存使用率已达到 {{ $value | printf \"%.1f\" }}%,系统可能面临 OOM 风险!"

# -------------------------
# 系统盘 (C盘) 空间告警
# -------------------------

- alert: Windows系统盘空间耗尽
expr: (1 - (windows_logical_disk_free_bytes{volume="C:"} / windows_logical_disk_size_bytes{volume="C:"})) * 100 > 90
for: 3m
labels:
severity: '严重'
annotations:
summary: "节点 【{{ $labels.instance }}】 系统盘【C盘】即将耗尽"
description: "节点 【{{ $labels.instance }}】 的 【C】 盘使用率高达 {{ $value | printf \"%.1f\" }}%,系统或程序可能无法正常运行!"

# -------------------------
# 其他数据盘空间告警 (排除C盘)
# -------------------------
- alert: Windows数据盘空间不足
expr: (1 - (windows_logical_disk_free_bytes{volume!="C:"} / windows_logical_disk_size_bytes{volume!="C:"})) * 100 > 90
for: 3m
labels:
severity: '严重'
annotations:
summary: "节点 【{{ $labels.instance }}】 数据盘【{{ $labels.volume }}】空间不足"
description: "节点 【{{ $labels.instance }}】 的 【{{ $labels.volume }}】 盘使用率已达到 {{ $value | printf \"%.1f\" }}%。"

# -------------------------
# CPU 告警
# -------------------------
- alert: WindowsCPU使用率过高
expr: 100 - (avg by(instance) (rate(windows_cpu_time_total{mode="idle"}[2m])) * 100) > 95
for: 3m
labels:
severity: '警告'
annotations:
summary: "节点 【{{ $labels.instance }}】 CPU使用率过高"
description: "节点 【{{ $labels.instance }}】 的 CPU 使用率已达到 {{ $value | printf \"%.1f\" }}%,持续 3 分钟。请检查是否有异常进程。"

# -------------------------
# 磁盘 I/O 延迟告警 (可选,针对高IO业务)
# -------------------------
- alert: Windows磁盘IO延迟过高
expr: rate(windows_logical_disk_read_seconds_total[5m]) + rate(windows_logical_disk_write_seconds_total[5m]) > 0.05
for: 3m
labels:
severity: '警告'
annotations:
summary: "节点 【{{ $labels.instance }}】 磁盘 【{{ $labels.volume }}】 IO延迟过高"
description: "节点 【{{ $labels.instance }}】 的 【{{ $labels.volume }}】 盘平均 IO 延迟超过 50ms (当前: {{ $value | printf \"%.2f\" }}s),可能存在磁盘性能瓶颈。"


# -------------------------
# 网卡接收流量过高
# -------------------------
- alert: Windows网卡接收流量过高
expr: sum by (instance, nic) (rate(windows_net_bytes_received_total{nic!~"isatap.*|VPN.*|Loopback.*|.*Virtual.*"}[1m])) * 8 > 80000000
for: 1m
labels:
severity: '警告'
annotations:
summary: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 接收流量过高"
description: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 持续1分钟接收速率超过 10MB/s(当前值:{{ $value | printf \"%.2f\" }} bps)"

# -------------------------
# 网卡发送流量过高
# -------------------------
- alert: Windows网卡发送流量过高
expr: sum by (instance, nic) (rate(windows_net_bytes_sent_total{nic!~"isatap.*|VPN.*|Loopback.*|.*Virtual.*"}[1m])) * 8 > 80000000
for: 1m
labels:
severity: '警告'
annotations:
summary: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 发送流量过高"
description: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 持续1分钟发送速率超过 10MB/s(当前值:{{ $value | printf \"%.2f\" }} bps)"

# -------------------------
# 网卡接收流量异常飙升
# 使用 predict_linear 预测未来1分钟流量,并增加当前基线判断,防止误报
# -------------------------
- alert: Windows网卡接收流量异常飙升
expr: predict_linear(windows_net_bytes_received_total{nic!~"isatap.*|VPN.*|Loopback.*|.*Virtual.*"}[5m], 60) * 8 > 80000000
and on (instance, nic)
rate(windows_net_bytes_received_total{nic!~"isatap.*|VPN.*|Loopback.*|.*Virtual.*"}[1m]) * 8 > 8000000
for: 3m
labels:
severity: '严重'
annotations:
summary: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 接收流量异常飙升"
description: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 流量在3分钟内急剧上升,预测1分钟后将超过10MB/s,可能存在异常业务或网络攻击。"

# -------------------------
# 网卡状态异常
# -------------------------
- alert: Windows网卡状态异常
expr: windows_net_adapter_info{nic!~"isatap.*|VPN.*|Loopback.*|.*Virtual.*", net_connection_status!="2"} == 1
for: 1m
labels:
severity: '严重'
annotations:
summary: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 状态异常"
description: "节点 【{{ $labels.instance }}】 网卡 【{{ $labels.nic }}】 当前状态码为 {{ $labels.net_connection_status }} (非2/已连接),可能导致网络中断。"
*****************************************************

(3)将要监控的Windows主机加入prometheus.yml

1
2
3
4
5
- job_name: windows
static_configs:
- targets: ['xxxx:9182']
labels:
instance: xxxx

安装blackbox_exporter

(1)下载blackbox_exporter

1
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.28.0/blackbox_exporter-0.28.0.linux-amd64.tar.gz

(2)创建blackbox_exporter服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar -xf blackbox_exporter-0.28.0.linux-amd64.tar.gz -C /usr/local/bin/
mv /usr/local/bin/blackbox_exporter-0.28.0.linux-amd64 /usr/local/bin/blackbox_exporter
vi /etc/systemd/system/blackbox-exporter.service

[Unit]
Description=blackbox-exporter
After=network.target

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

[Install]
WantedBy=multi-user.target

(3)启动blackbox_exporter服务

1
2
3
4
systemctl daemon-reload
systemctl start blackbox-exporter
systemctl enable blackbox-exporter
systemctl status blackbox-exporter

(4)允许端口通过防火墙

1
2
3
firewall-cmd --permanent --add-port=9115/tcp
firewall-cmd --reload
firewall-cmd --list-all

(5)编写告警规则文件blackbox.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vi /data/prometheus/config/rules/blackbox.yml

*****************************************************
groups:
- name: 应用服务监控规则
rules:
- alert: 应用服务访问异常
expr: probe_success == 0
for: 10s
annotations:
summary: "{{ $labels.group }}应用服务访问异常{{ $labels.instance }}"
description: "{{ $labels.group }}应用服务 【{{ $labels.instance }}】访问不可用,状态异常或连接失败"
labels:
severity: '严重'
- alert: 应用服务访问响应时间>10s
expr: probe_duration_seconds >= 10
for: 30s
annotations:
summary: "{{ $labels.group }}应用服务响应异常{{ $labels.instance }}"
description: "{{ $labels.group }}应用服务 【{{ $labels.instance }}】访问缓慢,响应时间超过10秒"
labels:
severity: '警告'
*****************************************************

(6)将要监控的应用服务加入到prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 # 网站监控
- job_name: 'http_status'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- http://xxxx:8080
- http://xxxx
labels:
group: web
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 本机IP:9115

# ping 检测
- job_name: 'ping_status'
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets:
- xxxx
labels:
group: 'icmp'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 本机IP:9115

# 端口监控
- job_name: 'port_status'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- xxxx:8080
labels:
group: 'port'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 本机IP:9115