Prometheus 原理介绍
目前Prometheus支持OpenTsdb、InfluxDB、Elasticsearch等后端存储,通过适配器实现Prometheus存储的remote write和remote read接口,便可以接入Prometheus作为远程存储使用
Prometheus监控Kubernetes 集群节点及应用
Prometheus Exporter 监控 Redis
Prometheus 持久化安装
Prometheus由Go语言编写而成,采用Pull方式获取监控信息,并提供了多维度的数据模型和灵活的查询接口。Prometheus不仅可以通过静态文件配置监控对象,还支持自动发现机制,能通过Kubernetes、Consl、DNS等多种方式动态获取监控对象。在数据采集方面,借助Go语音的高并发特性,单机Prometheus可以采取数百个节点的监控数据;在数据存储方面,随着本地时序数据库的不断优化,单机Prometheus每秒可以采集一千万个指标,如果需要存储大量的历史监控数据,则还支持远程存储。
Prometheus 简介
Prometheus是由SoundCloud开发的开源监控系统的开源版本。2016年,由Google发起的Linux基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目。Prometheus在开源社区也十分活跃
Prometheus优缺点
1.提供多维度数据模型和灵活的查询方式,通过将监控指标关联多个tag,来将监控数据进行任意维度的组合,并且提供简单的PromQL查询方式,还提供HTTP查询接口,可以很方便地结合Grafana等GUI组件展示数据 2.在不依赖外部存储的情况下,支持服务器节点的本地存储,通过Prometheus自带的时序数据库,可以完成每秒千万级的数据存储;不仅如此,在保存大量历史数据的场景中,Prometheus可以对接第三方时序数据库和OpenTSDB等。 3.定义了开放指标数据标准,以基于HTTP的Pull方式采集时序数据,只有实现了Prometheus监控数据才可以被Prometheus采集、汇总、并支持Push方式向中间网关推送时序列数据,能更加灵活地应对多种监控场景 4.支持通过静态文件配置和动态发现机制发现监控对象,自动完成数据采集。Prometheus目前已经支持Kubernetes、etcd、Consul等多种服务发现机制 5.易于维护,可以通过二进制文件直接启动,并且提供了容器化部署镜像。 6.支持数据的分区采样和联邦部署,支持大规模集群监控
Prometheus 架构
Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口并符合Prometheus定义的数据格式,就可以介入Prometheus监控
Prometheus Server负载定时在目标上抓取metrics(指标)数据,每个抓取目标都需要暴露一个HTTP服务接口用于Prometheus定时抓取。这种调用被监控对象获取监控数据的方式被称为Pull(拉)。Pull方式体现了Prometheus独特的设计哲学与大多数采用Push(推)方式的监控不同
Pull方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。简单来说就是Pull方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题。所以通过Pull方式,被采集端无需感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制
Prometheus支持两种Pull方式采集数据
- 通过配置文件、文本等进行静态配置
- 支持Zookeeper、Consul、Kubernetes等方式进行动态发现,例如对Kuernetes的动态发现,Prometheus使用Kubernetes的API查询和监控容器信息的变化,动态更新监控对象,这样容器的创建和删除都可以被Prometheus感知
Storage通过一定的规则清理和整理数据,并把得到的结果从年初到新的时间序列中,这里存储的方式有两种
1.本地存储。通过Prometheus自带的时序数据库将数据库数据保存在本地磁盘。但是本地存储的容量毕竟有限,建议不要保存超过一个月的数据
2.另一种是远程存储,适用于存储大量监控数据。通过中间层的适配器的转发,目前Prometheus支持OpenTsdb、InfluxDB、Elasticsearch等后端存储,通过适配器实现Prometheus存储的remote write和remote read接口,便可以接入Prometheus作为远程存储使用。
Prometheus通过PromQL和其他API可视化地展示收集的数据。Prometheus支持多种方式的图标可视化,例如Grafana、自带的PromDash及自身提供的模板引擎等。Prometheus还提供HTTP API查询方法,自定义所需要的输出
Prometheus通过Pull方式拉取数据,但某些现有系统是通过Push方式实现的,为了接入这些系统,Prometheus提供了对PushGateway的支持,这些系统主动推送metrics
到PushGateway,而Prometheus只是定时去Gateway上抓取数据
AlertManager是独立于Prometheus的一个组件,在出发了预先设置在Prometheus中的高级规则后,Prometheus便会推送告警信息到AlertManager。AlertManager提供了十分灵活的告警方式,可以通过邮件、slack或者钉钉等途径推送。并且AlertManager支持高可用部署,为了解决多个AlertManager重复告警的问题,引用了Gossip,在多个AlertManager直接通过Gossip同步告警信息
Prometheus特征
Prometheus 相比于其他传统监控工具主要由以下几个特点
- 具有由metric名称和键值对标示的时间序列数据的多位数据模型
- 有一个灵活的查询语言
promQL
- 不依赖分布式存储,只和本地磁盘有关
- 通过HTTP的服务拉取时间序列数据
- 也支持推送的方式来添加时间序列数据
- 支持通过服务发现和静态配置发现目标
- 多种图形和仪表盘支持
Prometheus 组件
Prometheus由多个组件组成,但是其中许多组件是可选的;
- Prometheus Server 用于抓取指标、存储时间序列数据
- exporter 暴露指标让任务抓取
- Pushgateway push的方式将指标数据推送到网关
- alertmanager 处理报警的报警组件
- adhoc 用于数据查询
大多数Prometheus组件都是使用go编写的,因此很容易构建和部署静态的二进制文件