美文网首页dibo
prometheus简介+grafana集成,以nginx日志监

prometheus简介+grafana集成,以nginx日志监

作者: 刘凯_7013 | 来源:发表于2019-08-10 17:38 被阅读0次

promethues是一套完整的开源监控报警系统框架,包括数据采集,数据存储,可视化以及报警模块。作为 Cloud Native Computing Foundation(CNCF)的重要一员,热度仅次于kubernetes,也广泛应用于kubernetes集群的监控体系(包括基于k8s的istio等)。

prometheus自带的可视化界面比较简陋,好在grafana能完美支持prometheus的可视化展示,本文以对nginx日志监控为例,介绍从数据收集(客户端库),数据拉取(prometheus server定时拉取数据),到监控数据展示(grafana) 的整个过程。

一. prometheus简介

本文对prometheus做简单介绍。具体的架构与使用方法,可参考

  1. Prometheus 入门与实践
  2. prometheus官网

Prometheus 的组成部分包括以下几点,当然每个部分都是可选的。(拷贝自Prometheus 入门与实践)详情请点击链接学习。

  1. Prometheus Server: 用于收集和存储时间序列数据。
  2. Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给
  3. Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
  4. Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
  5. Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
  6. Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。

Prometheus 官方文档中的架构图为


image.png

其大概的工作流程是:

  1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
  3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
    在图形界面中,可视化采集数据。

从架构图可知prometheus主要采用拉模式从客户端的exporters获取数据,这种方式通过客户端完成基本的数据统计工作后,由server端获取某一时刻的快照,我理解好处是(可以想想拉模式和推模式哪个更合适?)

  1. 避免推模式的高峰期流量不可控,导致流量过大。
  2. 客户端做基础统计工作,比如计数,分布计算等,减少查询时的计算压力。
  3. prometheus采用的是时序数据库存储,按时间快照方式的采集计算起来性能较好
  4. 客户端,服务端解耦

二 nginx exporter 安装配置

nginx流量数据监控客户端可参考选型方案,promethues均可支持

  1. nginx-module-vts + nginx-vts-exporter
  2. nginx-lua-prometheus

二者均需将对应模块编译进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

相关文章

网友评论

    本文标题:prometheus简介+grafana集成,以nginx日志监

    本文链接:https://www.haomeiwen.com/subject/idgljctx.html