七、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,如下图所示

python 管理samba python 管理prometheus_日志文件

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

  1. 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