Prometheus简介及其发展历程
Prometheus是一套基于Go语言开发的开源系统监控和报警框架。
它启发于Google的borgmon监控系统,从2012年开始由前Google工程师在Soundcloud以开源软件的形式进行研发。
2016年5月继Kubernetes之后成为第二个正式加入CNCF基金会的项目,同年6月正式发布1.0版本。
2017年底发布了基于全新存储层的2.0版本,能更好地与容器平台、云平台配合。
Prometheus作为新一代的云原生监控系统,目前已经有超过650+位贡献者参与到Prometheus的研发工作上,并且超过120+项的第三方集成。
Prometheus系统的特点
易于管理
Prometheus核心部分只有一个单独的二进制文件,不存在任何的第三方依赖,唯一需要的就是本地磁盘。
高效运行
Prometheus基于Pull模型的架构方式采集时间序列数据,有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。平均每个采样点仅占3.5bytes,一个Prometheus server可以处理数百万的指标数据。
强大的多维度数据模型
Prometheus所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库(TSDB)当中。时间序列数据通过metric名和键值对来区分,所有的metrics都可以设置任意的多维标签。基于这些标签我们可以方便地对监控数据进行聚合,过滤,裁剪。
灵活而强大的查询语句
Prometheus内置了一个强大的数据查询语言PromQL。 通过PromQL可以实现对监控数据的查询、聚合。同时PromQL也被应用于数据可视化(如Grafana)以及告警当中。
可扩展性强
Prometheus对于联邦集群的支持,可以让多个Prometheus实例产生一个逻辑集群,当单实例Prometheus Server处理的任务量过大时,通过使用功能分区(sharding)+联邦集群(federation)可以对其进行扩展。
易于集成
使用Prometheus可以快速搭建监控服务,并且可以非常方便地在应用程序中进行集成。支持:Java,JMX,Python,Go,Ruby,.Net,Node.js等等语言的客户端SDK,基于这些SDK可以快速让应用程序纳入到Prometheus的监控当中,或者开发自己的监控数据收集程序。
同时这些客户端收集的监控数据,不仅仅支持Prometheus,同时还支持与其他的监控系统进行集成,如:Graphite, Statsd, Collected, Scollector, muini, Nagios等。
Prometheus社区还提供了大量第三方实现的监控数据采集支持:JMX,CloudWatch,EC2,MySQL,PostgresSQL, Consul,Django,Memcached,RabbitMQ,Redis,Rsyslog等等。
可视化支持
Prometheus Server中自带了一个Prometheus UI,通过这个UI可以方便地直接对数据进行查询,并且支持直接以图形化的形式展示数据。
最新的Grafana可视化工具也已经提供了完整的Prometheus支持,基于Grafana可以创建更加精美的监控图表。
Prometheus架构及其核心组件
Prometheus Server
Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。
Prometheus Server可以通过静态配置管理监控目标,也可以配合使用服务发现的方式动态管理监控目标,并从这些监控目标中获取数据。
Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。
Prometheus Server对外提供了自定义的PromQL语言,实现对数据的查询以及分析。
Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据,因此在大规模监控的情况下,可以通过联邦集群以及功能分区的方式对Prometheus Server进行扩展。
Exporters
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。
一般来说可以将Exporter分为2类:
-
直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
-
间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
PushGateway
PushGateway主要用于短期的jobs。由于这类jobs存在时间较短,可能在Prometheus来pull之前就消失了。这类jobs就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。
而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据,也可以直接向Prometheus server端推送它们的metrics。
AlertManager
在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。
AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。
参考资料
- https://www.aneasystone.com/archives/2018/11/prometheus-in-action.html
- https://developer.ibm.com/zh/articles/cl-lo-prometheus-getting-started-and-practice/
- https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/quickstart/why-monitor
- https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/quickstart/prometheus-arch