李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
工具
正文
Prometheus简介
Leefs
2025-06-08 PM
2178℃
0条
[TOC] ### 一、概述 Prometheus 是由 Cloud Native Computing Foundation(CNCF) 孵化的开源监控与告警系统,专注于实时数据采集、存储和查询,广泛应用于云原生、容器化(如 Kubernetes)和微服务架构中。它以灵活的数据模型、强大的查询语言和生态扩展性著称,是现代 DevOps 和 SRE(站点可靠性工程)的核心工具之一。 + Prometheus 基本原理是通过 **HTTP** 协议**周期性**抓取被监控组件的状态,这样做的好处是任意组件只要提供 HTTP 接口就可以接入监控系统,不需要任何 SDK 或者其他的集成过程。这样做非常适合虚拟化环境比如 VM 或者 Docker 。 + Prometheus 应该是为数不多的适合 Docker、Mesos、Kubernetes 环境的监控系统之一。 + 每个被监控的主机都可以通过专用的 exporter 程序提供输出监控数据的接口,它会在目标处收集监控数据,并暴露出一个HTTP接口供Prometheus server查询,Prometheus通过基于HTTP的pull的方式来周期性的采集数据。 + 如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送到Alertmanager完成告警的汇总和分发 + 当被监控的目标有主动推送数据的需求时,可以以Pushgateway组件进行接收并临时存储数据,然后等待Prometheus Server完成数据的采集。 + 任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让Prometheus通过服务发现的机制进行动态管理。 Prometheus 能够直接把API Server作为服务发现系统使用,进而动态发现和监控集群中的所有可被监控的对象。 > 官网:https://prometheus.io/ > GitHub地址:https://github.com/prometheus/prometheus #### 1.1 Prometheus功能 Prometheus为系统监控提供了强大的工具和功能,支持多维数据分析、动态警报、自动服务发现等特性。 + **多维数据模型** Prometheus使用多维数据模型来表示时间序列数据,每个时间序列都由一个唯一的标识符,包括:指标名称和一组标签标识。由度量名称和键值对标识的时间序列数据。 > **时间序列数据**:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;服务器指标数据、应用程序性能监控数据、网络数据等都是时序数据 + **数据采集和存储** Prometheus支持从各种数据源中采集指标数据,包括应用程序、操作系统、容器、服务发现和云平台等。 + **指标类型** Prometheus支持多种指标类型,包括计数器(Counter)、仪表(Gauge)、直方图(Histogram)和摘要(Summary)等数据。 + **数据查询** Prometheus提供了PromQL(Prometheus Query Language)查询语言,允许用户灵活地查询和聚合数据。 + **警报和通知** Prometheus可以设置警报规则,当指标数据达到预设的阈值时,可以触发警报通知。 + **云原生支持** Prometheus在云原生环境中得到广泛应用,与Kubernetes等容器编排平台集成紧密,能够自动发现和监控容器化应用。 #### 1.2 Prometheus优势 + **易于管理** - Prometheus核心部分只有一个单独的二进制文件,不存在任何的第三方依赖(数据库,缓存等等); - 唯一需要的就是本地磁盘,因此不会有潜在级联故障的风险。 + **强大的查询语言 PromQL** - Prometheus 内置一个强大的数据查询语言 PromQL,通过 PromQL 可以实现对监控数据的查询、聚合。 - 同时 PromQL 也被应用于数据可视化(如 Grafana)以及告警中。 + **高效** 对于监控系统而言,大量的监控任务必然导致有大量的数据产生。而 Prometheus 可以高效的处理这些数据。 + **可扩展** - Prometheus 支持联邦集群,可以让多个 Prometheus 实例产生一个逻辑集群; - 当单实例 Prometheus 处理的任务量过大时,通过使用功能分区(sharding)+ 联邦集群(federation)可以对其进行扩展。 + **易于集成** 目前官网提供了多种语言的客户端 SDK,基于这些 SDK 可以快速让应用程序纳入到监控系统中,同时还支持与其它的监控系统集成。 + **可视化** - Prometheus Server 自带一个 UI,通过这个 UI 可以方便对数据进行查询和图形化展示; - 同时还可以对接 Grafana 可视化工具展示精美监控指标。 ### 二、Prometheus 组成与架构 **Prometheus 架构图**:  #### 2.1 组件介绍 + **Prometheus server** Prometheus server 是 Prometheus服务器,用于抓取和存储时间序列数据。Prometheus server 由三个部分组成:Retrival,Storage,PromQL - Retrival:负责在活跃的target主机上抓取监控指标数据 - Storage:存储,主要是把采集到的数据存储到磁盘中。默认为15天(可修改) - PromQL:是Prometheus提供的查询语言模块。 + **Service Discovery(服务发现)** 负责自动发现需要监控的目标。Prometheus 支持多种服务发现机制,包括: - DNS:通过 DNS 记录来发现目标服务的地址。 - Kubernetes:与 Kubernetes 集成,自动发现 Kubernetes 集群内的 Pod、Service 等资源作为监控目标。 - Consul:借助 Consul 服务发现工具来查找目标服务。 - Custom integration(自定义集成):允许用户根据自身需求实现自定义的服务发现逻辑。 Service Discovery 模块找到目标后,将信息提供给 Prometheus Server,以便 Prometheus Server 能去相应目标拉取指标数据。 + **Jobs / Exporters(作业 / 数据采集器)** Exporters(数据采集器)是 Prometheus 与各种监控目标之间的桥梁。它们负责将不同系统和服务(如操作系统、数据库、中间件等)的指标数据转换为 Prometheus 可识别的格式。 常见的 Exporters 有: - node_exporter:用于采集服务器节点(如 CPU、内存、磁盘、网络等)的基础指标。 - mysql_exporter:专门采集 MySQL 数据库的相关指标,如连接数、查询耗时等。 - redis_exporter:采集 Redis 缓存数据库的指标,像内存使用、请求频率等。 Jobs(作业):可以理解为一组相关的监控任务,每个 Job 可以包含一个或多个 Exporter 作为监控目标。Prometheus Server 会按照配置从这些 Jobs/Exporters 拉取指标数据。 + **Pushgateway** 对于一些短生命周期的任务(Short - lived jobs),由于其存在时间短,Prometheus Server 可能来不及拉取指标数据它们就结束了。Pushgateway 允许这些短生命周期任务主动推送指标数据到 Pushgateway,然后 Prometheus Server 再从 Pushgateway 拉取指标,确保数据不丢失。 + **Alertmanager** Alertmanager 是一个独立的告警模块,从Prometheus server端接收到**告警通知**后,会进行去重、分组,并路由到相应的接收方,发出报警。 Alertmanager 负责处理 Prometheus Server 推送过来的告警信息。它可以对告警进行分组、抑制(避免重复告警)、沉默(在特定时间段内屏蔽告警)等操作,然后将处理后的告警通过多种渠道发送通知,如 PagerDuty、Email 等。 + **可视化组件** - Web UI:Prometheus 自带的 Web 界面,用户可以在上面执行 PromQL 查询,查看简单的图表和监控数据。 - Grafana:一款功能强大的开源可视化工具,支持将 Prometheus 作为数据源。用户可以通过 Grafana 定制丰富、美观的仪表盘,更直观地展示监控数据,便于分析和排查问题。 - API clients:其他通过 Prometheus API 来获取数据并进行可视化或进一步处理的客户端工具。 #### 2.2 Prometheus工作流程 1. Prometheus以prometheus Server 为核心,用于收集和存储时间序列数据。Prometheus Server从监控目标中通过pull方式拉取指标数据,或通过pushgateway 把采集的数据拉取到Prometheus server中。 2. Prometheus server 把采集到的监控指标数据通过 TSDB存储到本地HDD/ssD中。 3. Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的报警发送到Alertmanager。 4. Alertmanager 通过配置报警接收方,发送报警到邮件、钉钉或者企业微信等。 5. Prometheus 自带的Web UI 界面提供 PromQL 查询语言,可查询监控数据。 6. Grafana 可接入Prometheus 数据源,把监控数据以图形化形式展示出。 > ps:告警数据采集、告警信息提取、告警通知 1. 首先,需要采集监控数据,pro会周期性的pull或被push指标数据,数据采集的方式主要包括exporters、instrumentation、pushgateway 3种方式,前两者为pull方式获取,pushgateway借助于push方式推送给prometheus。 2. 根据prometheus配置文件中(K8S-configmap的配置种),获取被监控端的数据之后,保存在TSDB中,我们可以借助Grafana或者告警平台来展示数据,grafana的展示是通过PromQL来获取数据。 3. prometheus通过rule配置来借助于PromQL来定义布尔值表达式,产生告警信息 4. 一旦出现告警,prometheus产生告警信息,发送给altermanager,altermanager根据自定义的告警路由,来进行告警通知,对接第三方平台,例如告警平台、邮件、钉钉。 ### 三、Prometheus存储机制 #### 3.1 内部存储机制 > Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概花了200多G(引用官方PPT)。 Prometheus内部主要分为三大块: - **Retrieval**是负责定时去暴露的目标页面上去抓取采样指标数据 - **Storage**是负责将采样数据写磁盘 - **PromQL**是Prometheus提供的查询语言模块。  #### 3.2 数据模型 > Prometheus 存储的所有数据都是**时间序列数据**(**Time Serie Data**,简称时序数据)。时序数据是具有时间戳的数据流,该数据流属于某个度量指标(Metric)和该度量指标下的多个标签(Label)。  > 每个Metric name代表了一类的指标,他们可以携带不同的Labels,每个Metric name + Label组合成代表了一条时间序列的数据。 > > 在Prometheus的世界里面,所有的数值都是64bit的。每条时间序列里面记录的其实就是**64bit timestamp(时间戳) + 64bit value(采样值)**。 **参数说明** - **Metric name(指标名称)**:该名字应该具有语义,一般用于表示 metric 的功能。 例如:http_requests_total, 表示 http 请求的总数。其中,metric 名字由 ASCII 字符,数字,下划线,以及冒号组成,且必须满足正则表达式 ` [a-zA-Z_:][a-zA-Z0-9_:]* `。 - **Lables(标签)**:使同一个时间序列有了不同维度的识别。 例如 http_requests_total{method=“Get”} 表示所有 http 请求中的 Get 请求。当 method=“post” 时,则为新的一个 metric。标签中的键由 ASCII 字符,数字,以及下划线组成,且必须满足正则表达式 ` [a-zA-Z_:][a-zA-Z0-9_:]* `。 - **timestamp(时间戳)**:数据点的时间,表示数据记录的时间。 - **Sample Value(采样值)**:实际的时间序列,每个序列包括一个 float64 的值和一个毫秒级的时间戳。 例如图上的数据: ``` http_requests_total{status="200",method="GET"} http_requests_total{status="404",method="GET"} ``` 根据上面的分析,时间序列的存储似乎可以设计成key-value存储的方式(基于BigTable)。  ### 四、Prometheus 的局限性 + Prometheus是一款指际监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据; + Prometheus认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对 大量的历史数据进行存储;若需要存储长期的历史数据,建议基于远端存储机制将数据保存于InfluxDB或openTsDB等系统中; + Prometheus的集群机制成熟度不高,可基于Thanos(和灭霸是一个单词)实现Prometheus集群的高可用及联邦集群 *附参考文章链接* *https://blog.csdn.net/G_D0120/article/details/138861635* *https://www.cnblogs.com/huangSir-devops/p/18907356*
标签:
Prometheus
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/2990.html
上一篇
cAdvisor工作原理
下一篇
Prometheus Exporter介绍
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
35
其它
25
GO
48
NLP
8
标签云
ajax
设计模式
Java编程思想
二叉树
Sentinel
递归
Docker
字符串
Yarn
MyBatis
CentOS
Elasticsearch
Quartz
排序
SpringCloudAlibaba
容器深入研究
机器学习
Spark SQL
VUE
Eclipse
MyBatis-Plus
Flume
数学
数据结构
Git
散列
FastDFS
工具
GET和POST
Elastisearch
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞