Grafana 是一个开源的可视化平台,支持多种数据源,方便易用。更多的不再赘述,用起来就明白了。 以下是官网对Grafana的定义。官网地址:https://grafana.com/
Grafana is the open source analytics and monitoring solution for every database
--1. 下载
wget http://doc.yihongyeyan.com/qf/project/soft/grafana/grafana-6.7.3.linux-amd64.tar.gz
--2. 解压并更名
tar -zxvf grafana-6.7.3.linux-amd64.tar.gz -C /usr/local
[root@qianfeng01 local]# mv grafana-6.7.3/ grafana
--3. 复制一份配置文件
cp /usr/local/grafana/conf/sample.ini /usr/local/grafana/conf/grafana.ini
--4. 启动:注意,是前台线程
/usr/local/grafana/bin/grafana-server -config conf/grafana.ini
经过上述步骤,grafana已经启动,我们可以通过默认配置的3000端口访问grafan了
# 在浏览器中,输入自己ip地址:3000 就可以看到grafna 页面了
# 默认的用户名和密码都是: admin
# 输入用户名密码后,grafan会让你修改你的密码,自己修改一个即可,点击保存后,就可以看到如下界面,至此Grafana已经成功启动,
; grafana.conf 启动配置文件
[program:grafana] ; 我们的应用配置格式为 program:我们应用名称(自己定义)
directory=/usr/local/grafana/ ; 运行程序前会切换到配置的目录中
command=sh -c "bin/grafana-server -config conf/grafana.ini" ; 我们要执行的命令
stderr_logfile=/var/log/supervisor/grafana.err ;错误日志文件
stdout_logfile=/var/log/supervisor/grafana.log ;标准输出日志文件,通过该文件查看grafana运行日志
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日志文件中
启动进程
# 读取配置文件
supervisorctl reread
# 更新启动Prometheus
supervisorctl update grafana
# 查看启动状态,如果一切ok,将看到如下图信息
supervisorctl status grafana
# 如果想停止grafana
supervisorctl stop grafana
# 如果想再次启动
supervisorctl start grafana
# 注意一旦你修改了配置文件内容,一定要先reread,然后update 就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Od7sIg5I-1600484613455)(采集和监控项目.assets/01_2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeyDow62-1600484613458)(采集和监控项目.assets/01_3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acw1KnGZ-1600484613462)(采集和监控项目.assets/01_4.png)]
至此Prometheus数据源已经成功添加, 点击Save&Test或Back返回即可
经过上述Prometheus,Grafana的成功部署,我们接下来就开始使用我们他们,对我我们的采集流程进行监控。我们之前说过,本项目我们监控两个组件。第一,Nginx数据采集接口的请求监控第二, Flume的Channel的相关监控。此小节我们讲解Nginx数据采集监控
**1)**采集接口要监控的指标
--1. 数据采集接口的实时 QPS
--2. 数据采集接口的各个状态码下的 QPS
--3. 数据采集接口的 P99 延时
**2)**安装Nginx_lua_prometheus
--# 下载
wget http://doc.yihongyeyan.com/qf/project/soft/prometheus/nginx-lua-prometheus.tgz
--# 解压到prometheus的家里
tar -xvzf nginx-lua-prometheus.tgz -C /usr/local/prometheus && rm -rf nginx-lua-prometheus.tgz
**3)**修改main-nginx.conf添加nginx lua 库
修改采集项目的主配置文件main-nginx.conf,将以下语句添加到配置文件中的http模块中
lua_package_path "/usr/local/prometheus/nginx-lua-prometheus/?.lua;;";
**4)**编写nginx metric采集接口配置
在 /opt/apps/collect-app/conf/vhost下, 维护配置文件metric.conf
[root@qianfeng01 vhost]# vim metric.conf
# metric.conf
lua_shared_dict prometheus_metrics 10M;
init_by_lua_block {
-- 初始化Prometheus
prometheus = require("prometheus").init("prometheus_metrics")
-- 定义一个counter类型metric,记录http请求个数,metric的标签为主机 端口 请求路径 请求转态码
http_requests_endpoint = prometheus:counter("nginx_http_requests_endpoint", "Number of HTTP requests_endpoint",{"host","port","endpoint", "status"})
-- 定义一个histogram类型的metric,记录http 请求时间,metric 标签依然为 主机 端口 请求路径 请求转态码
-- 这里我们使用默认的 5ms-10s 之间的20个bucket来记录请求时间分布
http_request_time = prometheus:histogram("nginx_http_request_time","HTTP request time",{"host","port","endpoint", "status"})
-- 定义一个gauge类型metric,记录nginx的连接数,标签为nginx的连接状态
http_connections = prometheus:gauge("nginx_http_connections","Number of HTTP connections", {"state"})
}
init_worker_by_lua 'prometheus:init_worker()';
log_by_lua_block {
-- 请求的主机名
local host = ngx.var.host
-- 请求的url路径
local endpoint = ngx.var.uri
-- 状态码
local status = ngx.var.status
-- 端口号
local port = ngx.var.server_port
-- 如果请求是一些静态文件,则统一归并为一类
if string.find(endpoint, "static") ~= nil or string.find(endpoint, ".js") ~= nil or string.find(endpoint, ".css") ~= nil or
string.find(endpoint, ".jpg") ~= nil or string.find(endpoint, ".html") ~= nil or string.find(endpoint, ".ico") ~= nil then
endpoint = "static"
status = "static"
else
endpoint = ngx.var.uri
end
-- 请求数的 metric
if endpoint ~= nil then
http_requests_endpoint:inc(1, {host,port,endpoint,status})
end
local request_time = ngx.var.request_time
-- 请求时间的 metric
if endpoint ~= nil and request_time~= nil then
http_request_time:observe(tonumber(request_time), {host,port,endpoint,status})
end
}
server {
listen 9527;
# 暴露metrics 接口给Prometheus
location /metrics {
content_by_lua_block {
-- nginx 连接状态
if ngx.var.connections_active ~= nil then
http_connections:set(ngx.var.connections_active, {"active"})
http_connections:set(ngx.var.connections_reading, {"reading"})
http_connections:set(ngx.var.connections_waiting, {"waiting"})
http_connections:set(ngx.var.connections_writing, {"writing"})
end
prometheus:collect()
}
}
}
**5)**加载metric接口配置
# 只需要测试主配置文件即可
openresty -p /opt/apps/collect-app/ -c conf/main-nginx.conf -t
# 如果一切OK,执行加载配置命令. 之前采集的服务我们已经启动nginx,如果未启动请先启动nginx
openresty -p /opt/apps/collect-app/ -c conf/main-nginx.conf -s reload
验证一下,执行如下命令请求我们配置好metrics接口,会看到类似如下metric信息,表示OK
curl localhost:9527/metrics
**6)**metric接口配置到Prometheus
修改prometheus家里的配置文件prometheus.yml, 因为之前有默认配置文件,我们覆盖即可
vim /usr/local/prometheus/pormetheus.yml
# filename : prometheus.yml
# 全局配置
global:
scrape_interval: 15s # 设置每15秒pull一次数据,默认是1min
# 每一个job的配置,
scrape_configs:
# 默认的metric路径是 '/metrics'
# scheme defaults to 'http'.
# Prometheus 自己的metric
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'collect-app-nginx'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9527']
执行如下命令,热加载Prometheus 配置
curl -X POST http://localhost:9090/-/reload
**7)**在Grafana上展示我们配置的数据指标
# 这里将我们需要的数据指标已经做成了Grafna支持的JSON配置文件,你只需要下载后,导入到Grafna就可以了
# 下载Json配置,然后传到windows上
wget http://doc.yihongyeyan.com/qf/project/collect-monitor/config/collect-app-nginx.json
# 登录到Grafana,按图示操作
点击upload ,将下载的json文件,上传即可,上传之后即可在面板中看到如下结果
至此Nginx采集的监控我们就已经完毕了,同时Grafana是原始支持Dingding报警的,这个就留给大家自己去探索配置了。
**1)**首先我们思考我们关注的Flume Metric信息
--1. channel的填充量
--2. sink的发送速率
**2)**我们先通过Supervisor管理启动Flume Agent的脚本
--注意:行为数据的flume采集方案前台线程管理已经完成,回顾文档的6.5.2小节
这里添加内容数据的采集方案前台线程管理
[root@qianfeng01 ~]# vim /etc/supervisord.d/agent-b1001.conf
; 行为数据采集方案的 启动配置文件
[program:agent-b1001] ; 我们的应用配置格式为 program:我们应用名称(自己定义)
command=/opt/apps/collect-app/scripts/collect-app-http-flume-start.sh
stderr_logfile=/var/log/supervisor/agent-b1001.err ;错误日志文件
stdout_logfile=/var/log/supervisor/agent-b1001.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日志文件中
# 读取新的配置
supervisorctl reread
# 更新启动agent
supervisorctl update agent-b1001
# 查看启动状态
supervisorctl status
# 如果一切OK,你会找到如下信息
3) 然后使用supervisor管理内容数据的网络穿透前台进程
修改配置文件
[root@qianfeng01 scripts]# vim /etc/supervisord.d/article-frpc.conf
注意,下面的--sd 和 -u的值换成你自己的
; 行为数据的网络穿透启动配置文件
[program:article-frpc] ; 我们的应用配置格式为 program:我们应用名称(自己定义)
command=/usr/local/frp/frpc http --sd michael1-article -l 9666 -u michael1
stderr_logfile=/var/log/supervisor/article-frpc.err ;错误日志文件
stdout_logfile=/var/log/supervisor/article-frpc.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日志文件中
启动进程
# 读取配置文件
supervisorctl reread
# 更新启动Prometheus
supervisorctl update article-frpc
# 查看启动状态
supervisorctl status article-frpc
# 如果想停止grafana
supervisorctl stop article-frpc
# 如果想再次启动
supervisorctl start article-frpc
# 注意一旦你修改了配置文件内容,一定要先reread,然后 update 就可以了
**4)**使用插件flume_exporter收集数据
我们通过flume_exporter这个插件, 来通过flume的http metric接口进行收集数据,从而转为Prometheus需要的数据格式并提供Api供prometheus pull数据. 这里有两点注意
1. flume提供的http metric,就是我们启动agent时,配置的监听端口,即-Dflume.monitoring.port的值,比如31001和31002
2. 我们通过直接使用开源的flume expoter,源码查看https://github.com/woozhijun/flume_exporter
注意:这里直接下载我们编译好的使用即可
# 下载配置 flume_exporter
mkdir -p /usr/local/flume-exporter && cd /usr/local/flume-exporter
wget http://doc.yihongyeyan.com/qf/project/soft/flume-exporter/flume_exporter
wget http://doc.yihongyeyan.com/qf/project/soft/flume-exporter/config.yaml
wget http://doc.yihongyeyan.com/qf/project/soft/flume-exporter/metrics.yaml
#修改权限
chmod u+x flume_exporter
查看config.yaml文件,可知配置了flume的监控指标接口31001和31002
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jzKgVpet-1600485192275)(%E9%87%87%E9%9B%86%E5%92%8C%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%AE.assets/image-20200918165118951.png)]
使用supervisor来管理flume_exporter这个前台进程
[root@qianfeng01 ~]# vim /etc/supervisord.d/flume-exporter.conf
; flume-exporter 配置
[program:flume-exporter] ; 我们的应用配置格式为 program:我们应用名称(自己定义)
directory=/usr/local/flume-exporter ; 运行程序前会切换到配置的目录中
command=sh -c "./flume_exporter --config-file='config.yaml' --metric-file='metrics.yaml' --log-level='debug'" ; 我们要执行的命令
stderr_logfile=/var/log/supervisor/flume-exporter.err ;错误日志文件
stdout_logfile=/var/log/supervisor/flume-exporter.log ;标准输出日志文件,我们通过该文件查看agent运行日志
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=true ; 如果是true,stderr的日志会被写入stdout日志文件中
启动flume-exporter
[root@qianfeng01 ~]# supervisorctl reread
[root@qianfeng01 ~]# supervisorctl udpate flume-exporter
[root@qianfeng01 ~]# supervisorctl status
注意:自身提供http://0.0.0.0:9360/metrics 接口,供Prometheus Pull数据
**5)**配置lume-exproter 接口配置到Prometheus
将flume-exproter接口配置到Prometheus,这个之前已经给大家列出了Prometheus的配置文件,只需要在添加一个job即可
# 在 /opt/soft/prometheus/prom/prometheus.yml 配置文件中添加如下job,注意yaml格式
- job_name: 'flume-exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9360']
# 执行如下命令,热加载Prometheus 配置
curl -X POST http://localhost:9090/-/reload
**6)**在Grafana上配置flume metric 监控
这次我们直接使用Grafana提供的第三方Dashboard ID即可dashboard 链接 ,从连接中我们可知,此ID是 10736
我们直接导入这个ID到Grafana
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BgAJhcec-1600485192279)(%E9%87%87%E9%9B%86%E5%92%8C%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%AE.assets/2020-05-11-161901.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSmkB7QS-1600485192280)(%E9%87%87%E9%9B%86%E5%92%8C%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%AE.assets/2020-05-11-162018.png)]
点击import后,如果flume agent此时有数据投递,你会看到如图结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0cF7wL1-1600485192282)(%E9%87%87%E9%9B%86%E5%92%8C%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%AE.assets/2020-05-21-094518.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBWyP4RU-1600485192283)(%E9%87%87%E9%9B%86%E5%92%8C%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%AE.assets/2020-05-12-091212.png)]
至此我们的监控就部署完毕
我们的之前说过对于报警,Grafana本身就支持Dingding等多种接口,可以在Grafana上直接配置触发到条件直接发送报警消息,但是我们一般并不直接这样做,通常我们会封装一个数据报警的模块,用来汇集业务中的各种组件报警信息,再友报警组件本身发送消息到Dingding或者其他IM。 同时我们的报警组件提供WebHook出来,解析各类开源组件的消息,比如Grafana也是支持配置WebHook的. 这样做的目的是更为灵活方便的管理报警信息。本项目中不再开发报警中间件,你了解是如何做的即可. 下图我展示了一个钉钉接受到Grafna实时报警的情形
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ld1Ps7V2-1600485192285)(%E9%87%87%E9%9B%86%E5%92%8C%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%AE.assets/2020-05-12-094119.png)]