尝试通过AlertManager向Teams发送消息来测试Prometheus背后的功能
动机
在使用Kubernetes时,Prometheus是最常用的监控工具。
在通过Prometheus发送警报时,需要使用AlertManager工具来实现。
我们将调查如何进行AlertManager的配置,并尝试发送通知到Teams。
AlertManager是什么
在Prometheus背后使用的工具是用于警报管理和通知的。
您可以从Prometheus接收警报,并对这些警报进行静音、抑制、汇总等操作,然后将通知发送到Slack或电子邮件等。
公式教程
安装
从以下网站获取已构建的二进制文件。
苹果电脑的情况
wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.darwin-amd64.tar.gz
tar xzvf alertmanager-0.20.0.darwin-amd64.tar.gz
设置
默认设置
❯ cat alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
发送邮件时的设置示例
发送到Slack的设置示例
将CHANNEL_NAME更改为发送目标的Slack频道
由于Slack的Webhook URL已与频道相关联而创建,因此通过指定URL可以唯一确定收件人
因此,将下面的设置更改为指定CHANNEL_NAME是不需要的
❯ cat alertmanager.yml
global:
slack_api_url: '<SLACK_URL>'
route:
receiver: 'slack'
receivers:
- name: 'slack'
slack_configs:
- channel: '#<CHANNEL_NAME>'
通过设置以下内容,可以将Webhook发送到Slack。此外,为了灵活地增加多个目标,可以在routes内为每个目标设置接收哪些带有哪种标签的警报。
global:
resolve_timeout: 5m
route:
receiver: default
routes:
- match:
team: frontend
group_by: [alertname, service]
receiver: frontend
- match:
team: backend
group_by: [alertname, service]
receiver: backend
receivers:
- name: default
slack_configs:
- api_url: '<SLACK_URL>'
- name: frontend
slack_configs:
- api_url: '<SLACK_URL>'
- name: backend
slack_configs:
- api_url: '<SLACK_URL>'
报警管理器已启动。
./alertmanager --config.file=alertmanager.yml
警报发送
发送警报到Slack
使用curl来准备虚假警报
❯ cat post_alert.sh
curl http://localhost:9093/api/v1/alerts -H "Content-type: application/json" -X POST -d @- << EOF
[
{
"labels": {
"team": "frontend",
"alertname": "frontend error",
"service": "myservice",
"instance": "node1"
},
"annotations": {
"summary": "寿司食べたい"
},
"generatorURL": "http://where-this-alert-from.local"
}
]
EOF
发出虚假警报 (fā chū
❯ sh post_alert.sh
{"status":"success"}
以下是Slack收到的通知:
![dummy_alert.png](https://cdn.silicloud.com/blog-img/blog/img/657d524737434c4406ccc5dd/29-0.png)
点击链接后,您可以在AlertManager的用户界面上查看警报。
![dummy_alert2.png](https://cdn.silicloud.com/blog-img/blog/img/657d524737434c4406ccc5dd/31-0.png)
使用amtool检查警报
只需给出一种选择,将以下内容以中文本地化方式重新表达:可以通过CLI来确认警报的情况。
amtool和alertmanager二进制文件被一起包含在相同的目录中。
❯ amtool alert
Labels Annotations Starts At Ends At Generator URL
alertname="重大なアラート" instance="node1" summary="寿司食べたい" 2020-04-10 21:03:09 JST 2020-04-10 21:08:09 JST http://where-this-alert-from.local
amtool的设置
通过指定receiver和alertmanager.url,确定警报的接收方。
❯ cat $HOME/.config/amtool/config.yml
# Define the path that `amtool` can find your `alertmanager` instance at alertmanager.url: "http://localhost:9093"
# Force amtool to give you an error if you don't include a comment on a silence
comment_required: true
# Set a default output format. (unset defaults to simple)
output: extended
# Set a default receiver
receiver: slack
alertmanager.url: http://localhost:9093
如果没有指定alertmanager.url,则会要求以命令行选项的形式进行指定。
❯ amtool alert
amtool: error: required flag --alertmanager.url not provided
将 Prometheus 警报发送到 Teams 的方法。
在Prometheus的通知选项中,没有Teams。
通过将Prometheus的警报格式转换为Teams的卡片格式的服务器作为中继来实现这一点。
利用下方存儲庫中的prometheus-msteams
https://github.com/bzon/prometheus-msteams
在Teams中预先创建Teams端点。
这种感觉的东西
https://outlook.office.com/webhook/XXXXXXXXXXXXXXXXXXXXX
执行Prometheus-msteams
将TEAMS_ENDPOINT部分更改为先前记下的内容。
docker run -d -p 2000:2000 \
--name="promteams" \
-e TEAMS_INCOMING_WEBHOOK_URL="<TEAMS_ENDPOINT>" \
-e TEAMS_REQUEST_URI=alertmanager \
quay.io/prometheusmsteams/prometheus-msteams
将msteams添加到AlertManager的通知列表中。
请在 Alertmanager.yaml 中附上以下的接收者。
route:
group_by: ['alertname']
group_interval: 30s
repeat_interval: 30s
group_wait: 30s
receiver: 'prometheus-msteams'
receivers:
- name: 'prometheus-msteams'
webhook_configs: # https://prometheus.io/docs/alerting/configuration/#webhook_config
- send_resolved: true
url: 'http://localhost:2000/alertmanager' # the prometheus-msteams proxy
将amtool的终端节点也进行更改。
❯ cat ~/.config/amtool/config.yml
# Define the path that `amtool` can find your `alertmanager` instance at alertmanager.url: "http://localhost:9093"
# Force amtool to give you an error if you don't include a comment on a silence
comment_required: true
# Set a default output format. (unset defaults to simple)
output: extended
# Set a default receiver
receiver: prometheus-msteams
alertmanager.url: http://localhost:9093
发送虚假警报
❯ sh post_alert.sh
{"status":"success"}
在Teams中可以查看警报。
![teams_alert.png](https://cdn.silicloud.com/blog-img/blog/img/657d524737434c4406ccc5dd/60-0.png)
據說可以根據設定的方式將消息發送到多個終端點。
我尚未嘗試。