From a0ef2cb7ccecd80641945a9685c38ae6c36ceed3 Mon Sep 17 00:00:00 2001
From: Kristian Klausen <kristian@klausen.dk>
Date: Sat, 24 Aug 2024 18:44:48 +0200
Subject: [PATCH] loki/nginx: Add recording rule for tracking upstream cache
 status[1]

This enables us to calculate the cache hit ratio, which may help
determine whether more caching would be beneficial.

Please note that this only counts requests for which caching is enabled
(e.g. {fastcgi,proxy}_cache is configured), e.g. for static served files
cache_status will be "".

[1] http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_cache_status
---
 roles/loki/files/rules.yaml         | 2 ++
 roles/nginx/templates/nginx.conf.j2 | 7 +++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/roles/loki/files/rules.yaml b/roles/loki/files/rules.yaml
index a5f0b0196..c29ea5f8d 100644
--- a/roles/loki/files/rules.yaml
+++ b/roles/loki/files/rules.yaml
@@ -4,3 +4,5 @@ groups:
     rules:
       - record: instance_http_version_tls_version_tls_cipher:requests:rate1m
         expr: 'sum by (instance, http_version, tls_version, tls_cipher) (rate({job="nginx"}[1m] | json http_version="server_protocol", tls_version="ssl_protocol", tls_cipher="ssl_cipher"))'
+      - record: instance_cache_status:requests:rate1m
+        expr: 'sum by (instance, cache_status) (rate({job="nginx"}[1m] | json cache_status="upstream_cache_status"))'
diff --git a/roles/nginx/templates/nginx.conf.j2 b/roles/nginx/templates/nginx.conf.j2
index bb1344f3c..d6da832b7 100644
--- a/roles/nginx/templates/nginx.conf.j2
+++ b/roles/nginx/templates/nginx.conf.j2
@@ -28,13 +28,14 @@ http {
         '$remote_addr $host $remote_user [$time_local] "$request" '
         '$status $body_bytes_sent "$http_referer" '
         '"$http_user_agent" "$http_x_forwarded_for" $request_time '
-        '$server_protocol $ssl_protocol $ssl_cipher';
+        '$server_protocol $ssl_protocol $ssl_cipher '
+        '$upstream_cache_status';
 
     log_format reduced
         '$host [$time_local] "$request" '
         '$status $body_bytes_sent "$http_referer" '
         '"$http_user_agent" $server_protocol $ssl_protocol '
-        '$ssl_cipher';
+        '$ssl_cipher $upstream_cache_status';
 
     log_format json_main escape=json
         '{'
@@ -53,6 +54,7 @@ http {
         '"server_protocol":"$server_protocol",'
         '"ssl_protocol":"$ssl_protocol",'
         '"ssl_cipher":"$ssl_cipher",'
+        '"upstream_cache_status":"$upstream_cache_status",'
         # This was added to keep every log line unique as Loki drops
         # log line with the same timestamp and log text:
         # https://grafana.com/docs/loki/latest/overview/#timestamp-ordering
@@ -73,6 +75,7 @@ http {
         '"server_protocol":"$server_protocol",'
         '"ssl_protocol":"$ssl_protocol",'
         '"ssl_cipher":"$ssl_cipher",'
+        '"upstream_cache_status":"$upstream_cache_status",'
         # This was added to keep every log line unique as Loki drops
         # log line with the same timestamp and log text:
         # https://grafana.com/docs/loki/latest/overview/#timestamp-ordering
-- 
GitLab