江湖夜雨十年灯

普罗米修斯

李二花 / 2023-03-14


Prometheus 是什么

介绍下 Prometheus 是什么.

Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud创建。自2016年成为Cloud Native Computing Foundation(CNCF)的第二个托管项目(在Kubernetes之后)以来,它已经成为云原生环境中最受欢迎的监控工具之一。

核心特性

工作原理

  1. 数据收集:Prometheus服务器定期从配置的目标(如HTTP端点)拉取指标,这种拉取模式与传统的推送模式相对。
  2. 数据存储:收集的时间序列数据存储在本地磁盘上,并通过PromQL进行查询。
  3. 警报:基于配置的规则,Prometheus会评估时间序列数据。当规则条件满足时,触发警报并通过Alertmanager发送通知。

使用场景

Prometheus因其简单、高效和适应性强的特点,成为了现代云环境中监控和警报的首选工具。

数据拉取

Prometheus 定期从配置的目标拉取数据,这个被拉取的数据在被拉取之前是存在哪里的,这部分数据是怎么由后端服务产生的(如果是机器的指标呢,是由谁产生的)?如果量太大,每次都有延迟怎么办

Prometheus通过拉取(scrape)机制定期从配置的目标(如应用程序、数据库、硬件设备等)收集指标数据。这些指标数据在被Prometheus拉取之前,通常是由目标服务或设备实时生成并暴露在一个HTTP端点上的。接下来,我们来详细探讨这个过程:

数据产生与暴露

  1. 后端服务产生的指标:对于后端服务(如Web应用、数据库等),指标通常是由服务内部的监控组件生成的。这些组件会根据服务的运行状态(如请求速率、错误率、响应时间等)生成相应的指标数据。为了让Prometheus能够拉取这些数据,服务需要通过某种方式(通常是一个HTTP端点)暴露这些指标。在许多情况下,这可以通过集成Prometheus客户端库来实现,这些库提供了一种简单的方式来收集和暴露指标。

  2. 机器指标的产生:对于硬件或系统级指标(如CPU使用率、内存使用量、磁盘I/O等),这些数据通常是由操作系统或硬件本身生成的。可以使用诸如Node Exporter之类的工具来收集这些指标,并以Prometheus可以理解的格式暴露在HTTP端点上。Node Exporter是一个由Prometheus社区提供的守护程序,它能够收集系统级指标并暴露给Prometheus服务器。

应对大量数据和潜在延迟

当监控的目标数量增加或指标量变大时,Prometheus可能会面临数据拉取延迟的问题。这里有几种策略可以帮助缓解这个问题:

  1. 增加拉取间隔:通过增加Prometheus配置中的拉取间隔,可以减少对目标服务的拉取频率,从而减轻服务器的负载。但这可能会牺牲一些时效性。

  2. 分片和分层收集:通过将Prometheus服务器分成多个实例,每个实例负责收集部分目标的数据,可以有效分散数据收集的负载。此外,可以使用Prometheus的联邦功能(Federation)来实现分层收集,其中一个Prometheus实例用于收集和聚合多个其他实例的数据。

  3. 使用远程存储:虽然Prometheus设计为主要在本地存储数据,但它也支持将数据推送到远程存储系统。这可以帮助处理大量数据,并允许使用更强大的查询引擎和长期数据保留策略。

  4. 优化指标和查询:减少不必要的指标收集,优化PromQL查询,以及合理地设计仪表盘,可以减少对Prometheus服务器的查询压力,从而提高整体性能。

通过这些方法,可以在监控大规模系统时,有效地管理数据量和减少潜在的延迟问题。

Node Exporter

以机器指标收集工具 Node Exporter 为例,解释下,是如何提供 HTTP 服务,同时如何组织打点数据,服务内部数据是以什么形式存在,Prometheus 拉取完之后,这部分数据怎么处理,Prometheus 如何找到这些机器(如果我有几十台的话)

Node Exporter 是一个由 Prometheus 社区开发的工具,用于收集 UNIX 和 Linux 系统的硬件和操作系统指标,并以 Prometheus 可理解的格式暴露给 Prometheus 服务器。下面详细解释 Node Exporter 是如何工作的,以及 Prometheus 如何与之交互。

Node Exporter 如何提供 HTTP 服务

  1. 启动 HTTP 服务器:Node Exporter 本质上是一个守护进程,当启动时,它会在指定的端口(默认是 9100)上启动一个 HTTP 服务器。
  2. 暴露指标: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 提供了几种机制来发现和配置监控目标:

  1. 静态配置:在 Prometheus 的配置文件中,可以静态列出每台机器的地址和端口。这种方法简单直接,但不适合频繁变化的环境。

  2. 服务发现:更灵活的方法是使用 Prometheus 的服务发现功能。Prometheus 支持多种服务发现机制,如 Kubernetes、Consul、AWS EC2、GCE 等,能够动态发现目标机器。例如,在 Kubernetes 环境中,Prometheus 可以自动发现所有运行 Node Exporter 的 Pod,并从它们收集指标。

  3. 文件服务发现:对于不支持直接服务发现的环境,Prometheus 还支持文件服务发现,其中目标列表存储在 JSON 或 YAML 文件中。这些文件可以由外部系统动态更新,Prometheus 会定期读取这些文件来获取最新的目标列表。

通过这些方法,Prometheus 能够有效地管理和监控几十台甚至更多的机器,无论这些机器的网络环境如何变化。