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. Springboot+Mybatisplus+ClickHouse集成

    核心依赖引入 <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clic ...

  2. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  3. go 流程控制之switch 语句介绍

    go 流程控制之switch 语句介绍 目录 go 流程控制之switch 语句介绍 一.switch语句介绍 1.1 认识 switch 语句 1.2 基本语法 二.Go语言switch语句中cas ...

  4. IDEA的Maven换源

    打开IDEA安装路径,然后打开下面的文件夹 plugins\maven\lib\maven3\conf 在conf文件目录下出现一个setting.xml的文件.(ps:如果没有,请忽略本文,自行创建 ...

  5. AtCoder Beginner Contest 326 (ABC326)

    A. 2UP3DOWN 直接模拟即可. Code B. 326-like Numbers 枚举,每次拆除百.十.个位,再判断. Code C. Peak Description 数字线上放置了 \(N ...

  6. JUC并发编程学习笔记(十)线程池(重点)

    线程池(重点) 线程池:三大方法.七大参数.四种拒绝策略 池化技术 程序的运行,本质:占用系统的资源!优化资源的使用!-> 池化技术(线程池.连接池.对象池......):创建和销毁十分消耗资源 ...

  7. .NET8 WebApplication剖析

    ​ WebApplication 是用于配置HTTP管道和路由的web应用程序,接来下我将一一拆解它的组成. /// <summary> /// The web application u ...

  8. Python 文件处理指南:打开、读取、写入、追加、创建和删除文件

    文件处理是任何Web应用程序的重要部分.Python有多个用于创建.读取.更新和删除文件的函数. 文件处理 在Python中处理文件的关键函数是open()函数.open()函数接受两个参数:文件名和 ...

  9. off-line RL | CQL:魔改 Bellman error 更新,得到 Q 函数 lower-bound

    论文题目: Conservative Q-Learning for Offline Reinforcement Learning CQL 是师兄盛赞的一篇论文:"是 off-line RL ...

  10. 你还在为SFTP连接超时而困惑么?

    1. 前言 在最近的项目联调过程中,发现在连接上游侧SFTP时总是需要等待大约10s+的时间才会出现密码输入界面,这种长时间的等待直接导致的调用文件接口时连接sftp超时问题.于是决定自己针对该问题进 ...