暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第六篇 Alertmanager 配置详解及企业微信报警配置

4573


写在之前

Alertmanager 只是在 Prometheus Server 触发报警规则后,接收报警内容的组件程序,把报警内容发送给 Alertmanager 后,由 Alertmanager 根据label标签决定如何发送、发送给谁、邮件报警、还是微信报警、报警内容是否聚合、是否抑制等。


邮件报警

邮件报警如何配置、验证,前面安装 alertmanager 的时候已经总结过,如果忘记了,可以回顾下之前的文章,这里主要说下配置文件的含义。

[root@master01 monitor]# cat alertmanager-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.163.com:465'
      smtp_from: 'xxxx@163.com'
      smtp_auth_username: 'xxxxx'
      smtp_auth_password: 'xxxxx'
      smtp_require_tls: false
    route:
      group_by: [alertname]
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 10m
      receiver: default-receiver
    receivers:
    - name: 'default-receiver'
      email_configs:
      - to: 'k8svip@163.com'
        send_resolved: true
[root@master01 monitor]#


以上结构非常的清晰,主要有global 全局配置、route 路由、receivers 接收者、templates 模板等几部分组成。


1.  global 全局配置,可以定义一些全局使用的,这里配置了一个邮箱报警时,需要有一个发送者,由谁从哪里发送出去;

2.  route 路由,就是把报警信息发送给谁,这里可以配置多个routes,根据报警级别、严重程度,决定使用邮件发送,还是企业微信发送,是发送给运维,还是leader等;

3.  receivers 接收者,这里定义报警接收途径,上面只定义了一个邮箱,可以配置叮叮报警、企业微信报警、自定义Webhook、短信等接收报警途径;

4. templates 模板配置,定制化一些报警模板,文章会给出实例。


下面给出配置中常用的几个字段的含义:

重要字段说明含义
resolve_timeout设置解析超时时间;
group_by按什么聚合,一起发送报警 ;
group_wait组报警等待时间 ,等待是否有相同组的报警出来,如果有,一起发送;
group_interval组报警时间间隔,上一次组报警与这次组报警的最小间隔;
repeat_interval重复报警时间间隔;
receiver报警通知的接收者
send_resolved报警是否发送恢复邮件;
match 报警按标签完全匹配
match_re报警按标签正则匹配


企业微信报警

注册企业微信

https://work.weixin.qq.com/  很简单直接注册即可。


创建应用

选择应用管理选项卡,创建应用如下图:


AgentId:1000002

Secret:BLZM-b1cLROgPSujUO3X2Pjlj5QQ0rCoBIn3xVk-U6Q


修改alertmanager 配置

[root@master01 monitor]# cat alertmanager-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.163.com:465'
      smtp_from: 'xxx@163.com'
      smtp_auth_username: 'xxx'
      smtp_auth_password: 'xxx'
      smtp_require_tls: false
    route:
      group_by: [alertname]
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 10m
      receiver: wechat
      routes:
      - match:
          team: admin
        receiver: support_team
      - match_re:
          severity: ^(warnning|critical)$
          team: admin
        receiver: wechat
    receivers:
    - name: 'default-receiver'
      email_configs:
      - to: 'k8svip@163.com'
        send_resolved: true
    - name: "support_team"
      email_configs:
      - to: 'support_team@163.com'
        send_resolved: true
    - name: 'wechat'
      wechat_configs:
      - corp_id: xxxxxxx
        to_user: '@all'
        agent_id: 1000002
        api_secret: BLZM-b1cLROgPSujUO3X2Pjlj5QQ0rCoBIn3xVk-U6Q
        message: '{{ template "wechatx.html" . }}'
        send_resolved: true
    templates:
      - '/alertmanager/*.tmpl'
[root@master01 monitor]#


corp_id:企业唯一标识,在"我的企业"  -->  "CorpID";

to_user:'@all' ,发送报警到所有人,也可以指定用户;

agent_id:应用ID,创建应用时产生的AgentId;

api_secret:应用对应的secret,创建应用时产生的Secret

message:这里使用了一个模板,让报警更为直观,个人可以根据爱好,自定义即可;

secret: 企业微信("企业应用"-->"自定应用"[Prometheus]--> "Secret") ;


模板定义

templates:这个选项,指定模板文件在哪里,可以通过configmap的形式,创建Pod时,加载configmap即可。

[root@master01 monitor]# cat cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: monitor
  name: alertemp
data:
  wechat.tmpl: |
    {{ define "wechatx.html" }}
    {{- if gt (len .Alerts.Firing) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 -}}
    @故障告警
    告警类型: {{ $alert.Labels.alertname }}
    告警级别: {{ $alert.Labels.severity }}

    ---------------------
    {{- end }}
    ---告警详情---
    告警详情: {{ $alert.Annotations.message }}
    故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
    ---参考信息---
    {{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
    {{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
    {{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
    {{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- end }}
    ---------------------
    {{- end }}
    {{- end }}

    {{- if gt (len .Alerts.Resolved) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 -}}
    @故障恢复
    恢复类型: {{ $alert.Labels.alertname }}
    恢复级别: {{ $alert.Labels.severity }}

    =====================
    {{- end }}
    ===故障恢复详情===
    故障恢复详情: {{ $alert.Annotations.message }}
    故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
    恢复时间: {{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
    ===故障恢复参考信息===
    {{ if gt (len $alert.Labels.instance) 0 -}}恢复实例ip: {{ $alert.Labels.instance }};{{- end -}}
    {{- if gt (len $alert.Labels.namespace) 0 -}}恢复实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
    {{- if gt (len $alert.Labels.node) 0 -}}恢复物理机ip: {{ $alert.Labels.node }};{{- end -}}
    {{- if gt (len $alert.Labels.pod_name) 0 -}}恢复pod名称: {{ $alert.Labels.pod_name }};{{- end }}
    =====================
    {{- end }}
    {{- end }}
    {{- end }}
[root@master01 monitor]#


创建Pod时需要挂载


验证

手动把etcd一台关掉进程,看是否报警,如果报警,然后再开启;


silenced(静默)

静默就是设置一个维护时间,这段时间不再报警,如下:


创建默认

创建完成后,在Alerts中就没有了,会出现在silences标签下面,在这里可以设置取消或者编辑


inhibited(抑制)

配置文件中添加报警抑制规则 inhibit_rules,这个对于告警收敛非常有用,可以自行google测试下。


总结

Alertmanager通过labels进行匹配,其实它是根据之前定义报警规则中定义的labels进行标签匹配,确认使用哪个路由,根据路由决定使用哪种方式报警,还总结了如何使用模板进行个性化定制报警等,最后我司使用的企业微信实现方式。

这里有遗留一个问题,时差问题,后面文章解决。

文章转载自Linux点滴运维实践,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论