Prometheus 是一套开源的系统监控报警框架,非常适合大规模集群的监控。它也是第二个加入CNCF的项目,受欢迎度仅次于 Kubernetes 的项目。本文讲解完整prometheus 监控和告警服务的搭建。

prometheus 监控是当下主流监控系统,它是多个服务组合使用的体系。整体架构预览如下:

本篇教程监控系统搭建,包括的服务有:

  1. prometheus 监控的主体,负责数据汇总,保存,监控数据,产生告警信息
  2. exporter 监控的采集端,负责数据采集
  3. grafana 数据可视化,负责以丰富的页面展示采集到的数据
  4. alertmanager 告警管理,负责告警信息处理,包括告警周期,消息优先级等
  5. prometheusAlert 告警的具体发送端,负责配置告警模板,发出告警信息

除了监控采集节点,其他服务均通过docker-compose部署。部署系统信息:

  1. 系统:ubuntu20.04
  2. 服务器IP:172.16.9.124
  3. docker版本:20.10.21
  4. docker-compose版本:1.29.2
  5. 配置文件路径:/root/prometheus

部署prometheus

prometheus主要负责数据采集和存储,提供PromQL查询语言的支持。部署prometheus分为两个步骤:

  1. 准备配置文件
  2. 启动prometheus

准备配置文件

整个体系的配置文件在/root/prometheus,首先新建prometheus服务的配置文件路径 /root/prometheus/prometheus,并在这个目录下新建:

  • config 用于放置服务主要配置文件 prometheus.yml
  • data 用于放置服务的数据库文件
root@ubuntu-System-Product-Name:~/prometheus# tree . -L 3
.
├── docker-compose.yaml
└── prometheus
├── config
│ └── prometheus.yml
└── data

新建prometheus.yml,prometheus服务的主配置文件

global:
scrape_interval: 30s # 每30s采集一次数据
evaluation_interval: 30s # 每30s做一次告警检测 scrape_configs:
# 配置prometheus服务本身
- job_name: prometheus
static_configs:
- targets: ['172.16.9.124:9090']
labels:
instance: prometheus

修改 data 目录的文件权限,让容器有权限在data目录里生成数据相关数据

chmod 777 data

创建 docker-compse.yml

version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- /root/prometheus/prometheus/config:/etc/prometheus
- /root/prometheus/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'

参数说明:

command:

  • --config.file=/etc/prometheus/prometheus.yml 指定使用的配置文件
  • --storage.tsdb.path=/prometheus 指定时序数据库的路径
  • --web.enable-lifecycle 支持配置热加载

volumes:

  • /root/prometheus/prometheus/config:/etc/prometheus 映射配置文件所在目录
  • /root/prometheus/prometheus/data:/prometheus 映射数据库路径参数

启动prometheus

启动 docker-compse docker-compose up -d

查看日志:

root@ubuntu-System-Product-Name:~/prometheus# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
776772d69b20 prom/prometheus "/bin/prometheus --c…" 5 minutes ago Up 5 minutes 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus

查看容器的日志:

docker logs -f 776

ts=2023-12-25T10:21:17.560Z caller=main.go:478 level=info msg="No time or size retention was set so using the default time retention" duration=15d
ts=2023-12-25T10:21:17.560Z caller=main.go:515 level=info msg="Starting prometheus" version="(version=2.32.1, branch=HEAD, revision=41f1a8125e664985dd30674e5bdf6b683eff5d32)"
ts=2023-12-25T10:21:17.561Z caller=main.go:520 level=info build_context="(go=go1.17.5, user=root@54b6dbd48b97, date=20211217-22:08:06)"
ts=2023-12-25T10:21:17.561Z caller=main.go:521 level=info host_details="(Linux 5.15.0-56-generic #62~20.04.1-Ubuntu SMP Tue Nov 22 21:24:20 UTC 2022 x86_64 776772d69b20 (none))"
ts=2023-12-25T10:21:17.561Z caller=main.go:522 level=info fd_limits="(soft=1048576, hard=1048576)"
ts=2023-12-25T10:21:17.561Z caller=main.go:523 level=info vm_limits="(soft=unlimited, hard=unlimited)"
ts=2023-12-25T10:21:17.562Z caller=web.go:570 level=info component=web msg="Start listening for connections" address=0.0.0.0:9090
ts=2023-12-25T10:21:17.562Z caller=main.go:924 level=info msg="Starting TSDB ..."
ts=2023-12-25T10:21:17.562Z caller=tls_config.go:195 level=info component=web msg="TLS is disabled." http2=false
ts=2023-12-25T10:21:17.564Z caller=head.go:488 level=info component=tsdb msg="Replaying on-disk memory mappable chunks if any"
ts=2023-12-25T10:21:17.564Z caller=head.go:522 level=info component=tsdb msg="On-disk memory mappable chunks replay completed" duration=1.305µs
ts=2023-12-25T10:21:17.564Z caller=head.go:528 level=info component=tsdb msg="Replaying WAL, this may take a while"
ts=2023-12-25T10:21:17.564Z caller=head.go:599 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=1
ts=2023-12-25T10:21:17.564Z caller=head.go:599 level=info component=tsdb msg="WAL segment loaded" segment=1 maxSegment=1
ts=2023-12-25T10:21:17.564Z caller=head.go:605 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=14.305µs wal_replay_duration=301.534µs total_replay_duration=327.342µs
ts=2023-12-25T10:21:17.565Z caller=main.go:945 level=info fs_type=EXT4_SUPER_MAGIC
ts=2023-12-25T10:21:17.565Z caller=main.go:948 level=info msg="TSDB started"
ts=2023-12-25T10:21:17.565Z caller=main.go:1129 level=info msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
ts=2023-12-25T10:21:17.565Z caller=main.go:1166 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=217.62µs db_storage=555ns remote_storage=860ns web_handler=182ns query_engine=371ns scrape=90.382µs scrape_sd=10.238µs notify=450ns notify_sd=788ns rules=737ns
ts=2023-12-25T10:21:17.565Z caller=main.go:897 level=info msg="Server is ready to receive web requests."

日志很重要!日志很重要!日志很重要! 整个监控告警体系服务较多,环节较长,想要顺利完成一定要学会看日志排查问题。比如日志中报错容器没有权限创建文件,所以需要修改目录的权限。

查看web页面

登录prometheus的web页面 172.16.9.124:9090,查看监控的目标端点信息

可以看到只有一个服务,就是prometheus自身,已经是up的状态。

部署exporter

部署了prometheus主服务之后,下一步部署exporter。可以在这里找到常用的exporter,

本篇以最常用的服务器监控node-exporter为例,通过docker部署(最好使用安装包部署,这里主要为了方便快捷)。

启动node-exporter

root@ubuntu-System-Product-Name:~/prometheus# docker run -d --restart=always -p 9100:9100 prom/node-exporter
Unable to find image 'prom/node-exporter:latest' locally
latest: Pulling from prom/node-exporter
aa2a8d90b84c: Pull complete
b45d31ee2d7f: Pull complete
b5db1e299295: Pull complete
Digest: sha256:f2269e73124dd0f60a7d19a2ce1264d33d08a985aed0ee6b0b89d0be470592cd
Status: Downloaded newer image for prom/node-exporter:latest
fa3754932320ed9936d340cb4bb753db38086fa18fd0e99a8cb2ec556ed7f4bd

查看exporter状态

root@ubuntu-System-Product-Name:~/prometheus#docker ps | grep node
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa3754932320 prom/node-exporter "/bin/node_exporter" 43 seconds ago Up 42 seconds 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp eager_lehmann

所有的exporter都实现了一个查询的接口,通过访问exporter的端点可以访问其采集到的资源,如node-exporter的接口172.16.9.124:9100

相同步骤,部署了两个node-exporter,分别是node01: 172.16.9.124、node02: 192.168.123.62

更新prometheus

部署好exporter之后,需要配置prometheus定时从exporter采集资源。更新prometheus.yml

global:
scrape_interval: 30s # 每30s采集一次数据
evaluation_interval: 30s # 每30s做一次告警检测 scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['172.16.9.124:9090']
labels:
instance: prometheus - job_name: node01
static_configs:
- targets: ['172.16.9.124:9100']
labels:
instance: node01 - job_name: node02
static_configs:
- targets: ['192.168.123.62:9100']
labels:
instance: node02

node01 和 node02是启动的两个node-exporter,如果有更多客户端也添加到这里。

重新加载配置文件

让prometheus配置文件生效有两种方法,重新启动prometheus和热加载。因为在部署prometheus时已经配置了其可以热加载,所以通过如下命令即可快速重新加载配置文件。

curl -X POST http://172.16.9.124:9090/-/reload

刷新prometheus页面,查看已经配置的节点的状态,可以看到新加的两个采集节点已经处于up状态,配置生效。

部署grafana

prometheus自带的页面比较简单,通常使用grafana来查看prometheus采集的监控数据。grafana是一个可以展示和分析数据的平台,支持多种数据源和仪表盘的展示方式。下面部署grafana服务。

准备配置文件

新建目录 /root/prometheus/grfana作为grafana服务的主要目录,新建data目录将grafa配置文件映射出来,这样重启不会丢失配置。

root@ubuntu-System-Product-Name:~# tree prometheus/
prometheus/
├── docker-compose.yaml
├── grafana
│ └── data
└── prometheus
├── config
│ └── prometheus.yml
└── data
├── chunks_head
├── lock
├── queries.active
└── wal
├── 00000000
└── 00000001

修改grafana目录的读写权限

chmod 777 -R grafana/

启动grafana服务

在docker-compose.yml中新增grafana服务

version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- /root/prometheus/prometheus/config:/etc/prometheus
- /root/prometheus/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle' grafana:
image: grafana/grafana
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- /root/prometheus/grafana/data:/var/lib/grafana

重新启动docker-compose.yml

root@ubuntu-System-Product-Name:~/prometheus# docker-compose down
Stopping prometheus ... done
Removing prometheus ... done
Removing network prometheus_default
root@ubuntu-System-Product-Name:~/prometheus# docker-compose up -d
Creating network "prometheus_default" with the default driver
Pulling grafana (grafana/grafana:)...
latest: Pulling from grafana/grafana
97518928ae5f: Pull complete
5b58818b7f48: Pull complete
d9a64d9fd162: Pull complete
4e368e1b924c: Pull complete
867f7fdd92d9: Pull complete
387c55415012: Pull complete
07f94c8f51cd: Pull complete
ce8cf00ff6aa: Pull complete
e44858b5f948: Pull complete
4000fdbdd2a3: Pull complete
Digest: sha256:18d94ae734accd66bccf22daed7bdb20c6b99aa0f2c687eea3ce4275fe275062
Status: Downloaded newer image for grafana/grafana:latest
Creating grafana ... done
Creating prometheus ... done

查看容器状态

root@ubuntu-System-Product-Name:~/prometheus# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------
grafana /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp

查看grafana日志

docker logs -f grafana

t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add index builtin_role.org_id"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add unique index builtin_role_org_id_role_id_role"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="Remove unique index role_org_id_uid"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add unique index role.uid"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="create seed assignment table"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add unique index builtin_role_role_name"
t=2023-12-25T10:51:21+0000 lvl=info msg="migrations completed" logger=migrator performed=381 skipped=0 duration=1.361595517s
t=2023-12-25T10:51:21+0000 lvl=info msg="Created default admin" logger=sqlstore user=admin
t=2023-12-25T10:51:21+0000 lvl=info msg="Created default organization" logger=sqlstore
t=2023-12-25T10:51:21+0000 lvl=info msg="Initialising plugins" logger=plugin.manager
t=2023-12-25T10:51:21+0000 lvl=info msg="Plugin registered" logger=plugin.manager pluginId=input
t=2023-12-25T10:51:21+0000 lvl=info msg="Live Push Gateway initialization" logger=live.push_http
t=2023-12-25T10:51:21+0000 lvl=info msg="warming cache for startup" logger=ngalert
t=2023-12-25T10:51:21+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=
t=2023-12-25T10:51:21+0000 lvl=info msg="starting MultiOrg Alertmanager" logger=ngalert.multiorg.alertmanager
t=2023-12-25T10:52:41+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=GET path=/ status=302 remote_addr=192.168.123.62 time_ms=1 size=29 referer=

配置grafana

grafana服务启动之后,配置展示的数据来源、展示的模板等。操作步骤:

  1. 配置展示数据来源为prometheus服务
  2. 选择合适的展示模板

登录grafana 172.16.9.124:9100 默认密码是 admin / admin

配置grafana展示数据的来源是 prometheus

URL中填写 prometheus 的IP:端口号,http://172.16.9.124:9000

保存配置信息

到这里数据来源就配置好了,下面配置展示的模板。

添加展示模板



有三种添加模板的方法,分别是上传json文件、load 模板ID、粘贴json字符串。最方便的方法当然是load模板ID,因此选用这种方法。可以在模板商城选择模板 https://grafana.com/grafana/dashboards/

这里我们选择node-exporter配套的展示模板8919

配置完成

相同步骤导入单个服务器展示模板 12633

展示监控页面

  1. 服务器列表展示 ID:8919

  1. 单个服务器展示 ID:12633

到这里我们就拥有一个可以采集资源,查看资源的监控平台了。如果不需要告警消息就可以完工了,需要告警配置的请大步向前迈‍️。

部署alertmanager

采集的数据除了展示之后,更重要的是数据集异常告警。prometheus体系中告警是alertmanager服务。

部署步骤:

  1. 准备配置文件
  2. 更新prometheus
  3. 启动alertmanager服务
  4. 告警测试

准备配置文件

新建告警服务配置目录 /root/prometheus/alertmanager

root@ubuntu-System-Product-Name:~/prometheus# tree . -L 2
.
├── alertmanager
│ └── alertmanager.yml
├── docker-compose.yaml
├── grafana
│ └── data
└── prometheus
├── config
└── data

创建alertmanager服务配置文件 alertmanager.yaml

global:
resolve_timeout: 5m
route:
group_by: ['instance']
group_wait: 30s
group_interval: 60s
repeat_interval: 5m
receiver: 'web.hook.prometheusalert'
receivers:
- name: 'web.hook.prometheusalert'
webhook_configs:
- url: 'http://172.16.9.124:9093'

参数解释:

参数 解释
resolve_timeout: 5m 持续5分钟没收到告警信息后认为问题已解决
route 定义告警路由规则,可以定义多个receiver和group实现告警分组
group_by: ['instance'] 分组,处于同一组的告警会被合并为同一个通知。这里设置的是instance相同的告警会被合并为同一个通知
group_wait: 30s 30秒是个时间窗口,这个窗口内,同一个分组的所有消息会被合并为同一个通知
group_interval: 60s 同一个分组发送一次合并消息之后,每隔1分钟检查一次告警,判断是否要继续对此告警做操作
repeat_interval: 5m 发送报警间隔,如果指定时间内没有修复,则重新发送报警
receiver: 'web.hook.prometheusalert' 告警接受者,具体信息将在receivers区域中配置

注意:这里receiver配置了一个无效的webhook,所以alertmanager可以收到告警,但是暂时发送不出去。

更新prometheus

将alertmanager集成到prometheus中,分为两步走:

  1. 新建告警规则文件rules.yml
  2. 更新prometheus.yml新增alertmanager相关配置

/root/prometheus/ptometheus/config 目录下新增告警规则文件 rules.yml,用于给prometheus服务触发告警的规则。

rules.yaml

groups:
- name: 实例存活报警
rules:
- alert: 服务器宕机报警
expr: up == 0
for: 30s
labels:
severity: emergency
level: critical
annotations:
description: '服务器 {{ $labels.instance }}宕机'

该规则用于测试,当一个实例up状态为0超过30s就产生一个告警,告警的内容就是annotations中的description, 例如:服务器node01宕机。更多告警规则自行选择。

修改prometheus.yml相关的配置,新增告警服务和告警规则文件

global:
scrape_interval: 30s # 每30s采集一次数据
evaluation_interval: 30s # 每30s做一次告警检测 # 告警服务
alerting:
alertmanagers:
- static_configs:
- targets: ["172.16.9.124:9093"] # 告警规则文件
rule_files:
- "rules.yml" scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['172.16.9.124:9090']
labels:
instance: prometheus - job_name: node01
static_configs:
- targets: ['172.16.9.124:9100']
labels:
instance: node01 - job_name: node02
static_configs:
- targets: ['192.168.123.62:9100']
labels:
instance: node02

启动alertmanager服务

在docker-compose.yaml中新增alertmanager服务

version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- /root/prometheus/prometheus/config:/etc/prometheus
- /root/prometheus/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle' grafana:
image: grafana/grafana
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- /root/prometheus/grafana/data:/var/lib/grafana alertmanager:
image: prom/alertmanager
container_name: alertmanager
restart: always
ports:
- "9093:9093"
volumes:
- /root/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml

重启docker-compose

docker-compose down
docker-compose up -d

登录 172.16.9.124:9093 可以看到告警服务正常启动

登录prometheus web页面,点击菜单Alerts,可以看到所有的告警规则以及触发状态。当前告警处于非active的状态。

告警测试

触发一个告警规则,当一个node-exporter 停止30s就是触发告警规则。关闭node01 的 node-exporter

root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# docker ps | grep node
fa3754932320 prom/node-exporter "/bin/node_exporter" 24 hours ago Up 24 hours 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp eager_lehmann
root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# docker stop fa3
fa3
root@ubuntu-System-Product-Name:~/prometheus/prometheus/config#

查看prometheus服务的页面,30s之后报警处于等待状态

60s之后报警处于激活状态

到这里告警就部署完成了,因为没有给告警receiver配置可用的webhook,所以告警消息能收到但不能发送出去。下一步就部署能将告警消息发送到各个终端的服务 prometheusAlert。

部署prometheusAlert

alertmanager 是告警处理模块,但是告警消息的发送方法并不丰富。如果需要将告警接入飞书,钉钉,微信等,还需要有相应的SDK适配。prometheusAlert就是这样的SDK,可以将告警消息发送到各种终端上。

prometheus Alert 是开源的运维告警中心消息转发系统,支持主流的监控系统 prometheus,日志系统 Graylog 和数据可视化系统 Grafana 发出的预警消息。通知渠道支持钉钉、微信、华为云短信、腾讯云短信、腾讯云电话、阿里云短信、阿里云电话等。

部署prometheusAlert相关步骤:

  1. 创建飞书机器人
  2. 准备配置文件
  3. 启动 prometheusAlert服务
  4. 对接告警服务
  5. 调试告警模板

创建飞书机器人

创建飞书机器人步骤比较简单

添加自定义关键词,后续在发送的告警消息中一定要包含该关键字,如果没有飞书机器人会丢掉消息。

拿到最重要的webhook地址,后面作为告警地址使用

https://open.feishu.cn/open-apis/bot/v2/hook/b56175a-eb8e-4498-b5a-0b712c0a3d4f

不要尝试使用这个webhook,当你能看到的时候,该webhook已经失效了。

准备配置文件

新建目录 /root/prometheus/prometheus-alert/db用于保存prometheusAlert的数据库文件,当服务重新部署时不会丢失配置信息。

prometheus
├── alertmanager
│ └── alertmanager.yml
├── docker-compose.yaml
├── grafana
│ └── data
│ ├── alerting
│ ├── csv
│ ├── grafana.db
│ ├── plugins
│ └── png
├── prometheus
│ ├── config
│ │ ├── prometheus.yml
│ │ └── rules.yml
│ └── data
│ ├── 01HJHKAFY3SB9XYD71NECDARSV
│ ├── chunks_head
│ ├── lock
│ ├── queries.active
│ └── wal
└── prometheus-alert
└── db

启动prometheusAlert服务

docker-compose.yml 中新增prometheus-alert服务

version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- /root/prometheus/prometheus/config:/etc/prometheus
- /root/prometheus/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle' grafana:
image: grafana/grafana
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- /root/prometheus/grafana/data:/var/lib/grafana alertmanager:
image: prom/alertmanager
container_name: alertmanager
restart: always
ports:
- "9093:9093"
volumes:
- /root/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prometheus-alert:
image: feiyu563/prometheus-alert:latest
container_name: prometheus-alert
restart: always
ports:
- "9094:8080"
volumes:
- /root/prometheus/prometheus-alert/db:/app/db
environment:
- PA_LOGIN_USER=alertuser
- PA_LOGIN_PASSWORD=123456
- PA_TITLE=prometheusAlert
- PA_OPEN_FEISHU=1
- PA_OPEN_DINGDING=0
- PA_OPEN_WEIXIN=1

参数解释:

  • PA_LOGIN_USER=alertuser 登录账号
  • PA_LOGIN_PASSWORD=123456 登录密码
  • PA_TITLE=prometheusAlert 系统title
  • PA_OPEN_FEISHU=1 开启飞书支持
  • PA_OPEN_DINGDING=0 开启钉钉支持
  • PA_OPEN_WEIXIN=1 开启微信支持
  • /root/prometheus/prometheus-alert/db 将数据库映射出来

重启服务

docker-compose down
docker-compose up -d

查看服务启动状态

root@ubuntu-System-Product-Name:~/prometheus# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------
alertmanager /bin/alertmanager --config ... Up 0.0.0.0:9093->9093/tcp,:::9093->9093/tcp
grafana /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp
prometheus-alert /bin/sh /app/docker-entryp ... Up (healthy) 0.0.0.0:9094->8080/tcp,:::9094->8080/tcp

查看日志

docker logs -f 5ec

登录web页面

prometheusAlert到这了就部署完成了,目前只是部署好该服务,还没有将服务器接入到告警消息流中。

对接告警服务

prometheusAlert是用于将告警服务alertmanager产生的消息发送给终端,也就是将消息格式化,适配不同的终端,如邮件,短信,微信,钉钉,飞书等不同的接口。

将alertmanager告警消息的接受者指定为prometheus-alert提供的url。修改告警规则rules.yml,添加webhook_configs中url配置。

rules.py

global:
resolve_timeout: 5m
route:
group_by: ['instance']
group_wait: 10m
group_interval: 10s
repeat_interval: 10m
receiver: 'web.hook.prometheusalert'
receivers:
- name: 'web.hook.prometheusalert'
webhook_configs:
- url: 'http://172.16.9.124:9094/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/5f4b9c9b-9fed-4bb9-af26-3e1ce174d145'

http://172.16.9.124:9094/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=xxx

是prometheus-alert提供的固定格式,

  • type=fs表示为飞书
  • tpl=prometheus-fs 表示是prometheus消息
  • fsurl 为飞书机器人的webhook,就是创建飞书机器人拿到的webhook

这些参数非常关键,通过type和tpl可以匹配到prometheus-alert上的模板,以上参数匹配到就是飞书的模板。当消息到来的时候,会自动适配到飞书模板,发送给飞书机器人。

重启alertmanager让配置生效

docker-compose start alermanager

重启之后飞书应该就能收到告警消息了

如果不能收到告警消息,排查三个地方,查看告警信息的流向:

一、prometheus 触发的告警。

是否产生了告警消息

二、prometheusAlert 接收到的告警msg。

当prometheusAlert对接alertmanager之后,告警消息就能发送过来,从日志中可以看到prometheusAlert接收到的错误信息。

三、prometheusAlert web端显示发送的告警。

查看prometheusAlert的消息统计信息,是否有消息发送进来和出去。如果从日志中看到有消息进来,但是统计页面没有消息出去,那就是服务模板配置有问题,有问题——看日志。

调试告警模板

默认告警模板很难满足所有人的审美,如果要选择更多模板,可以使用prometheusAlert提供的模板功能完成。默认的模板如下:

进入模板编辑页面

红框内容都是必填内容,分别是模板的内容,日志中json格式的告警消息,飞书机器人的地址。

其中模板可以从这里去找:https://github.com/feiyu563/prometheusAlert/issues/30,比如说我个人喜欢这个

填写相应的信息

点击测试,能够发送该模板的消息到飞书机器人

当告警恢复了之后,还会发送一个恢复的消息

为了方便测试,把模板和告警日志也搬过来

模板

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}<font color="green">**告警恢复信息**</font>
事件: **{{$v.labels.alertname}}**
告警类型:{{$v.status}}
告警级别: {{$v.labels.level}}
开始时间: {{GetCSTtime $v.startsAt}}
结束时间: {{GetCSTtime $v.endsAt}}
主机: {{$v.labels.instance}}
<font color="green">**事件详情: {{$v.annotations.description}}**</font>
{{else}}**告警信息**
事件: **{{$v.labels.alertname}}**
告警类型:{{$v.status}}
告警级别: {{$v.labels.level}}
开始时间: {{GetCSTtime $v.startsAt}}
主机: {{$v.labels.instance}}
<font color="red">**事件详情: {{$v.annotations.description}}**</font>
{{end}}
{{ end }}

日志

{"msg_type":"interactive","email":"xxxxxxxxxxx@qq.com","card":{"config":{"wide_screen_mode":true,"enable_forward":true},"elements":[{"tag":"div","text":{"content":"\r\n\r\n**[prometheus告警信息](http://b616a9009165:9090/graph?g0.expr=up+%3D%3D+0\u0026g0.tab=1)**\r\n*[服务器宕机报警](http://054ff0c0b9ab:9093)*\r\n告警级别:critical\r\n开始时间:2023-12-28 01:38:28\r\n结束时间:0001-01-01 00:00:00\r\n故障主机IP:node01\r\n**服务器 node01宕机**\r\n\r\n","tag":"lark_md"},"content":"","elements":null},{"tag":"hr","text":{"content":"","tag":""},"content":"","elements":null},{"tag":"note","text":{"content":"","tag":""},"content":"","elements":[{"tag":"lark_md","text":{"content":"","tag":""},"content":"prometheusAlert","elements":null}]}],"header":{"title":{"content":"prometheusAlert","tag":"plain_text"},"template":"red"}}}

ok,到此为止prometheus的搭建就完成了,撒花

整个过程步骤较多,即使是我第二次搭建也出现了很多问题。有问题也不要慌,多看日志,搜索报错记录,分析可能的报错原因,问题终会解决。

Prometheus 监控告警系统搭建(对接飞书告警)的更多相关文章

  1. prometheus 对接飞书告警

    prometheus对接飞书告警 环境 名称 ip地址 cpu 内存 yz-feishu 10.65.6.91 4c 8G 飞书创建群组机器人,参考飞书官网 https://www.feishu.cn ...

  2. k8s event监控利器kube-eventer对接企微告警

    背景 监控是保障系统稳定性的重要组成部分,在Kubernetes开源生态中,资源类的监控工具与组件监控百花齐放. cAdvisor:kubelet内置的cAdvisor,监控容器资源,如容器cpu.内 ...

  3. php对接飞书机器人报警接口

    <?php function request_by_curl($remote_server, $post_string) { $ch = curl_init(); curl_setopt($ch ...

  4. 图文详解Prometheus监控+Grafana+Alertmanager告警安装使用

    一:前言 一个服务上线了后,你想知道这个服务是否可用,需要监控.假如线上出故障了,你要先于顾客感知错误,你需要监控.还有对数据库,服务器的监控,等等各层面的监控. 近年来,微服务架构的流行,服务数越来 ...

  5. Prometheus+Grafana+Altermanager搭建监控系统

    基本概念 Prometheus 时间序列化数据库,我的理解就是将数据打上标签,以时间维度存储.后面有机会在深入研究. Prometheus架构如下: Grafana Prometheus中存储的数据, ...

  6. Prometheus 监控平台的搭建

    1. 环境准备 两台ubuntu 16.04 服务器内网IP 作用 安装软件 172.16.4.11                 监控的服务端                Prometheus( ...

  7. Prometheus监控告警浅析

    前言 最近有个新项目需要搞一套完整的监控告警系统,我们使用了开源监控告警系统Prometheus:其功能强大,可以很方便对其进行扩展,并且可以安装和使用简单:本文首先介绍Prometheus的整个监控 ...

  8. Prometheus 监控报警系统 AlertManager 之邮件告警

    转载自:https://cloud.tencent.com/developer/article/1486483 文章目录1.Prometheus & AlertManager 介绍2.环境.软 ...

  9. 简单易用的监控告警系统 | HertzBeat 在 Rainbond 上的使用分享

    在现有的监控告警体系中 Prometheus + AlertManger + Grafana 一直是主流,但对于中小团队或个人来说,这种体系显的较为复杂.而 HertzBeat 能让中小团队或个人很快 ...

  10. Prometheus 监控领域最锋利的“瑞士军刀”

    原文:https://mp.weixin.qq.com/s/Cujn6_4w8ZcXCOWpoAStvQ 一.Kubernetes 容器监控的标配—Prometheus 1.简介 Prometheus ...

随机推荐

  1. DB2复制表结构及数据

    在DB2数据库中,复制已经存在的表的结构及其数据.我们采用两步走方式:第一步先复制表结构,第二部拷贝数据. 第一步:复制表结构 方法一: Create table test_Rate as (sele ...

  2. ESS、RSS、TSS

    回归平方和 ESS,残差平方和 RSS,总体平方和 TSS 残差平方和越小,自变量与因变量之间的相关性越好 总变差(TSS):被解释变量Y的观测值与其平均值的离差平方和(总平方和)(说明 Y 的总变动 ...

  3. Android news Display Owner Info on Your Android Device in Case It Gets Lost

    Display Owner Info on Your Android Device in Case It Gets Lost The latest versions of Android includ ...

  4. 使用 OpenTelemetry 构建 .NET 应用可观测性(4):ASP.NET Core 应用中集成 OTel

    目录 前言 使用 elastic 构建可观测性平台 在 ASP.NET Core 应用中集成 OTel SDK 安装依赖 基础配置 Instrumentation 配置 创建自定义 Span 和 Me ...

  5. 再学Blazor——扩展方法

    上篇提到 Blazor 组件的高级写法,是采用扩展方法对 HTML 元素和组件进行扩展,以便于书写组件结构和代码阅读.本篇主要介绍扩展方法实现的思路. 什么是扩展方法 要扩展哪个类 扩展方法的实现 1 ...

  6. [ABC310D] Peaceful Teams 题解

    Peaceful Teams 题目大意 将 \(n\) 个人分成 \(T\) 组,要求每组不能包含敌对的人,问有多少种分法. 思路分析 注意到 \(n,T\) 均很小,考虑爆搜. 注意到直接枚举会枚举 ...

  7. gson如何序列化子类

    需求 目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性.对方传过来的json字符串中,把这些对象组成了一个数组返回过来的.这样该如何反序列化呢? 举例 定义Person类.Student ...

  8. JavaScript(ES6):变量的解构赋值

    解构赋值定义: 允许按照一定模式从数组或对象中提取值,然后对变量进行赋值. 数组的解构赋值 注:数组的元素要一次排序的,变量的值由他的位置决定. 基本用法 // ES6 解构赋值 let [a, b, ...

  9. IPv4:根据CIDR显示地址范围

    最近遇到一个很有意思的点,于是就记录下来. CIDR一般是由IP地址和子网掩码组成,即 IP地址/子网掩码 格式. 子网掩码表示前面地址中的前多少位,为网络位,后面部分代表主机部分.例如:192.16 ...

  10. influxdb报错:cache-max-memory-size exceeded

    转载请注明出处: influxdb报错日志: 该错误信息表示 InfluxDB 引擎超过了缓存最大内存大小.这意味着 InfluxDB 的缓存使用量超出了配置的限制. 要解决此问题,可以采取以下步骤来 ...