监控是当前云原生时代下可观测性中关键性的一环,较之前相比,云原生时代已经发生了诸多变化,诸如微服务,容器化等技术层出不穷,且云原生时代的演进速度,更新速度极快,相对应监控所产生的数据量大大增加,对实时性的要求也大大增加。为应对变化,Prometheus应运而生,其所可实现的功能,与云原生极好的契合度,集成第三方开源组件的便利性,无疑使其成为无疑是最为耀眼的明星之一。
本文着重在于介绍如何利用Prometheus搭建监控系统,涵盖探针,指标设定,可视化,告警设定,容器监控等。这是一篇入门级教程,暂不涵盖gateway,K8S集群等的相关内容。关于Prometheus的基本知识与概念,自行google之,本文重点描述实战过程。
目录:
- 部署Prometheus Server
- 部署监控探针
- 部署Grafana
- 部署AlertManager
- 部署PrometheusAlert
本节主要介绍以docker的方式部署Prometheus Server,并预留映射相关配置项
2.1 配置环境- 创建文件夹并授予权限
sudo mkdir -pv /data/docker/prometheus/{data,alert_rules,job}
sudo chown -R myusername:myusername /data/docker/prometheus/
其中,
- data文件夹用于存放prometheus产生的数据
- alert_rules文件夹用于存放prometheus alert告警规则配置文件
- job用于存放监控对象配置json文件
- myusername可替换为实际的用户名
- 执行本条命令以避免出现 permission denied 错误
sudo chown 65534:65534 -R /data/docker/prometheus/data
- 拷贝配置文件到指定的目录,注意下,需要关注该文件中涉及“$ip”的部分,后续配置,诸如添加AlertManager后,记得返回修改修改此处。
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
# - targets: ["$ip:9093"]
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
- /etc/prometheus/alert_rules/*.rules
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus'
file_sd_configs:
- files:
- /etc/prometheus/job/prometheus.json
refresh_interval: 1m # 重载配置文件
# Node 主机组
- job_name: 'host'
#basic_auth:
# username: prometheus
# password: prometheus
file_sd_configs:
- files:
- /etc/prometheus/job/host.json
refresh_interval: 1m
# cadvisor 容器组
- job_name: 'cadvisor'
file_sd_configs:
- files:
- /etc/prometheus/job/cadvisor.json
refresh_interval: 1m
# mysql exporter 组
- job_name: 'mysqld-exporter'
file_sd_configs:
- files:
- /etc/prometheus/job/mysqld-exporter.json
refresh_interval: 1m
# blackbox ping 组
- job_name: 'blackbox_ping'
scrape_interval: 5s
scrape_timeout: 2s
metrics_path: /probe
params:
module: [ping]
file_sd_configs:
- files:
- /etc/prometheus/job/blackbox/ping/*.json
refresh_interval: 1m
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: $ip:9115
# blackbox http get 2xx 组
- job_name: 'blackbox_http_2xx'
scrape_interval: 5s
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- files:
- /etc/prometheus/job/blackbox/http_2xx/*.json
refresh_interval: 1m
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: $ip:9115
- job_name: "blackbox_tcp"
metrics_path: /probe
params:
module: [tcp_connect]
file_sd_configs:
- files:
- /etc/prometheus/job/blackbox/tcp/*.json
refresh_interval: 1m
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: $ip:9115
- job_name: 'blackbox_ssh_banner'
metrics_path: /probe
params:
module: [ssh_banner]
file_sd_configs:
- files:
- /etc/prometheus/job/blackbox/ssh_banner/*.json
refresh_interval: 1m
relabel_configs:
# Ensure port is 22, pass as URL parameter
- source_labels: [__address__]
regex: (.*?)(:.*)?
replacement: ${1}:22
target_label: __param_target
# Make instance label the target
- source_labels: [__param_target]
target_label: instance
# Actually talk to the blackbox exporter though
- target_label: __address__
replacement: $ip:9115
- job_name: "blackbox_dns"
metrics_path: /probe
params:
module: [dns_udp]
file_sd_configs:
- files:
- /etc/prometheus/job/blackbox/dns/*.json
refresh_interval: 1m
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: $ip:9115
2.2 启动服务端
docker run -itd -p 9090:9090 -v /data/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro -v /data/docker/prometheus/alert_rules:/etc/prometheus/alert_rules -v /data/docker/prometheus/job:/etc/prometheus/job -v /data/docker/prometheus/data:/data/prometheus/ -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --name prometheus --restart=always prom/prometheus:v2.28.1 --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus/ --storage.tsdb.retention.time=30d --web.read-timeout=5m --web.max-connections=10 --query.max-concurrency=20 --query.timeout=2m --web.enable-lifecycle
启动成功后,通过浏览器访问 http://$ip:9090 可看到界面。
如果系统打开了防火墙,你可能需要给以下几个端口开白名单,以centos7为例,
sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent sudo firewall-cmd --zone=public --add-port=9100/tcp --permanent sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent sudo firewall-cmd --reload2.3 部署 Prometheus Server 参考文档
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
三、部署监控探针Prometheus与Zabbix不同,Prometheus主要采用主动拉取的模式,通过Exporter提供的接口读取监控数据。Exporter负责采集数据,可以把Exporter理解为探针,并通过http的方式提供接口供Server调用读取数据,读者可自行google本文未描述的各个exporter提供的返回结果内字段的含义。
3.1 部署node_exporternode_exporter用于监控主机的CPU,内存,磁盘,I/O等的信息。侧重点在于主机系统本身的数据采集。
- 下载 node exporter 并解压
登录需要被监控的主机,可从 此处 下载 node exporter
或者运行 curl -O https://github.com/prometheus/node_exporter/releases/download/v1.2.0/node_exporter-1.2.0.linux-amd64.tar.gz
下载完成后,运行以下命令解压二进制包
tar xvfz node_exporter-1.2.0.linux-amd64.tar.gz sudo mkdir -p /data/node_exporter/ sudo mv node_exporter-1.2.0.linux-amd64/* /data/node_exporter/
- 创建prometheus用户
sudo groupadd prometheus sudo useradd -g prometheus -m -d /var/lib/prometheus -s /sbin/nologin prometheus sudo chown prometheus.prometheus -R /data/node_exporter/
- 创建Systemd服务
添加并编辑文件
sudo nano /etc/systemd/system/node_exporter.service
写入以下内容
[Unit] Description=node_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=prometheus ExecStart=/data/node_exporter/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target
- 使用systemctl 启动 node exporter
启动并查看服务是否正常
sudo systemctl start node_exporter sudo systemctl status node_exporter
应该返回类似以下的文本
● node_exporter.service - node_exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2019-06-05 09:18:56 GMT; 3s ago
Main PID: 11050 (node_exporter)
CGroup: /system.slice/node_exporter.service
└─11050 /usr/local/prometheus/node_exporter/node_exporter
设置开机启动: sudo systemctl enable node_exporter
- 开启防火墙白名单
执行curl localhost:9100,如可以看到返回的网页,说明 node exporter 已经启动成功了。
在同网段内其他机器执行curl http://$ip:9100/,应同样可以看到返回的页面。
如果看不到返回的页面,可以检查下是否为防火墙端口未开
sudo firewall-cmd --zone=public --add-port=9100/tcp --permanent sudo firewall-cmd --reload
- 配置 Prometheus
登录 Prometheus 服务端,编辑以下文件
nano /data/docker/prometheus/job/host.json, 内容参考如下,ip地址自行更改实际的ip地址
[
{
"targets": [ "192.168.1.100:9100"],
"labels": {
"subject": "node_exporter",
"hostname": "server1"
}
},
{
"targets": [ "192.168.1.101:9100"],
"labels": {
"subject": "node_exporter",
"hostname": "server2"
}
}
]
- 部署 node_exporter 可参考文档
https://github.com/prometheus/node_exporter
https://prometheus.io/docs/guides/node-exporter/
https://www.jianshu.com/p/7bec152d1a1f
mysqld-exporter 用于监控MySQL数据库的性能等数据。
- 登录mysql数据库所在主机,并通过docker方式启动
docker run -d -p 9104:9104 --link mysql --name mysqld-exporter --restart on-failure:5 -e DATA_SOURCE_NAME="root:pwdpwdpwdpwdpwd@(mysql:3306)/" prom/mysqld-exporter:v0.13.0
启动后,访问http://127.0.0.1:9104/metrics,可看到监控信息,同时从Prometheus服务端访问也应要可访问的到。
- 部署 mysqld-exporter 可参考文档
https://github.com/prometheus/mysqld_exporter
https://registry.hub.docker.com/r/prom/mysqld-exporter/
cadvisor用于监控容器的状态。
- 登录docker所在主机并通过运行以下脚本启动cadvisor
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=9101:8080 --detach=true --name=cadvisor --restart on-failure:5 --privileged --device=/dev/kmsg gcr.io/cadvisor/cadvisor:v0.38.6
你可能会找到两种 cadvisor,一种是 gcr.io/cadvisor/cadvisor, 另一种是 google/cadvisor, 建议使用 gcr.io/cadvisor/cadvisor
- 配置 Prometheus 服务端
登录Prometheus 服务端所在主机,编辑 nano /data/docker/prometheus/job/cadvisor.json 文件, 内容参考如下:
[
{
"targets": [ "192.168.1.100:9101"],
"labels": {
"subject": "cadvisor",
"hostname": "server1"
}
},
{
"targets": [ "192.168.1.101:9101"],
"labels": {
"subject": "cadvisor",
"hostname": "server2"
}
}
]
- 如果docker所在主机存在防火墙,记得添加防火墙白名单
sudo firewall-cmd --zone=public --add-port=9101/tcp --permanent sudo firewall-cmd --reload
- 部署 cadvisor 可参考文档
https://github.com/google/cadvisor
blackbox_exporter 是以黑盒方式进行监控的工具
- 创建配置文件
登录 Prometheus 服务端主机,执行以下命令
sudo mkdir -p /data/docker/blackbox/conf sudo chown -R myusername:myusername /data/docker/blackbox
并添加编辑该文件
nano /data/docker/blackbox/conf/blackbox.yml
yml文件范本如下:
modules:
ping:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"
http_2xx:
prober: http
timeout: 5s
http:
method: GET
preferred_ip_protocol: "ip4" # defaults to "ip4"
ip_protocol_fallback: false # no fallback to "ip6"
http_post_2xx:
prober: http
timeout: 5s
http:
method: POST
preferred_ip_protocol: "ip4"
http_post_2xx_json:
prober: http
timeout: 30s
http:
preferred_ip_protocol: "ip4"
method: POST
headers:
Content-Type: application/json
body: '{"key1":""vlaue1,"params":{"param2":"vlaue2"}}'
http_basic_auth:
prober: http
timeout: 60s
http:
method: POST
headers:
Host: "login.example.com"
basic_auth:
username: "username"
password: "mysecret"
tls_connect:
prober: tcp
timeout: 5s
tcp:
tls: true
tcp_connect:
prober: tcp
timeout: 5s
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
- send: SSH-2.0-blackbox-ssh-check
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
dns_udp:
prober: dns
timeout: 10s
dns:
transport_protocol: udp
preferred_ip_protocol: ip4
query_name: "www.example.cn"
query_type: "A"
- 配置 Prometheus
继续在 Prometheus 服务端主机,执行以下命令
sudo mkdir -p /data/docker/prometheus/job/blackbox/
sudo mkdir -pv /data/docker/prometheus/job/blackbox/{dns,http_2xx,ping,ssh_banner,tcp}
sudo chown -R myusername:myusername /data/docker/prometheus/job/blackbox/
以下依次在/data/docker/prometheus/job/blackbox/下的对应的文件夹中,创建json文件,并参考样本写入配置
在dns文件夹下,创建 dns.json,样本如下
[
{
"targets": [ "192.168.1.1"],
"labels": {
"subject": "blackbox_dns",
"app": "my_dns"
}
}
]
在http_2xx文件夹下,创建 search-site.json,样本如下
[
{
"targets": [ "https://www.google.cn/?HealthCheck"],
"labels": {
"app": "google",
"subject": "blackbox_http_2xx",
"hostname": "server-01"
}
},
{
"targets": [ "https://cn.bing.com/?HealthCheck"],
"labels": {
"app": "bing",
"subject": "blackbox_http_2xx",
"hostname": "server-02"
}
}
]
在ping文件夹下,创建 search-site.json,样本如下
[
{
"targets": [ "www.google.cn"],
"labels": {
"app": "google",
"subject": "blackbox_ping",
"hostname": "server-01"
}
},
{
"targets": [ "cn.bing.com"],
"labels": {
"app": "bing",
"subject": "blackbox_ping",
"hostname": "server-02"
}
}
]
在ssh_banner文件夹下,创建 ssh-banner.json,样本如下
[
{
"targets": [ "192.168.1.100:22"],
"labels": {
"subject": "blackbox_ssh_banner",
"hostname": "server-01"
}
},
{
"targets": [ "192.168.1.101:22"],
"labels": {
"subject": "blackbox_ssh_banner",
"hostname": "server-02"
}
}
]
在tcp文件夹下,创建 tcp.json,样本如下
[
{
"targets": [ "$ip:3306"],
"labels": {
"app": "mysql.example.cn",
"subject": "blackbox_tcp",
"hostname": "mysql"
}
}
]
- 运行blackbox_exporter
在 Prometheus服务端所在的主机,运行以下命令,使用容器启动blackbox_exporter
docker run -d --restart on-failure:5 -p 9115:9115 -v /data/docker/blackbox/conf/blackbox.yml:/config/blackbox.yml:ro --name blackbox_exporter prom/blackbox-exporter:v0.19.0 --config.file=/config/blackbox.yml
启动成功后,访问http://$ip:9090/targets,可看到至今为止,我们配置的所有探针所反馈回来的数据,其中,State应为UP状态。
- 部署 blackbox_exporter 可参考文档
https://github.com/prometheus/blackbox_exporter
https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/exporter/commonly-eporter-usage/install_blackbox_exporter
接下来,部署可视化工具Grafana,Grafana可快速集成Prometheus,并通过设定甚至是使用现成的模板,快速将采集结果转变为图形化的页面。
4.1 启动运行以下命令,做启动前的准备工作
sudo mkdir -p /data/docker/grafana sudo chown 472:472 /data/docker/grafana -R
通过docker运行grafana
docker run -d -p 3000:3000 --name=grafana -v /data/docker/grafana:/var/lib/grafana -v /etc/localtime:/etc/localtime:ro --restart=always --name grafana grafana/grafana:8.0.6
启动成功后,可通过http://$ip:3000访问页面,默认账号密码: admin / admin 。
4.2 配置-
配置数据源
点击“Configuration -> Data sources”,进入 http://$ip:3000/datasources,增加Prometheus数据源,并做好配置。 -
配置Dashboards
点击“Dashboards -> Manage -> import”,进入http://$ip:3000/dashboard/import,导入 Grafana Dashboards 模板,在Import via grafana.com处,填入你想要导入的模板id,常用的模板id如下:
- node exporter ID: 8919
- Cadvisor ID: 14282
- mysqld-exporter ID: 7362
你也可以在https://grafana.com/grafana/dashboards,自行搜索 Dashboards 模板。也可以自行创建dashboard面板。
4.3 部署 Grafana 可参考文档https://grafana.com/docs/grafana/latest/installation/docker/
五、部署AlertManager截至到现在,我们已经部署好Prometheus Server,Exporter,Grafana可视化组件,我们还需要配置告警组件,当故障出现时,监控系统可通过多种方式告知接收人,以便接收人及时知晓并处理。但Prometheus本身并不自带告警工具,Prometheus可以通过预配置的规则,将信息发送到AlertManager,由AlertManager统一处理告警信息,并通过邮箱,短信,微信,钉钉等方式告知告警接收人。和Grafana一样,AlertManager同样不仅仅支持Prometheus,也支持集成处理其他程序的信息。
5.1 准备工作运行以下命令
sudo mkdir -pv /data/docker/alertmanager sudo chown -R myusername:myusername /data/docker/alertmanager/ cd /data/docker/alertmanager
在/data/docker/alertmanager文件夹中,创建alertmanager.yml 和 email.tmpl 文件,
alertmanager.yml的样例如下,注意要设置smtp相关配置项与webhook的ddurl:
global:
resolve_timeout: 5m
# 邮件SMTP配置
smtp_smarthost: 'smtp.gmail.com:465'
smtp_from: 'example@gmail.com'
smtp_auth_username: 'example@gmail.com'
smtp_auth_password: 'xxxxx'
smtp_require_tls: false
# 自定义通知模板
templates:
- '/etc/alertmanager/email.tmpl'
# route用来设置报警的分发策略
route:
# 采用哪个标签来作为分组依据
group_by: ['alertname']
# 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
group_wait: 10s
# 两组告警的间隔时间
group_interval: 10s
# 重复告警的间隔时间,减少相同邮件的发送频率
repeat_interval: 1h
# 设置默认接收人
receiver: 'myreceiver'
routes: # 可以指定哪些组接手哪些消息
- receiver: 'myreceiver'
continue: true
group_wait: 10s
receivers:
- name: 'myreceiver'
#send_resolved: true
email_configs:
# - to: 'example@gmail.com, example2@gmail.com'
- to: 'example@gmail.com'
html: '{{ template "email.to.html" . }}'
headers: { Subject: "Prometheus [Warning] 报警邮件" }
# 钉钉配置
webhook_configs:
- url: 'http://$ip:18080/prometheusalert?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxxx'
email.tmpl的样例如下,注意样例中有一个"2006-01-02 15:04:05",这个时间不能改,否则报警显示时间可能会不正确:
{{ define "email.to.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{ range .Alerts }}
=========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }}
告警类型: {{ .Labels.alertname }}
告警应用: {{ .Labels.app }}
告警主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
=========end==========
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ range .Alerts }}
=========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }}
告警类型: {{ .Labels.alertname }}
告警应用: {{ .Labels.app }}
告警主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
=========end==========
{{ end }}{{ end -}}
{{- end }}
这两个配置文件,可参考 https://prometheus.io/docs/alerting/latest/configuration/ 进行修改。
5.1 启动AlertManager运行以下命令
docker run -d -p 9093:9093 -v /data/docker/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro -v /data/docker/alertmanager/email.tmpl/:/etc/alertmanager/email.tmpl:ro --name alertmanager --restart=always prom/alertmanager:v0.22.25.3 访问
启动成功后,可通过http://$ip:9093访问alertmanager组件
六、部署PrometheusAlert上节已经提到,Prometheus告警需由两部分组成,上节我们已经部署好AlertManager用于信息处理与通知,本节我们需要定义好Prometheus的配置规则,如此Prometheus便可以产生告警信息并发送到AlertManager。
6.1 准备工作运行以下命令
sudo mkdir -p /data/docker/prometheus-alert/conf sudo chown -R fenixadar:fenixadar /data/docker/prometheus-alert/ nano /data/docker/prometheus-alert/conf/app.conf
从 https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/conf/app-example.conf 下载文件并移动到 /data/docker/prometheus-alert/conf/app.conf
6.2 启动运行以下命令开启prometheus-alert
docker run -d --publish=18080:8080 -v /data/docker/prometheus-alert/conf/:/app/conf:ro -v /data/docker/prometheus-alert/db/:/app/db -v /data/docker/prometheus-alert/log/:/app/logs --name prometheusalert-center feiyu563/prometheus-alert:v-4.5.0
开启成功后,通过http://$ip:18080,访问prometheus-alert界面。用户密码已在 app.conf 中设置。
如果系统开启了防火墙,记得开放白名单
sudo firewall-cmd --zone=public --add-port=18080/tcp --permanent sudo firewall-cmd --reload6.3 配置
- 配置告警模板
点击AlertTemplate,进入http://$ip:18080/template,此处有各类可对接的第三方系统的模板。
以钉钉的告警模板为例,将模版内容改为如下,主要是修正时间显示慢8小时的问题,以及增加一些信息
{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
## [Prometheus恢复信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{GetCSTtime $v.startsAt}}
###### 结束时间:{{GetCSTtime $v.endsAt}}
###### 故障主机名:{{$v.labels.hostname}}
###### 故障主机IP:{{$v.labels.instance}}
###### 故障应用:{{$v.labels.app}}
###### 故障主机对象:{{$v.labels.subject}}
##### {{$v.annotations.description}}

{{else}}
## [Prometheus告警信息]({{$v.generatorURL}})
#### [{{$v.labels.alertname}}]({{$var}})
###### 告警级别:{{$v.labels.level}}
###### 开始时间:{{GetCSTtime $v.startsAt}}
###### 故障主机名:{{$v.labels.hostname}}
###### 故障主机IP:{{$v.labels.instance}}
###### 故障应用:{{$v.labels.app}}
###### 故障主机对象:{{$v.labels.subject}}
##### {{$v.annotations.description}}

{{end}}
{{ end }}
- 设置钉钉机器人
在钉钉中,新建一个钉钉群,点击“群设置 -> 智能群助手 -> 添加机器人 -> 自定义 -> 安全设置”,把发送信息的服务器IP地址加进去,而后就会有 Webhook 地址。可参考 https://blog.csdn.net/knight_zhou/article/details/105583741
https://github.com/feiyu563/PrometheusAlert/blob/master/doc/readme/install.md



