前言 使用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界面
配置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