alertmanger 使用详解

1. 部署

$ vim /root/alertmanager/config.yml
global:
  # resolve_timeout:解析超时时间
  resolve_timeout: 5m
  # smtp_smarthost: 使用email打开服务配置
  smtp_smarthost: 'smtp.126.com:465'
  # smtp_from:指定通知报警的邮箱
  smtp_from: '[email protected]'
  # smtp_auth_username:邮箱用户名
  smtp_auth_username: '[email protected]'
  # smtp_auth_password:授权密码
  smtp_auth_password: 'xsk123'
  # smtp_require_tls:是否启用tls
  smtp_require_tls: false

# route标记:告警如何发送分配
route:
  # group_by:采用哪个标签作为分组的依据
  group_by: ['alertname']
  # group_wait:分组等待的时间
  group_wait: 10s
  # group_interval:上下两组发送告警的间隔时间
  group_interval: 10s
  # repeat_interval:重复发送告警时间。默认1h
  repeat_interval: 1m
  # receiver 定义谁来通知报警
  receiver: 'mail'

# receiver标记:告警接受者 
receivers:
# name:报警来源自定义名称
- name: 'mail'
  # email_configs:通过邮箱发送报警
  email_configs:
    # to:指定接收端email
    - to: '[email protected]'

# inhibit_rules标记:降低告警收敛,减少报警,发送关键报警
#inhibit_rules:
#  - source_match:
#      severity: 'critical'
#    target_match:
#      severity: 'warning'
#    equal: ['alertname', 'dev', 'instance']

svEdlmtIA-6joL79FCaL7ZYO27lYt_D6DbDgm6P_128

运行容器


$ docker run -d -p 9093:9093 --name alertmanager docker.io/prom/alertmanager:latest
$ docker run -d -p 9093:9093 -v /root/alertmanager/config.yml:/etc/alertmanager/config.yml --name alertmanager docker.io/prom/alertmanager:latest #将配置挂载出来

2. 配置文件说明

Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在Alertmanager配置中一般会包含以下几个主要部分:
全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;

  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;
  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;
  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,
  • Slack或者Webhook等,接收人一般配合告警路由使用;
  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生

global:

  • smtp_smarthost、smtp_from、smtp_auth_username、smtp_auth_password用于设置
  • smtp邮件的地址及用户信息
  • hipchat_auth_token与安全性认证有关
  • resolve_timeout,该参数定义了当Alertmanager持续多长时间未接收到告警后标记告警状态为resolved(已解决)。该参数的定义可能会影响到告警恢复通知的接收时间,读者可根据自己的实际场景进行定义,其默认值为5分钟。

templates:

  • 指定告警信息展示的模版

route:可存在多个Route,一个Route有多个Group,一个Group有多个Alert

  • group_by:指定所指定的维度对告警进行分组
  • group_wait:指定每组告警发送等待的时间,根据resolve_timeout判断Alert是否解决,然后发送通知
  • group_interval:指定告警调度的时间间隔,判断Alert是否解决,当上次发送通知到现在的间隔大于repeat_interval或者Group有更新时会发送通知
  • repeat_interval:在连续告警触发的情况下,重复发送告警的时间间隔

routes

  • match_re:定义告警接收者的匹配方式
  • service:定义匹配的方式,纬度service值以foo1或foo2或baz开始/结束时表示匹配成功
  • receiver:定义了匹配成功的的情况下的接受者

receiver

  • 指定告警默认的接受者

receivers

  • 定义了具体的接收者,也就是告警具体的方式方式

inhibit_rules

  • 定义告警的抑制条件,过滤不必要的告警

3. 配置示例:

3.1 receivers接收

3.1.1 微信接收

receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    api_secret: 'svEdlmtIA-6joL79FCaL7ZYO27lYt_D6DbDgm6P_128'
    corp_id: 'ww906049af7aae6271'
    api_url: "https://qyapi.weixin.qq.com/cgi-bin/"
    to_party: "1"
    to_user: '@all'
    agent_id: "1000002"

3.1.2 邮箱接收

templates:
  [ - <filepath> ... ]
receivers:
- name: 'mengyuan'
  email_configs:
  - to: '[email protected]'
    html: '{{ template "email.mengyuan.html" . }}'
    headers: { Subject: "[WARN] 报警邮件test" }

3.2 inhibit_rules抑制

当触发'物理节点夯机或宕机'告警的时候,'监控客户端状态异常告警'会被抑制。

inhibit_rules:
  - source_match:
      alertname: '物理节点宕机'
    target_match:
      alertname: '监控客户端状态异常告警'
    equal: ['ip']

  - source_match:
      alertname: '物理节点夯机或宕机'
    target_match:
      alertname: '服务组件端口状态异常'
    equal: ['ip']

alertname是从何而来?
来自prometheus配置告警略文件blackbox.rules.yaml

  - alert: 物理节点夯机或宕机
    expr: probe_success{group=~"test"} == 0
    for: 2m
    labels:
      severity: "警告"
    annotations:
      info: |
        {{ with query "time()+8*3600" }}{{ . | first | value | humanizeTimestamp | reReplaceAll "(.+)\\.(.*)" "$1" }} {{ end }} {{$labels.group}}{{$labels.ip}}服务器夯机或宕机
      summary: "请联系管理员登陆主机进行检测,判断是人为操作原因,还是主机故障。"

4 告警模板

4.1 微信模板

test1.tmpl

{{ define "wechat.default.message" }}
{{- 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 }}

test2.tmpl

{{ define "wechat.default.message" }}
{{ range .Alerts }}
告警级别:{{ .Labels.severity }}
告警类型:{{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}

4.2 邮箱模板

第一个

模板文件email.tmpl
{{ define "email.mengyuan.html" }}
<table>
    <tr><td>报警名</td><td>开始时间</td></tr>
    {{ range $i, $alert := .Alerts }}
        <tr><td>{{ index $alert.Labels "alertname" }}</td><td>{{ $alert.StartsAt }}</td></tr>
    {{ end }}
</table>
{{ end }}

第二个

{{ define "test.html" }}
<table border="1">
        <tr>
                <td>报警项</td>
                <td>实例</td>
                <td>报警阀值</td>
                <td>开始时间</td>
        </tr>
        {{ range $i, $alert := .Alerts }}
                <tr>
                        <td>{{ index $alert.Labels "alertname" }}</td>
                        <td>{{ index $alert.Labels "instance" }}</td>
                        <td>{{ index $alert.Annotations "value" }}</td>
                        <td>{{ $alert.StartsAt }}</td>
                </tr>
        {{ end }}
</table>
{{ end }}

5. alertmanger API

/api/v1/alerts
/api/v1/status
/api/v1/silences
/silence/{silenceID}  get delete
/api/v2/receivers
 /alerts/groups
#查询已有的告警,只要客户仍然处于活动状态(通常约为30秒到3分钟),客户就会不断重新发送警报
curl http://180.76.154.185:9093/api/v1/alerts
[
  {
    "labels": {
      "": "",
      ...
    },
    "annotations": {
      "": "",
    },
    "startsAt": "",
    "endsAt": ""  #endsAt只有在警报的结束时间已知时才被设置。否则,它将被设置为自上次收到警报以来的可配置超时时间。
    "generatorURL": "" #该generatorURL字段是唯一的后向链接,用于标识客户端中此警报的原因实体。
  },
  ...
]

#生成一个告警
$ curl -H "Content-Type: application/json" -d ‘[{"labels":{"alertname":"TestAlert1"}}]’ http://180.76.154.185:9093/api/v1/alerts

#抑制一个告警
$ curl -H "Content-Type: application/json" -X POST -d '{"comment": "test1","createdBy": "test1","endsAt": "2019-02-20T18:00:59.46418637Z","matchers": [{"isRegex": false,"name": "severity","value": "critical"},{"isRegex": false,"name": "job","value": "prometheus"},{"isRegex": false,"name": "instance","value": "localhost:9090"},{"isRegex": false,"name": "alertname","value": "InstanceDown"}]}' http://alerts.example.org:9093/api/v1/silences

删除silences
$ curl -X DELETE http://alerts.example.org:9093/api/v1/silence/<silenceId>

6. amtool工具

命令行可以对告警进行抑制、查询等操作。

amtool check-config /monitor/alertmanager/config/alertmanager/alertmanager.yml
#查看当前已触发的报警
amtool alert --alertmanager.url="http://127.0.0.1:9093"

#查看所有沉默
amtool silence query --alertmanager.url="http://127.0.0.1:9093"

#查看匹配的沉默
amtool silence query alertname=PodMemory  --alertmanager.url="http://127.0.0.1:9093"
#沉默添加,如果comment_required设置为true,不写comment的话会提交不上
#alertname就是Prometheus那里设置的alert
#--start 生效时间
#--end   结束时间
amtool silence add alertname="PodMemory" container_name="elasticsearch" --start="2019-01-02T15:04:05+08:00" --end="2019-01-02T15:05:05+08:00" --comment="test"  -a "wuchen" --alertmanager.url="http://127.0.0.1:9093"

#更新
amtool silence update --end="2019-02-02T15:05:05+08:00"  6cac2b37-4ce2-4af5-8305-9f47850d72a4  --alertmanager.url="http://127.0.0.1:9093"


#docker官方镜像,默认数据源保存在/alertmanager,所以要挂载数据盘,不然容器重启一切都白做

#因为查看沉默列表的时候,生效时间输出的不完整,所以可以
amtool silence query -o json --alertmanager.url="http://127.0.0.1:9093"
#还可以导出json数据
amtool silence query -o json PodMemory > 1.json --alertmanager.url="http://127.0.0.1:9093"

#沉默解除
amtool silence expire 8188b168-1332-4398-83a5-a9df4263c60d --alertmanager.url="http://127.0.0.1:9093"

#解除所有沉默
amtool silence expire $(amtool silence query -q --alertmanager.url="http://127.0.0.1:9093") --alertmanager.url="http://127.0.0.1:9093"

你可能感兴趣的:(monitor)