17.8 Prometheus 监控部署

Prometheus 是一个开源的系统监控和告警工具包,本节将介绍如何在 FreeBSD 上部署 Prometheus 监控系统。

框架

Prometheus 监控部署框架如图所示。

框架

说明:

  • Prometheus 是整个监控系统的中心

  • Grafana 用于将监控数据可视化显示

  • Exporter 用于数据采集;Prometheus 支持多种 Exporter,可使用 pkg search -D prometheus 查找

  • Alertmanager 用于处理告警信息

  • Prometheus 可以配置多种远程存储

注意

Prometheus、Grafana、Exporter、Alertmanager 等组件可以分别部署在不同的设备或操作系统上。Exporter 应安装在被监控的节点上。以下示例中,Prometheus、Grafana、Alertmanager 安装在同一台机器上,Exporter 根据需要单独部署。

此外,如果遇到服务启动问题,可先查看 /var/log/daemon.log。Prometheus 配置文件大部分采用 YAML 格式,请注意缩进。对于 Prometheus 配置文件,可使用 promtool check 命令检查配置文件是否正确。

安装基本工具

了解完框架后,需要安装 Prometheus 监控系统的各个基本组件。

安装 prometheus

使用 pkg 包管理器安装 Prometheus 是最快捷的方式,执行以下命令即可完成安装。

或者使用 Ports 方式安装 Prometheus,需要先进入对应的目录再执行编译安装命令。

服务项

设置 Prometheus 服务开机自启并启动服务:

安装 grafana

使用 pkg 包管理器安装 Grafana 是最快捷的方式,执行以下命令即可完成安装:

或者使用 Ports 方式安装 Grafana,需要先进入对应的目录再执行编译安装命令。

服务项

设置 Grafana 服务开机自启并启动服务:

安装 node_exporter

使用 pkg 包管理器安装 Node Exporter 是最快捷的方式,执行以下命令即可完成安装:

或者使用 Ports 方式安装 Node Exporter,需要先进入对应的目录再执行编译安装命令。

服务项

设置 Node Exporter 服务开机自启并启动服务:

配置

目录结构:

prometheus

Prometheus 的主要配置文件为 /usr/local/etc/prometheus.yml,内容如下:

scrape_configs 用于配置采集数据的目标节点,这里默认的 targets: ["localhost:9090"] 指 Prometheus 服务本身。

现在增加用于监控主机信息的 node_exporter,在 scrape_configs 下写入如下:

重启 Prometheus。

这样就向 Prometheus 增加了一个新的监控节点,任务名为 node_exporter_local[] 中可添加多个主机。

Prometheus 提供 Web 界面(默认端口:9090),可查看监控目标信息如下:

监控目标

Graph 页:可以查看各项监控指标,支持表达式。例如:

空闲内存示例

熟悉界面后会发现,直接查看数据或 Panel 并不方便。此时可使用 Grafana 以更友好的方式展示数据。

grafana

在浏览器中打开 Grafana 的 Web 页面(默认端口为 3000),默认用户名为 admin,密码为 admin

如下图所示,可切换为中文界面:

grafana 切换中文界面

先新建与 prometheus 的连接

连接 prometheus 1
连接 prometheus 2
连接 prometheus 3

用创建的连接建立仪表板 (导入预设仪表板)

建仪表盘 1
建仪表盘 2
建仪表盘 3
建仪表盘 4
建仪表盘 5

安全认证

默认情况下,只有登录 Grafana 需要密码。各组件之间以 HTTP 连接,例如可通过访问 http://ip:9100/ 直接获取 Node Exporter 的监控数据,Prometheus 可通过 http://ip:9090/ 直接访问。

在生产环境中直接暴露这些信息存在安全风险,因此需要进行安全认证。

基本认证

prometheus 的 basic_auth

  • 编辑 /usr/local/etc/prometheus_webconfig.yml,格式如下

第二行中,冒号前为用户名,冒号后为密码的 bcrypt 哈希值——此处使用 sttr 工具生成,也可使用其他工具。假设密码为 prometheuspassword

这里的 % 是终端在未换行时显示的输出符号,可忽略。

  • 编辑 /usr/local/etc/prometheus.yml 文件,在 prometheus 的配置下加入下面三行:

请注意缩进,完整示例如下:

  • 修改 prometheus 启动配置,并重启

访问 http://ip:9090/ 时,Prometheus 会要求先登录:

登录 prometheus

相应的 Grafana 在连接数据源时要设置相应认证信息

exporter 的 basic_auth

下面以 node_exporter 为例

  • 编辑 /usr/local/etc/node_exporter_webconfig.yml,格式如下

  • 修改 node_exporter 启动配置,并重启

  • 编辑 /usr/local/etc/prometheus.yml,如下:

重启 prometheus

CA 证书认证

对安全要求很高的情况下,还可以使用 CA 证书认证方式加强安全,但是这不是每个 exporter 都支持的认证方式。

以下仍以 Node Exporter 为例,假设其节点 IP 为 10.0.55.1。

生成证书

生成 prometheus 端证书

生成 node_exporter 端证书

  1. 创建一个 OpenSSL 配置文件,以便在生成证书时指定 SAN(Subject Alternative Name)。

创建一个文件,比如叫 san.cnf,内容如下。

  1. 生成证书请求时使用 SAN 配置

使用这个配置文件来生成证书签名请求(CSR)和证书。

指定 SAN(Subject Alternative Name)非常重要,否则可能无法访问。也可以在 Prometheus 中配置忽略证书验证,但这和安全相悖,所以这里不再提及。

配置 prometheus 和 node_exporter

编辑 /usr/local/etc/node_exporter_webconfig.yml 文件,如下:

最后一句重要,只有这个选项才是安全的。

修改 /usr/local/etc/prometheus.yml 文件如下:

这两个文件在 基本认证 中已经提及,用法相同。

请注意密钥和证书文件的存放位置及权限设置,应只赋予最低访问权限。

重启 prometheus 和 node_exporter 即可。

pushgateway

上述介绍均为 Pull 方式,由 Prometheus 从各个 Exporter 拉取数据;Pushgateway 则允许监测点主动推送数据到 Pushgateway,再由 Prometheus 从 Pushgateway 拉取数据,适用于临时任务和批量任务的监控场景。

  1. 安装 pushgateway

  1. 在 prometheus 中配置 pushgateway

编辑 /usr/local/etc/prometheus.yml 文件,增加如下内容:

  1. 临时任务举例

假设有一个查看僵尸进程的管理脚本,如下:

第一行用于检查僵尸进程数量,第二行将僵尸进程计数发送到 Pushgateway。注意发送的数据每行必须以换行符 \n 结尾。

告警

Prometheus 的告警依赖 Alertmanager 组件。此处示例以 Jail Exporter 为例(安装配置较为简单,参见上文),同时需要在 /boot/loader.conf 文件中写入 kern.racct.enable=1 以开启系统记账功能。

  1. 使用 pkg 安装:

  1. 配置 alertmanager 告警路由规则

这里只展示简单的 email 方式,alertmanager 也支持其他方式通知。

其中 global 指定全局配置,这里指定了 smtp 服务。route 指定发送路由规则。receivers 指定接收者信息。

  1. 配置告警规则

编写规则文件,如 /usr/local/etc/prometheus/alert.rules.yml 文件:

alert 指定告警的名字。 expr 指定告警触发条件表达式,这里使用 absent(jail_id{name="dox"}) 表示当名为 dox 的 jail 的指标(jail_id)不存在时触发告警。 for 指触发告警的等待时间,此处为 5 分钟。如果在 5 分钟内问题得到解决,则不会发送告警。

  1. 在 prometheus 配置文件中引入规则文件,并连接 alertmanager

  1. 重启 prometheus 和 alertmanager

  1. 测试

关闭 jail 以触发规则:

5 分钟后发送告警邮件。

再开启 jail。

告警规则重置为非活动。

远程存储

prometheus 的数据支持远程存储。下面以 InfluxDB 为例。

  1. 请读者参考本书其他章节,自行安装配置 InfluxDB。

请注意 InfluxDB 的服务名是 influxd

出于安全考量,应该修改 /usr/local/etc/influxd.conf,在 http 段开启 http 认证:

  1. 创建 InfluxDB 用户和数据库

influx 进入命令行客户端

重启 InfluxDB 即可。

  1. 配置 prometheus

编辑 /usr/local/etc/prometheus.yml

FreeBSD Ports 中的 InfluxDB 为 v1 版本,请使用 v1 API 进行配置。

重启 prometheus 服务即可。

  1. 验证

可使用 influx 命令查询数据库中的数据指标:

参考文献

课后习题

  1. 查找 Prometheus 源码中的 scrape_configs 模块,修改采集间隔从默认的 15 秒改为 60 秒,同时禁用远程存储功能,重启服务后对比两种配置的内存占用和网络流量。

  2. 重构 Prometheus 的简体中文翻译,贡献至上游。

  3. 将目前不兼容 FreeBSD 的组件完全适配,并将其制作成 Podman 容器。

最后更新于