Alertmanager 配置企业微信告警

alertmanager支持直接对接webhook,所以只要将alertmanager的告警消息解析成企业微信、飞书、钉钉能够识别的消息,那么再通过官方的api接口就可以发送告警消息了。

查看 alertmanger 消息

首先我们需要了解 alertmanager 发送的消息格式,可以通过执行一个命令来查看 alertmanager 发送的消息内容。

# 端口转发,访问alertmanager
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093

# 查看 alertmanager 发送的消息,并解析成 json 格式
curl -s 'http://localhost:9093/api/v2/alerts' | jq .

# 示例如下:
curl -s http://127.0.0.1:9093/api/v2/alerts -q| jq .
[
  {
    "annotations": {
      "description": "KubeControllerManager has disappeared from Prometheus target discovery.",
      "runbook_url": "https://runbooks.prometheus-operator.dev/runbooks/kubernetes/kubecontrollermanagerdown",
      "summary": "Target disappeared from Prometheus target discovery."
    },
    "endsAt": "2026-01-14T06:16:31.435Z",
    "fingerprint": "2a2c5d2e339cb632",
    "receivers": [
      {
        "name": "Critical"
      }
    ],
    "startsAt": "2026-01-13T01:27:01.435Z",
    "status": {
      "inhibitedBy": [],
      "mutedBy": [],
      "silencedBy": [],
      "state": "active"
    },
    "updatedAt": "2026-01-14T06:12:39.762Z",
    "generatorURL": "http://prometheus-k8s-0:9090/graph?g0.expr=absent%28up%7Bjob%3D%22kube-controller-manager%22%7D+%3D%3D+1%29&g0.tab=1",
    "labels": {
      "alertname": "KubeControllerManagerDown",
      "cluster": "loacl",
      "prometheus": "monitoring/k8s",
      "severity": "critical"
    }
  },
    ...
]

可以登录 pod 中查看该告警对应的 prometheus 规则。

# 进入 prometheus pod
kubectl -n monitoring exec  prometheus-k8s-0 -i -t -- sh

# 查看 prometheus 规则文件
cd /etc/prometheus/rules/prometheus-k8s-rulefiles-0

# 配置如下
- name: kubernetes-system-controller-manager
  rules:
  - alert: KubeControllerManagerDown
    annotations:
      description: KubeControllerManager has disappeared from Prometheus target discovery.
      runbook_url: https://runbooks.prometheus-operator.dev/runbooks/kubernetes/kubecontrollermanagerdown
      summary: Target disappeared from Prometheus target discovery.
    expr: |
      absent(up{job="kube-controller-manager"} == 1)
    for: 15m
    labels:
      severity: critical

这是一个常见alertmanager告警消息,可以看到是一个json的格式,其中labels和annotations里面的字段都是我们配置prometheus时设置的,其他字段是prometheus触发告警时自动生成的,那么我们只需要将这个json字符串解析为各个通讯软件能够识别的格式,就OK了。目前对接企业微信是使用的企业微信所支持的markdown格式,对接飞书是使用的飞书所支持的card格式,对接钉钉是使用的钉钉所支持的markdown格式。具体格式要求,可以到各平台的官网进行查看。

配置企业微信告警

先获取企业微信的一些基础信息。

配置如下:

vim altermanager.yaml

global:
  resolve_timeout: 5m
receivers:
- name: wechat
  wechat_configs:
  - agent_id: "应用的AgentId,在应用的配置页面可以看到"
    api_secret: "应用的secret,在应用的配置页面可以看到"
    corp_id: '企业id,在企业的配置页面可以看到
    to_party: ' PartyID1 | PartyID2 '
    send_resolved: true
    to_user: '@all'
route:
  group_by:
  - namespace
  group_interval: 5m
  group_wait: 30s
  receiver: wechat
  repeat_interval: 7m
  routes:
  - match:
      severity: critical
    receiver: wechat
    group_by:
    - alertname
    - namespace
templates:
- /etc/alertmanager/config/*.tmp1  //使用报警信息的模板

模板文件 template.tmp1

{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
====异常告警====
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空间: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
节点信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
实例名称: {{ $alert.Labels.pod }}
{{- end }}
====END====
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
====异常恢复====
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空间: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
节点信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
实例名称: {{ $alert.Labels.pod }}
{{- end }}
====END====
{{- end }}
{{- end }}
{{- end }}
{{- end }}

更新配置

# 备份原有的alertmanager配置
kubectl get secret alertmanager-main -n monitoring -o jsonpath="{.data.alertmanager\.yaml}" | base64 --decode > alertmanager-backup.yaml

# 删除原有的alertmanager配置
kubectl delete secret alertmanager-main -n monitoring

# 创建新的alertmanager配置
kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml --from-file=template.tmp1 -n monitoring

# 端口转发,访问alertmanager
kubectl port-forward -n monitoring svc/alertmanager-operated 9093:9093

# 重新加载 alertmanager 配置
curl -X POST http://localhost:9093/-/reload

# 就可以收到企业微信告警消息了