如何使用Alertmanager和BlackboxExporter在Ubuntu16.04上监控您的Web服务器

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来获得 300 美元的捐款。

介绍

出现问题时,向相应的团队发送警报可显着加快确定问题的根本原因,从而使团队能够快速解决事件。

Prometheus 是一个开源监控系统,它从您的服务中收集指标并将它们存储在时间序列数据库中。 Alertmanager 是一个用于处理警报的工具,它可以对警报进行重复数据删除、分组并将警报发送到适当的接收器。 它可以处理来自 Prometheus 等客户端应用程序的警报,并且支持许多接收器,包括电子邮件、PagerDutyOpsGenieSlack

由于有许多可用的 Prometheus 导出器,您可以为基础架构的每个部分配置警报,包括 web数据库服务器消息系统API

Blackbox Exporter 通过 HTTP、HTTPS、DNS、TCP 或 ICMP 协议探测端点,返回有关请求的详细指标,包括请求是否成功以及接收响应所需的时间。

在本教程中,您将安装和配置 Alertmanager 和 Blackbox Exporter 以监控 Nginx Web 服务器的响应能力。 然后,您将配置 Alertmanager 以在您的服务器没有响应时通过电子邮件和 Slack 通知您。

先决条件

对于本教程,您需要:

第 1 步 — 创建服务用户

出于安全考虑,我们将创建两个新用户帐户,blackbox_exporteralertmanager。 我们将在整个教程中使用这些帐户来运行 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

此服务文件告诉 systemdblackbox_exporter 用户身份运行 Blackbox Exporter,配置文件位于 /etc/blackbox_exporter/blackbox.ymlsystemd 服务文件的详细信息超出了本教程的范围,但如果您想了解更多信息,请参阅 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 的目录,其中包含两个二进制文件(alertmanageramtool)、一个许可证和一个示例配置文件。

将两个二进制文件移动到/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

如果您只想匹配和发送有关特定警报的通知,您可以使用 matchmatch_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'

有两种方法可以向多个接收者发送警报:

  1. 在同一条目下包含多个接收器配置。 这是最不容易出错的解决方案,也是最简单的方法。
  2. 创建多个接收器条目并嵌套多个 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