概述

通常咱们要 silence 某个 AlertManager 的 alert 时,须要通过 UI 界面操作,如下图:

效率有点低,而且不够自动化,那么是否能够有一种方法疾速创立 AlertManager silence 呢?

-- 有的,通过 API.

API Payload

v1

如下:

{    "matchers": [        {            "name": "alername1",            "value": ".*",            "isRegex": true        }    ],    "startsAt": "2022-04-29T22:12:33.533Z",    "endsAt": "2022-04-29T23:11:44.603Z",    "createdBy": "api",    "comment": "Silence",    "status": {        "state": "active"    }}

v2

{    "matchers": [        {            "name": "service",            "value": "rancher",            "isRegex": false,            "isEqual": true        },        {            "name": "alertname",            "value": "TargetDown",            "isRegex": false,            "isEqual": true        }    ],    "startsAt": "2022-04-29T10:11:35.656Z",    "endsAt": "2022-04-29T12:11:35.656Z",    "createdBy": "Casey Cui",    "comment": "配置谬误导致的误报",    "id": null}

具体实现

curl 实现

Notes:

以 v1 api 为例

如下:

curl https://alertmanager.ewhisper.cn/api/v1/silences -d '{      "matchers": [        {          "name": "alername1",          "value": ".*",          "isRegex": true        }      ],      "startsAt": "2022-04-29T22:12:33.533Z",      "endsAt": "2022-04-29T23:11:44.603Z",      "createdBy": "api",      "comment": "Silence",      "status": {        "state": "active"      }}'
Notes:
在 K8S 集群内,地址个别为:http://alertmanager:9093

python 实现

如下:

#!/usr/bin/python3import requestsimport socketimport datetimeimport timeres = requests.post("http://alertmanager:9093/api/v2/silences", json={    "matchers": [        {"name": "job", "value": "myjob", "isRegex": False},        {"name": "instance", "value": "{}:1234".format(socket.gethostname()), "isRegex": False},        ],    "startsAt": datetime.datetime.utcfromtimestamp(time.time()).isoformat(),    "endsAt": datetime.datetime.utcfromtimestamp(time.time() + 4*3600).isoformat(),    "comment": "Backups on {}".format(socket.gethostname()),    "createdBy": "My backup script",    },    )res.raise_for_status()silenceId = res.json()["silenceID"]

移除 silence 的脚本:

res = requests.delete("http://alertmanager:9093/api/v2/silence/{}".format(silenceId))res.raise_for_status()

EOF

本文由东风微鸣技术博客 EWhisper.cn 编写!