我们都知道,Prometheus可用于监控,但这是一个比较模糊的描述,我们需要对Prometheus 进行更具体的拆解,所以本文会介绍 Promethes 是什么以及它的部署架构。话不多说,让我们正式开始吧。
什么是Prometheus
Prometheus官网对其描述如下:
使用领先的开源监控解决方案监控您的应用程序、系统和服务。检测、收集、存储和查询您的指标,用于告警、仪表板和其他用例。
所以Prometheus不仅是组件应用,更是一套成熟的开源监控解决方案。
通常,一个完整的应用监控体系通常包含以下三个层面:
- 指标监控(Metrics):采集数值型数据(如吞吐量、JVM 内存),用于趋势分析和阈值告警。
- 链路追踪(Tracing):记录请求在微服务间的完整调用路径,精准定位分布式架构中的性能瓶颈。
3. 日志监控(Logging):收集文本型事件日志,用于异常细节排查和上下文还原
而Prometheus聚焦于监控体系的指标监控层面,将指标作为时间序列数据收集并存储,即指标信息与记录的时间戳一起存储,同时也包含了称为标签的可选键值对,用于形成对指标数据的多维管理。
主要特征
Prometheus 主要特征如下:
- 一个多维数据模型,其时间序列数据由指标名称和键/值对标识,多维是通过键值对标签实现;
- PromQL,利用多维特征进行灵活查询的语言;
- 不依赖分布式存储,单个服务器节点是自主的,即每个Prometheus实例不能共享存储;
- 基于HTTP的pull模型收集时间序列数据;
- 支持通过中间网关推送时间序列数据,这通常适用于短job,即还未等到Prometheus拉取,对应目标就可能已经结束运行;
- 可通过服务发现或静态配置发现目标,在k8s中,还可以通过Pod标签匹配等方式自动发现集群中部署的资源;
- 图形和仪表板支持多种模式
Prometheus专为云原生世界而设计,与Kubernetes和其他云和容器管理器集成,以不断发现和监控您的服务。这是继Kubernetes之后从CNCF毕业的第二个项目。
组件
Prometheus 生态系统由多个组件组成,其中许多是可选的:
- main prometheus server:负责抓取和存储时间序列数据;
- client libraries:用于检测应用代码的客户端库,这些客户端库实现了Prometheus的指标类型,选择与编写应用程序的语言相匹配的Prometheus客户端库,可以让您通过应用程序实例上的HTTP端点定义和公开内部指标;
- push gateay:支持短期工作的推送网关;
- 专门用于HAProxy、StatsD、Graphite等服务的专用导出器;
- alertmanager:处理告警。
大多数Prometheus组件都是用Go书写的,使它们易于作为静态二进制文件构建和部署。
架构
下图来自于官网,说明了普罗米修斯的架构及其一些生态系统组件:
架构
整个Prometheus架构可以分为以下四部分:
- 目标(拉模型):指标数据的来源,可以是server通过服务发现的k8s服务,也可以是在配置中指定的静态目标;
- Prometheus Server:拉取指标,并存储在本地的时序数据库中,也可以对这些数据运行规则,以从现有数据中聚合和记录新的时间序列,或生成警报。同时通过HTTP服务对数据可视化组件暴露这些指标数据;
- alertmanager:用于接收 server推送的告警,并转发至不同邮件等用户接口通道;
- 数据可视化:通过PromQL从Server暴露的HTTP服务中查询指标数据,进行可视化。
概念
Prometheus基本上将所有数据存储为时间序列:属于同一指标和同一组标记维度的带时间戳的值流。除了存储的时间序列外,Prometheus还可以根据查询结果生成临时导出的时间序列。
指标名称和标签
每个时间序列都由其指标名称和称为标签的可选键值对作为唯一标识。
job和instance
在Prometheus术语中,可以抓取的端点称为instance,通常对应于单个进程。具有相同目的的实例集合,例如为了可扩展性或可靠性而复制的进程,称为job。
配置
Prometheus 的配置文件是 prometheus.yml 文件,文件的主要内容如下: