普罗米修斯
李二花 / 2023-03-14
Prometheus 是什么
介绍下 Prometheus 是什么.
Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud创建。自2016年成为Cloud Native Computing Foundation(CNCF)的第二个托管项目(在Kubernetes之后)以来,它已经成为云原生环境中最受欢迎的监控工具之一。
核心特性
- 多维数据模型:Prometheus使用时间序列数据来存储其指标,每个时间序列由唯一的指标名称和一组键值对(称为标签)来标识。
- 灵活的查询语言:Prometheus提供了一种强大的查询语言PromQL(Prometheus Query Language),用于检索和处理时间序列数据。
- 无需分布式存储:数据以时间序列的形式存储在本地磁盘上。尽管Prometheus支持数据快照和部分远程存储功能,但它的设计理念是运行为自治的单一节点或高度分散的节点集合,而不是依赖于大型分布式存储系统。
- 服务发现:Prometheus可以通过服务发现或静态配置来发现目标,自动监控新的服务实例。这对于动态变化的云环境尤其有用。
- 内置警报:Prometheus的Alertmanager组件可以处理由Prometheus服务器发送的警报,包括通过电子邮件、PagerDuty、OpsGenie、Slack等多种方式通知用户。
工作原理
- 数据收集:Prometheus服务器定期从配置的目标(如HTTP端点)拉取指标,这种拉取模式与传统的推送模式相对。
- 数据存储:收集的时间序列数据存储在本地磁盘上,并通过PromQL进行查询。
- 警报:基于配置的规则,Prometheus会评估时间序列数据。当规则条件满足时,触发警报并通过Alertmanager发送通知。
使用场景
- 监控云原生应用:Prometheus非常适合监控在Kubernetes等容器编排平台上运行的微服务架构应用。
- 系统和硬件监控:通过收集操作系统和硬件指标,Prometheus可以帮助你监控服务器的健康状态和性能。
- 服务状态监控:Prometheus可以监控多种类型的服务(如数据库、缓存、Web服务器等),确保这些服务运行正常。
Prometheus因其简单、高效和适应性强的特点,成为了现代云环境中监控和警报的首选工具。
数据拉取
Prometheus 定期从配置的目标拉取数据,这个被拉取的数据在被拉取之前是存在哪里的,这部分数据是怎么由后端服务产生的(如果是机器的指标呢,是由谁产生的)?如果量太大,每次都有延迟怎么办
Prometheus通过拉取(scrape)机制定期从配置的目标(如应用程序、数据库、硬件设备等)收集指标数据。这些指标数据在被Prometheus拉取之前,通常是由目标服务或设备实时生成并暴露在一个HTTP端点上的。接下来,我们来详细探讨这个过程:
数据产生与暴露
后端服务产生的指标:对于后端服务(如Web应用、数据库等),指标通常是由服务内部的监控组件生成的。这些组件会根据服务的运行状态(如请求速率、错误率、响应时间等)生成相应的指标数据。为了让Prometheus能够拉取这些数据,服务需要通过某种方式(通常是一个HTTP端点)暴露这些指标。在许多情况下,这可以通过集成Prometheus客户端库来实现,这些库提供了一种简单的方式来收集和暴露指标。
机器指标的产生:对于硬件或系统级指标(如CPU使用率、内存使用量、磁盘I/O等),这些数据通常是由操作系统或硬件本身生成的。可以使用诸如Node Exporter之类的工具来收集这些指标,并以Prometheus可以理解的格式暴露在HTTP端点上。Node Exporter是一个由Prometheus社区提供的守护程序,它能够收集系统级指标并暴露给Prometheus服务器。
应对大量数据和潜在延迟
当监控的目标数量增加或指标量变大时,Prometheus可能会面临数据拉取延迟的问题。这里有几种策略可以帮助缓解这个问题:
增加拉取间隔:通过增加Prometheus配置中的拉取间隔,可以减少对目标服务的拉取频率,从而减轻服务器的负载。但这可能会牺牲一些时效性。
分片和分层收集:通过将Prometheus服务器分成多个实例,每个实例负责收集部分目标的数据,可以有效分散数据收集的负载。此外,可以使用Prometheus的联邦功能(Federation)来实现分层收集,其中一个Prometheus实例用于收集和聚合多个其他实例的数据。
使用远程存储:虽然Prometheus设计为主要在本地存储数据,但它也支持将数据推送到远程存储系统。这可以帮助处理大量数据,并允许使用更强大的查询引擎和长期数据保留策略。
优化指标和查询:减少不必要的指标收集,优化PromQL查询,以及合理地设计仪表盘,可以减少对Prometheus服务器的查询压力,从而提高整体性能。
通过这些方法,可以在监控大规模系统时,有效地管理数据量和减少潜在的延迟问题。
Node Exporter
以机器指标收集工具 Node Exporter 为例,解释下,是如何提供 HTTP 服务,同时如何组织打点数据,服务内部数据是以什么形式存在,Prometheus 拉取完之后,这部分数据怎么处理,Prometheus 如何找到这些机器(如果我有几十台的话)
Node Exporter 是一个由 Prometheus 社区开发的工具,用于收集 UNIX 和 Linux 系统的硬件和操作系统指标,并以 Prometheus 可理解的格式暴露给 Prometheus 服务器。下面详细解释 Node Exporter 是如何工作的,以及 Prometheus 如何与之交互。
Node Exporter 如何提供 HTTP 服务
- 启动 HTTP 服务器:Node Exporter 本质上是一个守护进程,当启动时,它会在指定的端口(默认是 9100)上启动一个 HTTP 服务器。
- 暴露指标:Node Exporter 会收集系统的各种指标,如 CPU 使用率、内存使用、磁盘 I/O 等,并将这些指标以文本格式暴露在
/metrics
路径下的 HTTP 端点上。这些指标会以 Prometheus 的数据格式(即键值对,其中包含指标名称和一系列标签)进行展示。
数据组织与内部存储
Node Exporter 内部并不存储数据,它实时收集指标并直接暴露给 Prometheus。当 Prometheus 或任何 HTTP 客户端请求 /metrics
端点时,Node Exporter 会实时地收集当前的系统指标并返回。这意味着,Node Exporter 不需要维护内部数据库或任何形式的数据存储。
Prometheus 拉取数据的处理
当 Prometheus 从 Node Exporter 拉取数据时,它会解析 HTTP 响应中的文本格式的指标数据,并将这些数据存储在自己的时间序列数据库中。从那时起,这些数据就可以通过 PromQL 查询、用于警报规则或在 Grafana 等可视化工具中展示。
Prometheus 如何找到这些机器
对于有几十台机器的情况,Prometheus 提供了几种机制来发现和配置监控目标:
静态配置:在 Prometheus 的配置文件中,可以静态列出每台机器的地址和端口。这种方法简单直接,但不适合频繁变化的环境。
服务发现:更灵活的方法是使用 Prometheus 的服务发现功能。Prometheus 支持多种服务发现机制,如 Kubernetes、Consul、AWS EC2、GCE 等,能够动态发现目标机器。例如,在 Kubernetes 环境中,Prometheus 可以自动发现所有运行 Node Exporter 的 Pod,并从它们收集指标。
文件服务发现:对于不支持直接服务发现的环境,Prometheus 还支持文件服务发现,其中目标列表存储在 JSON 或 YAML 文件中。这些文件可以由外部系统动态更新,Prometheus 会定期读取这些文件来获取最新的目标列表。
通过这些方法,Prometheus 能够有效地管理和监控几十台甚至更多的机器,无论这些机器的网络环境如何变化。