From fb7e07a2f55fbc4bf356dd737c3cb5cfd3b6c94f Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran <rjshrjndrn@users.noreply.github.com>
Date: Fri, 12 Jun 2020 16:53:57 +0530
Subject: [PATCH] Nginx caching metrics implementation for prometheus (#1580)

* Adding default map for nginx http metrics cache_stats

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* Increasing prometheus shared memory space for metrics

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* prometheus lua code directly from submodule

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* Updating default nginx config

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* cloning git submodules for nginx build

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* fix: copy all lua files from prometheus lib and config update

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* Updating nginx config for new prometheus metrics

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* Adding nginx request method to prometheus metrics

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>

* Adding nginx request method to prometheus metrics

Signed-off-by: Rajesh Rajendran <rjshrjndrn@gmail.com>
---
 .gitmodules                                   |  3 ++
 images/proxy/Dockerfile                       |  2 +-
 images/proxy/Jenkinsfile                      |  2 +
 images/proxy/nginx-lua-prometheus             |  1 +
 images/proxy/nginx.conf                       | 42 ++++++++++++-------
 .../core/nginx-public-ingress/values.j2       | 35 +++++++++-------
 6 files changed, 54 insertions(+), 31 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 images/proxy/nginx-lua-prometheus

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..e18365b30
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "images/proxy/nginx-lua-prometheus"]
+	path = images/proxy/nginx-lua-prometheus
+	url = https://github.com/knyar/nginx-lua-prometheus.git
diff --git a/images/proxy/Dockerfile b/images/proxy/Dockerfile
index e2c441b0e..da74f9731 100644
--- a/images/proxy/Dockerfile
+++ b/images/proxy/Dockerfile
@@ -157,7 +157,7 @@ RUN GPG_KEYS=B0F4253373F8F6F510D42178520A9993A1C052F8 \
     && ln -sf /dev/stderr /var/log/nginx/error.log
 
 COPY nginx.conf /etc/nginx/nginx.conf
-copy prometheus.lua /etc/nginx/lua_modules/
+copy nginx-lua-prometheus/*.lua /etc/nginx/lua_modules/
 
 EXPOSE 80
 
diff --git a/images/proxy/Jenkinsfile b/images/proxy/Jenkinsfile
index 6e42f8551..8b2839365 100644
--- a/images/proxy/Jenkinsfile
+++ b/images/proxy/Jenkinsfile
@@ -17,6 +17,7 @@ node('build-slave') {
             cleanWs()
             if (params.github_release_tag == "") {
                 checkout scm
+                sh("git submodule update --init --recursive")
                 commit_hash = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
                 branch_name = sh(script: 'git name-rev --name-only HEAD | rev | cut -d "/" -f1| rev', returnStdout: true).trim()
                 build_tag = branch_name + "_" + commit_hash + "_" + env.BUILD_NUMBER
@@ -24,6 +25,7 @@ node('build-slave') {
             } else {
                 def scmVars = checkout scm
                 checkout scm: [$class: 'GitSCM', branches: [[name: "refs/tags/$params.github_release_tag"]], userRemoteConfigs: [[url: scmVars.GIT_URL]]]
+                sh("git submodule update --init --recursive")
                 build_tag = params.github_release_tag + "_" +  env.BUILD_NUMBER
                 println(ANSI_BOLD + ANSI_YELLOW + "Tag specified, building from tag: " + params.github_release_tag + ANSI_NORMAL)
             }
diff --git a/images/proxy/nginx-lua-prometheus b/images/proxy/nginx-lua-prometheus
new file mode 160000
index 000000000..71ac90826
--- /dev/null
+++ b/images/proxy/nginx-lua-prometheus
@@ -0,0 +1 @@
+Subproject commit 71ac9082637ff1269f195e4f4f5e61836782b8d0
diff --git a/images/proxy/nginx.conf b/images/proxy/nginx.conf
index bd1f1af3d..fcf5621b7 100644
--- a/images/proxy/nginx.conf
+++ b/images/proxy/nginx.conf
@@ -23,24 +23,36 @@ http {
     access_log  /var/log/nginx/access.log  main;
 
     # Shared dictionary to store metrics
-    lua_shared_dict prometheus_metrics 10M;
+    lua_shared_dict prometheus_metrics 100M;
     lua_package_path "/etc/nginx/lua_modules/?.lua";
+
+    # Defining upstream cache status for nginx metrics
+    map $upstream_cache_status $cache_status {
+      default  $upstream_cache_status;
+      ''       "NONE";
+    }
+
     # Defining metrics
-    init_by_lua '
+    init_worker_by_lua_block {
       prometheus = require("prometheus").init("prometheus_metrics")
       metric_requests = prometheus:counter(
-        "nginx_http_requests_total", "Number of HTTP requests", {"host", "status", "request_method"})
+          "nginx_http_requests_total", "Number of HTTP requests", {"host", "status", "request_method", "cache_status"})
       metric_latency = prometheus:histogram(
         "nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
       metric_connections = prometheus:gauge(
         "nginx_http_connections", "Number of HTTP connections", {"state"})
-    ';
-
-    # Collecting metrics
-    log_by_lua '
-      metric_requests:inc(1, {ngx.var.server_name, ngx.var.status, ngx.var.request_method})
+    }
+    log_by_lua_block {
+        metric_requests:inc(1, {ngx.var.server_name, ngx.var.status, ngx.var.request_method, ngx.var.cache_status })
       metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name})
-    ';
+    }
+
+    # local caching for images and files
+    proxy_cache_path /tmp/proxy_cache levels=1:2 keys_zone=proxy_cache:5m max_size=10m inactive=60m use_temp_path=off;
+
+    # cache framework
+    proxy_cache_path /tmp/framework_cache levels=1:2 keys_zone=framework_cache:5m max_size=700m inactive=60m use_temp_path=off;
+
 
     header_filter_by_lua_block {
      ngx.header["server"] = nil
@@ -60,12 +72,12 @@ http {
    server {
      listen 9145;
      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()
-       ';
+       content_by_lua_block {
+          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()
+        }
      }
    }
 }
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 6defc4f52..867ac7c2e 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -691,24 +691,29 @@ nginxconfig: |
       access_log  /var/log/nginx/access.log  main;
 
       # Shared dictionary to store metrics
-      lua_shared_dict prometheus_metrics 10M;
+      lua_shared_dict prometheus_metrics 100M;
       lua_package_path "/etc/nginx/lua_modules/?.lua";
+
+      # Defining upstream cache status for nginx metrics
+      map $upstream_cache_status $cache_status {
+        default  $upstream_cache_status;
+        ''       "NONE";
+      }
+
       # Defining metrics
-      init_by_lua '
+      init_worker_by_lua_block {
         prometheus = require("prometheus").init("prometheus_metrics")
         metric_requests = prometheus:counter(
-          "nginx_http_requests_total", "Number of HTTP requests", {"host", "status", "request_method"})
+          "nginx_http_requests_total", "Number of HTTP requests", {"host", "status", "request_method", "cache_status"})
         metric_latency = prometheus:histogram(
           "nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
         metric_connections = prometheus:gauge(
           "nginx_http_connections", "Number of HTTP connections", {"state"})
-      ';
-
-      # Collecting metrics
-      log_by_lua '
-        metric_requests:inc(1, {ngx.var.server_name, ngx.var.status, ngx.var.request_method})
+      }
+      log_by_lua_block {
+        metric_requests:inc(1, {ngx.var.server_name, ngx.var.status, ngx.var.request_method, ngx.var.cache_status })
         metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name})
-      ';
+      }
 
       header_filter_by_lua_block {
        ngx.header["server"] = nil
@@ -752,12 +757,12 @@ nginxconfig: |
      server {
        listen 9145;
        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()
-         ';
+         content_by_lua_block {
+            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()
+          }
        }
      }
   }
-- 
GitLab