使用alertmanager的API接口发送报警消息.md
Alertmanager提供了API供其他程序调用,目前版本是V2,文档比较少,仅在github中有个帮助页面。我们这里整理下最常用的几个接口。调试工具我使用的Postman。
GET /api/v2/alerts 查询报警信息
Query参数如下,以下参数用来过滤告警
结果如下
[{
"annotations": {
"description": "TCP_ESTAB数异常 IS-PUSH-PRO-tcpserver-06: 445313",
"summary": "TCP_ESTAB数异常 IS-PUSH-PRO-tcpserver-06"
},
"endsAt": "2020-08-23T03:14:29.564Z",
"fingerprint": "19a2d1b57b6f28ba",
"receivers": [
{
"name": "pywebhook"
}
],
"startsAt": "2020-08-23T00:25:14.564Z",
"status": {
"inhibitedBy": [],
"silencedBy": [
"57bd377f-05b1-4016-9086-7318c298678e",
"757f69d8-8529-4ae3-b1f3-b9b750ba113f"
],
"state": "suppressed"
},
"updatedAt": "2020-08-23T11:11:31.711+08:00",
"generatorURL": "https://prometheus.lpcsd.com/graph?g0.expr=node_netstat_Tcp_CurrEstab%7Benv%3D%22PRO%22%7D+%3E+20000+and+abs%28node_netstat_Tcp_CurrEstab%7Benv%3D%22PRO%22%7D+-+node_netstat_Tcp_CurrEstab%7Benv%3D%22PRO%22%7D+offset+1d%29+%3E+20000&g0.tab=1",
"labels": {
"alertname": "TCP_ESTAB数异常",
"application": "tcpserver",
"buniess": "PRODUCT01",
"dc": "TC",
"env": "PRO",
"instance": "IS-PUSH-PRO-tcpserver-06",
"instancetype": "app",
"job": "TC-app",
"product": "PUSH",
"severity": "Information",
"team": "node"
}
}
]
POST /api/v2/alerts 发送新的报警信息
[{
"labels": {
"alertname": "我只是一个测试",
"service": "别担心",
"severity":"Warning",
"instance": "IS-MBG-PRO-jenkins-01"
},
"annotations": {
"summary": "测试"
},
"startsAt": "2020-08-23T10:00:00.000+08:00",
"endsAt": "2020-08-23T01:11:00.000+08:00"
}]
Body参数是一个数组[],格式是application/json,里面是一个个的告警。其中startsAt与endsAt是可选参数,且格式必须是上面的那种,不能是时间戳。generatorURL也是一个可选项。这里面是没有status这一项的,当然写了也不会报错,但是只要alertmanager接收到的就被认为是一个报警。
GET /api/v2/silences 获取沉默规则
我从线上导出了2个比较典型的例子,一个是isRegex匹配,一个没有启用isRegex匹配。如下
[{
"id": "dd9f7558-0aa8-4827-8f03-b0a539fac598",
"status": {
"state": "active"
},
"updatedAt": "2020-05-26T03:47:04.088Z",
"comment": "1",
"createdBy": "a",
"endsAt": "2020-08-26T17:46:45.327Z",
"matchers": [{
"isRegex": true,
"name": "hostname",
"value": "IS-AMT-PRO-bid-redis-cluster-.*"
}],
"startsAt": "2020-05-26T03:47:04.088Z"
},
{
"id": "560b6d4f-a746-4e88-b6f1-b411ea62442f",
"status": {
"state": "active"
},
"updatedAt": "2020-07-28T08:05:15.095Z",
"comment": "aa",
"createdBy": "1",
"endsAt": "2020-08-27T08:05:06.950Z",
"matchers": [{
"isRegex": false,
"name": "instance",
"value": "IS-GAME-PRO-app-bigdata-01"
},
{
"isRegex": false,
"name": "alertname",
"value": "PortDownDectect"
}
],
"startsAt": "2020-07-28T08:05:15.095Z"
}
]
POST /api/v2/silences 创建一个沉默规则
{
"comment": "test",
"createdBy": "abc",
"matchers": [{
"isRegex": false,
"name": "hostname",
"value": "IS-MBG-PRO-jenkins-01"
}],
"startsAt": "2020-08-23T00:00:00.088Z",
"endsAt": "2020-08-24T00:00:00.088Z"
}
Body参数是一个字典,格式是application/json。
创建成功以后会显示silenceID, 后面可以使用 DELETE /silence/{silenceID} 删除沉默规则(DELETE提交的数据,和创建成功以后的数据一致)
{
"silenceID": "91b199ad-3d96-4394-a797-fe187827c72e"
}
注意事项
在这里,我们必须重申一遍prometheus向alertmanager发送报警消息的过程。
prometheus根据参数evaluation_interval设定的周期,根据设定的报警规则进行查询,如果查询结果为True,会进入pending状态,经过for参数设定周期以后,进入firing状态,此时会向alertmanager发送告警消息。
在下一个evaluation_interval周期,prometheus仍然会向alertmanager发送消息,直到规则查询结果为False,进入inactive状态(resolved),prometheus会向alertmanager发送resolved消息。
也就是说如果一个告警没有恢复,那么prometheus每隔evaluation_interval时间就会向alertmanager发消息。
同样的alertmanager中有一个参数,resolve_timeout ,表示当持续resolve_timeout (默认5分钟)时长以后没有收到来自prometheus的消息,那么会认定此报警已经恢复。
在上面的场景中,我们通过API手动创建了一条报警,由于我们没有后续动作,此条报警,会在resolve_timeout (默认5分钟)时长后,进入恢复状态(resolved)。如果不想收 resolved报警,可以在接收人参数send_resolved: false 来关闭。
参考资料
https://github.com/prometheus/alertmanager/blob/main/api/v2/openapi.yaml
https://zhuanlan.zhihu.com/p/43637757
转载请注明:IPCPU-网络之路 » 使用alertmanager的API接口发送报警消息