diff --git a/.env b/.env index 895e2a1c..7867c465 100644 --- a/.env +++ b/.env @@ -81,11 +81,13 @@ 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 IMAGE_PROVIDER_HOST=image-provider 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/README.md b/README.md index 0c6bb21c..0bc00355 100644 --- a/README.md +++ b/README.md @@ -10,31 +10,23 @@ [![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 +## 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 . +``` -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/). ## Quick start diff --git a/docker-compose.minimal.yml b/docker-compose.minimal.yml index 603faf10..1adbb7f1 100644 --- a/docker-compose.minimal.yml +++ b/docker-compose.minimal.yml @@ -242,20 +242,22 @@ services: condition: service_started logging: *logging - # Frontend Proxy (Envoy) + # Frontend Proxy (NGINX) frontend-proxy: - image: ${IMAGE_NAME}:${DEMO_VERSION}-frontend-proxy + image: ${DEMO_VERSION}-frontend-proxy + # image: frontend-proxy #NGINX Configuration container_name: frontend-proxy build: context: ./ - dockerfile: ${FRONTEND_PROXY_DOCKERFILE} + 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 @@ -273,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 @@ -616,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/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 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..52dd2d1b --- /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": ["NGINX Plus"], + "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 new file mode 100644 index 00000000..f8ecbd84 --- /dev/null +++ b/src/nginx-frontend-proxy/Dockerfile @@ -0,0 +1,12 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +FROM nginx:1.28.0-otel + + +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.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 new file mode 100644 index 00000000..24c530a6 --- /dev/null +++ b/src/nginx-frontend-proxy/Dockerfile.nplus @@ -0,0 +1,31 @@ +# ----------------------------------------------------------------------------- +# 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 +# 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.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 new file mode 100644 index 00000000..f8ecbd84 --- /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.28.0-otel + + +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.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-proxy.conf b/src/nginx-frontend-proxy/nginx-proxy.conf new file mode 100644 index 00000000..51e32dad --- /dev/null +++ b/src/nginx-frontend-proxy/nginx-proxy.conf @@ -0,0 +1,141 @@ +# 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 { + # 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; + 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 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..205257f9 --- /dev/null +++ b/src/nginx-frontend-proxy/nginx.conf @@ -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/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