博客/工程

使用Slack、PagerDuty和Gmail设置Prometheus Alertmanager的逐步指南

2020年2月25日8分钟

在我之前的博客中,“如何用简单的‘Hello World’项目探索普罗米修斯,”为了更好地了解Prometheus的功能,我描述了三个项目。在这篇文章中,我想分享一下我是如何更加熟悉普罗米修斯Alertmanager以及我如何为Slack、PagerDuty和Gmail设置提醒通知。

(我将参考我以前的博客文章,所以我建议在继续之前阅读它。)

最基本的

你可以开始普罗米修斯在几分钟内Grafana云.我们有适合每个用例的免费和付费Grafana Cloud计划-现在就免费注册。

通过Prometheus设置警报分为两个步骤:

首先,您需要在Prometheus中创建警报规则,并指定在什么条件下希望收到警报(例如当实例关闭时)。

其次,你需要设置Alertmanager,接收Prometheus中指定的警报。然后,Alertmanager将能够做各种事情,包括:

  • 将性质相似的警报分组到单个通知中
  • 在特定时间内静音警报
  • 如果其他指定的警报已经触发,则将某些警报的通知静音
  • 选择接收特定警报的接收方

步骤1:在Prometheus中创建警报规则

我们从之前为每个项目设置的四个子文件夹开始:Server、node_export、github_export和prom_middleware.这个过程在我的博客文章中有解释,关于如何用简单的项目探索普罗米修斯在这里

我们接着讲服务器子文件夹并在代码编辑器中打开内容,然后创建一个新的规则文件。在rules.yml,您将指定您希望收到警报的条件。

cd Prometheus/server touch rules.yml

我相信每个人都同意知道你的实例什么时候坏了非常重要的。因此,我要用这个作为条件向上指标。通过在Prometheus用户界面(http://localhost:9090)中评估这个指标,您将看到所有正在运行的实例的值都是1,而所有当前未运行的实例的值都是0(我们目前只运行Prometheus实例)。

在Prometheus UI中计算metric以查看哪些实例正在运行
在Prometheus UI中计算metric以查看哪些实例正在运行

确定警报条件后,需要在rules.yml。其内容如下:

groups:—name: AllInstances rules:—alert: InstanceDown #报警条件expr: up == 0 for: 1m # Annotation—附加信息标签,存储更多信息注释:title: 'Instance {{$labels. #实例}}down' description: '{{$labels。作业{{$labels的实例}}。作业}}已关闭超过1分钟。' #标签-附加在警告标签上的标签:severity: 'critical'

总而言之,它表示,如果任何实例将在一分钟内处于down (up == 0)状态,那么警报将启动。我还添加了注释和标签,用于存储关于警报的附加信息。对于这些,你可以使用模板化变量{{$标签。实例}}然后将它们内插到特定的实例中(例如localhost:9100)。

(你可以阅读更多关于普罗米修斯警报规则在这里.)

一旦你有rules.yml准备好了,你需要把文件链接到prometheus.yml并添加告警配置。你的prometheus.yml看起来是这样的

global: #抓取目标的频率scrape_interval: 10s #评估规则的频率evaluation_interval: 10s #从指定的文件(s)中读取规则和警报rule_files: -规则。alertmanagers: - static_configs: - targets: # Alertmanager的默认端口为9093 - localhost:9093 #刮取配置的列表,该列表指定了一组# targets和描述如何刮取它们的参数。—job_name: 'prometheus' scrape_interval: 5s static_configs:—targets:—localhost:9090—job_name: ' node_exports ' scrape_interval: 5s static_configs:—targets:—localhost:9100—job_name: 'prom_middleware' scrape_interval: 5s static_configs:—targets:—localhost:9091

如果你从《普罗米修斯》开始——web.enable-lifecycle标志,您可以通过发送POST请求来重新加载配置/ /重新加载端点curl -X POST http://localhost:9090/-/reload.之后,启动prom_middleware app (节点index.js在prom_middleware文件夹中)和node_export (。/ node_exporter在node_exporters文件夹中)。

一旦您这样做了,任何时候您想要创建一个警报,您只需停止node_exporters或prom_middleware应用程序。

步骤2:设置Alertmanager

创建一个alert_managerPrometheus文件夹中的子文件夹,mkdir alert_manager.文件中下载并解压缩Alertmanager普罗米修斯的网站,且无需对alertmanager.yml,你会跑/ alertmanager——config.file = alertmanager.yml打开localhost:9093。

取决于您是否有任何活动的警报,Alertmanager应该正确设置,看起来如下图所示。要查看在上面步骤中添加的注释,请单击+信息按钮。

Prometheus Alertmanager带有2个活动警报
Prometheus Alertmanager带有2个活动警报

完成所有这些之后,我们现在可以看看使用Alertmanager和发送警报通知的不同方式。

如何设置Slack提醒

如果你想通过Slack接收通知,你应该成为Slack工作区的一部分。如果你目前不是任何Slack工作空间的一部分,或者你想在单独的工作空间中进行测试,你可以快速创建一个在这里

要在您的Slack工作区中设置警报,您需要一个Slack API URL。Slack -> Administration ->应用管理。

在你的Slack工作区中打开“管理应用程序”
在你的Slack工作区中打开“管理应用程序”

在“管理应用程序”目录中搜索进来的人并将其添加到您的Slack工作区中。

添加'Incoming Webhooks'到您的Slack工作区
添加' Incoming Webhooks '到您的Slack工作区

接下来,指定您希望在哪个通道中接收来自Alertmanager的通知。(我创建了#monitoring-infrastructure频道。)确认并添加Incoming WebHooks集成后,webhook URL(这是您的Slack API URL)会显示出来。复制它。

显示webhook URL
显示webhook URL

然后需要修改alertmanager.yml文件。首先,打开子文件夹alert_manager在代码编辑器中,并填写alertmanager.yml基于下面的模板。使用刚才复制的url作为slack_api_url。

slack_api_url: 'https://hooks.slack.com/services/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' route: receiver: 'slack-notifications' receivers: - name: 'slack-notifications' slack_configs: - channel: '#monitoring-instances' send_resolved: true

通过发送POST请求来重新加载配置/ /重新加载端点curl -X POST http://localhost:9093/-/reload.在几分钟内(在你停止至少一个实例后),你应该会通过Slack收到你的提醒通知,如下所示:

通过Slack接收的警报通知
通过Slack接收的警报通知

如果你想改进你的通知,让它们看起来更好,你可以使用下面的模板,或者使用这个工具创造你自己的。

global: resolve_timeout: 1m slack_api_url: 'https://hooks.slack.com/services/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' route: receiver: 'slack-notifications' receivers: - name: 'slack-notifications' slack_configs: - channel: '#monitoring-instances' send_resolved: true icon_url: https://avatars3.githubusercontent.com/u/3380462 title: |- [{{. status | toUpper}}{{if eq . status "firing"}}:{{. alerts . messages . {}触发| len}}{{end}}] {{. commonlabels。alertname}}用于{{. commonlabels。job}} {{- if gt (len . commonlabels) (len . grouplabels) -}} {{" "}}({{- with . commonlabels。删除.GroupLabels。名称}}{{——美元指数范围,标签:美金= .SortedPairs -}}{{如果美元指数}},{{结束}}{{- $标签。名称}}="{{$label. Name "价值  -}}" {{- 结束}}{{——结束  -}} ) {{- 结束}}文本:> -{{范围.Alerts -}} *警报:* {{.Annotations。title}}{{如果.标签。severity}} - '{{.标签。severity}} ' {{end}} *描述:* {{. annotations . Description}} *详细信息:* {{range . labels . label . name。SortedPairs  }} • *{{ . 的名字  }}:* `{{ . 值}}’{{结束}}{{结束}}

这是最终的结果:

美化的警报通知
美化的警报通知

如何设置PagerDuty提醒

PagerDuty是IT部门最知名的事件响应平台之一。要通过PagerDuty设置警报,您需要在那里创建一个帐户。(PagerDuty是一项付费服务,但你可以免费试用14天。)登录后,转到配置—>服务—> +新建服务。

PagerDuty主屏幕
PagerDuty主屏幕

从Integration types列表中选择Prometheus,并为服务指定一个名称。我决定把我的电脑命名为普罗米修斯警报管理器。(你也可以自定义事件设置,但我使用了默认设置。)然后单击保存。

向PagerDuty添加服务
向PagerDuty添加服务

集成键将显示出来。复制密钥。

PagerDuty集成键
PagerDuty集成键

你需要更新你的内容alertmanager.yml。它应该类似于下面的示例,但是使用您自己的service_key(来自PagerDuty的集成键)。Pagerduty_url应该保持不变,应该设定为https://events.pagerduty.com/v2/enqueue.保存并重新启动Alertmanager。

全局:resolve_timeout: 1m pagerduty_url: 'https://events.pagerduty.com/v2/enqueue' route: receiver: 'pagerduty-notifications' receivers: - name: 'pagerduty-notifications' pagerduty_configs: - service_key: 0c1cc665a594419b6d215e81f4e38f7 send_resolved: true

停止其中一个实例。几分钟后,应该在PagerDuty中显示警报通知。

警报发送到PagerDuty
警报发送到PagerDuty

在PagerDuty用户设置中,您可以决定如何得到通知:电子邮件和/或电话。我都选了,它们都很成功。

如何设置Gmail警报

如果你更喜欢通过电子邮件服务直接收到通知,设置就更简单了。Alertmanager可以简单地将消息传递到您的提供程序(在本例中,我使用Gmail),然后由它代表您发送消息。

不建议您为此使用个人密码,因此您应该创建一个应用程序的密码.要做到这一点,请参见帐户设置->安全->登录谷歌->应用程序密码(如果你没有看到应用程序密码选项,你可能还没有设置2步验证,需要先设置)。复制新创建的密码。

为Gmail创建应用程序密码
为Gmail创建应用程序密码

你需要更新你的内容alertmanager.yml一次。内容应该与下面的示例类似。不要忘记将邮箱地址替换为您自己的邮箱地址,密码替换为您的新应用程序密码。

Global: resolve_timeout: 1m route: receiver: 'gmail-notifications' receivers: - name: 'gmail-notifications' email_configs: - to: monitoringinstances@gmail.com from: monitoringinstances@gmail.com smarthost: smtp.gmail.com:587 auth_username: monitoringinstances@gmail.com auth_identity: monitoringinstances@gmail.com auth_password:密码send_resolved: true

同样,在几分钟之后(在您停止至少一个实例之后),警报通知应该被发送到您的Gmail。

警报通知发送到Gmail
警报通知发送到Gmail

就是这样!