特点
Prometheus是一个开源的完整监控解决方案,其对传统监控系统的测试和告警模型进行了彻底的颠覆,形成了基于中央化的规则计算、统一分析和告警的心模型。其具有以下几个特点
易于管理
- Prometheus的核心文件只有一个二进制文件,并没有过多的第三方库的引入。需要的是一个本地磁盘,因此不会有级联故障的出现
- 消息队列采用pull模型,可以将监控系统部署在任何地方(本地电脑、开发环境、测试环境)等
- 对于一些特殊的复杂情景,Prometheus可以使用service discovery服务发现的能力来实现动态管理监控目标
监控服务的内部运行状态
Prometheus监控鼓励用户监控服务的内部运行状态,这点不同于nagios监控。也是基于Prometheus丰富的client库,使得用户可以轻松在应用中获取Prometheus的支持,以此获取对服务和应用真实的内部运行状态。
强大的数据模型
Prometheus采集到的监控数据都会以 指标(metric)的形式保存在时间序列数据库(TSDB)中的,在其后会跟着用于描述该样本特征的标签。如下所示:
http_request_status{code='200',content_path='/api/path',environment='produme
nt'} => [value1@timestamp1,value2@timestamp2...]
http_request_status{code='200',content_path='/api/path2',environment='produm
ent'} => [value1@timestamp1,value2@timestamp2...]
##
##http_request_status:指标名称
##{code='200',content_path='/api/path',environment='produment'}:表示纬度的标签,基于这些 Labels 我们可以方便地对监控数据进行聚合,过滤,裁剪。
##[value1@timestamp1,value2@timestamp2...]:按照时间顺序存储的样本值
每一条时间序列由指标名称(Metrics Name)以及一组标签(Labels)唯一标识组成。
每条时间序列按照时间的先后顺序存储一系列的样本值。
强大的promSQL查询语言
Prometheus拥有一个强大的内置查询语言promSQL,通过它可以实现对监控数据的查询、聚合。同时,promSQL也被应用于监控数据的可视化(grafana)以及告警中。
通过 PromQL 可以轻松回答类似于以下问题:
- 在过去一段时间中 95%应用延迟时间的分布范围?
- 预测在 4 小时后,磁盘空间占用大致会是什么情况?
- CPU 占用率前 5 位的服务有哪些?(过滤)
高效
对于监控系统而言,大量的监控任务必然会产生大量的监控数据,而Prometheus可以高效的处理这些数据,在单个Prometheus Server实例中,它能够做到:
- 数以百万的监控指标
- 每秒处理数十万的数据点
可扩展
可以在每个数据中心、每个团队运行独立的Prometheus Server。Prometheus Server对于联邦集群的支持,使得多个Prometheus实例产生一个逻辑集群。
当单实例Prometheus Server处理的任务量过大时,通过功能分区(garading)和联邦分区(fedreration)可以对其进行扩展。
易于集成
使用 Prometheus 可以快速搭建监控服务,并且可以非常方便地在应用程序中进行集成。目前支持:Java,JMX,Python,Go,Ruby,.Net,Node.js 等等语言的客户端SDK,基于这些 SDK 可以快速让应用程序纳Prometheus 的监控当中,或者开发自己的监控数据收集程序。
同时这些客户端收集的监控数据,不仅仅支持 Prometheus,还能支Graphite 这些其他的监控工具。
可视化
- Prometheus Server 中自带的 Prometheus UI,可以方便地直接对数据进行查询,并且支持直接以图形化的形式展示数据。同时 Prometheus 还提供了一个独立的基于Ruby On Rails 的 Dashboard 解决方案 Promdash。
- 最新的 Grafana 可视化工具也已经提供了完整的 Prometheus 支持,基于 Grafana 可以创建更加精美的监控图标。
- 基于 Prometheus 提供的 API 还可以实现自己的监控可视化 UI。
开放性
对于 Prometheus 来说,使用 Prometheus 的 client library 的输出格式不止支持Prometheus 的格式化数据,也可以支持输出其它监控系统的格式化数据,比如 Graphite。
因此甚至可以在不使用 Prometheus 的情况下,采用 Prometheus 的 client library 来让应用程序支持监控数据采集。