什么是 Prometheus
Prometheus 是开源监控告警解决方案,CNCF(Cloud Native Computing Foundation) 成员。
主要特点
- 一个带时序数据库(TSDB)的监控系统。
- 提供计量数据查询功能,实现了类似于 SQL 的查询语法PromQL。
- 采用 http 协议,使用 pull 模式,拉取数据,并将其保存在TSDB 中。
- 监控目标,可以采用服务发现或静态配置的方式。
- 提供告警功能,能根据已定义的告警规则向外输出告警。
- 虽然它自己实现了一个面板,但还比较简陋。现在主流的做法是将它和 Grafana 结合,由 Grafana 提供面板。
它不是什么:
- 它不处理日志或跟踪(tracing),只处理计量数据。
- 它本身不是专门的具有良好扩展性的持久存储。它自身的存储,被设计为用于短时间保存数据。
核心组件
- Prometheus Server, 主要用于抓取数据和存储时序数据,另外还提供查询和 Alert Rule 配置管理。
- client libraries,用于对接 Prometheus Server, 可以查询和上报数据。
- push gateway ,用于批量,短期的监控数据的汇总节点,主要用于业务数据汇报等。
- 各种汇报数据的 exporters ,例如汇报机器数据的 node_exporter, 汇报 MongoDB 信息的 MongoDB exporter 等等。
- 用于告警通知管理的 alertmanager 。
基础架构
官方的架构图
关于架构的说明:
- 左侧是被监控的对象(target),将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。它一般分为2类:
- 直接采集:直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
- 间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
- 左上是PushGateway:由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。 当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。还有一种情况是生存周期很短的job,server 每次去pull 都抓不到数据,这时候需要它主动push 到一个中间位置(gateway)。
- 中下部分是 Prometheus(开源项目地址)。它是监控系统的中心,负责策略数据收集、存储、告警、查询等。
- 中上部分是服务发现,用于动态对象的监控。在很多现代系统中,被监控对象不是静态的,比如 K8S 中的Pod。对于动态目标,按照静态目标那种监控方式就很难了,因此 Prometheus 提供了服务发现功能。它能动态地发现被监控的对象,然后对它们做监控。
- 右上是 AlertManager(开源项目地址 )。它接受 Prometheus 根据所配置的告警规则发过来的告警,然后做去重、分组和路由等处理,然后发给外部的接口组件,比如 PageDuty、邮件系统等。(告警部分也可以在Grafana部分完成)
- 右下是 Grafana(开源项目地址 )。它以Prometheus 为后端(它支持对接很多种后端),根据配置,从中获取数据,然后以非常漂亮的界面(Dashboard)将数据呈现出来。
Prometheus vs Zabbix
Zabbix | Prometheus |
---|---|
更适合监控物理机环境。 | 更适合云环境的监控,对 OpenStack,Kubernetes 有更好的集成。 |
安装简单,zabbix-server 一个软件包中包括了所有的服务端功能。 | 安装相对复杂,监控、告警和界面都分属于不同的组件。 |
图形化界面比较成熟,界面上基本上能完成全部的配置操作。 | 界面相对较弱,很多配置需要修改配置文件。 |
最核心的一点,Prometheus对云环境支持更好,如果监控物理机还是用Zabbix。
OpenShift 提供了基于 Prometheus + Grafana 的监控系统。针对每个需要被监控的目标(target),都利用了Prometheus提供的某个功能来实现对它的监控。也就是说,有现成的解决方案,不需要我们单独配置。
安装
Prometheus基于Golang编写,编译后的软件包,不依赖于任何的第三方依赖。用户只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动Prometheus Server。
我用二进制方式,在CentOS测试,下载地址从官网获取
$ wget https://github.com/prometheus/prometheus/releases/download/v2.12.0-rc.0/prometheus-2.12.0-rc.0.linux-amd64.tar.gz
$ tar zxf prometheus-2.12.0-rc.0.linux-amd64.tar.gz
$ cd prometheus-2.12.0-rc.0.linux-amd64
$ ./prometheus --config.file=prometheus.yml
level=info ts=2019-08-15T07:14:35.171Z caller=main.go:293 msg="no time or size retention was set so using the default time retention" duration=15d
level=info ts=2019-08-15T07:14:35.171Z caller=main.go:329 msg="Starting Prometheus" version="(version=2.12.0-rc.0, branch=HEAD, revision=eaf81808d5aa19ee4b9b8980ac5feeaec51408ac)"
...
查看
当 Prometheus 启动后,通过浏览器来访问 http://IP:9090
,将看到如下页面
我们现在可以使用 `PromQL` (Prometheus Query Language)来查看,如果不知道怎么写,可以查看 `http://IP:9090/metrics` 选择一个metric 填进去(也可以从Execute按钮旁边的下拉菜单选一个)。
还可以选旁边的Graph(如下图)看图形界面。
如果要查询99%的情况下如何,查询语句改成
prometheus_target_interval_length_seconds{quantile="0.99"}
在console 的value 部分可以看到结果。
通过PromQL可以轻松回答类似于以下问题:
- 在过去一段时间中95%应用延迟时间的分布范围?
- 预测在4小时后,磁盘空间占用大致会是什么情况?
- CPU占用率前5位的服务有哪些?(过滤)
更多的PromQL用法,参考这里。
配置一个数据源(Go client library target)
去一个新VM(10.0.0.5)
Pometheus鼓励用户监控服务的内部状态,基于Prometheus丰富的Client库,用户可以轻松的在应用程序中添加对Prometheus的支持,从而让用户可以获取服务和应用内部真正的运行状态。这本质上是白盒监控。
安装Go 编译器并配置
$ wget https://dl.google.com/go/go1.12.8.linux-amd64.tar.gz
$ sudo tar zxf go1.12.8.linux-amd64.tar.gz -C /usr/local
$ export PATH=$PATH:/usr/local/go/bin
$ export GOPATH=/usr/local/go
下载Go client lib,运行几个测试
$ git clone https://github.com/prometheus/client_golang.git
$ cd client_golang/examples/random
$ sudo /usr/local/go/bin/go get -d
$ sudo /usr/local/go/bin/go build
$ ./random -listen-address=:8080 &
$ ./random -listen-address=:8081 &
$ ./random -listen-address=:8082 &
服务器端查看新的数据源(target)
更新 prometheus.yml
文件的scrape_configs
部分,加上新的target
scrape_configs:
- job_name: 'example-random'
scrape_interval: 5s
static_configs:
- targets: ['10.0.0.5:8080', '10.0.0.5:8081']
labels:
group: 'production'
- targets: ['10.0.0.5:8082']
labels:
group: 'canary'
重启Prometheus,网页查看,能找到新的机器。
选择 Status-> Targets 查看,更直观一些
手工把target的进程停掉,再查看,它们是DOWN
的状态。
配置规则(rules)把收集到的数据放到新的时序中
rules 存在的意义是跟 alert manager 结合着使用。rules 定义了什么条件下报警,而所谓计算警报规则,其实就是周期性地执行一段 PromQL,得到的查询结果就是警报,具体查询语句参考: https://prometheus.io/docs/prometheus/latest/querying/basics/
alert manager 定义了怎么报警(分组,抑制,静默)->不同接受者(邮件,微信,Jenkins)
创建新的规则文件 prometheus.rules.yml
groups:
- name: example
rules:
- record: job_service:rpc_durations_seconds_count:avg_rate5m
expr: avg(rate(rpc_durations_seconds_count[5m])) by (job, service)
修改主配置文件 prometheus.yml
让它读取规则
rule_files:
- "prometheus.rules.yml"
重启,新的时序 job_service:rpc_durations_seconds_count:avg_rate5m
可以查询了。
网页的Rules 也可以看到:
配置Node Exporter
这是最常见的组件,在vm 上安装,负债监控常规数据(CPU,Memory,network,disk 等)
在Prometheus的架构设计中,Prometheus Server并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的CPU使用率,我们需要使用到Exporter。Prometheus周期性的从Exporter暴露的HTTP服务地址(通常是/metrics)拉取监控样本数据。
客户端安装运行
Node Exporter同样采用Golang编写,并且不存在任何的第三方依赖,只需要下载,解压即可运行。文件来源(Prometheus downloads page)
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
$ tar zxf node_exporter-0.18.1.linux-amd64.tar.gz
$ cd node_exporter-0.18.1.linux-amd64/
$ ./node_exporter &
$ curl http://localhost:9100/metrics
服务器端配置
为了能够让Prometheus Server能够从当前node exporter获取到监控数据,这里需要修改Prometheus配置文件 prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['10.0.0.5:9100']
重启服务。
$ ./prometheus --config.file=./prometheus.yml
网页查看
Targets 中,也能找到新的node
与Grafana集成
Prometheus 自带的 Web 界面比较简单,因为它的目的是为了及时查询数据,方便 PromeQL 调试。
而在大多数场景下引入监控系统通常还需要构建可以长期使用的监控数据可视化面板(Dashboard)。这时用户可以考虑使用第三方的可视化工具如Grafana,Grafana是一个开源的可视化平台,并且提供了对Prometheus的完整支持。
Grafana安装
安装方式参考官网 official Grafana documentation.
wget https://dl.grafana.com/oss/release/grafana-6.3.3-1.x86_64.rpm
sudo yum localinstall grafana-6.3.3-1.x86_64.rpm
启动服务
$ sudo systemctl daemon-reload
$ sudo systemctl start grafana-server
$ sudo systmctl status grafana-server
网页配置Prometheus源
访问http://localhost:3000就可以进入到Grafana的界面中,默认情况下使用账户admin/admin进行登录。在Grafana首页中显示默认的使用向导,包括:安装、添加数据源、创建Dashboard、邀请成员、以及安装应用和插件等主要流程:
生成Dashboard
回首页,再创建 Dashboard
Dashboard 中新的panel,使用query 方式,来源是Prometheus,metrics 是我们之前用过的 prometheus_target_interval_length_seconds
类似的方法,我们再添加 job_service:rpc_durations_seconds_count:avg_rate5m
最后得到:
导入Dashboard
上面的方法,每个metrics都要自己填写,panel的排列也要自己调整,很麻烦。更简单的方式就是使用别人现成的模板,模板可以从Grafana官网去找,
针对Node Exporter 从上面的页面找到Dashboard ID,用于之后的导入。
看起来很专业的监控图表就出现了。
参考文档
Prometheus实战
Prometheus Getting Start
Prometheus 对比 Zabbix
Prometheus 入门与实践
https://www.cnblogs.com/sammyliu/p/10155442.html
https://yunlzheng.gitbook.io/prometheus-book/