Prometheus 架构全面解析

news2024/9/29 15:22:30

在本指南中,我们将详细介绍 Prometheus 架构。

Prometheus 是一个用 Golang 编写的开源监控和告警系统,能够收集和处理来自各种目标的指标。您还可以查询、查看、分析指标,并根据阈值收到警报。

此外,在当今世界,可观测性对每个组织来说都变得至关重要,而 Prometheus 是开源领域的关键可观测性工具之一。

在这篇博客中,我们将了解 Prometheus 的所有关键组件,以及它们如何协同工作以使整个监控系统正常工作。

Prometheus 架构

以下是 Prometheus 架构的高级概述。

Prometheus 架构 - 组件工作流

Prometheus 主要由以下部分组成。

  1. Prometheus 服务器
  2. 服务发现
  3. 时序数据库(TSDB)
  4. 目标
  5. 导出器
  6. 推送网关
  7. 警报管理器
  8. 客户端库
  9. PromQL系列

让我们详细看一下每个组件。

Prometheus 服务器

Prometheus 服务器是基于指标的监控系统的大脑。服务器的主要工作是使用拉取模型从各种目标收集指标。

Target 只不过是服务器、pod、端点等,我们将在下一主题中详细介绍。

使用 Prometheus 从目标收集指标的一般术语称为抓取(pull)。

Prometheus Server 组件

Prometheus 会根据 Prometheus 配置文件中提到的抓取间隔定期抓取指标。

下面是一个示例配置。

global:
  scrape_interval: 15s 
  evaluation_interval: 15s 
  scrape_timeout: 10s 

rule_files:
  - "rules/*.rules"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090'] 
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100'] 

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

时序数据库(TSDB)

prometheus 接收的指标数据会随时间变化(CPU、内存、网络 IO 等)。它称为时间序列数据。因此,Prometheus 使用时间序列数据库 (TSDB) 来存储其所有数据。

默认情况下,Prometheus 将其所有数据以有效的格式(块)存储在本地磁盘中。随着时间的流逝,它会压缩所有旧数据以节省空间。它还具有保留策略来删除旧数据。

Prometheus 还提供远程存储选项。这主要是存储可扩展性、长期存储、备份和灾难恢复等所必需的。

Prometheus 目标

Target 是 Prometheus 抓取指标的来源。目标可以是服务器、服务、Kubernetes Pod、应用程序端点等。

Prometheus 目标

默认情况下,prometheus 在目标路径下查找指标。可以在目标配置中更改默认路径。这意味着,如果您未指定自定义指标路径,Prometheus 会在 /metrics 下查找指标。/metrics

目标配置位于配置文件的scrape_configs下。下面是一个示例配置。Prometheus

scrape_configs:
  
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter1:9100', 'node-exporter2:9100']
 
  - job_name: 'my_custom_job'
    static_configs:
      - targets: ['my_service_address:port']
    metrics_path: '/custom_metrics'

  - job_name: 'blackbox-exporter'
    static_configs:
      - targets: ['blackbox-exporter1:9115', 'blackbox-exporter2:9115']
    metrics_path: /probe

  - job_name: 'snmp-exporter'
    static_configs:
      - targets: ['snmp-exporter1:9116', 'snmp-exporter2:9116']
    metrics_path: /snmp

从目标端点,prometheus 需要特定文本格式的数据。每个指标都必须位于新行上。

通常,这些指标使用在目标上运行的 prometheus 导出器在目标节点上公开。

Prometheus 导出器

导出器就像在目标上运行的代理。它将指标从特定系统转换为 prometheus 理解的格式。

它可以是 CPU、内存等系统指标,也可以是 Java JMX 指标、MySQL 指标等。

Prometheus 导出商

默认情况下,这些转换后的指标由导出器在目标的 /metrics 路径(HTTPS 端点)上公开。

例如,如果要监视服务器的 CPU 和内存,则需要在该服务器上安装节点导出器,并且节点导出器会在 /metrics 上以 prometheus 指标格式公开 CPU 和内存指标。

一旦 Prometheus 提取了指标,它将组合指标名称、标签、值和时间戳,为该数据提供结构

有很多社区导出器可用,但只有其中一些得到了 Prometheus 的正式批准。如果需要更多自定义项,则需要创建自己的导出器。

Prometheus 将导出器分为各个部分,例如数据库、硬件、问题跟踪和持续集成、消息传递系统、存储、公开 Prometheus 指标的软件、其他第三方实用程序等。

您可以从官方文档中查看每个类别的出口商列表。

在 Prometheus 配置文件中,所有导出器的详细信息都将在 .scrape_configs

scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter1:9100', 'node-exporter2:9100']

  - job_name: 'blackbox-exporter'
    static_configs:
      - targets: ['blackbox-exporter1:9115', 'blackbox-exporter2:9115']
    metrics_path: /probe

  - job_name: 'snmp-exporter'
    static_configs:
      - targets: ['snmp-exporter1:9116', 'snmp-exporter2:9116']
    metrics_path: /snmp

Prometheus 服务发现

Prometheus 使用两种方法从目标中抓取指标。

  1. 静态配置:当目标具有静态 IP 或 DNS 端点时,我们可以将这些端点用作目标。
  2. 服务发现:在大多数自动缩放系统和分布式系统(如 Kubernetes)中,目标不会有静态终结点。在这种情况下,将使用 prometheus 服务发现来发现目标端点,并将目标自动添加到 prometheus 配置中。

Prometheus 服务发现

在继续之前,让我展示一个使用 Prometheus 配置文件的 Kubernetes 服务发现块的小示例。kubernetes_sd_configs

scrape_configs:
      - job_name: 'kubernetes-apiservers'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https

Kubernetes 是动态目标的完美示例。在这里,您不能使用静态目标方法,因为 Kubernetes 集群中的目标(Pod)本质上是短暂的,并且很可能是短暂的。

Kubernetes 中还有基于文件的服务发现。它适用于静态目标,但经典静态配置与静态配置之间的主要区别在于,在这种情况下,我们创建单独的 JSON 或 YAML 文件并将目标信息保存在其中file_sd_configs。Prometheus 将读取文件以识别目标。static_configs file_sd_configs

不仅这两个,还有各种服务发现方法可用,例如 consul_sd_configs(prometheus 从 consul 获取目标详细信息)、ec2_sd_configs等。

要了解有关配置详细信息的更多信息,请访问官方文档。

Prometheus 推送网关

默认情况下,Prometheus 使用拉取机制来获取指标。

但是,在某些情况下,需要将指标推送到 prometheus。

让我们举一个在 Kubernetes cronjob 上运行的批处理作业的例子,该作业每天根据某些事件运行 5 分钟。在这种情况下,Prometheus 将无法使用拉取机制正确抓取服务级别指标

因此,为了等待 prometheus 拉取指标,我们需要将指标推送到 prometheus。为了推送指标,prometheus 提供了一个名为 Pushgateway 的解决方案。 它是一种中间网关。

Pushgateway 需要作为独立组件运行。批处理作业可以将指标推送到 pushgateway 端点,Pushgateway 会公开这些指标。然后 prometheus 从 Pushgateway 中抓取这些指标。

Prometheus 推送网关

Pushgateway 将指标数据临时存储在内存存储中。它更像是一个临时缓存。

Pushgateway 配置也将在配置中的部分下进行配置。scrape_configs Prometheus

scrape_configs:
  - job_name: "pushgateway"
        honor_labels: true
        static_configs:
        - targets: [pushgateway.monitoring.svc:9091]

要将指标发送到 Pushgateway,您需要使用 prometheus 客户端库检测应用程序或脚本以公开所需的指标。

Prometheus 客户端库

Prometheus 客户端库是软件库,可用于检测应用程序代码,以 Prometheus 理解的方式公开指标。

如果需要自定义检测或想要创建自己的导出器,可以使用客户端库。

一个非常好的用例是需要将指标推送到 Pushgateway 的批处理作业。批处理作业需要使用客户端库进行检测,以 prometheus 格式公开需求指标。

以下示例公开了名为 batch_job_records_processed_total 的自定义指标。Python Client Library

from prometheus_client import start_http_server, Counter
import time
import random

RECORDS_PROCESSED = Counter('batch_job_records_processed_total', 'Total number of records processed by the batch job')

def process_record():
    time.sleep(random.uniform(0.01, 0.1))
    RECORDS_PROCESSED.inc()

def batch_job():
   
    for _ in range(100):
        process_record()

if __name__ == '__main__':
 
    start_http_server(8000)
    print("Metrics server started on port 8000")

    batch_job()
    print("Batch job completed")

    while True:
        time.sleep(1)

此外,在使用客户端库时,HTTP 服务器prometheus_client端点中公开指标。/metrics

Prometheus 几乎为每种编程语言提供了客户端库,如果您想创建客户端库,也可以这样做。

要了解有关创建指南的更多信息并查看客户端库列表,您可以参考官方文档。

Prometheus 警报管理器

Alertmanager是Prometheus监控系统的关键部分。它的主要工作是根据 Prometheus 警报配置中设置的指标阈值发送警报。

警报由 Prometheus 触发并发送到 Alertmanager。它反过来将警报发送到警报管理器配置中配置的相应通知系统/接收器(电子邮件、松弛等)。

此外,警报管理器还负责以下工作。

  1. 警报重复数据删除:静默重复警报的过程。
  2. 分组:将相关警报分组到其他位置的过程。
  3. 音:静音警报,用于维护或误报。
  4. 路由:根据严重性将警报路由到适当的接收器。
  5. 禁止:当存在中等高严重性警报时停止低严重性警报的过程。

Prometheus 警报管理器


下面是警报规则的示例配置。

groups:
- name: microservices_alerts
  rules:
  - record: http_latency:average_latency_seconds
    expr: sum(http_request_duration_seconds_sum) / sum(http_request_duration_seconds_count)
  - alert: HighLatencyAlert
    expr: http_latency:average_latency_seconds > 0.5
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High latency detected in microservices"
      description: "The average HTTP latency is high ({{ $value }} seconds) in the microservices cluster."

这是 Alertmanager 配置文件的路由配置示例

routes:
- match:
    severity: 'critical'
  receiver: 'pagerduty-notifications'

- match:
    severity: 'warning'
  receiver: 'slack-notifications'

警报管理器支持大多数消息和通知系统,例如 Discord、电子邮件、Slack 等,以将警报作为通知发送给接收者。

PromQL系列

PromQL 是一种灵活的查询语言,可用于从 Prometheus 查询时间序列指标。

我们可以直接从用户界面使用查询,也可以使用命令通过命令行界面进行查询。Prometheuscurl

Prometheus 用户界面

Prometheus UI 上的 PromQL

通过 CLI 查询

curl "http://54.186.154.78:30000/api/v1/query?query=$(echo 'up' | jq -s -R -r @uri)" | jq .

此外,当您将 prometheus 作为数据源添加到 Grafana 时,您可以使用 PromQL 查询和创建 Grafana 仪表板,如下所示。

带有 promQL 的 Grafana 仪表板

结论

本文解释了 Prometheus 架构的主要组件,并将提供 Prometheus 配置的基本概述,您可以使用该配置执行更多操作。

每个组织的要求都不同,Prometheus 在不同环境中的实现也各不相同,例如 VM 和 Kubernetes。如果您了解基础知识和关键配置,则可以在任何平台上轻松实现它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1413941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

21.云原生之GitLab pipline语法实战(CI基础)

云原生专栏大纲 文章目录 gitlab-ci.yml 介绍GitLab中语法检测gitlab-ci.yml 语法job定义作业before_script和after_scriptstages定义阶段tages指定runnerallow_failure运行失败when控制作业运行retry重试timeout超时parallel并行作业only & exceptrulescache 缓存cache:p…

Windows10系统任务栏变小怎么处理

首先,邮件任务栏,点击任务栏设置; 然后,将小任务栏 使能关闭(图中为打开状态); 或者,你也可以取消锁定任务栏,然后在任务栏的边缘,进行上下拉拖动&#xff…

记签名机制

签名过程: 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

Android源码设计模式解析与实战第2版笔记(二)

第二章 应用最广的模式 — 单例模式 单例模式的定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式的使用场景 确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应…

水文模型SWMM与LisFlood耦合(pdf文档、软件见资源)

总技术路线图 INP生成图解 文献:面向服务的Web-SWMM构建研究 regardingINP为ArcGIS Pro项目 1.SWMM模型数据准备与参数设置 1.子汇水区 文件位于:beforeGenerateINP/generateSub.py(一级划分) 问题: 水文分析阈值划…

85 总结一下最近遇到的一些 jar发布 相关的知识

前言 呵呵 最近有一些构建服务, 发布服务的一些需求 我们这里的服务 一般来说是 java application, spring boot application 针对发布, 当然最好是 增量发布, 尽量的减少需要传递给 发布服务器 的资源的大小 比如 我的这个 java application, 可能会存在很多依赖, 常规…

Arduino开发实例-HTU21D温度和湿度传感器使用

HTU21D温度和湿度传感器使用 文章目录 HTU21D温度和湿度传感器使用1、HTU21D介绍2、硬件接线3、代码实现本文将详细介绍如何使用搭载来自瑞士 MEAS 的低成本、易于使用、高精度的HTU21D数字温度和湿度传感器模块。 1、HTU21D介绍 HTU21D传感器模块尺寸小,几乎可以安装在任何东…

MySQL连表操作之一对多

MySQL连表操作之一对多 目录 引入外键 Navicat创建外键使用外键SQL命令创建外键代码删除外键代码增加外键通过外键进行数据操作 正文 回到顶部 引入 当我们在数据库中创建表的时候,有可能某些列中值内容量很大,而且重复。 例子:创建一个…

磁盘挂载过程

硬盘 - 机械 HDD----便宜---这个,企业中更多- 固态 SSD----快SSD采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械硬盘的性能瓶颈, 拥有极高的存储性能,被认为是存储技术发展的新星。 与传统硬盘相比,SSD…

系统架构演变

1.1系统架构的演变 2008年以后,国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了,像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思…

单片机设计_智能蓝牙电子秤(51单片机、HX711AD)

想要更多项目私wo!!! 一、电路设计 智能蓝牙电子称由51单片机、HX711AD称重模块、HC-05蓝牙模块、LCD1602等电路组成硬件部分,然后上传至APP。 二、运行结果 三、部分代码 #include "main.h" #include "HX711.h" #include "uart.h" #include …

【蓝桥杯冲冲冲】[NOIP2000 提高组] 方格取数

蓝桥杯备赛 | 洛谷做题打卡day19 文章目录 蓝桥杯备赛 | 洛谷做题打卡day19[NOIP2000 提高组] 方格取数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 [NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N…

已解决:安卓,怎么优雅接入科大讯飞语音评测功能?

写在前面: 网上关于讯飞接入的博客都很少,按说讯飞都是业界翘楚,不知为何,很少搜索到精品,一搜就是一个要求开会员的博客,我也是醉了。讯飞提供的文档也是不清晰,我是摸着石头过河,…

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON(JavaScript Object Notation)是一种常见的信息交换格式,其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型,本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

Windows Qt C++ VTK 绘制三维曲线

Qt 自带数据可视化从文档上看,只能实现三维曲面。 QwtPlot3D在Qt6.6.0上没编译通过。 QCustomPlot 只能搞二维。 VTK~搞起。抄官网demo。 后续需求: 1、对数轴 2、Y轴逆序 3、Z轴值给色带,类似等高线图的色带 期待各位大佬多多指导。…

如何快速搭建实用的爬虫管理平台

目录 一、前言 二、选择合适的爬虫框架 三、搭建数据库 步骤1 步骤2 步骤3 四、搭建Web服务器 步骤1 步骤2 步骤3 步骤4 五、管理爬虫 六、总结 一、前言 爬虫是互联网数据采集的关键工具,但是随着数据量的增加和需求的多样化,手动运行和管…

超越传统,想修哪里就修哪里,SUPIR如何通过文本提示实现智能图像修复

项目简介 通过参数增加使得模型不仅能够修复图像中的错误或损坏,还能根据文本提示进行智能修复。例如根据描述来改变图像中的特定细节。这样的处理方式提升了图像修复的质量和智能度,使得模型能够更准确、更灵活地恢复和改进图像。 SUPIR的主要功能图像…

详解矩阵的LDU分解

目录 一. 矩阵分解 二. 解方程 三. 例题说明 四. 矩阵的LDU分解 五. 矩阵三角分解的唯一性 一. 矩阵分解 其实我们可以把一个线性系统(Linear System)看成两个三角系统(Triangular Systems),本文章将解释为什么可…

QT实现USB摄像头接入显示

一、UVC协议简介 UVC全称是USB Video Class(USB视频类),是一种标准化的USB视频设备通信协议,它定义了摄像头与主机之间的数据传输协议和格式。 UVC协议的出现,解决了摄像头厂商之间互不兼容,以及摄像头应…