最新消息:

使用alertmanager的API接口发送报警消息

IT技术 ipcpu 60浏览 0评论

使用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接口发送报警消息

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址