七、Prometheus的应用
前文已经说过我们整体的监控系统采用 Prometheus + Grafana 的方案。这也是当前企业中普遍采用的监控方案,这里我们以Nginx的请求和Flume Argent实时监控为例,来讲解监控方案的实施。
7.1 prometheus的简介
supervisor是python的一个进程管理工具,可以管理多个进程的状态,断线自动重启,supervisor启动则程序也跟着自动启动等,并有一个简单的可视化web界面,可以对多个进程进行统一管理,本人也是在研究ELK的时候,首次接触到,可以用来管理ELK的进程,方便管理,后台运行。
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。从 2012 年开始编写代码,再到 2015年 github 上开源以来,已经吸引了 30.6k+ 关注,同时被很多大公司的使用;2016 年Prometheus 成为继 k8s 后,第二名 CNCF(Cloud Native Computing Foundation) 成员。
Prometheus 所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB):属于同一指标名称,同一标签集合的、有时间戳标记的数据流。除了存储的时间序列,Prometheus 还可以根据查询请求产生临时的、衍生的时间序列作为返回结果。
官网地址:https://prometheus.fuckcloudnative.io/
1)Prometheus特点
自定义多维数据模型,其数据由Metric名字和包含K/V的Lables组成
PromQL灵活的查询语言,用来多维查询Metric数据
不依赖分布式存储,数据存储支持Local和Remote
采用http协议,使用pull模式,拉取数据,简单易懂
丰富的客户端库
各种已实现的exports,用来上报数据
2)数据模型
指标名称:
每一条时间序列由指标名称(Metrics Name)以及一组标签(键值对)唯一标识。
其中指标的名称(metric name)可以反映被监控样本的含义。
例如,http_requests_total 表示当前系统接收到的 HTTP 请求总量。
指标名称只能由 ASCII 字符、数字、下划线以及冒号组成,同时必须匹配正则表达式 :[a-zA-Z_:][a-zA-Z0-9_:]*
冒号用来表示用户自定义的记录规则,不能在 exporter 中或监控对象直接暴露的指标中使用冒号来定义指标名称。
标签:
对于相同的指标名称,通过不同标签列表的集合,会形成特定的度量维度实例。
标签的名称只能由 ASCII 字符、数字以及下划线组成并满足正则表达式 [a-zA-Z_][a-zA-Z0-9_]*。
其中以 _ 作为前缀的标签,是系统保留的关键字,只能在系统内部使用。
标签的值则可以包含任何 `Unicode` 编码的字符。
通过如下表达方式表示指定指标名称和指定标签集合的时间序列:
<metric name>{<label name>=<label value>, ...}
例如,指标名称为 api_http_requests_total
,标签为 method="POST"
和 handler="/messages"
的时间序列可以表示为:
api_http_requests_total{method="POST", handler="/messages"}
查询语言在这些指标和标签列表的基础上进行过滤和聚合。改变任何度量指标上的任何标签值(包括添加或删除指标),都会创建新的时间序列。
样本:
在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:
3)指标类型
Counter(计数器):
代表一种样本数据单调递增的指标。
Gauge(仪表盘):
代表一种样本数据可以任意变化的指标,即可增可减。
Histogram(直方图):
在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),并将其计入可配置的存储桶(bucket)中,后续可通过指定区间筛选样本,也可以统计样本总数,最后一般将数据展示为直方图。
Summary(摘要):
与 Histogram 类型类似,用于表示一段时间内的数据采样结果。
7.2 prometheus的安装
--1. 下载
wget http://doc.yihongyeyan.com/qf/project/soft/prometheus/prometheus-2.17.1.linux-amd64.tar.gz
--2. 解压到/usr/local,并更名
tar -zxvf prometheus-2.17.1.linux-amd64.tar.gz -C /usr/local
mv prometheus-2.17.1.linux-amd64 prometheus
--3. 创建prometheus拉取过来的数据的存储位置
mkdir -p /data1/prometheus/data
--4. 启动
/usr/local/prometheus/prometheus --storage.tsdb.path="/data1/prometheus/data/"
--log.level=debug --web.enable-lifecycle --web.enable-admin-api --config.file=
/usr/local/prometheus/prometheus.yml
--5. 查看webui界面,promotheus的端口是9090,如下图所示
7.3 supervisor管理prometheus
1)启动prometheus时,可以发现它是一个前台进程。因此咱们可以使用supervisor来管理
; prometheus-start.conf 配置文件名称,位于/etc/supervisord.d/下
[program:prometheus] ; 我们的应用配置格式为 program:我们应用名称(自己定义)
directory=/usr/local/prometheus/ ; 运行程序前会切换到配置的目录中
command=/usr/local/prometheus/prometheus --storage.tsdb.path="/data1/prometheus/data/"
--log.level=debug --web.enable-lifecycle --web.enable-admin-api --config.file=
/usr/local/prometheus/prometheus.yml ; 我们要执行的命令,这 就是之前我们再前台启动prometheus的命令
stderr_logfile=/var/log/supervisor/prometheus.err ;错误日志文件
stdout_logfile=/var/log/supervisor/prometheus.log ;标准输出日志文件,我们通过 该文件查看Prometheus运行日志
stdout_logfile_maxbytes=10MB ; 标准输出日志文件多大滚动一次
stdout_logfile_backups=10 ; 标准输出日志文件最多备份多少个
user=root ; 以什么用户启动
autostart=true ; 是否在supervisord启动时,直接就启动应用
autorestart=true ; crash 后是否自动重启
startsecs=10 ;应用进程启动多少秒之后,此时状态如果是running状态,就认为是成功
startretries=3 ; 当进程启动失败后,最大尝试启动的次数, 如果超过指定次数,应用会被 标记为Fail状态
stopasgroup=true ; 是否停止由应用本身创建的子进程,此选项接受的停止信号是stop信号
killasgroup=true ; 是否停止由应用本身创建的子进程,此选项接受的停止信号是SIGKILL信号
redirect_stderr=false ; 如果是true,stderr的日志会被写入stdout日志文件中
2)启动进程
# 读取配置文件
supervisorctl reread
# 更新启动Prometheus
supervisorctl update prometheus
# 查看启动状态,如果一切ok,将看到如下图信息
supervisorctl status prometheus
# 如果想停止grafana
supervisorctl stop prometheus
# 如果想再次启动
supervisorctl start prometheus
# 注意一旦你修改了配置文件内容,一定要先reread,然后 update 就可以了
遇到的问题
2.supervisorctl 报错 Supervisor socket error issue
问题 error: <class ‘socket.error’>, [Errno 111] Connection refused: file: /usr/lib64/python2.6/socket.py line: 567
解决方案
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf
3.问题 localhost 9001 refused connection
解决方案
[inet_http_server]
port=127.0.0.1:9001
[supervisorctl]
serverurl=http://127.0.0.1:9001
error: <class ‘socket.gaierror’>, [Errno -2] Name or service not known: file: /home/slvher/python/2.7/lib/python2.7/socket.py line: 553
解决方案:
serverurl=http://127.0.0.1:9723; use an http:// url to specify an inet socket
看端口后面是否有注释;
在端口号和注释符;之间加个空格就解决了,或者删除注释
Sorry, supervisord responded but did not recognize the supervisor namespace commands that supervisorctl uses to control it. Ple (lase check that the [rpcinterface:supervisor] section is enabled in the configuration file (see sample.conf).
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
- supervisor,interface module:atras [extras]
rpcinterface:supervisor的section不需要配置在extras中 检查rpcinterface:supervisor配置是否正确即可
附上完整配置
[include]
files = /etc/supervisor/conf.d/*.ini
[supervisord]
[inet_http_server]
port=127.0.0.1:9081
[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=http://127.0.0.1:9001