美文网首页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