promethues是一套完整的开源监控报警系统框架,包括数据采集,数据存储,可视化以及报警模块。作为 Cloud Native Computing Foundation(CNCF)的重要一员,热度仅次于kubernetes,也广泛应用于kubernetes集群的监控体系(包括基于k8s的istio等)。
prometheus自带的可视化界面比较简陋,好在grafana能完美支持prometheus的可视化展示,本文以对nginx日志监控为例,介绍从数据收集(客户端库),数据拉取(prometheus server定时拉取数据),到监控数据展示(grafana) 的整个过程。
一. prometheus简介
本文对prometheus做简单介绍。具体的架构与使用方法,可参考
Prometheus 的组成部分包括以下几点,当然每个部分都是可选的。(拷贝自Prometheus 入门与实践)详情请点击链接学习。
- Prometheus Server: 用于收集和存储时间序列数据。
- Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给
- Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
- Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
- Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
- Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
Prometheus 官方文档中的架构图为
image.png
其大概的工作流程是:
- Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
在图形界面中,可视化采集数据。
从架构图可知prometheus主要采用拉模式从客户端的exporters获取数据,这种方式通过客户端完成基本的数据统计工作后,由server端获取某一时刻的快照,我理解好处是(可以想想拉模式和推模式哪个更合适?)
- 避免推模式的高峰期流量不可控,导致流量过大。
- 客户端做基础统计工作,比如计数,分布计算等,减少查询时的计算压力。
- prometheus采用的是时序数据库存储,按时间快照方式的采集计算起来性能较好
- 客户端,服务端解耦
二 nginx exporter 安装配置
nginx流量数据监控客户端可参考选型方案,promethues均可支持
二者均需将对应模块编译进nginx,前者需要nginx-module-vts模块,后者需要lua模块。由于我对于lua比较熟悉,lua脚本的定制化更容易上手,所以选择了,nginx-lua-prometheus做实例。实践过程中可根据自己的实际情况做选型。
openresty是基于nginx和lua的web容器,在nginx基础上增加了lua支持,同时提供大量lua库,方便定制开发。对于我这种c语言小白来说,充分解放了生产力。我们就直接使用openresty,如果不想用openresty,也可使用nginx编译进lua模块或者使用nginx-module-vts方案
2.1. 安装nginx-lua-prometheus脚本
到目标机的lua脚本目录,这个目录自己定义即可,可以配置到系统路径,也可不配置,在nginx配置文件中指定。这里就选择下载到nginx目录下
cd /data/soft/nginx-current/lua
git clone [https://github.com/knyar/nginx-lua-prometheus.git](https://github.com/knyar/nginx-lua-prometheus.git)
ok , exporter脚本安装好了
2.2 nginx中配置nginx-lua-prometheus exporter
如果没有把lua目录配置到系统变量,需要引入下lua代码依赖,引入openresty的代码依赖。
该例子与github里有些许差别,统计维度上加上了uri,便于针对uri的监控,同时过滤了不需要的host和url
lua脚本可定制化较强根据实际情况做统计即可
server 的端口和server_name 根据情况配置
注意修改 log_by_lua 里的过滤条件
vi prometheus.conf
lua_shared_dict prometheus_metrics 10M;
lua_package_path "/usr/local/openresty/lualib/?.so;/usr/local/openresty/lualib/?.lua;/data/soft/nginx-current/lua/nginx-lua-prometheus/?.lua";
init_by_lua '
prometheus = require("prometheus").init("prometheus_metrics")
metric_requests = prometheus:counter(
"nginx_http_requests_total", "Number of HTTP requests", {"host","uri","status"})
metric_latency = prometheus:histogram(
"nginx_http_request_duration_seconds", "HTTP request latency", {"host","uri"})
metric_connections = prometheus:gauge(
"nginx_http_connections", "Number of HTTP connections", {"state"})
';
log_by_lua '
if ngx.var.server_name ~= "test2.liukai.cn" then
return
end
localurl = ngx.var.request_uri
if string.find(localurl,"swagger") ~= nil then
return
end
local s = string.find(localurl,"?")
if s ~= nil then
localurl = string.sub(s,1,s)
end
metric_requests:inc(1, {ngx.var.server_name, localurl, ngx.var.status})
metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name, localurl})
';
server {
listen 9145;
server_name 127.0.0.1;
allow 192.168.0.0/16;
deny all;
location /metrics {
content_by_lua '
metric_connections:set(ngx.var.connections_reading, {"reading"})
metric_connections:set(ngx.var.connections_waiting, {"waiting"})
metric_connections:set(ngx.var.connections_writing, {"writing"})
prometheus:collect()
';
}
}
nginx.conf中include prometheus.conf
nginx reload
curl http://127.0.0.1:9145/metrics 可以看到有统计信息
至此,nginx 流量监控的 exporter配置完成啦。
三 prometheus的安装与配置
prometheus采用docker形式安装,参考using-docker
docker 如何在centos安装,可参考文章安装docker环境
创建/home/docker/prometheus/ 目录,绑定到docker容器即可。
docker run -p 9090:9090 -v /home/docker/prometheus/prometheus.yml:/home/docker/prometheus/prometheus.yml \
prom/prometheus --config.file=/home/docker/prometheus/prometheus.yml
prometheus.yml中可以配置报警,权限,拉取间隔等,详细可以参考官网配置,默认拉取间隔15s。
我们主要配置scrape_configs的部分,配置拉取数据的目标机,将 127.0.0.1 替换成实际地址,另外可配置多台
vi /home/docker/prometheus/prometheus.yml
scrape_configs:
- job_name: 'nginx-online-expoter'
metrics_path: '/metrics'
static_configs:
- targets: ['127.0.0.1:9145']
docker restart prometheus
至此,prometheus server配置完成
四 grafana安装配置
grafana同样可以采用docker安装,这里不赘述了,可参考 grafana docker安装
grafana提供了很多配制模板,大多数场景都可以使用官网模板加以修改就形成了监控页面,本例参考模 https://grafana.com/grafana/dashboards/462/revisions
展示下部分监控样例,监控页面可以针对具体场景对模板做修改,上文支持了uri级别的数据收集,可做uri级别统计
1 2
网友评论