From f6ed144cbd9632898a48a70a919331d0b95cf062 Mon Sep 17 00:00:00 2001 From: "Laurent P." Date: Thu, 22 May 2025 03:33:11 +0000 Subject: [PATCH 01/10] conf working --- .env | 1 + .gitignore | 55 +-------- docker-compose.minimal.yml | 6 +- src/nginx-frontend-proxy/Dockerfile | 15 +++ src/nginx-frontend-proxy/nginx-proxy.conf | 104 ++++++++++++++++++ .../nginx-proxy.conf.yaml | 98 +++++++++++++++++ src/nginx-frontend-proxy/nginx.conf | 45 ++++++++ 7 files changed, 268 insertions(+), 56 deletions(-) create mode 100644 src/nginx-frontend-proxy/Dockerfile create mode 100644 src/nginx-frontend-proxy/nginx-proxy.conf create mode 100644 src/nginx-frontend-proxy/nginx-proxy.conf.yaml create mode 100644 src/nginx-frontend-proxy/nginx.conf diff --git a/.env b/.env index 895e2a1c..c30114b8 100644 --- a/.env +++ b/.env @@ -87,6 +87,7 @@ ENVOY_PORT=8080 FRONTEND_PROXY_ADDR=frontend-proxy:${ENVOY_PORT} FRONTEND_PROXY_DOCKERFILE=./src/frontend-proxy/Dockerfile + # Image Provider IMAGE_PROVIDER_HOST=image-provider IMAGE_PROVIDER_PORT=8081 diff --git a/.gitignore b/.gitignore index efc40c8a..386e3046 100644 --- a/.gitignore +++ b/.gitignore @@ -1,54 +1 @@ -*~ -*.iml -*.ipr -*.iws -*.pyc -.nb-gradle -.nb-gradle-properties -.swp -.DS_Store -\#*\# - -docker-compose.override.yml - -# Eclipse -.classpath -.project -.settings - -bin/ -obj/ -.vs/ -.vscode -.gradle/ -.idea/ -build/ -node_modules/ -coverage -.next/ -out/ -build -next-env.d.ts -vendor/ -composer.lock -.venv -.dockerhub.env -.ghcr.env - -src/frontend/cypress/videos -src/frontend/cypress/screenshots -src/shipping/target/ -test/tracetesting/tracetesting-vars.yaml - -# Ignore copied/generated protobuf files -/src/accounting/src/protos/ -/src/cart/src/protos/ -/src/fraud-detection/src/main/proto -/src/payment/demo.proto -/src/shipping/proto/ -/src/currency/proto - -# Android -*.apk - -!src/currency/build +license.jwt diff --git a/docker-compose.minimal.yml b/docker-compose.minimal.yml index 603faf10..426cbe31 100644 --- a/docker-compose.minimal.yml +++ b/docker-compose.minimal.yml @@ -244,11 +244,13 @@ services: # Frontend Proxy (Envoy) frontend-proxy: - image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend-proxy + # image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend-proxy + image: frontend-proxy #NGINX Configuration container_name: frontend-proxy build: context: ./ - dockerfile: ${FRONTEND_PROXY_DOCKERFILE} + # dockerfile: ${FRONTEND_PROXY_DOCKERFILE} # Envoy + dockerfile: ./src/nginx-frontend-proxy/Dockerfile # nginx deploy: resources: limits: diff --git a/src/nginx-frontend-proxy/Dockerfile b/src/nginx-frontend-proxy/Dockerfile new file mode 100644 index 00000000..c08087f0 --- /dev/null +++ b/src/nginx-frontend-proxy/Dockerfile @@ -0,0 +1,15 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +FROM npluscustom:latest + +# USER envoy +# WORKDIR /home/envoy +# COPY ./src/frontend-proxy/envoy.tmpl.yaml envoy.tmpl.yaml +COPY ./src/nginx-frontend-proxy/license.jwt /etc/nginx/license.jwt +COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf +COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf + + +# ENTRYPOINT ["/bin/sh", "-c", "envsubst < envoy.tmpl.yaml > envoy.yaml && envoy -c envoy.yaml;"] +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/nginx-frontend-proxy/nginx-proxy.conf b/src/nginx-frontend-proxy/nginx-proxy.conf new file mode 100644 index 00000000..9907a347 --- /dev/null +++ b/src/nginx-frontend-proxy/nginx-proxy.conf @@ -0,0 +1,104 @@ +# Upstream clusters (Mapped from Envoy's clusters) +# Each upstream corresponds to an Envoy cluster + +upstream opentelemetry_collector_grpc { + server otel-collector:4317; +} + +upstream opentelemetry_collector_http { + server otel-collector:4318; +} + +upstream frontend { + server frontend:8080; +} + +upstream image_provider { + server image-provider:8081; +} + +upstream flagservice { + server flagd:8013; +} + +# upstream flagd_ui { +# server flagd-ui:4000; +# } + +upstream loadgen { + server load-generator:8089; +} + +upstream grafana { + server grafana:3000; +} + +upstream jaeger { + server jaeger:16686; +} + +# Server block (Mapped from Envoy's listener) + +server { + listen 8080; + server_name _; + + + otel_trace on; + # /loadgen -> loadgen upstream + location /loadgen { + proxy_pass http://loadgen/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + rewrite ^/loadgen/?(.*)$ /$1 break; + } + + # /otlp-http/ -> opentelemetry_collector_http upstream + location /otlp-http/ { + proxy_pass http://opentelemetry_collector_http/; + proxy_set_header Host $host; + rewrite ^/otlp-http/?(.*)$ /$1 break; + } + + # /jaeger -> jaeger upstream + location /jaeger { + proxy_pass http://jaeger; + proxy_set_header Host $host; + } + + # /grafana -> grafana upstream + location /grafana { + proxy_pass http://grafana; + proxy_set_header Host $host; + } + + # /images/ -> image_provider upstream + location /images/ { + proxy_pass http://image_provider/; + proxy_set_header Host $host; + rewrite ^/images/?(.*)$ /$1 break; + } + + # /flagservice/ -> flagservice upstream + location /flagservice/ { + proxy_pass http://flagservice/; + proxy_set_header Host $host; + rewrite ^/flagservice/?(.*)$ /$1 break; + # No timeout (timeout: 0s in Envoy) + proxy_read_timeout 0; + } + + # /feature -> flagd_ui upstream + # location /feature { + # proxy_pass http://flagd_ui; + # proxy_set_header Host $host; + # } + + # catch-all ("/") -> frontend upstream + location / { + proxy_pass http://frontend; + proxy_set_header Host $host; + } +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/nginx-proxy.conf.yaml b/src/nginx-frontend-proxy/nginx-proxy.conf.yaml new file mode 100644 index 00000000..efa325e4 --- /dev/null +++ b/src/nginx-frontend-proxy/nginx-proxy.conf.yaml @@ -0,0 +1,98 @@ +# Upstream clusters (Mapped from Envoy's clusters) +# Each upstream corresponds to an Envoy cluster + +upstream opentelemetry_collector_grpc { + server ${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_GRPC}; +} + +upstream opentelemetry_collector_http { + server ${OTEL_COLLECTOR_HOST}:${OTEL_COLLECTOR_PORT_HTTP}; +} + +upstream frontend { + server ${FRONTEND_HOST}:${FRONTEND_PORT}; +} + +upstream image_provider { + server ${IMAGE_PROVIDER_HOST}:${IMAGE_PROVIDER_PORT}; +} + +upstream flagservice { + server ${FLAGD_HOST}:${FLAGD_PORT}; +} + +upstream flagd_ui { + server ${FLAGD_UI_HOST}:${FLAGD_UI_PORT}; +} + +upstream loadgen { + server ${LOCUST_WEB_HOST}:${LOCUST_WEB_PORT}; +} + +upstream grafana { + server ${GRAFANA_HOST}:${GRAFANA_PORT}; +} + +upstream jaeger { + server ${JAEGER_HOST}:${JAEGER_PORT}; +} + +# Server block (Mapped from Envoy's listener) +server { + listen ${ENVOY_PORT}; + server_name _; + + # Route mappings (Mapped from Envoy's virtual_hosts and routes) + location /loadgen { + proxy_pass http://loadgen/; + } + + location /otlp-http/ { + proxy_pass http://opentelemetry_collector_http/; + } + + location /jaeger { + proxy_pass http://jaeger/; + } + + location /grafana { + proxy_pass http://grafana/; + } + + location /images/ { + proxy_pass http://image_provider/; + } + + location /flagservice/ { + proxy_pass http://flagservice/; + } + + location /feature { + proxy_pass http://flagd_ui; + } + + location / { + proxy_pass http://frontend; + } + + # Fault injection (Natively unsupported in NGINX, requires the `ngx_http_fantasy` or similar module) + # Uncomment the lines below if using a fault injection module + # location /some/path { + # proxy_pass http://some_upstream; + # fault_inject delay 500ms; # Example delay + # } + + # Access logging + # You can customize NGINX's logging format to emulate OpenTelemetry's structured logging + log_format otel_access_log '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent" ' + '$upstream_addr $request_time $upstream_response_time'; + + access_log /var/log/nginx/access.log otel_access_log; + + # Other configurations such as timeouts and error handling + proxy_connect_timeout 5s; + proxy_read_timeout 5s; + proxy_send_timeout 5s; +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/nginx.conf b/src/nginx-frontend-proxy/nginx.conf new file mode 100644 index 00000000..2c11784c --- /dev/null +++ b/src/nginx-frontend-proxy/nginx.conf @@ -0,0 +1,45 @@ +user nginx; +worker_processes auto; +load_module modules/ngx_otel_module.so; + +error_log /var/log/nginx/error.log notice; +pid /run/nginx.pid; +#load_module modules/ngx_otel_module.so; + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + otel_exporter { + endpoint otel-collector:4317; + } + otel_service_name nginx-frontendproxy; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + # Access logging + # You can customize NGINX's logging format to emulate OpenTelemetry's structured logging + log_format otel_access_log '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent" ' + '$upstream_addr $request_time $upstream_response_time'; + + access_log /var/log/nginx/access.log otel_access_log; + + # access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; +} \ No newline at end of file From 883ae2af93194b1c266189ac20c913c9c42cc5ba Mon Sep 17 00:00:00 2001 From: laurentpf5 <64307601+laurentpf5@users.noreply.github.com> Date: Thu, 22 May 2025 11:44:41 +0800 Subject: [PATCH 02/10] Update README.md --- README.md | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 0c6bb21c..3fab16bd 100644 --- a/README.md +++ b/README.md @@ -10,31 +10,8 @@ [![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/opentelemetry-demo)](https://artifacthub.io/packages/helm/opentelemetry-helm/opentelemetry-demo) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9247/badge)](https://www.bestpractices.dev/en/projects/9247) -## Welcome to the OpenTelemetry Astronomy Shop Demo - -This repository contains the OpenTelemetry Astronomy Shop, a microservice-based -distributed system intended to illustrate the implementation of OpenTelemetry in -a near real-world environment. - -Our goals are threefold: - -- Provide a realistic example of a distributed system that can be used to - demonstrate OpenTelemetry instrumentation and observability. -- Build a base for vendors, tooling authors, and others to extend and - demonstrate their OpenTelemetry integrations. -- Create a living example for OpenTelemetry contributors to use for testing new - versions of the API, SDK, and other components or enhancements. - -We've already made [huge -progress](https://github.com/open-telemetry/opentelemetry-demo/blob/main/CHANGELOG.md), -and development is ongoing. We hope to represent the full feature set of -OpenTelemetry across its languages in the future. - -If you'd like to help (**which we would love**), check out our [contributing -guidance](./CONTRIBUTING.md). - -If you'd like to extend this demo or maintain a fork of it, read our -[fork guidance](https://opentelemetry.io/docs/demo/forking/). +## Welcome to the OpenTelemetry Astronomy Shop Demo with NGINX Proxy +This is simple copy of the OpenTelemetry demo quickly hacked to replace the envoy proxy with nginx proxy. Everything else stays the same. ## Quick start From 617779ac9703fb285c6a32d03e0b79b3dc297477 Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Mon, 8 Sep 2025 01:03:07 +0000 Subject: [PATCH 03/10] cleaner --- .env | 9 ++-- docker-compose.minimal.yml | 16 +++---- docker-compose.yml | 11 +++-- src/nginx-frontend-proxy/Dockerfile | 9 ++-- src/nginx-frontend-proxy/nginx-proxy.conf | 53 +++++++++++++++++++---- 5 files changed, 68 insertions(+), 30 deletions(-) diff --git a/.env b/.env index c30114b8..7867c465 100644 --- a/.env +++ b/.env @@ -81,11 +81,12 @@ FRONTEND_PORT=8080 FRONTEND_ADDR=frontend:${FRONTEND_PORT} FRONTEND_DOCKERFILE=./src/frontend/Dockerfile -# Frontend Proxy (Envoy) +# Frontend Proxy (NGINX) FRONTEND_HOST=frontend -ENVOY_PORT=8080 -FRONTEND_PROXY_ADDR=frontend-proxy:${ENVOY_PORT} -FRONTEND_PROXY_DOCKERFILE=./src/frontend-proxy/Dockerfile +NGINX_PORT=8080 +FRONTEND_PROXY_ADDR=frontend-proxy:${NGINX_PORT} +# FRONTEND_PROXY_DOCKERFILE=./src/frontend-proxy/Dockerfile #Default NGINX Proxy +FRONTEND_PROXY_DOCKERFILE=./src/nginx-frontend-proxy/Dockerfile # Customs NGINX Proxy OTEL Instrumented # Image Provider diff --git a/docker-compose.minimal.yml b/docker-compose.minimal.yml index 426cbe31..1adbb7f1 100644 --- a/docker-compose.minimal.yml +++ b/docker-compose.minimal.yml @@ -242,22 +242,22 @@ services: condition: service_started logging: *logging - # Frontend Proxy (Envoy) + # Frontend Proxy (NGINX) frontend-proxy: - # image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend-proxy - image: frontend-proxy #NGINX Configuration + image: ${DEMO_VERSION}-frontend-proxy + # image: frontend-proxy #NGINX Configuration container_name: frontend-proxy build: context: ./ - # dockerfile: ${FRONTEND_PROXY_DOCKERFILE} # Envoy - dockerfile: ./src/nginx-frontend-proxy/Dockerfile # nginx + dockerfile: ${FRONTEND_PROXY_DOCKERFILE} # NGINX + # dockerfile: ./src/nginx-frontend-proxy/Dockerfile # nginx deploy: resources: limits: memory: 65M restart: unless-stopped ports: - - "${ENVOY_PORT}:${ENVOY_PORT}" + - "${NGINX_PORT}:${NGINX_PORT}" - 10000:10000 environment: - FRONTEND_PORT @@ -275,7 +275,7 @@ services: - OTEL_COLLECTOR_PORT_HTTP - OTEL_RESOURCE_ATTRIBUTES - OTEL_SERVICE_NAME=frontend-proxy - - ENVOY_PORT + - NGINX_PORT - FLAGD_HOST - FLAGD_PORT - FLAGD_UI_HOST @@ -618,7 +618,7 @@ services: condition: service_healthy logging: *logging environment: - - ENVOY_PORT + - NGINX_PORT - HOST_FILESYSTEM - OTEL_COLLECTOR_HOST - OTEL_COLLECTOR_PORT_GRPC diff --git a/docker-compose.yml b/docker-compose.yml index 08b6f7f8..632cb3bc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -318,18 +318,21 @@ services: # Frontend Proxy (Envoy) frontend-proxy: - image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend-proxy + # image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend-proxy # Default Envoy Proxy + image: ${DEMO_VERSION}-frontend-proxy + # image: frontend-proxy #NGINX Version of the proxy container_name: frontend-proxy build: context: ./ dockerfile: ${FRONTEND_PROXY_DOCKERFILE} + # dockerfile: ./src/nginx-frontend-proxy/Dockerfile #NGINX Proxy instead of Envoy deploy: resources: limits: memory: 65M restart: unless-stopped ports: - - "${ENVOY_PORT}:${ENVOY_PORT}" + - "${NGINX_PORT}:${NGINX_PORT}" - 10000:10000 environment: - FRONTEND_PORT @@ -347,7 +350,7 @@ services: - OTEL_COLLECTOR_PORT_HTTP - OTEL_RESOURCE_ATTRIBUTES - OTEL_SERVICE_NAME=frontend-proxy - - ENVOY_PORT + - NGINX_PORT - FLAGD_HOST - FLAGD_PORT - FLAGD_UI_HOST @@ -762,7 +765,7 @@ services: condition: service_healthy logging: *logging environment: - - ENVOY_PORT + - NGINX_PORT - HOST_FILESYSTEM - OTEL_COLLECTOR_HOST - OTEL_COLLECTOR_PORT_GRPC diff --git a/src/nginx-frontend-proxy/Dockerfile b/src/nginx-frontend-proxy/Dockerfile index c08087f0..cb88c15a 100644 --- a/src/nginx-frontend-proxy/Dockerfile +++ b/src/nginx-frontend-proxy/Dockerfile @@ -1,15 +1,12 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -FROM npluscustom:latest +FROM nginx:1.27.0-otel + +# USER nginx -# USER envoy -# WORKDIR /home/envoy -# COPY ./src/frontend-proxy/envoy.tmpl.yaml envoy.tmpl.yaml -COPY ./src/nginx-frontend-proxy/license.jwt /etc/nginx/license.jwt COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf -# ENTRYPOINT ["/bin/sh", "-c", "envsubst < envoy.tmpl.yaml > envoy.yaml && envoy -c envoy.yaml;"] CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/nginx-frontend-proxy/nginx-proxy.conf b/src/nginx-frontend-proxy/nginx-proxy.conf index 9907a347..51e32dad 100644 --- a/src/nginx-frontend-proxy/nginx-proxy.conf +++ b/src/nginx-frontend-proxy/nginx-proxy.conf @@ -21,9 +21,9 @@ upstream flagservice { server flagd:8013; } -# upstream flagd_ui { -# server flagd-ui:4000; -# } +upstream flagd_ui { + server flagd-ui:4000; +} upstream loadgen { server load-generator:8089; @@ -47,58 +47,95 @@ server { otel_trace on; # /loadgen -> loadgen upstream location /loadgen { + # otel_trace_context propagate; proxy_pass http://loadgen/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + # proxy_set_header tracestate $otel_trace_state; rewrite ^/loadgen/?(.*)$ /$1 break; } # /otlp-http/ -> opentelemetry_collector_http upstream location /otlp-http/ { + # otel_trace_context propagate; proxy_pass http://opentelemetry_collector_http/; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + # proxy_set_header tracestate $otel_trace_state; rewrite ^/otlp-http/?(.*)$ /$1 break; } # /jaeger -> jaeger upstream location /jaeger { + # otel_trace_context propagate; proxy_pass http://jaeger; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + # proxy_set_header tracestate $otel_trace_state; } # /grafana -> grafana upstream location /grafana { + # otel_trace_context propagate; proxy_pass http://grafana; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + # proxy_set_header tracestate $otel_trace_state; } # /images/ -> image_provider upstream location /images/ { + # otel_trace_context propagate; proxy_pass http://image_provider/; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + # proxy_set_header tracestate $otel_trace_state; rewrite ^/images/?(.*)$ /$1 break; } # /flagservice/ -> flagservice upstream location /flagservice/ { + # otel_trace_context propagate; proxy_pass http://flagservice/; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; rewrite ^/flagservice/?(.*)$ /$1 break; # No timeout (timeout: 0s in Envoy) proxy_read_timeout 0; } - # /feature -> flagd_ui upstream - # location /feature { - # proxy_pass http://flagd_ui; - # proxy_set_header Host $host; - # } + #feature -> flagd_ui upstream + location /feature { + proxy_pass http://flagd_ui; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + } # catch-all ("/") -> frontend upstream location / { + otel_trace $otel_parent_sampled; + otel_trace_context propagate; proxy_pass http://frontend; proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + otel_span_attr "request.id" $http_x_request_id; + proxy_set_header traceparent $otel_trace_id; + # proxy_set_header tracestate $otel_trace_state; } } \ No newline at end of file From 57d38fba483e56cd2293a6faf5e201fbd7583376 Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Mon, 8 Sep 2025 03:34:01 +0000 Subject: [PATCH 04/10] nplus added --- src/nginx-frontend-proxy/Dockerfile | 23 +++++++++++++++---- src/nginx-frontend-proxy/Dockerfile.nplus | 27 +++++++++++++++++++++++ src/nginx-frontend-proxy/Dockerfile.oss | 12 ++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/nginx-frontend-proxy/Dockerfile.nplus create mode 100644 src/nginx-frontend-proxy/Dockerfile.oss diff --git a/src/nginx-frontend-proxy/Dockerfile b/src/nginx-frontend-proxy/Dockerfile index cb88c15a..9dc6f6a4 100644 --- a/src/nginx-frontend-proxy/Dockerfile +++ b/src/nginx-frontend-proxy/Dockerfile @@ -1,9 +1,24 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 +# ----------------------------------------------------------------------------- +# Using module image layer from private-registry.nginx.com/ to build a NGINX +# Plus with Additional modules and Agent (V2) in rootles mode. +# ----------------------------------------------------------------------------- + +# Stage: Set Misc Module +FROM private-registry.nginx.com/nginx-plus/modules:set_misc AS set_misc +# Stage: OpenTelemetry Module +FROM private-registry.nginx.com/nginx-plus/modules:otel AS otel +# Stage: Substitution Filter Module +FROM private-registry.nginx.com/nginx-plus/modules:subs_filter AS subs_filter +# Final Stage: Rootless NGINX Plus +FROM private-registry.nginx.com/nginx-plus/base:r35 +# Copy modules from the build stages +COPY --from=set_misc / / +COPY --from=otel / / +COPY --from=subs_filter / / -FROM nginx:1.27.0-otel +#Copy license file to directory -# USER nginx +COPY ./src/nginx-frontend-proxy/license.jwt /etc/nginx/license.jwt COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf diff --git a/src/nginx-frontend-proxy/Dockerfile.nplus b/src/nginx-frontend-proxy/Dockerfile.nplus new file mode 100644 index 00000000..9dc6f6a4 --- /dev/null +++ b/src/nginx-frontend-proxy/Dockerfile.nplus @@ -0,0 +1,27 @@ +# ----------------------------------------------------------------------------- +# Using module image layer from private-registry.nginx.com/ to build a NGINX +# Plus with Additional modules and Agent (V2) in rootles mode. +# ----------------------------------------------------------------------------- + +# Stage: Set Misc Module +FROM private-registry.nginx.com/nginx-plus/modules:set_misc AS set_misc +# Stage: OpenTelemetry Module +FROM private-registry.nginx.com/nginx-plus/modules:otel AS otel +# Stage: Substitution Filter Module +FROM private-registry.nginx.com/nginx-plus/modules:subs_filter AS subs_filter +# Final Stage: Rootless NGINX Plus +FROM private-registry.nginx.com/nginx-plus/base:r35 +# Copy modules from the build stages +COPY --from=set_misc / / +COPY --from=otel / / +COPY --from=subs_filter / / + +#Copy license file to directory + +COPY ./src/nginx-frontend-proxy/license.jwt /etc/nginx/license.jwt + +COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf +COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf + + +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/nginx-frontend-proxy/Dockerfile.oss b/src/nginx-frontend-proxy/Dockerfile.oss new file mode 100644 index 00000000..cb88c15a --- /dev/null +++ b/src/nginx-frontend-proxy/Dockerfile.oss @@ -0,0 +1,12 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +FROM nginx:1.27.0-otel + +# USER nginx + +COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf +COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf + + +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file From 20e1d68791560f1bdba9adfeb6ad233d5d764d5d Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Mon, 8 Sep 2025 08:51:44 +0000 Subject: [PATCH 05/10] OSS validatee --- src/nginx-frontend-proxy/Dockerfile | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/nginx-frontend-proxy/Dockerfile b/src/nginx-frontend-proxy/Dockerfile index 9dc6f6a4..cb88c15a 100644 --- a/src/nginx-frontend-proxy/Dockerfile +++ b/src/nginx-frontend-proxy/Dockerfile @@ -1,24 +1,9 @@ -# ----------------------------------------------------------------------------- -# Using module image layer from private-registry.nginx.com/ to build a NGINX -# Plus with Additional modules and Agent (V2) in rootles mode. -# ----------------------------------------------------------------------------- - -# Stage: Set Misc Module -FROM private-registry.nginx.com/nginx-plus/modules:set_misc AS set_misc -# Stage: OpenTelemetry Module -FROM private-registry.nginx.com/nginx-plus/modules:otel AS otel -# Stage: Substitution Filter Module -FROM private-registry.nginx.com/nginx-plus/modules:subs_filter AS subs_filter -# Final Stage: Rootless NGINX Plus -FROM private-registry.nginx.com/nginx-plus/base:r35 -# Copy modules from the build stages -COPY --from=set_misc / / -COPY --from=otel / / -COPY --from=subs_filter / / +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 -#Copy license file to directory +FROM nginx:1.27.0-otel -COPY ./src/nginx-frontend-proxy/license.jwt /etc/nginx/license.jwt +# USER nginx COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf From cc701b7d088da5b0072054d5a10b252548c61b9f Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Tue, 9 Sep 2025 01:20:54 +0000 Subject: [PATCH 06/10] Nplus noss --- .../dashboards/demo/NGINXPlus_Dashboard.json | 3787 +++++++++++++++++ src/nginx-frontend-proxy/Dockerfile | 3 +- src/nginx-frontend-proxy/Dockerfile.nplus | 6 +- src/nginx-frontend-proxy/Dockerfile.oss | 6 +- src/nginx-frontend-proxy/dashboard.conf | 24 + src/nginx-frontend-proxy/dashboard.conf.oss | 13 + src/nginx-frontend-proxy/dashboard.conf.plus | 24 + src/nginx-frontend-proxy/nginx.conf | 7 +- src/nginx-frontend-proxy/nginx.conf.oss | 52 + src/nginx-frontend-proxy/nginx.conf.plus | 48 + src/prometheus/prometheus-config.yaml | 11 + 11 files changed, 3974 insertions(+), 7 deletions(-) create mode 100644 src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json create mode 100644 src/nginx-frontend-proxy/dashboard.conf create mode 100644 src/nginx-frontend-proxy/dashboard.conf.oss create mode 100644 src/nginx-frontend-proxy/dashboard.conf.plus create mode 100644 src/nginx-frontend-proxy/nginx.conf.oss create mode 100644 src/nginx-frontend-proxy/nginx.conf.plus diff --git a/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json b/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json new file mode 100644 index 00000000..f82fcd95 --- /dev/null +++ b/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json @@ -0,0 +1,3787 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "NGINX Plus native prometheus module supported", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.0.1" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Nginx plus native observability, through the dynamic module api output nginx plus real-time status data, including global statistics, ssl status, server / location / upstream status, upstream server active health check results. Enhance the reliability of nginx plus business operation, you can Inherit to any environment, including kubernetes.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 40, + "panels": [], + "title": "Global Performance", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": true, + "inspect": false + }, + "decimals": 1, + "mappings": [ + { + "options": { + "0": { + "index": 1, + "text": "Down" + }, + "1": { + "index": 0, + "text": "Up" + } + }, + "type": "value" + } + ], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Status" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + }, + { + "id": "custom.width", + "value": 100 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "address" + }, + "properties": [ + { + "id": "custom.width", + "value": 150 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "version" + }, + "properties": [ + { + "id": "custom.width", + "value": 150 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "build" + }, + "properties": [ + { + "id": "custom.width", + "value": 150 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 39, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 1, + "showHeader": true + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(up{ job=\"$job\"}) by (instance) ", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "nginxplus_nginx_config_generation{ job=\"$job\"}", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "__auto", + "range": false, + "refId": "B" + } + ], + "title": "NGINX INSTANCE Status", + "transformations": [ + { + "id": "merge", + "options": {} + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value #B": true, + "__name__": true, + "job": true, + "ppid": true, + "version": false + }, + "indexByName": { + "Time": 0, + "Value #A": 5, + "Value #B": 9, + "__name__": 6, + "address": 4, + "build": 2, + "instance": 1, + "job": 7, + "ppid": 8, + "version": 3 + }, + "renameByName": { + "Time": "", + "Value": "Status", + "Value #A": "Status", + "__name__": "", + "server": "Server", + "upstream": "Upstream" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 1 + }, + "id": 47, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "nginxplus_http_requests_current{job=\"$job\"}", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Current {{instance}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_http_requests_total{job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Request/s {{instance}}", + "range": true, + "refId": "D" + } + ], + "title": "NGINX INSTANCE HTTP Performance", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 1 + }, + "id": 43, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "nginxplus_connections_active{job=\"$job\"}", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "curConn - {{instance}}", + "range": true, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_connections_accepted{job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "CPS {{instance}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_connections_idle{job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Idle {{instance}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_connections_dropped{job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Drop - {{instance}}", + "range": true, + "refId": "C" + } + ], + "title": "NGINX Plus Connections", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 0, + "y": 10 + }, + "id": 60, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_nginx_config_generation{job='$job'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "INSTANCE Counts", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 4, + "y": 10 + }, + "id": 62, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_server_zone_requests{job='$job'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Server Zone Counts", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 8, + "y": 10 + }, + "id": 61, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_location_zone_requests{job='$job'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Location Counts", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 12, + "y": 10 + }, + "id": 54, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_upstream_server_state{job='$job', server=~\".+\", upstream=~\".+\" } == 1) / count(nginxplus_upstream_server_state{job='$job'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Availability", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 16, + "y": 10 + }, + "id": 55, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_upstream_server_state{job='$job'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Counts", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "semi-dark-red", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 20, + "y": 10 + }, + "id": 59, + "options": { + "colorMode": "background_solid", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_upstream_server_state{job='$job'} != 1 )", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Unhealthy", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 48, + "panels": [], + "title": "Instance SSL Performance", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "TPS" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 45, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_handshakes{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Handshakes", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_session_reuses{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Session Reuses", + "range": true, + "refId": "D" + } + ], + "title": "SSL Handshake Successfully", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "TPS" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 46, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_handshake_timeout{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Handshake Timeout", + "range": true, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_handshakes_failed{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Handshake Failed", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_no_common_cipher{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "No Common Cipher", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_no_common_protocol{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "No Common Prototocol", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_peer_rejected_cert{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Rejected Cert", + "range": true, + "refId": "D" + } + ], + "title": "SSL Handshake Failed", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "TPS" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 49, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_verify_failures_expired_cert{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Expired Cert", + "range": true, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_verify_failures_no_cert{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "No Cert", + "range": true, + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_verify_failures_other{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Other", + "range": true, + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_verify_failures_revoked_cert{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Revoked Cert", + "range": true, + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_ssl_verify_failures_hostname_mismatch{instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Hostname Mismatch", + "range": true, + "refId": "J" + } + ], + "title": "SSL Verify Failures", + "transformations": [], + "type": "timeseries" + }, + { + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 36, + "title": "Server Status", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "semi-dark-red", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": false, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "4xx" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "5xx" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 33, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"1xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"2xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"3xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"4xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"5xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_requests{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_requests{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"} [$__rate_interval]) ", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "nginxplus_server_zone_processing{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"}", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_received{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_server_zone_sent{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"}[$__range])) by (server_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "J" + } + ], + "title": "Server Requests / Responses", + "transformations": [ + { + "id": "merge", + "options": {} + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "__name__": true, + "instance": true, + "job": true + }, + "indexByName": { + "Time": 0, + "Value #A": 5, + "Value #B": 6, + "Value #C": 7, + "Value #D": 8, + "Value #E": 9, + "Value #F": 2, + "Value #G": 3, + "Value #H": 4, + "__name__": 12, + "instance": 10, + "job": 11, + "server_zone": 1 + }, + "renameByName": { + "Value #A": "1xx", + "Value #B": "2xx", + "Value #C": "3xx", + "Value #D": "4xx", + "Value #E": "5xx", + "Value #F": "Total", + "Value #G": "Req/s", + "Value #H": "Current", + "Value #I": "Bytes Recvd", + "Value #J": "Bytes Send", + "instance": "", + "job": "", + "server_zone": "" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 33 + }, + "id": 34, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_requests{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "{{server_zone}}", + "range": true, + "refId": "G" + } + ], + "title": "Server Zone - HTTP TPS", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "TPS" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 33 + }, + "id": 42, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"handshakes\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Handshakes - {{server_zone}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"session_reuses\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Session Reuses - {{server_zone}}", + "range": true, + "refId": "D" + } + ], + "title": "SSL Handshake Successfully", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 41 + }, + "id": 52, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "irate(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"1xx\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "instant": false, + "legendFormat": "1xx - {{server_zone}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "irate(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"2xx\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "instant": false, + "legendFormat": "2xx - {{server_zone}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "irate(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"3xx\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "instant": false, + "legendFormat": "3xx - {{server_zone}}", + "range": true, + "refId": "C" + } + ], + "title": "Server Zone - HTTP Response 1xx/2xx/3xx", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "light-red", + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 41 + }, + "id": 53, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"4xx\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "4xx - {{server_zone}}", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_responses{server_zone=~\".+\", code=\"5xx\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "instant": false, + "legendFormat": "5xx - {{server_zone}}", + "range": true, + "refId": "E" + } + ], + "title": "Server Zone - HTTP Response 4xx/5xx", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 49 + }, + "id": 38, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_received{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Bytes recvd {{server_zone}}", + "range": true, + "refId": "A" + } + ], + "title": "Server Zone - Traffic In", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 49 + }, + "id": 50, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_sent{server_zone=~\".+\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Bytes send {{server_zone}}", + "range": true, + "refId": "G" + } + ], + "title": "Server Zone - Traffic Out", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 49 + }, + "id": 41, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"handshake_timeout\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Timeout - {{server_zone}}", + "range": true, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"handshakes_failed\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Failed - {{server_zone}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"no_common_cipher\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "No cipher - {{server_zone}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"no_common_protocol\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "No Proto - {{server_zone}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl{server_zone=~\".+\", event=\"peer_rejected_cert\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Peer Rejected - {{server_zone}}", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl_verify_failures{server_zone=~\".+\", verify_failure=\"expired_cert\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Expired Cert - {{server_zone}}", + "range": true, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl_verify_failures{server_zone=~\".+\", verify_failure=\"no_cert\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "No Cert - {{server_zone}}", + "range": true, + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl_verify_failures{server_zone=~\".+\", verify_failure=\"other\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Other - {{server_zone}}", + "range": true, + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_server_zone_ssl_verify_failures{server_zone=~\".+\", verify_failure=\"revoked_cert\", instance=\"$instance\", job=\"$job\"} [$__rate_interval])", + "format": "time_series", + "hide": false, + "instant": false, + "legendFormat": "Revoked Cert - {{server_zone}}", + "range": true, + "refId": "I" + } + ], + "title": "SSL Handshake Failed", + "transformations": [], + "type": "timeseries" + }, + { + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 57 + }, + "id": 35, + "title": "Location Zone", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": false, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "4xx" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "5xx" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 58 + }, + "id": 51, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_responses{location_zone=~\".+\", code=\"1xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_responses{location_zone=~\".+\", code=\"2xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_responses{location_zone=~\".+\", code=\"3xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_responses{location_zone=~\".+\", code=\"4xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_responses{location_zone=~\".+\", code=\"5xx\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_requests{location_zone=~\".+\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "irate(nginxplus_location_zone_requests{location_zone=~\".+\", instance=\"$instance\", job=\"$job\"} [$__range]) ", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_received{location_zone=~\".+\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(nginxplus_location_zone_sent{location_zone=~\".+\", instance=\"$instance\", job=\"$job\"}[$__range])) by (location_zone)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "J" + } + ], + "title": "Location Requests / Responses", + "transformations": [ + { + "id": "merge", + "options": {} + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "__name__": true, + "instance": true, + "job": true + }, + "indexByName": { + "Time": 0, + "Value #A": 4, + "Value #B": 5, + "Value #C": 6, + "Value #D": 7, + "Value #E": 8, + "Value #F": 2, + "Value #G": 3, + "Value #I": 11, + "Value #J": 12, + "instance": 9, + "job": 10, + "location_zone": 1 + }, + "renameByName": { + "Value #A": "1xx", + "Value #B": "2xx", + "Value #C": "3xx", + "Value #D": "4xx", + "Value #E": "5xx", + "Value #F": "Total", + "Value #G": "Req/s", + "Value #H": "Current", + "Value #I": "Bytes Recvd", + "Value #J": "Bytes Send", + "instance": "", + "job": "", + "location_zone": "Location Zone", + "server_zone": "" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 65 + }, + "id": 37, + "panels": [], + "title": "Upstream Zone", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": true, + "inspect": false + }, + "decimals": 1, + "mappings": [ + { + "options": { + "1": { + "index": 0, + "text": "Up" + }, + "2": { + "index": 1, + "text": "Draining" + }, + "3": { + "index": 2, + "text": "Down" + }, + "4": { + "index": 3, + "text": "Unavail" + }, + "5": { + "index": 4, + "text": "Checking" + }, + "6": { + "index": 5, + "text": "Unhealthy" + } + }, + "type": "value" + } + ], + "max": 6, + "min": 1, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Status" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 7, + "x": 0, + "y": 66 + }, + "id": 16, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "enablePagination": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 1, + "showHeader": true + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(nginxplus_upstream_server_state{server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}) by (upstream,server) ", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Upstream Server State (De-duplication)", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + }, + "indexByName": { + "Time": 0, + "Value": 3, + "server": 2, + "upstream": 1 + }, + "renameByName": { + "Time": "", + "Value": "Status", + "server": "Server", + "upstream": "Upstream" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 7, + "y": 66 + }, + "id": 58, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_upstream_server_state{job='$job', instance='$instance'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Counts", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-RdYlGr" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 11, + "y": 66 + }, + "id": 57, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_upstream_server_state{job='$job', instance='$instance', server=~\".+\", upstream=~\".+\" } == 1) / count(nginxplus_upstream_server_state{job='$job', instance='$instance'})", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Availability", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 15, + "y": 66 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_requests{server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "{{upstream}} - {{server}}", + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server TPS", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "semi-dark-red", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 7, + "y": 70 + }, + "id": 56, + "options": { + "colorMode": "background_solid", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "count(nginxplus_upstream_server_state{job='$job', instance='$instance'} != 1 )", + "instant": false, + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Unhealthy", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 74 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_responses{code=\"1xx\", server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "1xx - {{upstream}} - {{server}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_responses{code=\"2xx\", server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "2xx - {{upstream}} - {{server}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_responses{code=\"3xx\", server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "3xx - {{upstream}} - {{server}}", + "range": true, + "refId": "C" + } + ], + "title": "Upstream Server Resp 1xx/2xx/3xx", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 74 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_responses{code=\"4xx\", server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "4xx - {{upstream}} - {{server}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_responses{code=\"5xx\", server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "5xx - {{upstream}} - {{server}}", + "range": true, + "refId": "B" + } + ], + "title": "Upstream Server Resp 4xx/5xx", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "miliseconds", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 82 + }, + "id": 28, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "nginxplus_upstream_server_response_time{server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}", + "interval": "", + "legendFormat": "{{upstream}} - {{server}}", + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Resp Time", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 82 + }, + "id": 26, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "irate(nginxplus_upstream_server_fails{server=~\".+\", upstream=~\".+\", instance=\"$instance\", job=\"$job\"}[$__rate_interval])", + "interval": "", + "legendFormat": "{{upstream}} - {{server}}", + "range": true, + "refId": "A" + } + ], + "title": "Upstream Server Fails", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "datasource": { + "type": "prometheus", + "uid": "e200b1fb-5f1a-4c6e-999c-c661c8421158" + }, + "filters": [], + "hide": 0, + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(up,job)", + "hide": 0, + "includeAll": false, + "label": "job", + "multi": false, + "name": "job", + "options": [], + "query": { + "query": "label_values(up,job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "nginxplus.*", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(up{job='$job'},instance)", + "hide": 0, + "includeAll": false, + "label": "instance", + "multi": false, + "name": "instance", + "options": [], + "query": { + "query": "label_values(up{job='$job'},instance)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "NGINX Plus Dashboard", + "uid": "RizyIIDnk", + "version": 36, + "weekStart": "", + "gnetId": 19314 +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/Dockerfile b/src/nginx-frontend-proxy/Dockerfile index cb88c15a..6a8df08c 100644 --- a/src/nginx-frontend-proxy/Dockerfile +++ b/src/nginx-frontend-proxy/Dockerfile @@ -5,8 +5,9 @@ FROM nginx:1.27.0-otel # USER nginx +COPY ./src/nginx-frontend-proxy/dashboard.conf.oss /etc/nginx/conf.d/dasboard.conf COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf -COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf +COPY ./src/nginx-frontend-proxy/nginx.conf.oss /etc/nginx/nginx.conf CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/nginx-frontend-proxy/Dockerfile.nplus b/src/nginx-frontend-proxy/Dockerfile.nplus index 9dc6f6a4..24c530a6 100644 --- a/src/nginx-frontend-proxy/Dockerfile.nplus +++ b/src/nginx-frontend-proxy/Dockerfile.nplus @@ -9,19 +9,23 @@ FROM private-registry.nginx.com/nginx-plus/modules:set_misc AS set_misc FROM private-registry.nginx.com/nginx-plus/modules:otel AS otel # Stage: Substitution Filter Module FROM private-registry.nginx.com/nginx-plus/modules:subs_filter AS subs_filter +# Stage: Substitution njs Module +FROM private-registry.nginx.com/nginx-plus/modules:prometheus AS prometheus # Final Stage: Rootless NGINX Plus FROM private-registry.nginx.com/nginx-plus/base:r35 # Copy modules from the build stages COPY --from=set_misc / / COPY --from=otel / / COPY --from=subs_filter / / +COPY --from=prometheus / / #Copy license file to directory COPY ./src/nginx-frontend-proxy/license.jwt /etc/nginx/license.jwt +COPY ./src/nginx-frontend-proxy/dashboard.conf /etc/nginx/conf.d/dashboard.conf COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf -COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf +COPY ./src/nginx-frontend-proxy/nginx.conf.plus /etc/nginx/nginx.conf CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/nginx-frontend-proxy/Dockerfile.oss b/src/nginx-frontend-proxy/Dockerfile.oss index cb88c15a..f8ecbd84 100644 --- a/src/nginx-frontend-proxy/Dockerfile.oss +++ b/src/nginx-frontend-proxy/Dockerfile.oss @@ -1,12 +1,12 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -FROM nginx:1.27.0-otel +FROM nginx:1.28.0-otel -# USER nginx +COPY ./src/nginx-frontend-proxy/dashboard.conf.oss /etc/nginx/conf.d/dasboard.conf COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf -COPY ./src/nginx-frontend-proxy/nginx.conf /etc/nginx/nginx.conf +COPY ./src/nginx-frontend-proxy/nginx.conf.oss /etc/nginx/nginx.conf CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/src/nginx-frontend-proxy/dashboard.conf b/src/nginx-frontend-proxy/dashboard.conf new file mode 100644 index 00000000..a8755e47 --- /dev/null +++ b/src/nginx-frontend-proxy/dashboard.conf @@ -0,0 +1,24 @@ +server { + + listen 8091; + + location /api { + api write=on; + allow all; + } + location /nginx_status { + stub_status; + allow all; + # deny all; + } + location / { + root /usr/share/nginx/html; + index dashboard.html; + } + location = /dashboard.html { + root /usr/share/nginx/html; + } + location = /metrics { + js_content prometheus.metrics; + } +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/dashboard.conf.oss b/src/nginx-frontend-proxy/dashboard.conf.oss new file mode 100644 index 00000000..91f5d854 --- /dev/null +++ b/src/nginx-frontend-proxy/dashboard.conf.oss @@ -0,0 +1,13 @@ +server { + + listen 8091; + + location /nginx_status { + stub_status; + allow all; + # deny all; + } + location = /metrics { + stub_status; + } +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/dashboard.conf.plus b/src/nginx-frontend-proxy/dashboard.conf.plus new file mode 100644 index 00000000..a8755e47 --- /dev/null +++ b/src/nginx-frontend-proxy/dashboard.conf.plus @@ -0,0 +1,24 @@ +server { + + listen 8091; + + location /api { + api write=on; + allow all; + } + location /nginx_status { + stub_status; + allow all; + # deny all; + } + location / { + root /usr/share/nginx/html; + index dashboard.html; + } + location = /dashboard.html { + root /usr/share/nginx/html; + } + location = /metrics { + js_content prometheus.metrics; + } +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/nginx.conf b/src/nginx-frontend-proxy/nginx.conf index 2c11784c..205257f9 100644 --- a/src/nginx-frontend-proxy/nginx.conf +++ b/src/nginx-frontend-proxy/nginx.conf @@ -1,10 +1,12 @@ user nginx; worker_processes auto; load_module modules/ngx_otel_module.so; +load_module modules/ngx_http_js_module.so; + error_log /var/log/nginx/error.log notice; pid /run/nginx.pid; -#load_module modules/ngx_otel_module.so; + events { worker_connections 1024; @@ -14,7 +16,8 @@ events { http { include /etc/nginx/mime.types; default_type application/octet-stream; - + + otel_exporter { endpoint otel-collector:4317; } diff --git a/src/nginx-frontend-proxy/nginx.conf.oss b/src/nginx-frontend-proxy/nginx.conf.oss new file mode 100644 index 00000000..b205a34c --- /dev/null +++ b/src/nginx-frontend-proxy/nginx.conf.oss @@ -0,0 +1,52 @@ +user nginx; +worker_processes auto; +load_module modules/ngx_otel_module.so; +load_module modules/ngx_http_js_module.so; + + +error_log /var/log/nginx/error.log notice; +pid /run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + + otel_exporter { + endpoint otel-collector:4317; + } + otel_service_name nginx-frontendproxy; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + # Access logging + # You can customize NGINX's logging format to emulate OpenTelemetry's structured logging + log_format otel_access_log '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent" ' + '$upstream_addr $request_time $upstream_response_time'; + log_format metrics '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log otel_access_log; + access_log /var/log/nginx/access.log metrics; + + # access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; +} \ No newline at end of file diff --git a/src/nginx-frontend-proxy/nginx.conf.plus b/src/nginx-frontend-proxy/nginx.conf.plus new file mode 100644 index 00000000..205257f9 --- /dev/null +++ b/src/nginx-frontend-proxy/nginx.conf.plus @@ -0,0 +1,48 @@ +user nginx; +worker_processes auto; +load_module modules/ngx_otel_module.so; +load_module modules/ngx_http_js_module.so; + + +error_log /var/log/nginx/error.log notice; +pid /run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + + otel_exporter { + endpoint otel-collector:4317; + } + otel_service_name nginx-frontendproxy; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + # Access logging + # You can customize NGINX's logging format to emulate OpenTelemetry's structured logging + log_format otel_access_log '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent" ' + '$upstream_addr $request_time $upstream_response_time'; + + access_log /var/log/nginx/access.log otel_access_log; + + # access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; +} \ No newline at end of file diff --git a/src/prometheus/prometheus-config.yaml b/src/prometheus/prometheus-config.yaml index 7ba23eed..25f3f0a4 100644 --- a/src/prometheus/prometheus-config.yaml +++ b/src/prometheus/prometheus-config.yaml @@ -19,3 +19,14 @@ otlp: storage: tsdb: out_of_order_time_window: 30m + +scrape_configs: + - job_name: nginxplus-target + honor_timestamps: true + scrape_interval: 5s + scrape_timeout: 5s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: ['frontend-proxy:8091'] \ No newline at end of file From 82a8f900042759357e7814be08b7f538d160768a Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Thu, 11 Sep 2025 01:43:21 +0000 Subject: [PATCH 07/10] OSS as a default --- .../provisioning/dashboards/demo/NGINXPlus_Dashboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json b/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json index f82fcd95..52dd2d1b 100644 --- a/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json +++ b/src/grafana/provisioning/dashboards/demo/NGINXPlus_Dashboard.json @@ -57,7 +57,7 @@ "target": { "limit": 100, "matchAny": false, - "tags": [], + "tags": ["NGINX Plus"], "type": "dashboard" }, "type": "dashboard" From 3b89ead24b0f1ff2b45392c5bf668d0d2ddd5a1d Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Thu, 11 Sep 2025 01:57:39 +0000 Subject: [PATCH 08/10] Instructions updated --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 3fab16bd..0bc00355 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,21 @@ ## Welcome to the OpenTelemetry Astronomy Shop Demo with NGINX Proxy This is simple copy of the OpenTelemetry demo quickly hacked to replace the envoy proxy with nginx proxy. Everything else stays the same. +To run NGINX Open Source, simply issue the following command : +```shell +$ cd src/nginx-frontend-proxy/ +$ cp Dockerfil.oss Dockerfile +``` +To run NGINX+, you must get a valid license (trial) in the form of a 'license.jwt' file. Then issue the following commands : +```shell +$ cd src/nginx-frontend-proxy/ +$ cp Dockerfil.nplus Dockerfile +``` +Now to build the frontend-proxy image with NGINX, issue the following: +```shell +$ docker build -f src/nginx-frontend-proxy/Dockerfile -t latest-frontend-proxy . +``` + ## Quick start From 167dc0359e56d1232060b8ddd8af5f38f65d1551 Mon Sep 17 00:00:00 2001 From: laurentpf5 Date: Thu, 11 Sep 2025 05:09:27 +0000 Subject: [PATCH 09/10] Dockerfile edit --- src/nginx-frontend-proxy/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nginx-frontend-proxy/Dockerfile b/src/nginx-frontend-proxy/Dockerfile index 6a8df08c..f8ecbd84 100644 --- a/src/nginx-frontend-proxy/Dockerfile +++ b/src/nginx-frontend-proxy/Dockerfile @@ -1,9 +1,8 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -FROM nginx:1.27.0-otel +FROM nginx:1.28.0-otel -# USER nginx COPY ./src/nginx-frontend-proxy/dashboard.conf.oss /etc/nginx/conf.d/dasboard.conf COPY ./src/nginx-frontend-proxy/nginx-proxy.conf /etc/nginx/conf.d/nginx-proxy.conf From 71957786c51b5d5a0d3404d71e6f61623c60ff94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:18:42 +0000 Subject: [PATCH 10/10] build(deps): bump the bundler-production-dependencies group across 1 directory with 6 updates Bumps the bundler-production-dependencies group with 3 updates in the /src/email directory: [net-smtp](https://github.com/ruby/net-smtp), [puma](https://github.com/puma/puma) and [sinatra](https://github.com/sinatra/sinatra). Updates `net-smtp` from 0.4.0 to 0.5.1 - [Release notes](https://github.com/ruby/net-smtp/releases) - [Changelog](https://github.com/ruby/net-smtp/blob/master/NEWS.md) - [Commits](https://github.com/ruby/net-smtp/compare/v0.4.0...v0.5.1) Updates `puma` from 6.4.0 to 6.6.0 - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v6.4.0...v6.6.0) Updates `sinatra` from 3.1.0 to 4.1.1 - [Changelog](https://github.com/sinatra/sinatra/blob/main/CHANGELOG.md) - [Commits](https://github.com/sinatra/sinatra/compare/v3.1.0...v4.1.1) Updates `opentelemetry-sdk` from 1.3.1 to 1.4.1 - [Release notes](https://github.com/open-telemetry/opentelemetry-ruby/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/sdk/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-ruby/compare/opentelemetry-sdk/v1.3.1...opentelemetry-sdk/v1.4.1) Updates `opentelemetry-exporter-otlp` from 0.26.1 to 0.26.3 - [Release notes](https://github.com/open-telemetry/opentelemetry-ruby/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/exporter/otlp/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-ruby/compare/opentelemetry-exporter-otlp/v0.26.1...opentelemetry-exporter-otlp/v0.26.3) Updates `opentelemetry-instrumentation-all` from 0.51.1 to 0.60.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-ruby-contrib/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/main/instrumentation/all/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-ruby-contrib/compare/opentelemetry-instrumentation-all/v0.51.1...opentelemetry-instrumentation-all/v0.60.0) --- updated-dependencies: - dependency-name: net-smtp dependency-version: 0.5.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: bundler-production-dependencies - dependency-name: puma dependency-version: 6.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: bundler-production-dependencies - dependency-name: sinatra dependency-version: 4.1.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: bundler-production-dependencies - dependency-name: opentelemetry-sdk dependency-version: 1.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: bundler-production-dependencies - dependency-name: opentelemetry-exporter-otlp dependency-version: 0.26.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: bundler-production-dependencies - dependency-name: opentelemetry-instrumentation-all dependency-version: 0.60.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: bundler-production-dependencies ... Signed-off-by: dependabot[bot] --- src/email/Gemfile | 6 +- src/email/Gemfile.lock | 132 ++++++++++++++++++++++++----------------- 2 files changed, 79 insertions(+), 59 deletions(-) diff --git a/src/email/Gemfile b/src/email/Gemfile index 39e99955..e02d2fd1 100644 --- a/src/email/Gemfile +++ b/src/email/Gemfile @@ -2,10 +2,10 @@ source "https://rubygems.org" -gem "net-smtp", "~> 0.3" +gem "net-smtp", "~> 0.5" gem "pony", "~> 1.13" -gem "puma", "~> 6.3" -gem "sinatra", "~> 3.0" +gem "puma", "~> 7.0" +gem "sinatra", "~> 4.1" gem "opentelemetry-sdk", "~> 1.4.1" gem "opentelemetry-exporter-otlp", "~> 0.26.3" diff --git a/src/email/Gemfile.lock b/src/email/Gemfile.lock index 1652b188..0fc36b5b 100644 --- a/src/email/Gemfile.lock +++ b/src/email/Gemfile.lock @@ -1,62 +1,72 @@ GEM remote: https://rubygems.org/ specs: + base64 (0.3.0) date (3.3.3) google-protobuf (3.25.0-aarch64-linux) google-protobuf (3.25.0-arm64-darwin) google-protobuf (3.25.0-x86_64-linux) googleapis-common-protos-types (1.9.0) google-protobuf (~> 3.18) + logger (1.7.0) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp mini_mime (1.1.2) - mustermann (3.0.0) + mustermann (3.0.4) ruby2_keywords (~> 0.0.1) net-imap (0.3.6) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.4.0) + net-smtp (0.5.1) net-protocol - nio4r (2.5.9) + nio4r (2.7.4) opentelemetry-api (1.2.3) opentelemetry-common (0.20.0) opentelemetry-api (~> 1.0) - opentelemetry-exporter-otlp (0.26.1) + opentelemetry-exporter-otlp (0.26.3) google-protobuf (~> 3.14) googleapis-common-protos-types (~> 1.3) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-sdk (~> 1.2) opentelemetry-semantic_conventions - opentelemetry-instrumentation-action_pack (0.7.1) + opentelemetry-helpers-mysql (0.1.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.20) + opentelemetry-helpers-sql-obfuscation (0.1.0) + opentelemetry-common (~> 0.20) + opentelemetry-instrumentation-action_mailer (0.1.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.1) + opentelemetry-instrumentation-base (~> 0.22.1) + opentelemetry-instrumentation-action_pack (0.9.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-action_view (0.6.1) + opentelemetry-instrumentation-action_view (0.7.2) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-active_support (~> 0.1) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_job (0.6.1) + opentelemetry-instrumentation-active_job (0.7.8) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-active_model_serializers (0.20.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-active_record (0.6.3) + opentelemetry-instrumentation-active_record (0.7.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - ruby2_keywords - opentelemetry-instrumentation-active_support (0.4.4) + opentelemetry-instrumentation-active_support (0.5.3) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-all (0.51.1) + opentelemetry-instrumentation-all (0.60.0) opentelemetry-instrumentation-active_model_serializers (~> 0.20.1) opentelemetry-instrumentation-aws_sdk (~> 0.5.0) opentelemetry-instrumentation-bunny (~> 0.21.0) @@ -64,23 +74,23 @@ GEM opentelemetry-instrumentation-dalli (~> 0.25.0) opentelemetry-instrumentation-delayed_job (~> 0.22.0) opentelemetry-instrumentation-ethon (~> 0.21.1) - opentelemetry-instrumentation-excon (~> 0.21.1) - opentelemetry-instrumentation-faraday (~> 0.23.1) + opentelemetry-instrumentation-excon (~> 0.22.0) + opentelemetry-instrumentation-faraday (~> 0.24.0) opentelemetry-instrumentation-grape (~> 0.1.3) - opentelemetry-instrumentation-graphql (~> 0.26.2) - opentelemetry-instrumentation-gruf (~> 0.1.0) + opentelemetry-instrumentation-graphql (~> 0.28.0) + opentelemetry-instrumentation-gruf (~> 0.2.0) opentelemetry-instrumentation-http (~> 0.23.1) opentelemetry-instrumentation-http_client (~> 0.22.1) opentelemetry-instrumentation-koala (~> 0.20.1) opentelemetry-instrumentation-lmdb (~> 0.22.1) opentelemetry-instrumentation-mongo (~> 0.22.1) - opentelemetry-instrumentation-mysql2 (~> 0.25.0) + opentelemetry-instrumentation-mysql2 (~> 0.27.0) opentelemetry-instrumentation-net_http (~> 0.22.1) - opentelemetry-instrumentation-pg (~> 0.26.0) - opentelemetry-instrumentation-que (~> 0.7.0) + opentelemetry-instrumentation-pg (~> 0.27.0) + opentelemetry-instrumentation-que (~> 0.8.0) opentelemetry-instrumentation-racecar (~> 0.3.0) - opentelemetry-instrumentation-rack (~> 0.23.1) - opentelemetry-instrumentation-rails (~> 0.28.0) + opentelemetry-instrumentation-rack (~> 0.24.0) + opentelemetry-instrumentation-rails (~> 0.30.0) opentelemetry-instrumentation-rake (~> 0.2.1) opentelemetry-instrumentation-rdkafka (~> 0.4.0) opentelemetry-instrumentation-redis (~> 0.25.1) @@ -89,7 +99,7 @@ GEM opentelemetry-instrumentation-ruby_kafka (~> 0.21.0) opentelemetry-instrumentation-sidekiq (~> 0.25.0) opentelemetry-instrumentation-sinatra (~> 0.23.1) - opentelemetry-instrumentation-trilogy (~> 0.57.0) + opentelemetry-instrumentation-trilogy (~> 0.59.0) opentelemetry-instrumentation-aws_sdk (0.5.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) @@ -113,22 +123,20 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-excon (0.21.2) + opentelemetry-instrumentation-excon (0.22.5) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-faraday (0.23.3) + opentelemetry-instrumentation-faraday (0.24.8) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-grape (0.1.5) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-graphql (0.26.7) + opentelemetry-instrumentation-graphql (0.28.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-gruf (0.1.1) + opentelemetry-instrumentation-gruf (0.2.1) opentelemetry-api (>= 1.0.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-http (0.23.1) @@ -148,33 +156,36 @@ GEM opentelemetry-instrumentation-mongo (0.22.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-mysql2 (0.25.0) + opentelemetry-instrumentation-mysql2 (0.27.2) opentelemetry-api (~> 1.0) + opentelemetry-helpers-mysql + opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-net_http (0.22.2) opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-pg (0.26.0) + opentelemetry-instrumentation-pg (0.27.4) opentelemetry-api (~> 1.0) + opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-que (0.7.0) + opentelemetry-instrumentation-que (0.8.4) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-racecar (0.3.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rack (0.23.4) + opentelemetry-instrumentation-rack (0.24.6) opentelemetry-api (~> 1.0) - opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) - opentelemetry-instrumentation-rails (0.28.1) + opentelemetry-instrumentation-rails (0.30.2) opentelemetry-api (~> 1.0) - opentelemetry-instrumentation-action_pack (~> 0.7.0) - opentelemetry-instrumentation-action_view (~> 0.6.0) - opentelemetry-instrumentation-active_job (~> 0.6.0) - opentelemetry-instrumentation-active_record (~> 0.6.1) - opentelemetry-instrumentation-active_support (~> 0.4.1) + opentelemetry-instrumentation-action_mailer (~> 0.1.0) + opentelemetry-instrumentation-action_pack (~> 0.9.0) + opentelemetry-instrumentation-action_view (~> 0.7.0) + opentelemetry-instrumentation-active_job (~> 0.7.0) + opentelemetry-instrumentation-active_record (~> 0.7.0) + opentelemetry-instrumentation-active_support (~> 0.5.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rake (0.2.1) opentelemetry-api (~> 1.0) @@ -206,13 +217,15 @@ GEM opentelemetry-common (~> 0.20.0) opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-instrumentation-rack (~> 0.21) - opentelemetry-instrumentation-trilogy (0.57.0) + opentelemetry-instrumentation-trilogy (0.59.3) opentelemetry-api (~> 1.0) + opentelemetry-helpers-mysql + opentelemetry-helpers-sql-obfuscation opentelemetry-instrumentation-base (~> 0.22.1) opentelemetry-semantic_conventions (>= 1.8.0) opentelemetry-registry (0.3.0) opentelemetry-api (~> 1.1) - opentelemetry-sdk (1.3.1) + opentelemetry-sdk (1.4.1) opentelemetry-api (~> 1.1) opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) @@ -221,19 +234,26 @@ GEM opentelemetry-api (~> 1.0) pony (1.13.1) mail (>= 2.0) - puma (6.4.0) + puma (7.0.2) nio4r (~> 2.0) - rack (2.2.8) - rack-protection (3.1.0) - rack (~> 2.2, >= 2.2.4) + rack (3.2.1) + rack-protection (4.1.1) + base64 (>= 0.1.0) + logger (>= 1.6.0) + rack (>= 3.0.0, < 4) + rack-session (2.1.1) + base64 (>= 0.1.0) + rack (>= 3.0.0) ruby2_keywords (0.0.5) - sinatra (3.1.0) + sinatra (4.1.1) + logger (>= 1.6.0) mustermann (~> 3.0) - rack (~> 2.2, >= 2.2.4) - rack-protection (= 3.1.0) + rack (>= 3.0.0, < 4) + rack-protection (= 4.1.1) + rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - tilt (2.3.0) - timeout (0.4.0) + tilt (2.6.1) + timeout (0.4.3) PLATFORMS aarch64-linux @@ -242,13 +262,13 @@ PLATFORMS x86_64-linux DEPENDENCIES - net-smtp (~> 0.3) - opentelemetry-exporter-otlp (~> 0.24) - opentelemetry-instrumentation-all (~> 0.39) - opentelemetry-sdk (~> 1.2) + net-smtp (~> 0.5) + opentelemetry-exporter-otlp (~> 0.26.3) + opentelemetry-instrumentation-all (~> 0.60.0) + opentelemetry-sdk (~> 1.4.1) pony (~> 1.13) - puma (~> 6.3) - sinatra (~> 3.0) + puma (~> 7.0) + sinatra (~> 4.1) BUNDLED WITH 2.3.7