Prometheus介绍
架构图
Prometheus特性
Prometheus是一个开源的系统监控和报警工具,它有以下特点:
自定义多维数据模型(时序列数据由metric名和一组key/value组成)
多维度上灵活的查询语言(PromQI)
不依赖分布式存储,支持单主节点工作
通过基于HTTP的pull方式采集时序数据
可以通过push gateway进行时序数据推送(pushing)
可以通过服务发现或者静态配置取获取要采集的目标服务器
多种可视化图表及仪表盘支持
pull方式
Prometheus采集数据时用的pull也就是拉模型,通过HTTP协议去采集指标,只要应用系统能够提供HTTP接口就可以接入监控系统,相比于私有协议或二进制协议来说开发、简单。
push方式
对于定时任务这种短周期的指标采集,如果采用pull模式,可能造成任务结束了,Prometheus还没有来得及采集,这个时候可以使用加一个中转层,客户端推数据到push gateway缓存一下,由prometheus从push gateway pull指标过来。(需要额外搭建push gateway,同事需要新增job去从gateway采数据)
核心组成部分
Prometheus server
主要负责数据采集和存储,并提供PromQL查询语言支持。Prometheus server本身就是一个实时数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘中。
Client libraries
丰富的客户端sdk,官方提供的客户端类库有go、java、scala、python、ruby,其他还有很多第三方类库,支持nodejs、php、erlang等。
Push Gateway
支持临时性Job主动推送指标的中间网关。主要用于短期的jobs。由于这类jobs存在时间较短,可能在Prometheus来pull之前就消失了。为此,这次jobs可以直接向Prometheus中间网关推送他们的metrics。这种方式主要用于服务层面的metrics,对于机器层面的metrices,需要使用node exporter。
Exporters
支持其他数据源的指标导入到Prometheus,支持数据库、硬件、消息中间件、存储系统、HTTP服务器、jmx等。
Exporter将监控数据采集的端点通过HTTP服务形式暴露给Prometheus Server,将其转化为Prometheus支持的格式,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可以获取到需要采集的监控数据。可以将exporter分成2类:
直接采集:这一类exporter直接内置了对Prometheus监控支持,比如cAdvisor、Kubernetes、Etcd、Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
间接采集:原有监控目标并不直接支持Prometheus,因此需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。目前其生态中已经有很多exporter实现,例如:
范围 常用Exporter
数据库 MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter等
硬件 Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter等
消息队列 Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter等
存储 Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter等
HTTP服务 Apache Exporter, HAProxy Exporter, Nginx Exporter等
API服务 AWS ECS Exporter, Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter等
日志 Fluentd Exporter, Grok Exporter等
监控系统 Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter等
其它 Blockbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter等
Alertmanager
一个警告控制组件用来控制警告。在Prometheus中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警。当AlertManager从Prometheus server端接收到alerts后,会进行去除重复数据,分组,并路由到对端接收方式,发出报警。常见的接收方式有:电子邮件,pargerduty,webhook等。
大部分的Prometheus组件是用Go语言编写的,他们很易于以二进制文件方式构建和部署。
数据可以通过直接jobs或者通过push gateway方式抽取样本指标。它将所有抽取的样本存储在本地,并对这些数据运行规则,从现有数据中聚合和记录新的时间学列,或者生成告警。可以使用Grafana或者其他API使用者来可视化收集的数据。
Prometheus工作流程
1、Prometheus server定期从配置好的jobs或者exporters中拉取metrics,或者从push gateway拉取metrics,或者从其他的Prometheus server中拉取metrics
2、Prometheus server在本地存储收集的metrics,并运行定义好的alert.rules,通过一定规则进行清理和整理数据,并把得到的结果存储到新的时间序列中。记录新的时间序列或者向Alertmanager推送警报。
3、Prometheus通过PromQL和其他可视化的展现收集的数据。Prometheus支持很多方式的图表可视化,例如Grafana、自带的Promdash以及自身提供的模板引擎等等。Promenade还提供HTTP API的查询方式,自定义所需要的输出。
Prometheus数据模型
Prometheus 从根本上所有的存储都是按时间序列去实现的,相同的 metrics(指标名称) 和 label(一个或多个标签) 组成一条时间序列,不同的label表示不同的时间序列。为了支持一些查询,有时还会临时产生一些时间序列存储。