如何使用Alertmanager和BlackboxExporter在Ubuntu16.04上监控您的Web服务器
作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来获得 300 美元的捐款。
介绍
出现问题时,向相应的团队发送警报可显着加快确定问题的根本原因,从而使团队能够快速解决事件。
Prometheus 是一个开源监控系统,它从您的服务中收集指标并将它们存储在时间序列数据库中。 Alertmanager 是一个用于处理警报的工具,它可以对警报进行重复数据删除、分组并将警报发送到适当的接收器。 它可以处理来自 Prometheus 等客户端应用程序的警报,并且支持许多接收器,包括电子邮件、PagerDuty、OpsGenie 和 Slack。
由于有许多可用的 Prometheus 导出器,您可以为基础架构的每个部分配置警报,包括 web 和 数据库服务器 、 消息系统 或 API 。
Blackbox Exporter 通过 HTTP、HTTPS、DNS、TCP 或 ICMP 协议探测端点,返回有关请求的详细指标,包括请求是否成功以及接收响应所需的时间。
在本教程中,您将安装和配置 Alertmanager 和 Blackbox Exporter 以监控 Nginx Web 服务器的响应能力。 然后,您将配置 Alertmanager 以在您的服务器没有响应时通过电子邮件和 Slack 通知您。
先决条件
对于本教程,您需要:
- 一台 Ubuntu 16.04 服务器,按照 Initial Server Setup with Ubuntu 16.04 教程 进行设置,包括一个 sudo 非 root 用户和一个防火墙。
- 按照如何在Ubuntu 16.04上安装Nginx教程的前两个步骤安装Nginx。
- 一个监听端口
8080
的 Nginx 服务器块,您可以按照 How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 16.04 教程进行配置。 在本教程中,您将使用它作为端点进行监控。 通过将监听指令从 80 修改为 8080 来更改端口。 您可以使用域或子域,但请确保通过教程替换端点地址。 - 按照教程 How To Install Prometheus On Ubuntu 16.04 安装 Prometheus 2.x。
- 用于发送电子邮件的 SMTP 服务器。 您可以使用任何 SMTP 服务器,或者按照教程 如何在 Ubuntu 16.04 上安装和配置 Postfix 作为仅发送 SMTP 服务器来设置自己的服务器。
- 如果您想通过 Slack 从 Alertmanager 接收警报,则可以选择使用 Slack 帐户和工作区。
第 1 步 — 创建服务用户
出于安全考虑,我们将创建两个新用户帐户,blackbox_exporter 和 alertmanager。 我们将在整个教程中使用这些帐户来运行 Blackbox Exporter 和 Alertmanager,以及隔离适当核心文件和目录的所有权。 这可确保 Blackbox Exporter 和 Alertmanager 无法访问和修改他们不拥有的数据。
使用 --no-create-home
和 --shell /bin/false
标志使用 useradd
命令创建这些用户,以便这些用户无法登录服务器:
sudo useradd --no-create-home --shell /bin/false blackbox_exporter sudo useradd --no-create-home --shell /bin/false alertmanager
用户到位后,让我们下载并配置 Blackbox Exporter。
第 2 步 — 安装 Blackbox Exporter
首先,将 Blackbox Exporter 的最新稳定版本下载到您的主目录。 您可以在 Prometheus 下载页面 上找到最新的二进制文件及其校验和。
cd ~ curl -LO https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbox_exporter-0.12.0.linux-amd64.tar.gz
在解压存档之前,使用以下 sha256sum
命令验证文件的校验和:
sha256sum blackbox_exporter-0.12.0.linux-amd64.tar.gz
将此命令的输出与 Prometheus 下载页面上的校验和进行比较,以确保您的文件是正版且未损坏:
Outputc5d8ba7d91101524fa7c3f5e17256d467d44d5e1d243e251fd795e0ab4a83605 blackbox_exporter-0.12.0.linux-amd64.tar.gz
如果校验和不匹配,请删除下载的文件并重复上述步骤以重新下载文件。
当您确定校验和匹配时,解压缩存档:
tar xvf blackbox_exporter-0.12.0.linux-amd64.tar.gz
这将创建一个名为 blackbox_exporter-0.12.0.linux-amd64
的目录,其中包含 blackbox_exporter
二进制文件、许可证和示例文件。
将二进制文件复制到/usr/local/bin
目录。
sudo mv ./blackbox_exporter-0.12.0.linux-amd64/blackbox_exporter /usr/local/bin
将二进制文件的用户和组所有权设置为 blackbox_exporter 用户,确保非 root 用户无法修改或替换文件:
sudo chown blackbox_exporter:blackbox_exporter /usr/local/bin/blackbox_exporter
最后,我们将删除存档和解压目录,因为它们不再需要。
rm -rf ~/blackbox_exporter-0.12.0.linux-amd64.tar.gz ~/blackbox_exporter-0.12.0.linux-amd64
接下来,让我们配置 Blackbox Exporter 以通过 HTTP 协议探测端点,然后运行它。
第 3 步 — 配置和运行 Blackbox Exporter
让我们创建一个配置文件,定义 Blackbox Exporter 应如何检查端点。 我们还将创建一个 systemd 单元文件,以便我们可以使用 systemd
管理 Blackbox 的服务。
我们将在下一步的 Prometheus 配置中指定要探测的端点列表。
首先,为 Blackbox Exporter 的配置创建目录。 根据 Linux 约定,配置文件位于 /etc
目录中,因此我们也将使用此目录来保存 Blackbox Exporter 配置文件:
sudo mkdir /etc/blackbox_exporter
然后将此目录的所有权设置为您在步骤 1 中创建的 blackbox_exporter 用户:
sudo chown blackbox_exporter:blackbox_exporter /etc/blackbox_exporter
在新创建的目录中,创建 blackbox.yml
文件,该文件将保存 Blackbox Exporter 配置设置:
sudo nano /etc/blackbox_exporter/blackbox.yml
我们将配置 Blackbox Exporter 以使用默认的 http
探测器来探测端点。 Probers 定义 Blackbox Exporter 如何检查端点是否正在运行。 http
探测器通过向端点发送 HTTP 请求并测试其响应代码来检查端点。 您可以选择使用哪种 HTTP 方法进行探测,以及接受哪些状态代码作为成功响应。 其他流行的探测器包括用于通过 TCP 协议探测的 tcp
探测器、用于通过 ICMP 协议探测的 icmp
探测器和用于检查 DNS 条目的 dns
探测器。
在本教程中,我们将使用 http
探测器通过 HTTP GET
方法探测在端口 8080
上运行的端点。 默认情况下,探测器假定 2xx
范围内的有效状态码是有效的,因此我们不需要提供有效状态码的列表。
我们将配置超时 5 秒,这意味着 Blackbox Exporter 将在报告失败之前等待 5 秒的响应。 根据您的应用程序类型,选择任何符合您需求的值。
注意: Blackbox Exporter的配置文件使用YAML格式,禁止使用制表符,严格要求缩进使用两个空格。 如果配置文件格式不正确,Blackbox Exporter 将无法启动。
将以下配置添加到文件中:
/etc/blackbox_exporter/blackbox.yml
modules: http_2xx: prober: http timeout: 5s http: valid_status_codes: [] method: GET
您可以在 Blackbox Exporter 的文档 中找到有关配置选项的更多信息。
保存文件并退出文本编辑器。
在创建服务文件之前,将配置文件上的用户和组所有权设置为步骤 1 中创建的 blackbox_exporter 用户。
sudo chown blackbox_exporter:blackbox_exporter /etc/blackbox_exporter/blackbox.yml
现在创建服务文件,以便您可以使用 systemd
管理 Blackbox Exporter:
sudo nano /etc/systemd/system/blackbox_exporter.service
将以下内容添加到文件中:
/etc/systemd/system/blackbox_exporter.service
[Unit] Description=Blackbox Exporter Wants=network-online.target After=network-online.target [Service] User=blackbox_exporter Group=blackbox_exporter Type=simple ExecStart=/usr/local/bin/blackbox_exporter --config.file /etc/blackbox_exporter/blackbox.yml [Install] WantedBy=multi-user.target
此服务文件告诉 systemd
以 blackbox_exporter 用户身份运行 Blackbox Exporter,配置文件位于 /etc/blackbox_exporter/blackbox.yml
。 systemd
服务文件的详细信息超出了本教程的范围,但如果您想了解更多信息,请参阅 Understanding Systemd Units and Unit Files 教程。
保存文件并退出文本编辑器。
最后,重新加载 systemd
以使用您新创建的服务文件:
sudo systemctl daemon-reload
现在启动 Blackbox Exporter:
sudo systemctl start blackbox_exporter
通过检查服务的状态确保它成功启动:
sudo systemctl status blackbox_exporter
输出包含有关 Blackbox Exporter 进程的信息,包括主进程标识符 (PID)、内存使用情况、日志等。
Output● blackbox_exporter.service - Blackbox Exporter Loaded: loaded (/etc/systemd/system/blackbox_exporter.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2018-04-05 17:48:58 UTC; 5s ago Main PID: 5869 (blackbox_export) Tasks: 4 Memory: 968.0K CPU: 9ms CGroup: /system.slice/blackbox_exporter.service └─5869 /usr/local/bin/blackbox_exporter --config.file /etc/blackbox_exporter/blackbox.yml
如果服务的状态不是 active (running)
,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续本教程。
最后,启用服务以确保 Blackbox Exporter 将在服务器重新启动时启动:
sudo systemctl enable blackbox_exporter
现在 Blackbox Exporter 已完全配置并运行,我们可以配置 Prometheus 以收集有关对端点的探测请求的指标,因此我们可以基于这些指标创建警报并使用 Alertmanager 设置警报通知。
第 4 步 — 配置 Prometheus 以抓取 Blackbox Exporter
如步骤 3 中所述,要探测的端点列表位于 Prometheus 配置文件中,作为 Blackbox Exporter 的 targets
指令的一部分。 在这一步中,您将配置 Prometheus 以使用 Blackbox Exporter 来抓取在您在先决条件教程中配置的端口 8080
上运行的 Nginx Web 服务器。
在编辑器中打开 Prometheus 配置文件:
sudo nano /etc/prometheus/prometheus.yml
此时,它应该如下所示:
/etc/prometheus/prometheus.yml
global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'node_exporter' scrape_interval: 5s static_configs: - targets: ['localhost:9100']
在 scrape_configs
指令的末尾,添加以下条目,这将告诉 Prometheus 使用 Blackbox Exporter 的模块 http_2xx
探测在本地端口 8080
上运行的端点,已配置在步骤 3。
/etc/prometheus/prometheus.yml
... - job_name: 'blackbox' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - http://localhost:8080 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: localhost:9115
默认情况下,Blackbox Exporter 在端口 9115
上运行,指标在 /probe
端点上可用。
Blackbox Exporter 的 scrape_configs
配置与其他导出器的配置不同。 最显着的区别是 targets
指令,它列出了被探测的端点而不是导出器的地址。 使用适当的 __address__
标签集指定导出器的地址。
您可以在 Prometheus 文档 中找到 relabel
指令的详细说明。
您的 Prometheus 配置文件现在将如下所示:
Prometheus 配置文件 - /etc/prometheus/prometheus.yml
global: scrape_interval: 15s scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'node_exporter' scrape_interval: 5s static_configs: - targets: ['localhost:9100'] - job_name: 'blackbox' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - http://localhost:8080 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: localhost:9115
保存文件并关闭文本编辑器。
重新启动 Prometheus 以使更改生效:
sudo systemctl restart prometheus
通过检查 Prometheus 服务状态确保它按预期运行:
sudo systemctl status prometheus
如果服务的状态不是 active (running)
,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续本教程。
此时,您已将 Prometheus 配置为从 Blackbox Exporter 抓取指标。 为了从 Alertmanager 接收警报,在下一步中,您将创建一组适当的 Prometheus 警报规则。
第 5 步 — 创建警报规则
Prometheus Alerting 分为两部分。 第一部分由 Prometheus 服务器处理,包括根据警报规则生成警报并将其发送到 Alertmanager。 第二部分由 Alertmanager 完成,它管理收到的警报并将它们发送到适当的接收器,具体取决于配置。
在此步骤中,您将在创建警报规则以检查您的服务器是否可用时学习警报规则的基本语法。
首先,创建一个文件来存储您的警报。 在/etc/prometheus
目录下创建一个名为alert.rules.yml
的空文件:
sudo touch /etc/prometheus/alert.rules.yml
由于此文件是 Prometheus 配置的一部分,请确保将所有权设置为您在先决条件 Prometheus 教程中创建的 prometheus 用户:
sudo chown prometheus:prometheus /etc/prometheus/alert.rules.yml
有了警报文件,我们需要通过在配置文件中添加适当的指令来告诉 Prometheus。
在编辑器中打开 Prometheus 配置文件:
sudo nano /etc/prometheus/prometheus.yml
在 global
指令之后添加 rule_files
指令,以使 Prometheus 在 Prometheus 启动时加载您新创建的警报文件。
/etc/prometheus/prometheus.yml
global: scrape_interval: 15s rule_files: - alert.rules.yml scrape_configs: ...
保存文件并退出文本编辑器。
现在让我们构建一个规则来检查端点是否关闭。
为了制定警报规则,您将使用 Blackbox Exporter 的 probe_success
指标,如果端点启动则返回 1,否则返回 0。
probe_success
指标包含两个标签:带有端点地址的 instance
标签和带有收集指标的导出器名称的 job
标签。
在编辑器中打开警报规则文件:
sudo nano /etc/prometheus/alert.rules.yml
与 Prometheus 配置文件一样,alerts 规则文件使用 YAML 格式,严格禁止制表符,并且需要两个空格进行缩进。 如果文件格式不正确,Prometheus 将无法启动。
首先,我们将创建一个名为 EndpointDown
的警报规则,以检查 probe_sucess
指标是否等于 0,持续时间为 10 秒。 这确保了如果端点不可用少于 10 秒,Prometheus 不会发送任何警报。 您可以根据应用程序类型和需求自由选择所需的任何持续时间。
此外,我们将附加两个表示严重严重性的标签和警报摘要,以便我们可以轻松管理和过滤警报。
如果要在警报的标签和注释中包含更多详细信息,可以使用 模板:$labels.metrics label
语法来获取标签的值。 我们将使用它来包含指标 instance
标签中的端点地址。
将以下规则添加到警报文件:
/etc/prometheus/alert.rules.yml
groups: - name: alert.rules rules: - alert: EndpointDown expr: probe_success == 0 for: 10s labels: severity: "critical" annotations: summary: "Endpoint {{ $labels.instance }} down"
保存文件并退出文本编辑器。
在重新启动 Prometheus 之前,请使用以下 promtool
命令确保您的警报文件在语法上是正确的:
sudo promtool check rules /etc/prometheus/alert.rules.yml
输出包含在文件中找到的规则数量,以及有关规则在语法上是否正确的信息:
OutputChecking /etc/prometheus/alert.rules.yml SUCCESS: 1 rules found
最后,重新启动 Prometheus 以应用更改:
sudo systemctl restart prometheus
使用 status
命令验证服务是否正在运行:
sudo systemctl status prometheus
如果服务的状态不是 active
,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续本教程。
有了警报规则,我们就可以下载并安装 Alertmanager。
第 6 步 — 下载 Alertmanager
Blackbox Exporter 已配置并且我们的警报规则已到位。 让我们下载并安装 Alertmanager 来处理 Prometheus 收到的警报。
您可以在 Prometheus 下载页面 上找到最新的二进制文件及其校验和。 下载当前稳定版本的 Alertmanager 并将其解压缩到您的主目录中:
cd ~ curl -LO https://github.com/prometheus/alertmanager/releases/download/v0.14.0/alertmanager-0.14.0.linux-amd64.tar.gz
在解压存档之前,使用以下 sha256sum
命令验证文件的校验和:
sha256sum alertmanager-0.14.0.linux-amd64.tar.gz
将此命令的输出与 Prometheus 下载页面上的校验和进行比较,以确保您的文件是真实的且没有损坏。
Outputcaddbbbe3ef8545c6cefb32f9a11207ae18dcc788e8d0fb19659d88c58d14b37 alertmanager-0.14.0.linux-amd64.tar.gz
如果校验和不匹配,请删除下载的文件并重复上述步骤以重新下载文件。
验证下载后,解压缩存档:
tar xvf alertmanager-0.14.0.linux-amd64.tar.gz
这将创建一个名为 alertmanager-0.14.0.linux-amd64
的目录,其中包含两个二进制文件(alertmanager
和 amtool
)、一个许可证和一个示例配置文件。
将两个二进制文件移动到/usr/local/bin
目录下:
sudo mv alertmanager-0.14.0.linux-amd64/alertmanager /usr/local/bin sudo mv alertmanager-0.14.0.linux-amd64/amtool /usr/local/bin
将二进制文件的用户和组所有权设置为您在步骤 1 中创建的 alertmanager 用户:
sudo chown alertmanager:alertmanager /usr/local/bin/alertmanager sudo chown alertmanager:alertmanager /usr/local/bin/amtool
从您的主目录中删除不再需要的剩余文件:
rm -rf alertmanager-0.14.0.linux-amd64 alertmanager-0.14.0.linux-amd64.tar.gz
现在所需的文件位于适当的位置,我们可以将 Alertmanager 配置为通过电子邮件发送警报通知。
第 7 步 — 配置 Alertmanager 以通过电子邮件发送警报
在此步骤中,您将创建目录和文件来存储 Alertmanager 的数据和配置设置,然后配置 Alertmanager 以通过电子邮件发送警报。
按照标准的 Linux 约定,我们将在 /etc
中创建一个目录来存储 Alertmanager 的配置文件。
sudo mkdir /etc/alertmanager
将新创建的目录的用户和组所有权设置为 alertmanager 用户:
sudo chown alertmanager:alertmanager /etc/alertmanager
我们将配置文件存储在 alertmanager.yml
文件中,因此创建此文件并在编辑器中打开它:
sudo nano /etc/alertmanager/alertmanager.yml
与其他 Prometheus 相关的文件一样,这个文件也使用 YAML 格式,因此请确保使用两个空格而不是制表符进行缩进。
我们将配置 Alertmanager 以使用您按照先决条件教程安装的 Postfix 发送电子邮件。 我们需要使用 smtp_smarthost
指令提供 SMTP 服务器的地址,以及使用 smtp_from
指令来发送电子邮件的地址。 由于 Postfix 和 Alertmanager 在同一台服务器上运行,所以服务器的地址是 localhost:25
。 我们将使用 alertmanager 用户发送电子邮件。
默认情况下,Postfix 没有配置 TLS,所以我们需要告诉 Alertmanager 允许使用 smtp_require_tls
指令的非 TLS SMTP 服务器。
将 SMTP 配置放在 global
指令下,因为它用于指定在所有其他配置上下文中有效的参数。 在我们的例子中,这包括 SMTP 配置,还可以包括用于各种集成的 API 令牌:
Alertmanager 配置文件第 1 部分 - /etc/alertmanager/alertmanager.yml
global: smtp_smarthost: 'localhost:25' smtp_from: 'alertmanager@your_domain' smtp_require_tls: false
注意: 确保将 smtp_from
指令中的 your_domin
替换为您的域名。
此时,Alertmanager 知道如何发送电子邮件,但我们需要使用 route
指令定义它将如何处理传入的警报。 route
指令应用于每个传入警报并定义属性,例如 Alertmanager 将如何对警报进行分组、谁是默认收件人,或者 Alertmanager 在发送初始警报之前将等待多长时间。
要对警报进行分组,请使用 group_by
子指令,它采用内联标签数组(例如 ['label-1', 'label-2']
)。 分组可确保包含相同标签的警报将被分组并在同一批次中发送。
每个 route
指令都有一个使用 receiver
子指令定义的接收器。 如果要添加多个接收器,则需要在同一指令下定义多个接收器,或者使用 routes
子指令嵌套多个 route
指令。 在本教程中,我们将介绍配置 Slack 警报的第一种方法。
在这种情况下,我们将仅按 Blackbox 的 instance
标签和我们在第 6 步中附加到警报的 severity
标签进行分组,确保我们将在一封邮件。
添加以下 group_by
指令:
Alertmanager 配置文件第 2 部分 - /etc/alertmanager/alertmanager.yml
... route: group_by: ['instance', 'alert']
接下来,我们将定义间隔,例如 Alertmanager 在发送初始警报和新警报之前将等待多长时间。
使用 group_wait
子指令,我们将定义 Alertmanager 在发送初始警报之前将等待多长时间。 在此期间,Alertmanager 将等待 Prometheus 发送其他警报(如果存在),以便它们可以在同一批次中发送。 由于我们只有一个警报,我们将选择 30 秒的任意值。
接下来,使用 group_interval
间隔,我们将定义如果同一组中有新警报,Alertmanager 在发送下一批警报之前将等待多长时间。 您可以根据需要自由选择任何值,但我们会将其设置为每 5 分钟一次。
我们将配置的最后一个间隔是 repeat_interval
,它定义了如果警报尚未解决,Alertmanager 在发送通知之前将等待多长时间。 您可以选择适合您需要的任何值,但我们将使用 3 小时的任意值。
最后,使用 receiver
子指令,定义谁将接收警报通知。 我们将使用一个名为 team-1
的接收器,稍后我们将对其进行定义。
修改路由指令,使其看起来像这样:
Alertmanager 配置文件第 2 部分 - /etc/alertmanager/alertmanager.yml
route: group_by: ['instance', 'severity'] group_wait: 30s group_interval: 5m repeat_interval: 3h receiver: team-1
如果您只想匹配和发送有关特定警报的通知,您可以使用 match
和 match_re
子指令按标签值过滤掉警报。 match
子指令表示相等匹配,其中 match_re
子指令表示通过正则表达式进行匹配。
现在我们将配置 team-1
接收器,以便您可以接收警报通知。 在 receivers
指令下,您可以定义包含名称和适当配置子指令的接收器。 Alertmanager 的文档 中提供了可用接收器列表以及如何配置它们的说明。
为了配置 team-1
电子邮件接收器,我们将使用 receivers
指令下的 email_configs
子指令:
Alertmanager 配置文件第 3 部分 - /etc/alertmanager/alertmanager.yml
receivers: - name: 'team-1' email_configs: - to: 'your-email-address'
此时,您已将 Alertmanager 配置为向您的电子邮件地址发送警报通知。 您的配置文件应如下所示:
警报管理器配置文件 - /etc/alertmanager/alertmanager.yml
global: smtp_smarthost: 'localhost:25' smtp_from: 'alertmanager@example.com' smtp_require_tls: false route: group_by: ['instance', 'severity'] group_wait: 30s group_interval: 5m repeat_interval: 3h receiver: team-1 receivers: - name: 'team-1' email_configs: - to: 'your-email-address'
在下一步中,我们将配置 Alertmanager 以将警报发送到您的 Slack 频道。 如果您不想配置 Slack,可以直接跳到第 10 步,我们将在其中创建服务文件并配置 Prometheus 以使用 Alertmanager。
第 8 步 — 配置 Alertmanager 以通过 Slack 发送警报
在继续执行此步骤之前,请确保您已创建一个 Slack 帐户并且您有一个可用的 Slack 工作区。
要将警报发送到 Slack,首先创建一个 Incoming Webhook。
将您的浏览器指向 https://workspace-name.slack.com/services/new/incoming-webhook/
上的 Incoming Webhook 创建页面。 您将获得包含有关传入 Webhook 的详细信息的页面以及您需要从中选择要发送警报的通道的下拉列表。
选择通道后,单击 Add Incoming WebHooks integration 按钮。
您将看到一个新页面,确认 Webhook 已成功创建。 复制此页面上显示的 Webhook URL,因为您将使用它来配置 Alertmanager 的 Slack 通知。
在编辑器中打开 Alertmanager 配置文件以配置 Slack 通知:
sudo nano /etc/alertmanager/alertmanager.yml
首先,使用您在创建 Slack Incoming Webhook 时获得的 URL,将 slack_api_url
子指令添加到配置的 global
部分。
Alertmanager 配置文件第 1 部分 - /etc/alertmanager/alertmanager.yml
global: smtp_smarthost: 'localhost:25' smtp_from: 'alertmanager@example.com' smtp_require_tls: false slack_api_url: 'your_slack_webhook_url'
有两种方法可以向多个接收者发送警报:
- 在同一条目下包含多个接收器配置。 这是最不容易出错的解决方案,也是最简单的方法。
- 创建多个接收器条目并嵌套多个
route
指令。
我们不会在本教程中介绍第二种方法,但如果您有兴趣,请查看 Alertmanager 文档的 Route 配置 部分。
在 team-1
接收器中,添加一个名为 slack_configs 的新子指令,并提供应该接收警报的通道的名称。 在这种情况下,我们将使用 general
通道:
Alertmanager 配置文件第 2 部分 - /etc/alertmanager/alertmanager.yml
receivers: - name: 'team-1' email_configs: - to: 'your-email-address' slack_configs: - channel: 'general<^>'
您完成的配置文件将如下所示:
警报管理器配置文件 - /etc/alertmanager/alertmanager.yml
global: smtp_smarthost: 'localhost:25' smtp_from: 'alertmanager@example.com' smtp_require_tls: false slack_api_url: 'your_slack_webhook_url' route: group_by: ['instance', 'severity'] group_wait: 30s group_interval: 5m repeat_interval: 3h receiver: team-1 receivers: - name: 'team-1' email_configs: - to: 'your-email-address' slack_configs: - channel: 'general'
保存文件并退出编辑器。
我们现在准备好第一次运行 Alertmanager。
第 9 步 — 运行 Alertmanager
让我们启动并运行 Alertmanager。 我们将首先为 Alertmanager 创建一个 systemd 单元文件,以使用 systemd
管理其服务。 然后我们将更新 Prometheus 以使用 Alertmanager。
创建一个新的 systemd
单元文件并在文本编辑器中打开它:
sudo nano /etc/systemd/system/alertmanager.service
将以下内容添加到文件中以配置 systemd 以 alertmanager 用户身份运行 Alertmanager,使用位于 /etc/alertmanager/alertmanager.yml
的配置文件和 Alertmanager 的 URL,配置为使用服务器的 IP 地址:
/etc/systemd/system/alertmanager.service
[Unit] Description=Alertmanager Wants=network-online.target After=network-online.target [Service] User=alertmanager Group=alertmanager Type=simple WorkingDirectory=/etc/alertmanager/ ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --web.external-url http://your_server_ip:9093 [Install] WantedBy=multi-user.target
这将以 alertmanager 用户身份运行 Alertmanager。 它还告诉 Alertmanager 为其 Web UI 使用 URL http://your_server_ip:9093
,其中 9093
是 Alertmanager 的默认端口。 确保包含协议 (http://
) 否则将无法正常工作。
保存文件并关闭文本编辑器。
接下来,我们需要通过在 Prometheus 配置文件中添加适当的 Alertmanager 服务发现目录来告诉 Prometheus 关于 Alertmanager。 默认情况下,Alertmanager 在端口 9093
上运行,由于它与 Prometheus 在同一台服务器上,我们将使用地址 localhost:9093
。
打开 Prometheus 配置文件:
sudo nano /etc/prometheus/prometheus.yml
在 rule_files
指令之后,添加以下 alerting
指令:
Prometheus 配置文件 - /etc/prometheus/prometheus.yml
... rule_files: - alert.rules.yml alerting: alertmanagers: - static_configs: - targets: - localhost:9093 ...
完成后,保存文件并关闭文本编辑器。
为了能够跟踪您收到的警报中的 URL,您需要在启动 Prometheus 时使用 -web.external-url
标志告诉 Prometheus 您的服务器的 IP 地址或域名。
打开 Prometheus 的 systemd
单元文件:
sudo nano /etc/systemd/system/prometheus.service
将现有的 ExecStart
行替换为以下行:
ExecStart=/usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries \ --web.external-url http://your_server_ip
您的新 Prometheus 单元文件将如下所示:
Prometheus 服务文件 - /etc/systemd/system/prometheus.service
[Unit] Description=Prometheus Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries \ --web.external-url http://your_server_ip [Install] WantedBy=multi-user.target
保存文件并关闭文本编辑器。
重新加载 systemd
并重新启动 Prometheus 以应用更改:
sudo systemctl daemon-reload sudo systemctl restart prometheus
通过检查服务的状态确保 Prometheus 按预期工作:
sudo systemctl status prometheus
如果服务的状态不是 active (running)
,请按照屏幕上的日志并回溯上述步骤以解决问题,然后再继续本教程。
最后,第一次启动Alertmanager:
sudo systemctl start alertmanager
检查服务的状态以确保 Alertmanager 按预期工作:
sudo systemctl status alertmanager
如果服务的状态不是 active (running)
,请按照屏幕上的消息并回溯上述步骤以解决问题,然后再继续本教程。
最后,启用该服务以确保 Alertmanager 将在系统启动时启动:
sudo systemctl enable alertmanager
要访问 Alertmanager 的 Web UI,请允许通过防火墙的端口 9093
的流量:
sudo ufw allow 9093/tcp
Alertmanager 现在配置为通过电子邮件和 Slack 发送警报通知。 让我们确保它有效。
第 10 步 — 测试 Alertmanager
让我们确保 Alertmanger 正常工作并发送电子邮件和 Slack 通知。 我们将通过删除您在先决条件教程中创建的 Nginx 服务器块来禁用端点:
sudo rm /etc/nginx/sites-enabled/your_domain
重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
如果您想确认它实际上已被禁用,您可以将您的网络浏览器指向您的服务器地址。 您应该会看到一条消息,指示该站点不再可访问。 如果不这样做,请回溯前面的步骤并确保删除了正确的服务器块并重新加载了 Nginx。
根据 group_wait
间隔,在我们的例子中是 30 秒,您应该会在 30 秒后收到电子邮件和 Slack 通知。
如果没有,请使用以下 status
命令检查服务的状态,并按照屏幕上的日志查找问题原因:
sudo systemctl status alertmanager sudo systemctl status prometheus
您还可以通过将您的网络浏览器指向 http://your_server_ip/alerts
从 Prometheus Web UI 检查警报的状态。 系统会要求您按照 Prometheus 教程输入您选择的用户名和密码。 通过单击警报名称,您将看到状态、警报规则和相关标签:
确认 Alertmanager 正常工作后,通过重新创建从 sites-available
目录到 sites-enabled
目录的符号链接来启用端点:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled
再次重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
在下一步中,我们将了解如何使用 Alertmanager 的命令行界面。
第 11 步 — 使用 CLI 管理警报
Alertmanager 附带命令行工具 amtool
,可让您监控、管理和消除警报。
amtool
工具要求您在每次执行命令时使用 --alertmanager.url
标志提供 Alertmanager 的 URL。 为了在不提供 URL 的情况下使用 amtool
,我们将首先创建一个配置文件。
配置文件的默认位置是 $HOME/.config/amtool/config.yml
,它使配置仅对您当前的用户可用,以及 /etc/amtool/config.yml
,它使配置对服务器上的每个用户都可用。
您可以自由选择适合您需要的任何内容,但在本教程中,我们将使用 $HOME/.config/amtool/config.yml
文件。
首先,创建目录。 -p
标志告诉 mkdir
在此过程中创建任何必要的父目录:
mkdir -p $HOME/.config/amtool
创建 config.yml
文件并在文本编辑器中打开它:
nano $HOME/.config/amtool/config.yml
添加以下行以告诉 amtool
使用带有 http://localhost:9093
URL 的 Alertmanager:
~/.config/amtool/config.yml
alertmanager.url: http://localhost:9093
保存文件并退出文本编辑器。
现在,我们将看看使用 amtool
命令行工具可以做什么。
使用 amtool alert query
命令,您可以列出所有已发送到 Alertmanager 的警报:
amtool alert query
输出显示警报的名称、警报第一次出现的时间,以及您在配置时提供的警报摘要:
OutputAlertname Starts At Summary EndpointDown 2018-04-03 08:48:47 UTC Endpoint http://localhost:8080 down
您还可以使用适当的匹配器按标签过滤警报。 匹配器包含标签名称、适当的操作,可以是 =
用于完全匹配和 =~
用于部分匹配,以及标签的值。
如果要列出附加了严重严重性标签的所有警报,请在 alert query
命令中使用 severity=critical
匹配器:
amtool alert query severity=critical
和以前一样,输出包含警报的名称、警报第一次出现的时间和警报的摘要。
OutputAlertname Starts At Summary EndpointDown 2018-04-03 08:48:47 UTC Endpoint http://localhost:8080 down
您可以使用正则表达式来匹配带有 =~
运算符的标签。 例如,要列出不依赖于端口的 http://localhost
端点的所有警报,您可以使用 instance=~http://localhost.*
匹配器:
amtool alert query instance=~http://localhost.*
由于您只有一个警报和端点,因此输出将与上一个示例中的相同。
要查看 Alertmanager 配置,请使用 amtool config
命令:
amtool config
输出将包含 /etc/alertmanager/alertmanager.yml
文件的内容。
现在让我们看看如何使用 amtool
使警报静音。
静音警报可让您在给定时间内根据匹配器静音警报。 在此期间,您将不会收到有关静音警报的任何电子邮件或 Slack 通知。
amtool silence add
命令将匹配器作为参数,并基于匹配器创建一个新的 silence。
要定义警报的到期,请使用带有所需静默持续时间的 --expires
标志,例如 1h
或带有 --expire-on
标志在 [ X182X]RFC3339 格式。 例如,格式 2018-10-04T07:50:00+00:00
表示 2018 年 10 月 4 日上午 7:50。
如果未提供 --expires
或 --expires-on
标志,则警报将静音 1 小时 。
要将 http://localhost:8080
实例的所有警报静音 3 小时 ,您可以使用以下命令:
amtool silence add instance=http://localhost:8080 --expires 3h
输出包含静音的标识号,因此请务必记下它,以防万一您想删除静音:
Output4e89b15b-0814-41d3-8b74-16c513611732
如果您想在创建静音时提供其他信息,例如作者和评论,请使用 --author
和 --comment
标志:
amtool silence add severity=critical --expires 3h --author "Sammy The Shark" --comment "Investigating the progress"
和以前一样,输出包含静默的 ID:
Output12b7b9e1-f48a-4ceb-bd85-65ac882ceed1
命令 amtool silence query
将显示所有未过期的静音列表:
amtool silence query
输出包含静默的 ID、匹配器列表、过期时间戳、作者和评论:
OutputID Matchers Ends At Created By Comment 12b7b9e1-f48a-4ceb-bd85-65ac882ceed1 severity=critical 2018-04-04 08:02:58 UTC Sammy The Shark Investigating in the progress 4e89b15b-0814-41d3-8b74-16c513611732 instance=http://localhost:8080 2018-04-04 08:14:21 UTC sammy
与 alert query
命令类似,您可以使用标签匹配器按创建时附加的标签过滤输出:
amtool silence query instance=http://localhost:8080
和以前一样,输出将包括 ID 号和警报的详细信息:
OutputID Matchers Ends At Created By Comment 4e89b15b-0814-41d3-8b74-16c513611732 instance=http://localhost:8080 2018-04-04 08:14:21 UTC sammy
最后,要使静默过期,请使用 amtool silence expire
和要过期的静默 ID:
amtool silence expire 12b7b9e1-f48a-4ceb-bd85-65ac882ceed1 amtool silence expire 4e89b15b-0814-41d3-8b74-16c513611732
无输出表示命令执行成功。 如果您看到错误,请确保您提供了正确的静音 ID。
结论
在本教程中,您将 Blackbox Exporter 和 Alertmanager 配置为与 Prometheus 一起使用,以便您可以通过电子邮件和 Slack 接收警报。 您还使用了 Alertmanager 的命令行界面 amtool
来管理和消除警报。
如果您想了解有关其他 Alertmanager 集成的更多信息,请查看 Alertmanager 文档的 Configuration 部分。
此外,您可以了解如何将 Prometheus Alerts 与其他服务集成,例如 Grafana。