掌握Web应用的监控与告警

掌握Web应用的监控与告警插图亿华云

最近组里又来了一个需求:当告警发生时,将告警信息通过企业微信发送给开发的相关负责人,方便尽快排除故障。实际使用Alertmanager来完成这项工作,下面介绍具体的实现方法。

详细配置

告警通道配置

监控最重要的是在故障发生时,能将告警信息发送出来,让正确的人第一时间获悉故障的详情,只有这样才能尽快排除故障。企业微信很多公司都有使用,而且Alertmanager支持将企业微信作为告警通道。

按照企业微信的官方文档来配置告警通道,如果觉得麻烦,可以在浏览器上搜索“alertmanager 企业微信”关键字,就有很多配置例子展示。我们需要得到下面五个键值对:

wechat_api_url: https://qyapi.weixin.qq.com/cgi-bin/wechat_api_corp_id: 12345678agent_id: 12345678api_secret: 12345678to_tag: 4

这五个键值对需要在Alertmanager中配置,后面四个键的值根据实际情况填写。

企业微信有三种ID来选择消息的接收对象:用户ID、部门ID和标签ID。因为第三种方式支持同时包含用户和部门,使用起来比较灵活,这里选择第三种方式。

掌握Web应用的监控与告警插图1亿华云

标签ID

点击“标签详情”,可以看到标签ID,在配置Alertmanager时会用到。

掌握Web应用的监控与告警插图2亿华云

标签ID显示

Blackbox配置

这里直接将配置文件贴出。

docker-compose.yaml:

version: 3.3services: blackbox_exporter: image: prom/blackbox-exporter:v0.19.0 ports: - "9115:9115" restart: always volumes: - "./config:/config" command: "--config.file=/config/blackbox.yaml"

config/blackbox.yaml:

modules: http_get: prober: http timeout: 5s http: valid_http_versions: ["HTTP/1.1", "HTTP/2.0"] valid_status_codes: [200] no_follow_redirects: false tls_config: insecure_skip_verify: trueAlertmanager配置

这里是关键,因为告警通知的发送控制都由Alertmanager来控制。配置文件如下。

docker-compose.yaml:

alertmanager: image: bitnami/alertmanager:0 restart: "always" ports: - 9093:9093 container_name: "alertmanager" volumes: - "./config:/etc/alertmanager"

config/config.yml:

global: resolve_timeout: 5m wechat_api_url: https://qyapi.weixin.qq.com/cgi-bin/ wechat_api_corp_id: 1234567templates: - /etc/alertmanager/*.tmplroute: receiver: wechat group_wait: 1s group_interval: 1s repeat_interval: 2s group_by: [adm] routes: - matchers: - adm="search" receiver: searchEngine group_wait: 10s - matchers: - adm="portalweb" receiver: portalWeb group_wait: 10sreceivers:- name: wechat wechat_configs: - to_tag: infra message: {{ template "wechat.message" . }} agent_id: 1000002 message_type: markdown api_secret: verylongstring- name: searchEngine wechat_configs: - to_tag: searchdep message: {{ template "wechat.message" . }} agent_id: 1000002 message_type: markdown api_secret: verylongstring- name: portalWeb wechat_configs: - to_tag: portalwebdep message: {{ template "wechat.message" . }} agent_id: 1000002 message_type: markdown api_secret: verylongstring

有几个参数需要介绍下:

group_wait:Alertmanager 在接收到一条新的告警(第一次出现的告警)时,将这条告警发送给 receiver 之前需要等待的时间。

repeat_interval: 对于一条已经出现过的告警,每隔 repeat_interval 会重新发送给 receiver。

有篇文档整理得很好,这里直接列出来。

“Alertmanager 在收到一条新的告警之后,会等待 group_wait 时间,对这条新的告警做一些分组、更新、静默的操作。当第一条告警经过 group_wait 时间之后,Alertmanager 会每隔 group_interval 时间检查一次这条告警,判断是否需要对这条告警进行一些操作,当 Alertmanager 经过 n 次 group_interval 的检查后,n*group_interval 恰好大于 repeat_interval 的时候,Alertmanager 才会将这条告警再次发送给对应的 receiver。”

文中这三个参数配置的值很小,主要为测试目的,生产环境根据需要配置。

还有一点需要注意,Alertmanager子路由(即routes里面)中配置的参数会覆盖根路由(即route里面)中配置的参数,所以按照文件“config/config.yml”中的配置,如果一条告警发送到了“searchEngine”,就不可能再发送给默认的接收者“wechat”,除非子路由没有匹配。

告警模板文件:config/wechat.tmpl。

{{ define "wechat.message" }}{{- if gt (len .Alerts.Firing) 0 -}}{{- range $index, $alert := .Alerts -}}{{- if eq $index 0 -}}# 报警项: {{ $alert.Labels.alertname }}{{- end }}

THE END
Copyright © 2024 亿华云