基本概念

告警网关以应用为维度,提供告警发送、限流、升级等功能。

告警的一些基本字段有:

  1. app: 发生告警的应用,对应cmdb中应用名
  2. name:告警名。由各个项目组自己定义,对告警类型的简要描述
  3. labels: 项目组自定义的一串标签key value
  4. env: 发送告警的环境。
  5. recovery:默认为false。如果设置成true,表示这是一条告警恢复通知

告警网关会根据app字段,从cmdb中获取应用负责人和运维,将应用负责人和运维自动加到告警接收人里面

告警限流

为了防止告警发送频率过高,导致接收人员来不及查看,或者漏看重要告警,因此对具有同一特征的告警进行流控。

  1. 特征的计算方式是将app, name, label, recovery等字段进行排序拼接,然后计算这些属性的hash值。同一个hash值被认为是同一个告警。
  2. 默认流控时间是20分钟(即20分钟内同一个告警只发送一次)
  3. 项目组可以针对不同应用、告警名在告警策略 - DevOps Alarm 页面修改流控时间。

告警发送

目前告警发送支持企业微信、电话等方式发送. 再发送电话的时候,强烈推荐同时通过webhook或者chatId方式发送。电话当做紧急提醒用,而webhook或者chatId作为查看详细内容用。

企业微信:

  1. 支持直接发送给个人(朗歌企业微信)。多个接收人员用逗号隔开
  2. 支持发送给群组(朗歌企业微信),可通过微信告警组 - DevOps Alarm查看群组id
  3. 支持webhook方式发送

下面例子将同时发送给个人(sendUsers), 告警组(chatId)和webhook

1
2
3
4
5
6
7
8
9
10
11
curl --location --request POST 'http://devops-alarm.geely.com/devopsalarm/api/v1/alarms/alarm' \
--header 'Content-Type: application/json' \
--data-raw '{
"app": "devops-ldap",
"name": "test send",
"ip": "172.16.220.30",
"message": "测试新的告警组",
"sendUsers": "Huijun.Xu@geely.com,Yangyang.Cheng1@geely.com",
"chatId": "wr17T_CgAAkOXUzNqdaP-QIt3pIIuJkA",
"webhook": "01c22bb3-6b8f-4acb-8969-xxxxdb3911524"
}'

电话告警

电话告警需提前申请,需要运维将接收号码加到白名单中。

在同一条电话告警中,任意一个人接通后,该条电话告警被认为已经发送成功,不再重复发送。如果所有人均未接通,那每个人最多拨打两次,每次拨打时间间隔2分钟。

电话告警有两种通知方式

1. 按照电话告警组通知

指同时给电话告警组内所有人员发送电话告警。电话告警组可通过电话告警组 - DevOps Alarm查看。

比如电话告警组4包含4个用户,在收到告警后,将同时给这四个用户拨打电话.

例:下面是通过电话告警组发送的方式(设置了voiceAppId和sendType=8)

1
2
3
4
5
6
7
8
9
10
11
12
curl --location --request POST 'http://devops-alarm.geely.com/devopsalarm/api/v1/alarms/alarm' \
--header 'Content-Type: application/json' \
--data-raw '{
"app": "devops-ldap",
"name": "test send",
"ip": "172.16.220.30",
"message": "测试新的告警组",
"voiceAppId": 12345
"chatId": "wr17T_CgAAkOXUzNqdaP-QIt3pIIuJkA",
"webhook": "01c22bb3-6b8f-4acb-8969-xxxxdb3911524",
"sendType": 8
}'

2. 按接收用户逐个发送

按接收用户逐个发送,当用户未接通,告警网关间隔时间为2分钟向后续用户发送,直到有用户接听。

比如告警接收用户指定了4个人,(sendUsers: zhangsan,lisi,wangwu,zhaoliu)。当收到电话告警后

  1. 告警网关首先给zhangsan拨打电话
  2. 2分钟,检测zhangsan是否接听。如果未接听,同时给zhangshan, lisi拨打电话
  3. 再过2分钟,检测zhansan, lisi是否接听。如果均未接听,则给 lisi, wangwu拨打 (此时zhangsan已经达到最大拨打次数,不再给zhangsan拨打)
  4. 以2分钟为间隔,依次检测是否有人接听,或者直到给zhaoliu也拨打完两次电话。
  5. 在这个过程中,任意一人接听电话,则不再拨打后续人员

推荐使用这种方式进行电话告警,可以有效防止骚扰现象

例: 下面按照逐个发送方式的例子(设置了sendUsers和sendType=8)

1
2
3
4
5
6
7
8
9
10
11
12
13
curl --location --request POST 'http://devops-alarm.langgemap/devopsalarm/api/v1/alarms/alarm' \
--header 'Content-Type: application/json' \
--data-raw '{
"app": "devops-ldap",
"name": "test send",
"ip": "172.16.220.30",
"message": "测试新的告警组",
"sendUsers": "Huijun.Xu@geely.com,Yangyang.Cheng1@geely.com",
"chatId": "wr17T_CgAAkOXUzNqdaP-QIt3pIIuJkA",
"webhook": "01c22bb3-6b8f-4acb-8969-230db3911524",
"sendType": 8
}'