一、prometheus介绍
- 监控
- 2022-07-20
- 20热度
- 0评论
介绍
概述
什么是 Prometheus?
Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud开发。自2012年启动以来,许多公司和组织已经采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并澄清项目的治理结构,Prometheus在2016年加入了云原生基金会,成为继Kubernetes之后的第二个托管项目。
有关Prometheus的详细介绍,请参见媒体部分的参考资料链接。
特性
Prometheus 的主要特性是:
- 多维数据模型,使用指标名称和键/值对标识的时间序列数据
PromQL
,灵活的查询语言来利用这个维度- 不依赖分布式存储;单个服务器节点是自治的
- 时间序列收集通过HTTP上的拉模型进行
- 通过一个中介网关支持
pushing time series
- 目标是通过服务发现或静态配置发现的
- 支持多种模式的图形和仪表板
组件
普罗米修斯生态系统由多个组件组成,其中很多都是可选的:
- 主要的组件 Prometheus Server 用来抓取和存储时间序列数据
- 用来检测应用程序代码的 client libraries
- 支持短时工作的 push gateway
- 专用于像 HAProxy,StatsD,Graphite,等服务的 exporter
- 处理预警的 alertmanager
- 其他各种支持的工具
大部分 Prometheus 组件都是用 Go 语言写的,是他们易于构建,并部署为二进制文件。
架构
这张图展示了 Prometheus 的架构和一些生态系统内的组件:
普罗米修斯从“工具化”的工作中获取指标,直接或通过中介推送网关来获取短期工作。它在本地存储所有采集的样本,并在这些数据上运行规则,从现有数据中聚合和记录新的时间序列,或者生成警报。Grafana或其他API消费者可以用来可视化收集的数据。
什么时候适用
Prometheus 可以很好地记录任何纯数字时间序列。它既适用于以机器为中心的监视,也适用于高度动态的面向服务的体系结构的监视。在微服务的世界中,它对多维数据收集和查询的支持是一种特别的优势。
Prometheus 是为可靠性而设计的,它可以让您在停机期间快速诊断问题。每个 Prometheus 服务器都是独立的,不依赖于网络存储或其他远程服务。当基础设施的其他部分损坏时,您可以依赖它,并且不需要设置大量的基础设施来使用它。
不适用于
普罗米修斯值的可靠性。您始终可以查看有关系统的可用统计信息,即使在故障情况下也是如此。如果您需要100%的准确性,比如对每个请求的账单,Prometheus不是一个好的选择,因为收集的数据可能不够详细和完整。在这种情况下,您最好使用其他系统来收集和分析用于计费的数据,使用Prometheus来完成余下的监控工作。
第一步
迈出Prometheus第一步
欢迎来到 Prometheus!Prometheus是一个监控平台,它通过抓取被监控目标上的 metrics HTTP端点来收集这些指标。本指南将向您展示如何使用 Prometheus 安装、配置和监控我们的第一个资源。你将下载、安装并运行 Prometheus 。您还将下载并安装一个 exporter,该工具用于在主机和服务上公开时间序列数据。我们的第一个导出工具是Prometheus本身,它提供了关于内存使用、垃圾收集等的各种主机级指标。
下载
根据你的操作平台下载最新版本的 Prometheus,然后解压:
tar xvfz prometheus-*.tar.gz
cd prometheus-*
Prometheus服务器是一个名为Prometheus(或者微软Windows上的Prometheus .exe)的单一二进制文件。我们可以通过传递——help标志来运行二进制文件并查看有关其选项的帮助。
./prometheus --help
usage: prometheus []
The Prometheus monitoring server. . .
在启动Prometheus之前,需要进行相关配置。
配置 Prometheus
Prometheus 配置文件是 YML 格式的文件。下载的Prometheus附带了一个名为 prometheus.yml
的示例配置文件。
我们删除了示例文件中的大部分注释,以使其更加简洁(注释是以#前缀的行)。
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
示例配置文件中有三个配置块:global、rule_files和scrape_configs。
global块:控制 Prometheus Server 的全局配置。我们现在有两种选择。
第一个是 scrape_interval
,它控制着普罗米修斯采集目标的频率。您可以针对个别目标重写此操作。在默认情况下,全局设置是每15采集一次。 evaluation_interval
选项控制普罗米修斯对规则进行评估的频率。普罗米修斯使用规则创建新的时间序列和生成警报。
rule_files块:指定了我们希望普罗米修斯服务器加载的任何规则的位置。现在我们没有规则。
scrape_configs块:控制普罗米修斯监视的资源。由于Prometheus也将自己的数据作为HTTP端点公开,因此它可以获取并监控自己的运行状况。在默认配置中,有一个名为prometheus的作业,它会抓取由 Prometheus Server 公开的时间序列数据。该作业在端口9090
上包含一个静态配置的目标localhost
。Prometheus希望在/metrics路径上的目标上提供度量。这个默认作业是通过URL抓取:http://localhost:9090/metrics.
返回的时间序列数据将详细说明 Prometheus Server 的状态和性能。
启动 Prometheus
要使用新创建的配置文件启动Prometheus,请切换到包含Prometheus二进制文件的目录,并运行:
./prometheus --config.file=prometheus.yml
Prometheus就启动了。您还应该能够通过http://localhost:9090
浏览到关于自身的状态页面。给它大约30秒的时间从它自己的HTTP度量端点收集关于它自己的数据。
您还可以通过导航到它自己的度量端点http://localhost:9090/metrics
来验证Prometheus是否在提供关于它自己的度量指标.
使用表达式浏览器
让我们看看普罗米修斯收集的一些关于自己的数据。要使用Prometheus的内置表达式浏览器,请导航到http://localhost:9090/graph并在“graph”选项卡中选择“Console”视图。
正如您可以从http://localhost:9090/metrics
收集到的那样,Prometheus导出的关于自身的一个度量称为promhttp_metric_handler_requests_total
(普罗米修斯服务器所服务的/metrics请求的总数)。继续并将其输入到表达式控制台中:
promhttp_metric_handler_requests_total
这将返回许多不同的时间序列(以及为每个时间序列记录的最新值),都使用指标名称promhttp_metric_handler_requests_total,但是使用不同的标签。这些标签指定不同的请求状态。
如果我们只对导致HTTP代码200的请求感兴趣,我们可以使用这个查询来检索该信息:
promhttp_metric_handler_requests_total{code="200"}
要计算返回的时间序列的数量,可以写:
count(promhttp_metric_handler_requests_total)
有关表达式语言的更多信息,请参见表达式语言文档。
使用图形界面
要绘制图形表达式,请导航到http://localhost:9090/graph并使用“graph”选项卡。
例如,输入以下表达式,可以绘制自刮Prometheus中返回状态码200的每秒HTTP请求率图:
rate(promhttp_metric_handler_requests_total{code="200"}[1m])
您可以试验图形范围参数和其他设置。
监控其他目标
单单从普罗米修斯那里收集数据并不能很好地体现普罗米修斯的能力。为了更好地了解Prometheus公司可以做些什么,我们建议查阅有关其他出口商的文件。使用节点导出指南来监视Linux或macOS主机指标是一个很好的起点。
总结
在本指南中,您安装了Prometheus,配置了Prometheus实例来监视资源,并学习了一些在Prometheus' expression browser中使用时间序列数据的基础知识。要继续了解普罗米修斯,请查看概述,了解接下来要探索的内容。
与其他工具比较
Prometheus vs. Graphite
适用范围
Graphite 专注于成为一个具有查询语言和图形特征的被动时间序列数据库。任何其他关注点都由外部组件处理。
Prometheus是一个完整的监控和趋势分析系统,它包括内置的、基于时间序列数据的主动抓取、存储、查询、绘图和警报。它知道世界应该是什么样子的(应该存在哪些端点,什么时间序列模式意味着麻烦,等等),并积极尝试寻找故障。
数据模型
Graphite 存储以时间序列命名的数字样本,就像 Prometheus 一样。然而,Prometheus的元数据模型更为丰富: Graphite 度量名称由点分隔的组件组成,这些组件隐式编码维度,而Prometheus将维度显式编码为键-值对,称为标签,附加到度量名称上。这样就可以通过查询语言方便地根据这些标签进行过滤、分组和匹配。
此外,特别是在将Graphite与StatsD结合使用时,通常只存储所有被监视实例上的聚合数据,而不是将实例保存为一个维度并能够深入到单个有问题的实例中。
例如,将HTTP请求数量存储到API服务器的响应代码为500,方法POST到/tracks端点通常会像这样在石墨/StatsD中编码:
stats.api-server.tracks.post.500 -> 93
在Prometheus中,相同的数据可以这样编码(假设有三个api-服务器实例):
api_server_http_requests_total{method="POST",handler="/tracks",status="500",instance="
"} -> 34
api_server_http_requests_total{method="POST",handler="/tracks",status="500",instance=""} -> 28
api_server_http_requests_total{method="POST",handler="/tracks",status="500",instance=""} -> 31
存储
Graphite以Whisper格式在本地磁盘上存储时间序列数据,这是一种rrd风格的数据库,它期望样本定期到达。每个时间序列存储在一个单独的文件中,经过一定的时间后,新的样本会覆盖旧的样本。
普罗米修斯还为每个时间序列创建一个本地文件,但允许在发生刮蹭或规则评估时以任意间隔存储样本。由于新样本只是简单地追加,旧数据可以保持任意的长度。普罗米修斯还适用于许多短暂、频繁变化的时间序列。
总结
Prometheus提供了更丰富的数据模型和查询语言,而且更容易运行和集成到环境中。如果您想要一个集群解决方案,可以长期保存历史数据,Graphite 可能是一个更好的选择。
Prometheus vs. InfluxDB
InfluxDB是一个开放源码时间序列数据库,具有可伸缩和集群的商业选项。在Prometheus开发开始将近一年后,InfluxDB项目才发布,所以当时我们无法将其作为替代方案。尽管如此,Prometheus 和 InfluxDB 之间仍然存在着显著的差异,而且这两个系统都针对略有不同的用例。
范围
为了进行公平的比较,我们还必须将 Kapacitor 和 InfluxDB 考虑在一起,因为在组合中它们解决了与Prometheus和Alertmanager相同的问题空间。
与 Graphite 的情况相同的范围差异也适用于这里的流感数据库本身。此外,InfluxDB提供了连续查询,这相当于Prometheus记录规则。
Kapacitor 的范围是 Prometheus 的记录规则、警报规则和Alertmanager的通知功能的组合。Prometheus提供了一种更强大的查询语言,用于绘图和报警。Prometheus Alertmanager还提供了分组、重复数据删除和沉默功能。
数据模型/存储
与Prometheus一样,InfluxDB数据模型使用键-值对作为标签,这些标签称为标签。此外,InfluxDB还有第二级标签,称为字段,在使用中受到更多限制。流感数据库支持最高达纳秒分辨率的时间戳,以及float64、int64、bool和string数据类型。相比之下,Prometheus支持float64数据类型,但对字符串和毫秒分辨率时间戳的支持有限。
InfluxDB 使用日志结构的合并树的一种变体进行存储,并使用按时间分片的提前写日志。这比Prometheus的每个时间序列只添加文件的方法更适合于事件日志记录。
Logs and Metrics and Graphs, Oh My!描述事件日志记录和度量记录之间的区别。
架构
Prometheus 服务器彼此独立运行,只依赖本地存储来实现其核心功能:抓取、规则处理和警报。InfluxDB 的开源版本与此类似。
商业上的InfluxDB产品在设计上是一个分布式存储集群,存储和查询由许多节点同时处理。
这意味着商业的 InfluxDB 将更容易水平伸缩,但也意味着您必须从一开始就管理分布式存储系统的复杂性。Prometheus运行起来更简单,但在某些时候,您需要明确地按照可伸缩性边界(如产品、服务、数据中心或类似方面)对服务器进行分片。独立服务器(可以并行冗余运行)还可以提供更好的可靠性和故障隔离。
Kapacitor的开源版本没有内置分布式/冗余的规则、提醒或通知选项。Kapacitor的开源版本可以通过用户手动分片来缩放,就像Prometheus本身一样。内流提供企业Kapacitor,它支持一个HA/冗余警报系统。
相比之下,Prometheus和Alertmanager则通过运行Prometheus的冗余副本并使用Alertmanager的高可用性模式,提供了完全开源的冗余选项。
总结
这两个系统之间有许多相似之处。两者都有标签(在InfluxDB中称为标签)来有效地支持多维度量。两者使用基本相同的数据压缩算法。两者都有广泛的集成,包括彼此之间的集成。它们都有钩子,允许您进一步扩展它们,例如在统计工具中分析数据或执行自动操作。
在哪些方面,InfluxDB 更好:
- 如果你正在做事件记录。
- 商业选项为 InfluxDB 提供了集群,它也更适合长期数据存储。
- 最终在副本之间实现一致的数据视图。
在哪些方面,Prometheus 更好:
- 如果你主要是做度量。
- 更强大的查询语言、警报和通知功能。
- 用于绘图和警报的更高可用性和正常运行时间。
InfluxDB 是由一家商业公司按照开放核心模型维护的,它提供了一些高级功能,如闭源集群、托管和支持。Prometheus是一个完全开源的独立项目,由许多公司和个人维护,其中一些还提供商业服务和支持。
Prometheus vs. OpenTSDB
OpenTSDB是一个基于Hadoop和HBase的分布式时间序列数据库。
范围
同样的范围差异,在 Graphite 的情况下适用于这里。
数据模型
OpenTSDB的数据模型与Prometheus的数据模型几乎相同:时间序列由一组任意的键值对标识(OpenTSDB标签是Prometheus标签)。指标的所有数据都存储在一起,从而限制了指标的基数。不过有一些小区别:Prometheus允许在标签值中使用任意字符,而OpenTSDB的限制更严格。OpenTSDB也缺乏完整的查询语言,只允许通过其API进行简单的聚合和数学运算。
存储
OpenTSDB的存储是在Hadoop和HBase之上实现的。这意味着可以很容易地横向扩展OpenTSDB,但您必须从一开始就接受运行Hadoop/HBase集群的总体复杂性。
Prometheus最初运行起来更简单,但一旦超过单个节点的容量,就需要显式分片。
总结
Prometheus提供了更丰富的查询语言,可以处理更高的基数指标,并构成完整监视系统的一部分。如果您已经在运行Hadoop,并且认为长期存储优于这些优点,那么OpenTSDB是一个不错的选择。
Prometheus vs. Nagios
Nagios是一种监视系统,起源于20世纪90年代的NetSaint。
范围
Nagios主要是基于脚本的退出代码发出警报。这些被称为“checks”。对单个警报进行沉默,但不进行分组、路由或重复数据删除。
有各种各样的插件。例如,管道传输的几个千字节的perfData插件被允许返回到一个时间序列数据库,比如Graphite,或者使用NRPE在远程机器上运行检查。
数据模型
Nagios是基于主机的。每个主机可以有一个或多个服务,每个服务可以执行一次检查。
没有标签或查询语言的概念。
存储
除了当前检查状态之外,Nagios本身没有存储空间。有一些插件可以存储数据,比如 visualisation。
架构
Nagios服务器是独立的。所有的配置检查是通过文件。
总结
Nagios适用于小型和/或静态系统的基本监视,在这些系统中,黑盒探测是足够的。
如果你想做白盒监控,或者有一个动态的或者基于云的环境,那么Prometheus是一个不错的选择。
Prometheus vs. Sensu
范围
与Nagios相同的一般范围差异也适用于这里。
还有一个客户端套接字允许将特别的检查结果推送到Sensu中。
数据模型
Sensu具有与Nagios相同的粗略数据模型。
存储
Sensu使用Redis来持久化监控数据,包括Sensu客户端注册表、检查结果、检查执行历史和当前事件数据。
架构
Sensu有很多组成部分。它使用RabbitMQ作为传输,Redis为当前状态,和一个单独的服务器处理和API访问。
一个Sensu部署的所有组件(RabbitMQ, Redis,和Sensu服务器/API)可以集群的高可用性和冗余配置。
总结
如果您有一个希望按现状扩展的现有Nagios设置,或者希望利用Sensu的自动注册特性,那么Sensu是一个不错的选择。
如果你想做白盒监控,或者有一个非常动态或基于云的环境,那么Prometheus是一个不错的选择。
常见问题解答
常见问题
路线图
以下只是我们计划在不久的将来实现的一些主要特性的一部分。要获得计划的特性和当前工作的更完整概述,请参阅各种存储库的问题跟踪器,例如,
Prometheus server。
服务器端度量元数据支持
此时,度量类型和其他元数据仅在客户端库中使用并以公开格式显示,但在Prometheus服务器中不持久或使用。我们计划在将来使用这些元数据。第一步是在Prometheus的内存中聚合这些数据,并通过一个实验API端点提供。
采用OpenMetrics
OpenMetrics工作组正在为度量公开开发一个新标准。我们计划在我们的客户端库和Prometheus本身中支持这种格式。
回填时间序列
回填将允许批量装载过去的数据。这将允许追溯性规则评估,以及从其他监控系统传输旧数据。
HTTP服务端点中的TLS和身份验证
Prometheus、Alertmanager和官方出口商中的HTTP服务端点还没有内置TLS和身份验证支持。添加这种支持将使人们更容易安全地部署Prometheus组件,而不需要通过反向代理向外部添加这些特性。
支持生态系统
Prometheus拥有一系列客户图书馆和出口商。总是有更多的语言可以被支持,或者有更多的系统可以用来导出度量标准。我们将支持生态系统创造和扩大这些。
视频
在互联网上有一个版块收集了所有与普罗米修斯有关的资源。
下面选择的资源对于开始使用普罗米修斯特别有用。令人敬畏的普罗米修斯包含了一个更全面的社区维护的资源列表。
相关术语
Alert
警报是普罗米修斯的警报规则的结果,它是主动开火的。警报从Prometheus发送到Alertmanager。
Alertmanager
Alertmanager接收警报,将它们聚合成组,删除重复项,应用静音、节流,然后向电子邮件、Pagerduty、Slack等发送通知。
Alertmanager接收警报,将它们聚合成组,删除重复项,应用静音、节流,然后向电子邮件、Pagerduty、Slack等发送通知。
Bridge
Bridge是一个组件,它从客户机库中提取样本,并将它们暴露给非prometheus监视系统。例如,Python、Go和Java客户机可以将指标导出到Graphite。
Client library
Client library 是用某种语言(例如Go、Java、Python、Ruby)编写的库,它可以方便地直接插入代码,编写自定义收集器从其他系统提取指标,并将指标公开给Prometheus。
Collector
收集器是表示一组指标的导出器的一部分。如果它是直接工具的一部分,那么它可能是单个指标,如果它是从另一个系统提取指标,那么它可能是多个指标。
Direct instrumentation
直接插装是使用客户端库作为程序源代码的一部分内联添加的插装。
Endpoint
可以被获取的指标来源,通常对应于单个流程。
Exporter
Exporter程序是与您希望从中获取指标的应用程序一起运行的二进制程序。出口商公开普罗米修斯度量标准,通常是将以非普罗米修斯格式公开的度量标准转换为普罗米修斯支持的格式。
Instance
实例是作业中唯一标识目标的标签。
Job
具有相同目的的目标集合称为作业,例如监视为了可伸缩性或可靠性而复制的一组类似进程。
Notification
通知代表一组一个或多个警报,并由Alertmanager发送到电子邮件、Pagerduty、Slack等。
Promdash
Promdash是Prometheus公司的一个本地仪表盘生成器。它已经被废弃,被Grafana所取代。
Prometheus
Prometheus 通常是指普罗米修斯系统的核心二进制程序。它也可以指普罗米修斯监测系统作为一个整体。
PromQL
PromQL是Prometheus查询语言。它支持广泛的操作,包括聚合、切片和切块、预测和连接。
Pushgateway
Pushgateway持久保存来自批处理作业的最新指标推入。这使得普罗米修斯可以在他们被终止后获取他们的度量标准。
Remote Read
远程读取是Prometheus的一个特性,它允许作为查询的一部分从其他系统(比如长期存储)透明地读取时间序列。
Remote Read Adapter
并不是所有系统都直接支持远程读取。远程读取适配器位于普罗米修斯和另一个系统之间,在它们之间转换时间序列请求和响应。
Remote Read Endpoint
远程读取端点是Prometheus在进行远程读取时所使用的。
Remote Write
远程写是Prometheus的一项特性,它允许将摄入的样本快速发送到其他系统,比如长期存储系统。
Remote Write Adapter
并不是所有系统都直接支持远程写。远程写适配器位于Prometheus和另一个系统之间,它将远程写中的示例转换为其他系统可以理解的格式。
Remote Write Endpoint
远程写端点是Prometheus在执行远程写操作时所使用的。
Sample
样本是时间序列中某一时刻的单一值。
在Prometheus中,每个示例由一个 float64 值和一个毫秒精度的时间戳组成。
Silence
Alertmanager中的静默可以防止带有与静默匹配的标签的警报被包含在通知中。
Target
目标是用来抓取的物体的定义。例如,应用什么标签、连接所需的任何身份验证,或定义抓取如何发生的其他信息。