Prometheus 监控域名和consul服务实现alertmanager钉钉告警
1. 目的
详细说明如何配置 Prometheus 监控系统,以监控域名和 Consul 服务,并通过 Alertmanager 实现钉钉告警通知。通过实现这一配置:
- 实时监控关键业务域名和服务的健康状态。
- 在出现问题时及时通过钉钉接收到告警通知,从而快速响应和处理潜在问题。
2. 背景
Prometheus 是一个开源的系统监控和警报工具包,能够收集和存储时序数据,支持丰富的查询语言和强大的告警功能。Alertmanager 是 Prometheus 的告警管理组件,用于处理告警通知、分组和路由。
钉钉是一款企业级通讯工具,提供了强大的通知功能。将 Prometheus 和 Alertmanager 与钉钉集成,可以实现自动化的告警通知,提高故障响应效率。
一般consul报错可能是项目上线时候会报错,所以需要告警到开发,使用邮箱的话就很不方便,使用钉钉告警的消息通知就很方便随时查看,但是网上的帖子在配置上都有很多问题,尤其是自定义模板的时候,这里花了很长的时间调整,也是借鉴的网上其他友友的帖子做的,所以我觉得需要记录一下
3. 配置步骤
3.1 Prometheus 配置
3.1.1 配置域名监控
blackbox-exporter同于监控域名和端口,这个的部署就不写了网上很多很简单现在安装启动就行了
在 Prometheus 配置文件(prometheus.yml
)中添加域名监控的 job 配置:
bash
- job_name: 'blackbox-exporter-http-api'
metrics_path: /probe
params:
module: [http_2xx]
company: [Huaperfect]
valid_http_statuses: []
static_configs:
- targets:
- https://api.aoligei.com #域名按自己需求
relabel_configs: #是 Prometheus 配置中用于调整和重新标记目标(targets)元数据的一个部分。允许你在数据收集和存储之前,修改或者添加标签。
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 172.26.28.140:9115 #最好用内网的
3.1.2 配置 Consul 服务监控
consul的和
在 Prometheus 配置文件中添加 Consul 服务监控的 job 配置:
- job_name: "consul-exporter"
static_configs:
- targets: ["172.26.28.156:9107"]
relabel_configs:
- source_labels: [__address__]
target_label: instance
3.2 Prometheus 告警规则
3.2.1 域名监控告警规则
这块有一个处理,这个api监控的域名是后端接口调用域名没有默认页和默认目录,但是需要监控证书和5xx的服务器端错误,监控指标是随便写的,可以去Prometheus上找一下自己需要的指标,可以使用and或者or
在 Prometheus 告警规则配置文件中添加域名监控的告警规则:
groups:
- name: alertmanager
rules:
- alert: DomainDown
expr: probe_success{job="blackbox-exporter-http-api"} == 502 or probe_success{job="blackbox-exporter-http-api"} == 503
for: 5m
labels:
severity: critical
annotations:
summary: "域名 {{ $labels.instance }} 访问失败"
description: "域名 {{ $labels.instance }} 监控返回失败状态。"
3.2.2 Consul 服务监控告警规则
在 Prometheus 告警规则配置文件中添加 Consul 服务监控的告警规则:
rules:
- alert: consul-exporter-模块严重事故
expr: |
(sum by (node,service_name,status) (consul_health_service_status{status="critical"})) == 1
for: 5s
labels:
severity: 严重
service_name: "{{ $labels.service_name }}"
annotations:
summary: "模块出现严重问题,如没有上线通知,请马上检查!"
3.3 Alertmanager 配置
3.3.1 配置钉钉告警通知
在 Alertmanager 配置文件(alertmanager.yml
)中配置钉钉告警通知:
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 30s
repeat_interval: 12h
receiver: 'dingding.webhook1'
routes:
- receiver: 'dingding.webhook1'
match_re:
alertname: ".*"
receivers:
- name: 'dingding.webhook1'
webhook_configs:
- url: 'http://172.26.28.140:18060/dingtalk/webhook1/send'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
3.4 dingding插件
我用的是prometheus-webhook-dingtalk-2.1.0.linux-amd64这个版本,这块坑挺多,一点点说,下载:
解压啥的就不写了,注意好存放位置即可,要配置模板
bash
[root@iZ8vbhz31hkz0xo7zsx0e9Z prometheus]# ls
alertmanager black_exporter data download logs prometheus-2.45.4.linux-amd64 prometheus-webhook-dingtalk-2.1.0.linux-amd64 rules tmpl
[root@iZ8vbhz31hkz0xo7zsx0e9Z prometheus]# pwd
/var/prometheus
#这是我组价的存放位置做个参考,tmpl下面就是dingding模板,rules下面是报警规则,日志和数据库就不用说了
[root@iZ8vbhz31hkz0xo7zsx0e9Z prometheus-webhook-dingtalk-2.1.0.linux-amd64]# ls
config.example.yml config.yml contrib LICENSE prometheus-webhook-dingtalk
[root@iZ8vbhz31hkz0xo7zsx0e9Z prometheus-webhook-dingtalk-2.1.0.linux-amd64]# pwd
/var/prometheus/prometheus-webhook-dingtalk-2.1.0.linux-amd64
# 这个config.yml文件是复制的config.example.yml,改个名字就行了,看看里面内容知道都是干啥的就都删除了即可,复制我下面的就行,就是调用模板和机器人的
bash
templates:
- /var/prometheus/tmpl/dingtalk-templates.tmpl
default_message:
#title: '{{ template "legacy.title" . }}'
text: '{{ template "email.to.message" . }}'
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxbbecxxxxxxxxxxxxxx #添加机器人就看到了
secret: SExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa1fa6cxxxxxxxxxx #这个就是机器人的加签秘钥
3.5 告警模板
告警通知模板(email.to.message
)可以根据实际需要进行调整:
{{ define "email.to.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts.Firing -}}
<font color=#FF0000>========= **监控告警** ========= </font>
**告警名称:** {{ $alert.Labels.alertname }}
**告警级别:** {{ $alert.Labels.severity | default "未知" }} 级
<br>
{{- if $alert.Labels.service_name }}
**告警资源:** {{ $alert.Labels.service_name }} <!-- 显示 Consul 服务名称 -->#空行别删,要不显示不换行,用<br>也行,这里判断是因为资源显示的域名和consul服务名称的标签不一样,还有其他的也可以在加,总之这个语法很简单,需要啥自己加
{{- else if $alert.Labels.instance }}
**告警资源:** {{ $alert.Labels.instance }} <!-- 显示域名或端口 -->
{{- else }}
**告警资源:** 未知资源
{{- end }}
**告警详情:** {{ $alert.Annotations.summary }}
**故障时间:** {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
<hr> <!-- 增加分隔符 -->
{{ end }}{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts.Resolved -}}
<font color=#008000>========= **告警恢复** ========= </font>
<br>
{{- if $alert.Labels.service_name }}
**告警资源:** {{ $alert.Labels.service_name }}
{{- else if $alert.Labels.instance }}
**告警资源:** {{ $alert.Labels.instance }}
{{- else }}
**告警资源:** 未知资源
{{- end }}
**告警名称:** {{ $alert.Labels.alertname }}
**告警级别:** {{ $alert.Labels.severity }}
**故障时间:** {{ ($alert.StartsAt.Add 28800e9).Format "2013-02-02 10:04:05" }}#这时间只是一个格式,不用改
**恢复时间:** {{ ($alert.EndsAt.Add 28800e9).Format "2013-02-02 16:04:05" }}<br>
<hr> <!-- 增加分隔符 -->
{{ end }}{{ end }}
{{ end }}
4. 总结
通过以上步骤,我们完成了 Prometheus 的域名和 Consul 服务监控配置,并实现了 Alertmanager 的钉钉告警通知。这个配置可以确保在域名或 Consul 服务出现问题时,能够及时收到告警通知,并提供详细的告警信息,帮助快速响应和处理问题。