什么是 Prometheus?

Prometheus 是一个系统监控和告警系统。它由 SoundCloud 于 2012 年开源,是继 Kubernetes 之后第二个加入并毕业于 Cloud Native Computing Foundation (CNCF) 的项目。Prometheus 将所有度量数据存储为时间序列,即度量信息与记录时的时间戳以及可选的称为标签的键值对一起存储。

什么是度量以及为何重要?

通俗地说,度量是一种测量标准。我们要测量什么取决于具体的应用。对于 Web 服务器,可以是请求时间;对于数据库,可以是 CPU 使用率或活跃连接数等。

度量在理解应用为何以某种方式运行时起着重要作用。如果你运行一个 Web 应用,有人过来告诉你应用很慢,你需要一些信息来找出应用出了什么问题。例如,当请求数量很高时,应用可能会变慢。如果你有请求计数度量,你可以找出原因并增加服务器数量来处理高负载。无论何时为应用定义度量,你都必须扮演侦探角色,并问自己这个问题:如果我的应用出现任何问题,哪些信息对我调试很重要?

Prometheus 的基本架构

Prometheus 设置的基本组件包括

  • Prometheus 服务器(抓取和存储度量数据的服务器)。
  • 待抓取的目标,例如公开其度量信息的埋点应用,或公开其他应用度量的导出器。
  • Alertmanager,根据预设规则触发告警。

(注意:除此之外,Prometheus 还有 push_gateway,此处未涵盖)。

Architecture

我们以 Web 服务器为例,假设我们想提取某个度量,比如 Web 服务器处理的 API 调用次数。于是我们使用 Prometheus 客户端库添加了一些埋点代码并公开度量信息。既然我们的 Web 服务器公开了它的度量,我们可以配置 Prometheus 来抓取它。现在 Prometheus 被配置为以特定的时间间隔(例如,每分钟)从监听 xyz IP 地址端口 7500 的 Web 服务器抓取度量。

在 11:00:00,当我将服务器公开供消费时,应用计算请求次数并公开,Prometheus 同时抓取该计数度量并将值存储为 0。

到 11:01:00,处理了一个请求。服务器中的埋点逻辑将计数增加到 1。当 Prometheus 抓取该度量时,计数值现在是 1。

到 11:02:00,又处理了两个请求,请求次数现在是 1+2 = 3。类似地,度量被抓取并存储。

用户可以控制 Prometheus 抓取度量的频率。

时间戳 请求计数 (度量)
11:00:00 0
11:01:00 1
11:02:00 3

(注意:此表格仅用于理解目的的表示。Prometheus 不会按此确切格式存储值)

Prometheus 还有一个 API,允许查询通过抓取存储的度量。这个 API 用于查询度量、在其上创建仪表盘/图表等。PromQL 用于查询这些度量。

基于请求计数度量创建的简单折线图将如下所示

Graph

可以抓取多个有用的度量来理解应用中发生的事情,并基于这些度量创建多个图表。将这些图表组合成一个仪表盘,并使用它来获得应用的总览。

告诉我如何操作

让我们亲自动手并设置 Prometheus。Prometheus 使用 Go 编写,你只需要编译好适用于你操作系统的二进制文件即可。从此处下载对应你操作系统的二进制文件,并将其添加到你的路径中。

Prometheus 会公开自身的度量信息,这些度量信息可以由它自己或其他 Prometheus 服务器消费。

现在我们已经安装了 Prometheus,下一步是运行它。我们所需要的只是二进制文件和一个配置文件。Prometheus 使用 yaml 文件进行配置。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

在上面的配置文件中,我们提到了 scrape_interval,即我们希望 Prometheus 多久抓取一次度量。我们添加了 scrape_configs,其中包含要从中抓取度量的名称和目标。Prometheus 默认监听端口 9090。所以将其添加到目标中。

prometheus --config.file=prometheus.yml

现在 Prometheus 已经启动并运行,每 15 秒抓取自身的度量。Prometheus 提供标准的导出器来导出度量。接下来我们将运行一个 node exporter,它是用于机器度量的导出器,并使用 Prometheus 抓取它。(下载 node metrics exporter。

在终端中运行 node exporter。

./node_exporter

Node exporter

接下来,将 node exporter 添加到 scrape_configs 列表中

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: node_exporter
    static_configs:
      - targets: ["localhost:9100"]

在本教程中,我们讨论了什么是度量以及它们为何重要,Prometheus 的基本架构以及如何运行 Prometheus。

本文档是开源的。请通过提交问题或拉取请求来帮助改进它。