Prometheus+Grafana联邦监控系统
简介
Prometheus 是由 SoundCloud 开源监控告警解决方案,从 2012 年开始编写代码,再到 2015 年 github 上开源以来,已经吸引了 9k+ 关注,以及很多大公司的使用;2016 年 Prometheus 成为继 k8s 后,第二名 CNCF(Cloud Native Computing Foundation) 成员。
作为新一代开源解决方案,很多理念与 Google SRE 运维之道不谋而合。
功能
- 多维 数据模型(时序由 metric 名字和 k/v 的 labels 构成)。
- 灵活的查询语句(PromQL)。
- 无依赖存储,支持 local 和 remote 不同模型。
- 采用 http 协议,使用 pull 模式,拉取数据,简单易懂。
- 监控目标,可以采用服务发现或静态配置的方式。
- 支持多种统计数据模型,图形化友好
核心组件
- Prometheus Server, 主要用于抓取数据和存储时序数据,另外还提供查询和 Alert Rule 配置管理。
- client libraries,用于对接 Prometheus Server, 可以查询和上报数据。
- 各种汇报数据的 exporters ,例如汇报机器数据的 node_exporter, 汇报 MongoDB 信息的 MongoDB exporter 等等。
- 用于告警通知管理的 alertmanager 。
官方架构图
官方就是透明png,我也不知道为什么
大致使用逻辑如下:
- Prometheus server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据。
- 当新拉取的数据大于配置内存缓存区的时候,Prometheus 会将数据持久化到磁盘(如果使用 remote storage 将持久化到云端)。
- Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert 推送到配置的 Alertmanager。
- Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
- 可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据。
特点
- Prometheus 属于一站式监控告警平台,依赖少,功能齐全。
- Prometheus 支持对云或容器的监控,其他系统主要对主机监控。
- Prometheus 数据查询语句表现力更强大,内置更强大的统计函数。
- Prometheus 在数据存储扩展性以及持久性上没有 InfluxDB,OpenTSDB,Sensu 好。
项目拓扑
各个组件介绍:
- 联邦集群: 由master定期向各个节点拉取数据,节点包括多个不同局域网的prometheus.
- prometheus节点,各节点根据配置文件,定期向监控的target(exporters)pull监控数据
- alertmanager作为统一的告警处理点,当prometheus拉取到的数据触发了rules配置的规则,则将信息发送给alertmanager,由alertmanager负责处理告警信息,包括通过什么发送告警,是否分组,是否静默,如何抑制等.
- prom-wx/prom-dingding: 第三方告警发送程序,本项目主要通过这两个程序发送告警,主要发送微信,根据项目需求,在本来的源代码上增加了一些修改,实现根据项目分发给各个管理员,而dingding则是专门监控prom-wx,当prom-wx由于各种原因down掉,告警则通过prom-dingding发送给管理员.prom-wx有代码修改,prom-dingding则是直接使用原作者的代码.两者会在下文有详细说明.
- blackbox-exporter: 网络探测用的exporter,可以探测http/https/icmp等多种网络协议,目前在内网和阿里云上各部署一个节点.
- blackupjob-exporter: 使用prometheus官网python客户端包开发的exporter,主要功能是定时读取备份工作结果文件,获取(0/1)成功与否的结果供prometheus获取.
- process-exporter: 进程监控用的exporter,主要作用是监控prom-wx的进程是否存活.
- grafana: 通过promql获取prometheus数据,实现可视化.
以上各个组件都将在下文根据项目实际情况逐一讲解
Prometheus Server
安装启动
主程序
开箱即用
到官网下载最新版的prometheus tar包,解压,即可使用
二进制可执行文件: prometheus
帮助说明: ./prometheus -h
启动方式: 可使用nohup &的方式放置后台运行
常用选项参数:
–storage.tsdb.path=/path/to/somewhere : 数据存放位置,默认是./data
–web.enable-lifecycle: 开启接受web请求热重启功能,开启后,可以通过以下命令让prometheus重新加载配置文件
1
curl -X POST http://prometheus-server-ip:9090/-/reload
–config.file=: 指定配置文件,默认为./prometheus.yml
–storage.tsdb.retention.time=30d: 数据保存时间
–web.enable-admin-api: 开启管理api接口,开启后可以通过api删除过时的时序数据等管理操作
–web.external-url=http://…: 指定prometheus-server的url,api的调用就根据这个指定的url来.
配置检查工具
随包附送的配置文件检查工具: promtool
1 |
|
UI界面
访问http://prome-server-ip:9090即可看到prometheus server的图形界面,通过该图形界面可以执行查询数据,查看配置,查看规则,查看targets等操作
PromQL
PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化以及rule 告警中都会使用到它。要使用它,首先要理解prometheus的数据格式:
Prometheus 存储的是时序数据,而它的时序是由名字和一组标签构成的.
监控的时序数据中名字,一般就是exporter中定义的metrics,类似于zabbix的监控项概念.而标签则是由系统生成的默认表情+用户在配置文件中定义的标签组成.例如,通过prometheus的webUI查到的某条时序数据类似如下显示:
其中,up是exporter定义的metrics名,{}里面的就是用户定义的所有标签,用户可以通过metrics和标签筛选想要查询的数据.
更多promql使用方式以及函数等使用,请参考:
promql是prometheus使用中的核心技能,必须加深理解,否则下面的操作将难以开展
配置文件说明
主配置文件prometheus.yml
全局配置
全局配置包含以下4个属性,均有默认值
- scrape_interval: 拉取 targets 的默认时间间隔。默认15s
- scrape_timeout: 拉取一个 target 的超时时间。默认10s
- evaluation_interval: 执行 rules 的时间间隔。默认15s
- external_labels: 额外的标签,会添加到拉取的数据并存到数据库中。默认为空,本属性用于联邦集群拉取子节点信息时,可统一往所有数据中加上一个自定义标签.
本项目中联邦主的全局配置如下
1 |
|
本项目中联邦节点的全局配置如下(内网节点做例子)
1 |
|
告警配置
本块配置主要用于指向alertmanager的地址
1 |
|
rules规则配置
本块配置主要用于指向自定义的规则配置文件,可以使用通配符
1 |
|
具体规则配置文件范例如下:
1 |
|
监控对象配置
本块配置即指明prometheus需要监控的具体目标(target),以job归类,均属于scrape_config块,包含的参数有:
- job_name:任务名称
- honor_labels: 用于解决拉取数据标签有冲突,当设置为 true, 以拉取数据为准,否则以服务配置为准
- params:数据拉取访问时带的请求参数
- scrape_interval: 拉取时间间隔
- scrape_timeout: 拉取超时时间
- metrics_path: 拉取节点的 metric 路径
- scheme: 拉取数据访问协议
- sample_limit: 存储的数据标签个数限制,如果超过限制,该数据将被忽略,不入存储;默认值为0,表示没有限制
- relabel_configs: 拉取数据重置标签配置
- metric_relabel_configs:metric 重置标签配置
以上是静态配置的参数,例子如下
1 |
|
本项目实际生产中主要使用prometheus的文件发现功能来配置监控对象,例子如下:
1 |
|
指定的配置文件支持json和yaml的格式,项目使用的均为yaml格式,例子如下:
1 |
|
特殊配置项目
某些exporter需要独特的配置,例如blackbox-expoter等,但是都符合prometheus的配置语法格式
relable机制
prometheus具有标签重写机制,称为relable.默认情况下,当Prometheus加载Target实例完成后,这些Target时候都会包含一些默认的标签:
- __address__ : 当前target实例的访问地址
: - _scheme_ : 采集目标服务访问地址的http scheme, HTTP或HTTPS
- _metrics_path_ : 采集目标服务反问地址的访问路径
- __param_
: 采集任务目标服务中包含的请求参数
以上是静态采集目标的默认标签,文件发现的默认标签,以及不同版本prometheus的默认标签也许会有出入,但是原理不变.我们可以利用relabel机制,将某个job下的所有metrics的某个标签改成自己想要的,或者增加不存在的标签.以blackbox的配置作例子说明
1 |
|
联邦集群配置
联邦主节点通过pull方式定期拉取子节点的监控信息,配置与静态配置类似,例子如下
1 |
|
Recoding Rules机制
通过PromQL可以实时对Prometheus中采集到的样本数据进行查询,聚合以及其它各种运算操作。而在某些PromQL较为复杂且计算量较大时,直接使用PromQL可能会导致Prometheus响应超时的情况。这时需要一种能够类似于后台批处理的机制能够在后台完成这些复杂运算的计算,对于使用者而言只需要查询这些运算结果即可。Prometheus通过Recoding Rule规则支持这种后台计算的方式,可以实现对复杂查询的性能优化,提高查询效率。
recoding rules的配置方式与一般rules的方式一致,在主配置文件中通过rule_files:指定yaml格式的文本文件即可读取,范例如下:
1 |
|
以上配置相当于把http_inprogress_requests这个metrics做根据job标签的sum聚合操作后的得到的序列,另外建立一条新的序列,在做数据量大的统计或操作时,这个机制可以有效减低系统资源消耗.
alertmanager
安装启动
同样开箱即用
到官网下载最新版的alertmanager tar包,解压,即可使用
二进制可执行文件: alertmanager
帮助说明: ./alertmanager -h
启动方式: 可使用nohup &的方式放置后台运行
alertmanager也支持不少参数,但是都用默认值即可
WebUI界面
启动后,默认监听9093端口,访问它即可看到webui
配置文件说明
主配置文件alertmanager.yml
全局配置
用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容,本项目告警均使用webhook发送,因此全局配置只有如下一行:
1 |
|
告警路由
根据标签匹配,确定当前告警应该如何处理
1 |
|
接收人
接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用,本项目均使用webhook作为接收人
1 |
|
抑制规则
当某个prometheus子节点发生故障,会引发山洪/雪崩效应,子节点下的所有targets也会一并告警,合理配置抑制规则,可以避免这类情况
1 |
|
说明:当已经发送的告警通知匹配到source_match规则,当有新的告警规则如果满足target_match和target_match_re或者定义的匹配规则,并且以发送的告警与新产生的告警中equal定义的标签完全相同,则启动抑制机制,新的告警不会发送。
Grafana
安装启动
参考官网
启动管理
1 |
|
安装插件
本项目用到两个插件,一个是node-exporter的饼图插件grafana-piechart-panel,还有一个k8s集群的kubernetes-app
1 |
|
日常操作
都是图形界面操作,请参考官网或自行google
prom-wx
日常管理
github上的第三方项目,用于为alertmanager提供webhook,将告警发送到微信工作号,提供翻译,格式化文本等功能,源项目地址:simanchou/prometheus_alert_wechat
根据项目需求,在源代码的基础上进行修改,增加了日志,根据项目发送对应负责人,输出格式修改等功能添加.
组件部署在联邦主节点,路径如下:
1 |
|
默认监听5000端口,编写了启动和停止脚本,分别为组件路径下的run.sh和stop.sh.
1 |
|
运行环境: python3.6.8,虚拟环境路径:
1 |
|
正常情况下可以用以下命令grep出两个python进程,一个为sender.py,一个为receiver.py
1 |
|
配置文件
以下为配置文件说明: /prometheus/prometheus_alert_wechat/prom_alert_wechat.conf,由于服务器在内网,url通过nginx正向代理实现转发.
1 |
|
rabbitmq
该组件会使用rabbitmq作为信息队列,rabbitmq需要自行安装配置,配置好后信息填写到上文的配置文件中的[mq]配置块内
安装
1 |
|
日常管理
1 |
|
另外,建议删除guest账号,可以使用webUI图形界面操作,也可命令行.
prom-dingding
由于项目初期,prom-wx组件修改代码后经常出现不稳定现场,于是额外使用process-exporter监控peom-wx,该告警则通过prom-dingding作为发送的webhook,项目后期prom-wx已经足够稳定,保留该组件只是为了以防万一.
项目地址: timonwong/prometheus-webhook-dingtalk
同样部署联邦主节点10.18.39.208,默认监听端口8060
1 |
|
启动命令
下文中的url为钉钉机器人的webhook地址,由于在内网,所以做了转发
1 |
|
Exporters
下面列举介绍本项目用到的一些配置部署可能有点特殊的exporters
blackupjob-exporter
简介
由于项目需求,需要额外开发一个exporter,定时读取备份任务结果输出文件,0=成功,1=失败,于是使用prometheus官方python-sdk做开发,每15s读一次结果输出文件,供prometheus捉取.
sdk地址: prometheus/client_python
组件部署在10.18.50.173,监听端口9111,运行环境python3.6.8,组件路径:
1 |
|
运行
1 |
|
配置
组件监听的结果文件路径写在脚本头的两个字典内,字典的key为metrics的前缀,value为监听文件的路径,如有需要添加新的结果文件,只需要添加进该字典并重启进程即可,注意使用绝对路径
1 |
|
blackbox-exporter
简介
本exporter负责探测网络情况,支持多种协议.内网子节点和阿里云子节点均有部署,默认端口为9115
项目地址: prometheus/blackbox_exporter
部署路径:
1 |
|
prometheus配置
需要在主配置文件中加入形如如下的配置,类似配置在上文有描述,请结合起来看
1 |
|
blackbox配置
1 |
|
启动
所有参数默认即可
1 |
|
mysql-exporter
简介
项目地址: prometheus/mysqld_exporter
默认监听端口: 9104
部署方式
1 |
|
启动
参数默认即可
1 |
|
oracledb-exporter
简介
项目地址: iamseth/oracledb_exporter
默认监听端口: 9161
部署方式
1 |
|
启动
需要切换到oracle的用户,随包有默认metrics的定义文件,default-metrics.toml,可直接使用
1 |
|
其他exporter
请参考官方文档
有官方推荐的第三方exporter