带你读《Prometheus监控实战》之三:安装和启动Prometheus

点击查看第一章
点击查看第二章
第3章

安装和启动Prometheus

在上一章,我们对Prometheus进行了概述。而本章我们将介绍在各种平台上安装Prometheus的过程。本章不提供全部支持平台的完整列表的安装说明,而是提供有代表性的示例以帮助你入门。接下来我们将在以下平台安装Prometheus:

  • Linux
  • Microsoft Windows
  • Mac OS X

上述安装Prometheus的过程也可以扩展到其他支持平台。
本书中提到的示例都是基于Linux平台,这些示例也适用于Mac OS X,但对于Microsoft Windows可能需要进行调整。
我们还将探索Prometheus的基础配置,并收集第一个目标,即Prometheus服务器自身。然后通过已收集的指标来了解内置表达式浏览器的基础知识,并学习如何使用Prometheus查询语言PromQL从指标中发现有趣的信息。后面的章节会在这个基础Prometheus服务器上进行扩展。

3.1 安装Prometheus

Prometheus提供了独立的二进制文件。它的下载页面提供了包含特定平台二进制文件的tar包。目前Prometheus支持以下平台:

  • Linux:32位、64位和ARM。
  • Max OS X:32位和64位。
  • FreeBSD:32位、64位和ARM。
  • OpenBSD:32位、64位和ARM。
  • NetBSD:32位、64位和ARM。
  • Microsoft Windows:32位和64位。
  • DragonFly:64位。

可以从Prometheus的GitHub页面下载较旧的版本。
在撰写本书时,Prometheus的版本为2.3.2。
首先,我们将在接下来的几小节中指导你手动安装Prometheus。在本节的最后,我们还将提供一些用于安装Prometheus的配置管理模块的链接。如果要将Prometheus部署到生产环境或进行扩展,则应该始终选择配置管理工具作为安装方法。

3.1.1 在Linux上安装Prometheus

首先将用来安装Prometheus的二进制文件下载到64位Linux主机上。我们可以使用wget或curl从下载站点获取文件。

代码清单3-1 下载Prometheus的tar包

带你读《Prometheus监控实战》之三:安装和启动Prometheus
接下来从tar包中将prometheus二进制文件解压缩并放在合适的目录下,然后安装promtool,这是Prometheus配置的代码校验工具。

代码清单3-2 解压Prometheus二进制文件

带你读《Prometheus监控实战》之三:安装和启动Prometheus
安装完成后,可以使用--version参数来检查版本,以验证Prometheus是否安装成功。

代码清单3-3 检查Linux上Prometheus的版本

带你读《Prometheus监控实战》之三:安装和启动Prometheus
接下来你可以继续了解如何在其他平台上安装Prometheus,或者跳过后面的安装章节直接查看配置相关的内容。

3.1.2 在Windows上安装Prometheus

要在Windows操作系统上安装Prometheus,我们需要下载可执行文件prometheus.exe并将其放在合适的目录下。首先可以通过PowerShell为可执行文件创建一个目录。

代码清单3-4 创建目录

带你读《Prometheus监控实战》之三:安装和启动Prometheus
然后从GitHub上下载Prometheus。

代码清单3-5 下载Prometheus Windows安装包

带你读《Prometheus监控实战》之三:安装和启动Prometheus
使用7-Zip等工具解压缩可执行文件,并将解压后的内容放入C:prometheus目录。最后,将该可执行文件的完整目录添加到Windows环境变量path中,这将允许Windows找到该可执行文件,可以通过以下命令来实现。

代码清单3-6 设置环境变量

带你读《Prometheus监控实战》之三:安装和启动Prometheus
现在你应该能够运行prometheus.exe可执行文件。

代码清单3-7 检查Windows上Prometheus的版本

带你读《Prometheus监控实战》之三:安装和启动Prometheus
如果你想将Prometheus服务器作为服务来运行,则可以通过类似NSSM(Non-Sucking Service Manager)的工具来实现。

3.1.3 在Windows上安装Prometheus的其他方式

你还可以使用包管理器在Windows上安装Prometheus。比如Chocolatey就可以提供Prometheus安装包。首先按照相关步骤安装Chocolatey,然后使用choco二进制文件安装Prometheus。

代码清单3-8 通过Chocolatey安装Prometheus

带你读《Prometheus监控实战》之三:安装和启动Prometheus

3.1.4 在Mac OS X上安装Prometheus

除了可以通过Mac OS X的二进制文件外,也可以通过Homebrew来安装Prometheus。如果你使用Homebrew配置Mac OS X主机,则可以通过brew命令安装Prometheus。

代码清单3-9 通过Homebrew安装Prometheus

带你读《Prometheus监控实战》之三:安装和启动Prometheus
Homebrew会将prometheus二进制文件安装到/usr/local/bin目录下。我们可以通过prometheus --version命令测试是否安装成功。
代码清单3-10 检查Mac OS X上Prometheus的版本
带你读《Prometheus监控实战》之三:安装和启动Prometheus

3.1.5 通过监控套件安装Prometheus

除了单独安装Prometheus外,也有一些已经集成好的监控套件,它们将Prometheus与其他工具整合在一起,例如Grafana控制台。

  • 使用Docker Compose安装Prometheus、Node Exporter和Grafana。
  • 使用Docker Compose单节点安装Prometheus、Alertmanager、Node Exporter和Grafana。
  • 使用Docker Swarm安装Prometheus。

3.1.6 通过配置管理工具安装Prometheus

还有一些可用于安装Prometheus的配置管理资源。以下是各种配置管理工具的示例:

  • Puppet的Prometheus模块
  • Chef的Prometheus cookbook

Ansible的Prometheus role
SaltStack的Prometheus formula
本书推荐使用配置管理工具来安装和管理Prometheus!

3.1.7 通过Kubernetes安装Prometheus

最后,还可以通过Kubernetes来部署Prometheus。事实上,部署Prometheus的最佳方式在很大程度上取决于你的实际环境。你可以使用配置文件来构建自己的部署并将Prometheus打包成服务,或者使用CoreOS的Prometheus Operator。

3.2 配置Prometheus

现在我们已经安装了Prometheus,接下来看看它的配置。Prometheus通过YAML文件来配置。当运行prometheus二进制文件(或Windows上的prometheus.exe可执行文件)时,我们会指定一个配置文件。Prometheus自带默认的配置文件prometheus.yml,该文件位于刚刚解压缩的目录中。我们来看看它的内容。
YAML配置非常复杂,可能让人很痛苦,建议你通过YAML Lint在线方式或者在命令行使用yamllint来验证YAML配置文件。
代码清单3-11 Prometheus默认配置文件
带你读《Prometheus监控实战》之三:安装和启动Prometheus
简单起见,我们已从配置文件中删除了一些注释。该默认文件可能会发生变化,因此你的默认配置文件可能与上面的内容不完全相同。
我们的默认配置文件中定义了4个YAML块:global、alerting、rule_files和scrape_configs。
接下来我们看一下每个块的内容。

3.2.1 global

配置的第一部分是global,它包含了控制Prometheus服务器行为的全局配置。
第一个参数scrape_interval用来指定应用程序或服务抓取数据的时间间隔(在示例中是15秒)。这个值是时间序列的颗粒度,即该序列中每个数据点所覆盖的时间段。
在从特定位置收集指标时,有可能会覆盖这个全局抓取间隔。强烈建议不要这么做!可以在服务器上保持一个全局抓取间隔,这会确保你的所有时间序列具有相同的颗粒度,并且可以组合在一起计算。但是,当你使用了不同的数据间隔来收集数据时,则可能产生不合逻辑的结果。
仅设置抓取间隔为全局参数以保持颗粒度一致!
参数evaluation_interval用来指定Prometheus评估规则的频率。目前主要有两种规则:记录规则(recording rule)和警报规则(alerting rule)。
记录规则:允许预先计算使用频繁且开销大的表达式,并将结果保存为一个新的时间序列数据。
警报规则:允许定义警报条件。
根据这个参数,Prometheus将每隔15秒(重新)评估这些规则。我们也将在后续章节中了解有关规则的更多内容。
你可以参考Prometheus文档以查看完整的配置说明。

3.2.2 alerting

配置的第二部分是alerting,它用来设置Prometheus的警报。正如我们在上一章中提到的,警报是由名为Alertmanager的独立工具进行管理的。Alertmanager是一个可以集群化的独立警报管理工具。

代码清单3-12 Alertmanager配置

带你读《Prometheus监控实战》之三:安装和启动Prometheus
在默认配置中,alerting部分包含服务器的警报配置,其中alertmanagers块会列出Prometheus服务器使用的每个Alertmanager,static_configs块表示我们要手动指定在targets数组中配置的Alertmanager。
Prometheus还支持Alertmanager的服务发现功能。例如,你可以通过查询外部源(如Consul服务器)来返回可用的Alertmanager列表,而不是单独指定每个Alertmanager。我们也将在第5章和第6章中介绍更多相关内容。
在上述例子中,我们没有定义Alertmanager,而是有一行注释alertmanager: 9093。我们可以暂时不用处理这个注释,因为目前并不需要特别定义一个Alertmanager来运行Prometheus。在第6章,我们将添加一个Alertmanager并对其进行配置。
我们将分别在第6章和第7章中看到有关警报和警报集群的更多信息。

3.2.3 rule_files

配置的第三部分是rule_files,它用来指定包含记录规则或警报规则的文件列表。我们将在下一章对它们进行一些配置。

3.2.4 scrape_configs

配置的最后一部分是scrape_configs,用来指定Prometheus抓取的所有目标。
正如我们在上一章所发现的,Prometheus将它抓取的指标的数据源称为端点。为了抓取这些端点的数据,Prometheus定义了一个目标,这个目标里包含的信息是抓取数据所必需的,比如用到的标签、建立连接所需的身份验证,或者其他定义数据抓取的信息。若干目标构成的组称为作业,作业里每个目标都有一个名为实例(instance)的标签,用来唯一标识这个目标。

代码清单3-13 Prometheus的默认抓取配置

带你读《Prometheus监控实战》之三:安装和启动Prometheus
默认配置中定义了一个作业prometheus,它的static_configs参数部分列出了抓取的目标,这些特定的目标被单独列出来,而不是通过自动服务发现。你也可以将静态配置理解为手动或人工服务发现。
我们将在第5章研究自动发现目标的方法。
作业prometheus只有一个监控目标:Prometheus服务器自身。它从本地的9090端口抓取数据并返回服务器的健康指标。Prometheus假设抓取的指标将返回到/metrics路径下,因此它会被追加到目标中然后抓取地址http://localhost:9090/metrics
你可以覆盖默认的指标路径。

3.3 启动Prometheus

接下来让我们启动服务器,看看会发生什么。首先,将配置文件移动到更合适的位置。
代码清单3-14 移动配置文件

这里,我们创建了一个目录/etc/prometheus,并将配置文件放在这个目录下。

代码清单3-15 启动Prometheus服务器

带你读《Prometheus监控实战》之三:安装和启动Prometheus
接下来运行二进制文件并在命令行中通过参数--config.file指定配置文件。现在Prometheus服务器正在运行并抓取prometheus作业的实例,然后返回结果。
如果发生异常,则可以使用promtool来验证配置文件,这是Prometheus附带的一个代码校验工具。

代码清单3-16 使用promtool验证配置文件

带你读《Prometheus监控实战》之三:安装和启动Prometheus
通过Docker运行Prometheus
在Docker中运行Prometheus也很容易。可以在Docker Hub上找到Prometheus团队提供的Docker镜像,然后通过docker命令来运行它。

代码清单3-17 通过Docker运行Prometheus

带你读《Prometheus监控实战》之三:安装和启动Prometheus
这将在本地运行一个Prometheus服务器,它的9090端口会绑定到Docker容器内的9090端口,然后可以通过浏览本地的这个端口来查看服务器的情况。服务器一般使用默认配置启动,所以你需要提供自定义配置和数据存储。这里可以采取多种方法来实现,例如,可以将配置文件挂载到容器中。
代码清单3-18 将配置文件挂载到Docker容器中
带你读《Prometheus监控实战》之三:安装和启动Prometheus
这会把/tmp/prometheus.yml作为Prometheus服务器的配置文件挂载到容器中。
你还可以在Prometheus文档中找到关于通过Docker运行Prometheus的更多信息。

3.4 第一个指标

现在服务器已经开始运行了,我们来看看正在抓取的端点和一些原始的Prometheus指标。为此,我们可以浏览http://localhost:9090/metrics并查看返回的内容。
在所有示例中,我们假设你正在查看的是运行Prometheus的服务器,即本地服务器。
代码清单3-19 原始指标示例
带你读《Prometheus监控实战》之三:安装和启动Prometheus

带你读《Prometheus监控实战》之三:安装和启动Prometheus

代码清单3-20 原始指标

带你读《Prometheus监控实战》之三:安装和启动Prometheus
这个指标的名称是go_gc_duration_seconds,里面有一个标签quantile="0.5",表示这衡量的是第50百分位数,后面的数字是这个指标的值。

3.5 表达式浏览器

由于上述查看指标的方式对用户不是很友好,所以我们可以使用Prometheus的内置表达式浏览器来查看(如图3-1所示),其可通过在Prometheus服务器上浏览http://localhost:9090/graph来获得。
你还可以通过Prometheus表达式浏览器和Web界面看到其他有用的信息,例如目标的状态以及Prometheus服务器的规则和配置。建议将界面上所有的菜单项都查看一遍。
带你读《Prometheus监控实战》之三:安装和启动Prometheus

图3-1 Prometheus表达式浏览器

首先让我们使用表达式浏览器找出go_gc_duration_seconds指标。你可以打开可用指标的下拉列表来查找,也可以在查询框中键入指标名称,然后单击Execute按钮得到具有这个名称的所有指标(如图3-2所示)。
带你读《Prometheus监控实战》之三:安装和启动Prometheus

图3-2 指标列表

在这个指标列表中,每个指标都使用一个或多个标签来进行描述,我们需要找到表示第50百分位数的标签。
代码清单3-21 Go garbage collection第50百分位数
带你读《Prometheus监控实战》之三:安装和启动Prometheus
我们可以看到两个新标签已添加到指标上,这是Prometheus在抓取过程中自动完成的。第一个新标签instance是我们抓取指标的目标,第二个标签job则是抓取指标的作业名称。标签为指标提供了不同的维度,允许我们查询或使用单个/多个指标。例如,针对多个目标的Go garbage collection指标。
我们将在下一章和后面的章节中看到更多关于标签的内容。
Prometheus在服务器中内置了一种名为PromQL的高度灵活的表达式语言,允许查询和聚合指标。我们可以在浏览器界面顶部的查询输入框中使用此查询语言(如图3-3所示)。
在上图中,我们查询了所有带有quantile="0.5"标签的指标,并返回了可能的86个结果。这个数据集是PromQL查询语言中的表达式可以返回的四种数据类型之一。此类型称为即时向量(instant vector):一组包含每个时间序列的单个样本的时间序列集合,其中所有时间序列都共享相同的时间戳。还可以通过查询指标的名称和标签来返回它的即时向量。接下来让我们查询指标go_gc_duration_seconds,但这次是第75百分位。在输入框中输入以下信息:
带你读《Prometheus监控实战》之三:安装和启动Prometheus

图3-3 查询百分位数

然后单击Execute进行搜索,它应该返回与查询内容匹配的即时向量。我们也可以使用正则表达式来过滤或匹配标签。如下所示:
带你读《Prometheus监控实战》之三:安装和启动Prometheus
这将返回所有百分位数不等于0.75的指标的即时向量。
如果你习惯使用像Graphite这样的工具,那么查询标签的方式将类似于解析由以点分隔的字符串命名的指标。你可以参考这篇博客,里面对Graphite、InfluxDB和Prometheus查询方式进行了分析和对比。
接下来看看另一个指标prometheus_build_info,它包含有关Prometheus服务器的构建信息。将prometheus_build_info放入表达式浏览器的查询框中,然后单击Execute返回指标的相关信息,你会看到一个这样的条目:

代码清单3-22 prometheus_build_info指标

带你读《Prometheus监控实战》之三:安装和启动Prometheus
可以看到这个指标使用了大量的标签,并且指标的值为1。这是通过指标将信息传递到Prometheus服务器的常见模式,它使用恒定值为1的指标,并且添加了你可能希望通过标签附加的相关信息。我们将在本书后面看到更多这种信息类型的指标。

3.6 聚合时间序列

在上述查询界面中还可以进行指标的复杂聚合。我们选择另一个指标promhttp_metric_handler_requests_total来看一下,它是Prometheus服务器中抓取数据所产生的HTTP请求总数。现在通过指定其名称并单击Execute来查询(如图3-4所示)。
带你读《Prometheus监控实战》之三:安装和启动Prometheus

图3-4 查询HTTP请求总数

查询结果会返回一个HTTP请求指标列表,但我们真正想要的是每个作业的HTTP请求总数,为此,我们需要通过查询语句来创建新的指标。Prometheus的查询语言PromQL具有大量的表达式和函数,可以帮助我们实现这一目标。
让我们从按作业汇总HTTP请求开始。将以下内容添加到查询框中,然后单击Execute。

这个查询使用了promhttp_metric_handler_requests_total指标的sum()运算符,它对所有请求进行累加,但没有按作业分类。为此,我们需要根据特定的标签维度进行聚合。PromQL有一个子句by,它允许按特定维度聚合。将以下内容添加到查询框中,然后单击Execute。
带你读《Prometheus监控实战》之三:安装和启动Prometheus
PromQL还有一个子句without,可以不按特定维度进行聚合。
你应该会看到输出如图3-5所示。
带你读《Prometheus监控实战》之三:安装和启动Prometheus

图3-5 按作业计算HTTP请求总数

现在单击Graph选项,将这个查询结果显示为一张图。
Robust Perception上有一篇关于常见查询模式的博文。
根据上述结果,新的输出仍然不是很有用。让我们把它转换成一个速率,将查询更新为:
带你读《Prometheus监控实战》之三:安装和启动Prometheus
这里我们添加了一个新函数rate(),并将它插入到sum()函数中。
带你读《Prometheus监控实战》之三:安装和启动Prometheus
rate()函数用来计算一定范围内时间序列的每秒平均增长率,只能与计数器一起使用。它非常“聪明”且可以自适应,例如在资源重启时会重置计数器,并且通过推断来处理时间序列中的间隔,例如一次漏掉的数据抓取。rate()函数最适合用于增长较慢的计数器或用于警报的场景。
还有一个irate()函数可以计算增长较快的计时器的瞬时增长率。
这里我们计算5分钟范围向量的速率。范围向量(range vector)是第二个PromQL数据类型,它包含一组时间序列,其中每个时间序列都包含一系列数据点。范围向量允许我们显示该时间段的时间序列,持续时间被包含在中括号[ ]中,内容是一个整数值后跟一个单位缩写,其中单位缩写:

  • s表示秒
  • m表示分钟
  • h表示小时
  • d表示天
  • w表示周

所以[5m]表示的时间范围是5分钟。
另外两个PromQL数据类型是Scalars(数字浮点值)和Strings(字符串值,且暂时未使用)。
接下来执行该查询并查看时间序列的结果范围向量(如图3-6所示)。
带你读《Prometheus监控实战》之三:安装和启动Prometheus

图3-6 速率查询

太棒了!根据上述结果,我们现在有了一个对跟踪或绘图非常有用的新指标。
如果在构建PromQL查询方面需要帮助,则可以使用查询编辑器Promeditor,它可以在Prometheus本地运行。
现在我们已经了解了Prometheus操作的基础知识,接下来看看运行Prometheus服务器的一些要求。

3.7 容量规划

Prometheus的性能很难估计,因为它在很大程度上取决于你的配置、所收集的时间序列的数量以及服务器上规则的复杂性。一般容量规划关注两个问题:内存和磁盘。
我们将在第7章讨论Prometheus扩展的概念。

3.7.1 内存

Prometheus在内存中做了很多工作。每个收集的时间序列、查询和记录规则都会消耗进程内存。关于Prometheus的容量规划的参考数据并不多(特别是自2.0版本发布以来),但一个有用的、粗略的经验法则是将每秒采集的样本数乘以样本的大小。我们可以使用以下查询语句来查看样本收集率。
带你读《Prometheus监控实战》之三:安装和启动Prometheus
这将显示你在最后一分钟添加到数据库的每秒样本率。如果想知道收集的指标数量,则可以使用以下语句:
带你读《Prometheus监控实战》之三:安装和启动Prometheus
这里使用sum聚合来计算所有匹配的指标的计数和,使用=~运算符和.+的正则表达式来匹配所有指标。
每个样本的大小通常为1到2个字节,让我们谨慎一点,按照2个字节计算。假设在12小时内每秒收集100 000个样本,那我们可以像下面这样计算内存使用情况:
带你读《Prometheus监控实战》之三:安装和启动Prometheus
结果大概是8.64GB的内存。
你还需要考虑在查询和记录规则方面的内存使用情况。这个不太好计算,并且依赖于许多其他变量,建议根据内存使用情况灵活调整。你可以通过检查process_resident_memory_bytes指标来查看Prometheus进程的内存使用情况。

3.7.2 磁盘

磁盘使用量受存储的时间序列数量和这些时间序列的保留时间限制。默认情况下,指标会在本地时间序列数据库中存储15天。数据库的位置和保留时间由命令行选项控制。

  • --storage.tsdb.path选项:它的默认数据目录位于运行Prometheus的目录中,用于控制时间序列数据库位置。
  • --storage.tsdb.retention选项:控制时间序列的保留期。默认值为15d,代表15天。
    建议采用SSD作为时间序列数据库的磁盘。

对于每秒10万个样本的示例,我们知道按时间序列收集的每个样本在磁盘上占用大约1到2个字节。假设每个样本有2个字节,那么保留15天的时间序列意味着需要大约259 GB的磁盘。
有关Prometheus磁盘使用情况的更多信息,请参见存储文档。

3.8 小结

在本章中,我们安装了Prometheus,并配置了基本的操作。同时还抓取了我们的第一个目标—Prometheus服务器本身。我们利用数据抓取收集的指标,了解到内置表达式浏览器的工作原理,包括使用Prometheus的查询语言PromQL派生出新指标以及指标的图形化展示。
在下一章,我们将使用Prometheus来收集一些主机指标,包括从Docker容器中收集指标。我们还会看到更多关于数据抓取、作业和标签的内容,并将详细介绍记录规则。

上一篇:带你读《Prometheus监控实战》之二:Prometheus简介


下一篇:HTML5 Web 存储|学习笔记