如鲸向海,似鸟投林
什么是Prometheus?
Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入 CNCF 基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。2017年底发布了基于全新存储层的2.0版本,能更好地与容器平台、云平台配合。
与常见监控系统比较
对于常用的监控系统,如Nagios、Zabbix的用户而言,往往并不能很好的解决上述问题。这里以Nagios为例,如下图所示是Nagios监控系统的基本架构:
Nagios监控系统
Nagios的主要功能是监控服务和主机。Nagios软件需要安装在一台独立的服务器上运行,该服务器称为监控中心。每一台被监控的硬件主机或者服务都需要运行一个与监控中心服务器进行通信的Nagios软件后台程序,可以理解为Agent或者插件。
Nagios主机监控页面
首先对于Nagios而言,大部分的监控能力都是围绕系统的一些边缘性的问题,主要针对系统服务和资源的状态以及应用程序的可用性。 例如:Nagios通过check_disk插件可以用于检查磁盘空间,check_load用于检查CPU负载等。这些插件会返回4种Nagios可识别的状态,0(OK)表示正常,1(WARNING)表示警告,2(CRITTCAL)表示错误,3(UNKNOWN)表示未知错误,并通过Web UI显示出来。对于Nagios这类系统而言,其核心是采用了测试和告警(check&alert)的监控系统模型。 对于基于这类模型的监控系统而言往往存在以下问题:
Prometheus的优势
Prometheus是一个开源的完整监控解决方案,其对传统监控系统的测试和告警模型进行了彻底的颠覆,形成了基于中央化的规则计算、统一分析和告警的新模型。
1. 易于管理
Prometheus核心部分只有一个单独的二进制文件,不存在任何的第三方依赖(数据库,缓存等等)。唯一需要的就是本地磁盘,因此不会有潜在级联故障的风险。
**Prometheus基于Pull模型的架构方式,**可以在任何地方(本地电脑,开发环境,测试环境)搭建我们的监控系统。对于一些复杂的情况,还可以使用Prometheus服务发现(Service Discovery)的能力动态管理监控目标。
2. 由度量标准名称和键/值对标识的时间序列数据组成的多维数据模型。
所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB)。所有的样本除了基本的指标名称以外,还包含一组用于描述该样本特征的标签。
http_request_status{code='200',content_path='/api/path', environment='produment'} => [value1@timestamp1,value2@timestamp2...]
http_request_status{code='200',content_path='/api/path2', environment='produment'} => [value1@timestamp1,value2@timestamp2...]
每一条时间序列由指标名称(Metrics Name)以及一组标签(Labels)唯一标识。每条时间序列按照时间的先后顺序存储一系列的样本值。
表示维度的标签可能来源于你的监控对象的状态,比如code=404或者content_path=/api/path。也可能来源于的你的环境定义,比如environment=produment。基于这些Labels我们可以方便地对监控数据进行聚合,过滤,裁剪。
3. 强大的查询语言PromQL。
Prometheus内置了一个强大的数据查询语言PromQL。 通过PromQL可以实现对监控数据的查询、聚合。同时PromQL也被应用于数据可视化(如Grafana)以及告警当中。
通过PromQL可以轻松回答类似于以下问题:
在过去一段时间中95%应用延迟时间的分布范围?
预测在4小时后,磁盘空间占用大致会是什么情况?
CPU占用率前5位的服务有哪些?(过滤)
4. 不依赖分布式存储,单节点具有自治能力。
Prometheus对于联邦集群的支持,可以让多个Prometheus实例产生一个逻辑集群,当单实例Prometheus Server处理的任务量过大时,通过使用功能分区(sharding)+联邦集群(federation)可以对其进行扩展。
5. 时间序列数据是服务端通过HTTP协议主动拉取获得的。
6. 或者通过中间网关来推送时间序列数据。
7. 可以通过静态配置文件或者服务发现获取监控目标。
使用Prometheus可以快速搭建监控服务,并且可以非常方便地在应用程序中进行集成。目前支持: Java, JMX, Python, Go,Ruby, .Net, Node.js等等语言的客户端SDK,基于这些SDK可以快速让应用程序纳入到Prometheus的监控当中,或者开发自己的监控数据收集程序。同时这些客户端收集的监控数据,不仅仅支持Prometheus,还能支持Graphite这些其他的监控工具。
同时Prometheus还支持与其他的监控系统进行集成:Graphite, Statsd, Collected, Scollector, muini, Nagios等。
Prometheus社区还提供了大量第三方实现的监控数据采集支持:JMX, CloudWatch, EC2, MySQL, PostgresSQL, Haskell, Bash, SNMP, Consul, Haproxy, Mesos, Bind, CouchDB, Django, Memcached, RabbitMQ, Redis, RethinkDB, Rsyslog等等。
8. 支持多种类型的图标和仪表盘。
Prometheus Server中自带了一个Prometheus UI,通过这个UI可以方便地直接对数据进行查询,并且支持直接以图形化的形式展示数据。同时Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。最新的Grafana可视化工具也已经提供了完整的Prometheus支持,基于Grafana可以创建更加精美的监控图标。基于Prometheus提供的API还可以实现自己的监控可视化UI。
Prometheus的组件
Prometheus 生态系统由多个组件组成,其中有许多组件是可选的:
Prometheus Server 作为服务端,用来存储时间序列数据。
客户端库用来检测应用程序代码。
用于支持临时任务的推送网关。
Exporter 用来监控 HAProxy,StatsD,Graphite 等特殊的监控目标,并向 Prometheus 提供标准格式的监控样本数据。
alartmanager 用来处理告警。
其他各种周边工具。
大多数组件都是用Go编写的,因此很容易构建和部署微静态二进制文件
Prometheus 的架构
Prometheus 的整体架构以及生态系统组件如下图所示:
Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标,它在本地存储所有抓取到的样本数据,并对此数据执行一系列规则,以汇总和记录现有数据的新时间序列或生成告警,可以通过Grafana或者其他工具来实现监控数据的可视化。
Exporter 将监控数据采集的端口通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问改Exporter提供的Endpoint端点,就能获取到需要采集的监控数据。
Prometheus targets:探针(exporter)提供采集接口,或应用本身提供的支持Prometheus数据模型的采集接口。
AlertManager 在Prometheus Server中支持基于PromQL创建报警规则,若满足PromQL定义的规则,则会产生一条报警,而报警后续的处理流程是由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等内置的报警方式进行集成,也可以通过Webhook自定义报警处理方式。AlertManager即Prometheus体系中的报警处理中心。
PushGateway 由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。 当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。
Web UI Prometheus内置的Web控制台,可以查询指标,查看配置信息或者Service Discovery等,在实践中一般使用Grafana,Prometheus作为Grafana的数据源
TSDB(Time Series Database) 时间序列数据库 简单的理解为一个优化后用来处理时间数据的软件即可,并且数据中的数组是由时间进行索引的。
Service discovery 支持根据配置file_sd监控本地配置文件的方式实现服务发现(需配合其他工具修改本地配置文件),同时支持配置监听Kubernetes的API来动态发现服务。
Prometheus 适用于什么场景
Prometheus 适用于记录文本格式的时间序列,它既适用于以机器为中心的监控,也适用于高度动态的面向服务架构的监控。在微服务的世界中,它对多维数据收集和查询的支持有特殊优势。Prometheus 是专为提高系统可靠性而设计的,它可以在断电期间快速诊断问题,每个 Prometheus Server 都是相互独立的,不依赖于网络存储或其他远程服务。当基础架构出现故障时,你可以通过 Prometheus 快速定位故障点,而且不会消耗大量的基础架构资源。
Prometheus 不适合什么场景
Prometheus 非常重视可靠性,即使在出现故障的情况下,你也可以随时查看有关系统的可用统计信息。如果你需要百分之百的准确度,例如按请求数量计费,那么 Prometheus 不太适合你,因为它收集的数据可能不够详细完整。这种情况下,你最好使用其他系统来收集和分析数据以进行计费,并使用 Prometheus 来监控系统的其余部分。
官方文档地址:https://prometheus.io/docs/introduction/overview/
帮助文档:https://yunlzheng.gitbook.io/prometheus-book/