Prometheus:一款开源监控系统的简介
Prometheus 是一款开源的、基于指标的监控解决方案。它通过向各指标端点发送 HTTP 请求,从服务和主机收集性能数据。采集到的数据会被存储于时间序列数据库中,以便进行分析和生成告警。
为何需要监控?
- 当问题发生时,它能及时发出告警,甚至在问题发生之前就预警,以便相关人员及时处理。
- 它为分析、故障排除和解决问题提供了深入的洞察力。
- 它能帮助我们观察系统随时间变化的趋势,比如在任何时刻的活跃会话数量,从而为决策和容量规划提供数据支持。
监控通常与各种事件相关联,包括接收 HTTP 请求、发送响应、从磁盘读取以及用户登录等。监控系统通常包含分析、日志记录、跟踪、指标、告警和可视化等功能。
黑盒监控与白盒监控
监控可以分为两大类:
黑盒监控
黑盒监控是指从外部观察应用程序或主机,在应用或主机层面进行的监控。这种方式的监控可能会存在一定的局限性。
白盒监控
白盒监控则深入到服务的内部,收集内部组件的状态和性能数据。这种监控方式能够提供更详尽的数据。
四大黄金信号
根据谷歌的建议,如果要对面向用户的系统进行监控,应该重点关注以下四个指标,它们被称为“四大黄金信号”:
#1. 延迟
指服务请求所花费的时间,无论请求成功还是失败。重要的是要同时跟踪成功和失败的请求。
#2. 流量
衡量对系统的需求量。对于 Web 服务,这通常指每秒钟的 HTTP 请求数量。
#3. 错误
指请求失败的比率。
#4. 饱和度
指服务的使用程度。延迟的增加通常是饱和度的一个重要指标。许多系统在达到 100% 利用率之前性能就会显著下降。
Prometheus 指标类型
Prometheus 指标有四种主要类型:
#1. 计数器
计数器的值只会增加,不会减少,但可以重置为零。如果抓取失败,则仅意味着数据点丢失,下次抓取时,累积的增量将会被提供。例如:
- 收到的 HTTP 请求总数
- 异常数量
#2. 仪表
仪表是指在任意时间点的值快照,其值既可以增加也可以减少。如果数据获取失败,则会丢失一个样本,下次提取可能会显示不同的值,例如磁盘空间、内存使用情况等。
#3. 直方图
直方图会对观测值进行采样,并将其计数到可配置的桶中。它常用于请求持续时间或响应大小等数据的监控。例如,可以测量特定 HTTP 请求的请求持续时间。直方图会设置一组桶,比如 1 毫秒、10 毫秒和 25 毫秒。Prometheus 不会存储每个请求的持续时间,而是存储落入特定桶中的请求频率。
#4. 摘要
摘要类似于直方图,通常用于请求持续时间或响应大小的采样。它提供观察的总次数和所有观察值的总和,从而可以计算观察值的平均值。例如,在一分钟内,有 3 个请求分别耗时 2、3 和 4 秒。总和为 9,计数为 3。平均延迟为 3 秒。
Prometheus 生态系统的组件
Prometheus 服务器
Prometheus 服务器负责收集指标、存储数据并使其可用于查询,并根据收集的指标发送警报。
抓取(Scrape)
Prometheus 是一个基于拉取的系统。为了获取指标,Prometheus 会发送一个名为“scrape”的 HTTP 请求。它会根据其配置向目标发送抓取请求。
每个目标(静态定义的或动态发现的)都会以固定的间隔(抓取间隔)进行抓取。每次抓取都会读取 /metrics HTTP 端点以获取客户端指标的当前状态,并将这些值存储在 Prometheus 时间序列数据库中。
你还可以探索更多用于监控解决方案的时间序列数据库。
客户端库
要监控服务,需要在代码中添加检测。Prometheus 为各种流行的语言和运行时提供了客户端库。通过使用这些库,只需添加几行代码,你的代码就可以开始发出指标,这被称为直接检测。这些库允许你定义内部指标并通过 HTTP 端点公开它们。当 Prometheus 抓取指标 HTTP 端点时,客户端库会将指标发送到服务器。
Prometheus 为 Go、Java、Python 和 Ruby 提供了官方客户端库。此外,Prometheus 还有一个开放的生态系统,社区还为 C、PHP、Node.js、C#/.NET 以及许多其他语言构建了客户端库。
Exporter(导出器)
许多应用程序以非 Prometheus 格式公开指标。对于这些应用程序,以及那些你没有所有权或无法访问其代码的应用程序,你无法直接添加检测。例如,MySQL、Kafka、JMX、HAProxy 和 NGINX 服务器。在这些情况下,可以使用 导出器。
导出器是一种与要从中获取指标的应用程序一起部署的工具。导出器充当应用程序和 Prometheus 之间的代理。它接收来自 Prometheus 服务器的请求,从应用程序的访问日志、错误日志中收集数据,将其转换为正确的格式,最后返回给 Prometheus 服务器。
一些常见的导出器包括:
- Windows Exporter – 用于 Windows 服务器指标
- Node Exporter – 用于 Linux 服务器指标
- Blackbox Exporter – 用于 DNS 和网站性能指标
- JMX Exporter – 用于基于 Java 的应用程序指标
一旦应用程序被检测,或者导出器就位,你需要告诉 Prometheus 它们的位置。这可以通过静态配置来完成。在动态环境中,这是不可能实现的,因此需要使用服务发现。
告警
Prometheus 的告警由两部分组成:
告警规则会将告警发送到 Alertmanager。
然后,Alertmanager 会管理这些告警。它使用多种开箱即用的集成来发送通知,例如电子邮件、Slack、Hipchat 和 PagerDuty。Alertmanager 还可以执行静默或聚合操作来减少通知的数量。
这里有一个使用 Prometheus 和 Dashboard 监控 Linux 服务器的指南。
使用仪表板进行可视化
Prometheus 提供了许多 API,可以使用 PromQL 查询生成原始数据,用于可视化。
虽然 Prometheus 包含一个可用于临时查询的表达式浏览器,但更好的工具是 Grafana。Grafana 与 Prometheus 完全集成,可以生成各种各样的仪表板。
你需要将 Prometheus 配置为 Grafana 的数据源。
可以通过以下方式添加仪表板:
- 导入社区构建的仪表板
- 创建自己的仪表板
- 使用预定义的仪表板
以下是一个预定义的节点导出器仪表板示例:
Grafana 还包含一个 worldPing 模块,可以监控全球站点和 DNS 性能指标。
总结
Prometheus 对系统要求较低。它运行非常简单,因为它是一个带有配置文件的二进制文件。它可以处理数千个目标并每秒摄取数百万个样本。Prometheus 的设计目标是跟踪系统的整体健康状况和行为。
Grafana 是用于指标可视化的最佳工具,它与 Prometheus 集成良好。