尝试通过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

点击链接后,您可以在AlertManager的用户界面上查看警报。

dummy_alert2.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

據說可以根據設定的方式將消息發送到多個終端點。

我尚未嘗試。

请提供有关此主题的参考资料。

AlertManager的官方文档

使用cURL访问AlertManager并触发警报的方法。

介绍适用于Alert Manager的CLI工具amtool。