Created
September 16, 2025 14:29
-
-
Save andypmw/8e0d72a9e1040e767d5f7ec249e615d3 to your computer and use it in GitHub Desktop.
NestJS REST API observability using Open Telemetry, save into Prometheus, visualize using Grafana Dashboard
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "annotations": { | |
| "list": [ | |
| { | |
| "builtIn": 1, | |
| "datasource": { | |
| "type": "grafana", | |
| "uid": "-- Grafana --" | |
| }, | |
| "enable": true, | |
| "hide": true, | |
| "iconColor": "rgba(0, 211, 255, 1)", | |
| "name": "Annotations & Alerts", | |
| "target": { | |
| "limit": 100, | |
| "matchAny": false, | |
| "tags": [], | |
| "type": "dashboard" | |
| }, | |
| "type": "dashboard" | |
| } | |
| ] | |
| }, | |
| "editable": true, | |
| "fiscalYearStartMonth": 0, | |
| "graphTooltip": 0, | |
| "id": 2, | |
| "links": [], | |
| "panels": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "PBFA97CFB590B2093" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "color": { | |
| "mode": "palette-classic" | |
| }, | |
| "custom": { | |
| "axisBorderShow": false, | |
| "axisCenteredZero": false, | |
| "axisColorMode": "text", | |
| "axisLabel": "", | |
| "axisPlacement": "auto", | |
| "barAlignment": 0, | |
| "barWidthFactor": 0.6, | |
| "drawStyle": "line", | |
| "fillOpacity": 0, | |
| "gradientMode": "none", | |
| "hideFrom": { | |
| "legend": false, | |
| "tooltip": false, | |
| "viz": false | |
| }, | |
| "insertNulls": 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": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 80 | |
| } | |
| ] | |
| } | |
| }, | |
| "overrides": [] | |
| }, | |
| "gridPos": { | |
| "h": 8, | |
| "w": 12, | |
| "x": 0, | |
| "y": 0 | |
| }, | |
| "id": 7, | |
| "options": { | |
| "legend": { | |
| "calcs": [], | |
| "displayMode": "list", | |
| "placement": "bottom", | |
| "showLegend": true | |
| }, | |
| "tooltip": { | |
| "hideZeros": false, | |
| "mode": "single", | |
| "sort": "none" | |
| } | |
| }, | |
| "pluginVersion": "12.1.1", | |
| "targets": [ | |
| { | |
| "editorMode": "code", | |
| "expr": "sum(rate(http_server_duration_count{http_route!=\"\"}[$__rate_interval]))*60 or vector(0)", | |
| "legendFormat": "Request Per Minute", | |
| "range": true, | |
| "refId": "A" | |
| } | |
| ], | |
| "title": "HTTP Request Per Minute (global)", | |
| "type": "timeseries" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "PBFA97CFB590B2093" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "color": { | |
| "mode": "thresholds" | |
| }, | |
| "custom": { | |
| "align": "auto", | |
| "cellOptions": { | |
| "type": "auto" | |
| }, | |
| "inspect": false | |
| }, | |
| "mappings": [], | |
| "thresholds": { | |
| "mode": "absolute", | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 80 | |
| } | |
| ] | |
| } | |
| }, | |
| "overrides": [] | |
| }, | |
| "gridPos": { | |
| "h": 8, | |
| "w": 12, | |
| "x": 12, | |
| "y": 0 | |
| }, | |
| "id": 6, | |
| "options": { | |
| "cellHeight": "sm", | |
| "footer": { | |
| "countRows": false, | |
| "fields": "", | |
| "reducer": [ | |
| "sum" | |
| ], | |
| "show": false | |
| }, | |
| "frameIndex": 0, | |
| "showHeader": true, | |
| "sortBy": [ | |
| { | |
| "desc": true, | |
| "displayName": "QTY" | |
| } | |
| ] | |
| }, | |
| "pluginVersion": "12.1.1", | |
| "targets": [ | |
| { | |
| "editorMode": "code", | |
| "exemplar": false, | |
| "expr": "topk(10, sum by (http_method, http_route)(\n increase(http_server_duration_count{http_route!=\"\"}[$__range])\n))", | |
| "format": "table", | |
| "instant": true, | |
| "legendFormat": "__auto", | |
| "range": false, | |
| "refId": "A" | |
| } | |
| ], | |
| "title": "Top routes by traffic", | |
| "transformations": [ | |
| { | |
| "id": "organize", | |
| "options": { | |
| "excludeByName": { | |
| "Time": true | |
| }, | |
| "includeByName": {}, | |
| "indexByName": {}, | |
| "renameByName": { | |
| "Value": "QTY", | |
| "http_method": "METHOD", | |
| "http_route": "PATH" | |
| } | |
| } | |
| } | |
| ], | |
| "type": "table" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "PBFA97CFB590B2093" | |
| }, | |
| "description": "", | |
| "fieldConfig": { | |
| "defaults": { | |
| "color": { | |
| "mode": "palette-classic" | |
| }, | |
| "custom": { | |
| "axisBorderShow": true, | |
| "axisCenteredZero": false, | |
| "axisColorMode": "text", | |
| "axisLabel": "", | |
| "axisPlacement": "auto", | |
| "barAlignment": 0, | |
| "barWidthFactor": 0.6, | |
| "drawStyle": "line", | |
| "fillOpacity": 0, | |
| "gradientMode": "none", | |
| "hideFrom": { | |
| "legend": false, | |
| "tooltip": false, | |
| "viz": false | |
| }, | |
| "insertNulls": false, | |
| "lineInterpolation": "linear", | |
| "lineWidth": 1, | |
| "pointSize": 5, | |
| "scaleDistribution": { | |
| "type": "linear" | |
| }, | |
| "showPoints": "auto", | |
| "spanNulls": false, | |
| "stacking": { | |
| "group": "A", | |
| "mode": "none" | |
| }, | |
| "thresholdsStyle": { | |
| "mode": "off" | |
| } | |
| }, | |
| "mappings": [], | |
| "max": 100, | |
| "min": 0, | |
| "thresholds": { | |
| "mode": "absolute", | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 80 | |
| } | |
| ] | |
| } | |
| }, | |
| "overrides": [] | |
| }, | |
| "gridPos": { | |
| "h": 8, | |
| "w": 12, | |
| "x": 0, | |
| "y": 8 | |
| }, | |
| "id": 9, | |
| "options": { | |
| "legend": { | |
| "calcs": [], | |
| "displayMode": "list", | |
| "placement": "bottom", | |
| "showLegend": true | |
| }, | |
| "tooltip": { | |
| "hideZeros": false, | |
| "mode": "single", | |
| "sort": "none" | |
| } | |
| }, | |
| "pluginVersion": "12.1.1", | |
| "targets": [ | |
| { | |
| "editorMode": "code", | |
| "expr": "(\n 100 *\n sum(rate(http_server_duration_count{http_route!=\"\", http_status_code=~\"5..\"}[$__rate_interval]))\n /\n clamp_min(\n sum(rate(http_server_duration_count{http_route!=\"\"}[$__rate_interval])),\n 1\n )\n) or on() vector(0)", | |
| "legendFormat": "5xx Error Rate", | |
| "range": true, | |
| "refId": "A" | |
| } | |
| ], | |
| "title": "HTTP Server Error 5xx Rate (%)", | |
| "type": "timeseries" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "PBFA97CFB590B2093" | |
| }, | |
| "description": "", | |
| "fieldConfig": { | |
| "defaults": { | |
| "color": { | |
| "mode": "palette-classic" | |
| }, | |
| "custom": { | |
| "axisBorderShow": true, | |
| "axisCenteredZero": false, | |
| "axisColorMode": "text", | |
| "axisLabel": "", | |
| "axisPlacement": "auto", | |
| "barAlignment": 0, | |
| "barWidthFactor": 0.6, | |
| "drawStyle": "line", | |
| "fillOpacity": 0, | |
| "gradientMode": "none", | |
| "hideFrom": { | |
| "legend": false, | |
| "tooltip": false, | |
| "viz": false | |
| }, | |
| "insertNulls": false, | |
| "lineInterpolation": "linear", | |
| "lineStyle": { | |
| "fill": "solid" | |
| }, | |
| "lineWidth": 1, | |
| "pointSize": 5, | |
| "scaleDistribution": { | |
| "type": "linear" | |
| }, | |
| "showPoints": "auto", | |
| "spanNulls": false, | |
| "stacking": { | |
| "group": "A", | |
| "mode": "none" | |
| }, | |
| "thresholdsStyle": { | |
| "mode": "off" | |
| } | |
| }, | |
| "mappings": [], | |
| "max": 100, | |
| "min": 0, | |
| "thresholds": { | |
| "mode": "absolute", | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 80 | |
| } | |
| ] | |
| } | |
| }, | |
| "overrides": [] | |
| }, | |
| "gridPos": { | |
| "h": 8, | |
| "w": 12, | |
| "x": 12, | |
| "y": 8 | |
| }, | |
| "id": 10, | |
| "options": { | |
| "legend": { | |
| "calcs": [], | |
| "displayMode": "list", | |
| "placement": "bottom", | |
| "showLegend": true | |
| }, | |
| "tooltip": { | |
| "hideZeros": false, | |
| "mode": "single", | |
| "sort": "none" | |
| } | |
| }, | |
| "pluginVersion": "12.1.1", | |
| "targets": [ | |
| { | |
| "editorMode": "code", | |
| "expr": "(\n 100 *\n sum(rate(http_server_duration_count{http_route!=\"\",http_status_code=~\"4..\"}[$__rate_interval]))\n /\n clamp_min(\n sum(rate(http_server_duration_count{http_route!=\"\"}[$__rate_interval])),\n 1\n )\n) or on() vector(0)", | |
| "legendFormat": "4xx Error Rate", | |
| "range": true, | |
| "refId": "A" | |
| } | |
| ], | |
| "title": "HTTP Client Error 4xx Rate (%)", | |
| "type": "timeseries" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "PBFA97CFB590B2093" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "color": { | |
| "mode": "thresholds" | |
| }, | |
| "custom": { | |
| "align": "auto", | |
| "cellOptions": { | |
| "type": "auto" | |
| }, | |
| "inspect": false | |
| }, | |
| "mappings": [], | |
| "thresholds": { | |
| "mode": "absolute", | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 80 | |
| } | |
| ] | |
| } | |
| }, | |
| "overrides": [] | |
| }, | |
| "gridPos": { | |
| "h": 8, | |
| "w": 12, | |
| "x": 0, | |
| "y": 16 | |
| }, | |
| "id": 11, | |
| "options": { | |
| "cellHeight": "sm", | |
| "footer": { | |
| "countRows": false, | |
| "fields": "", | |
| "reducer": [ | |
| "sum" | |
| ], | |
| "show": false | |
| }, | |
| "showHeader": true, | |
| "sortBy": [ | |
| { | |
| "desc": true, | |
| "displayName": "QTY" | |
| } | |
| ] | |
| }, | |
| "pluginVersion": "12.1.1", | |
| "targets": [ | |
| { | |
| "editorMode": "code", | |
| "exemplar": false, | |
| "expr": "topk(10, sum by (http_method, http_route)(\n increase(http_server_duration_count{http_route!=\"\",http_status_code=~\"5..\"}[$__range])\n))", | |
| "format": "table", | |
| "instant": true, | |
| "legendFormat": "__auto", | |
| "range": false, | |
| "refId": "A" | |
| } | |
| ], | |
| "title": "Top routes by 5xx errors", | |
| "transformations": [ | |
| { | |
| "id": "organize", | |
| "options": { | |
| "excludeByName": { | |
| "Time": true | |
| }, | |
| "includeByName": {}, | |
| "indexByName": {}, | |
| "renameByName": { | |
| "Time": "", | |
| "Value": "QTY", | |
| "http_method": "METHOD", | |
| "http_route": "PATH" | |
| } | |
| } | |
| } | |
| ], | |
| "type": "table" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "PBFA97CFB590B2093" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "color": { | |
| "mode": "thresholds" | |
| }, | |
| "custom": { | |
| "align": "auto", | |
| "cellOptions": { | |
| "type": "auto" | |
| }, | |
| "inspect": false | |
| }, | |
| "mappings": [], | |
| "thresholds": { | |
| "mode": "absolute", | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 80 | |
| } | |
| ] | |
| } | |
| }, | |
| "overrides": [] | |
| }, | |
| "gridPos": { | |
| "h": 8, | |
| "w": 12, | |
| "x": 12, | |
| "y": 16 | |
| }, | |
| "id": 12, | |
| "options": { | |
| "cellHeight": "sm", | |
| "footer": { | |
| "countRows": false, | |
| "fields": "", | |
| "reducer": [ | |
| "sum" | |
| ], | |
| "show": false | |
| }, | |
| "showHeader": true, | |
| "sortBy": [ | |
| { | |
| "desc": true, | |
| "displayName": "QTY" | |
| } | |
| ] | |
| }, | |
| "pluginVersion": "12.1.1", | |
| "targets": [ | |
| { | |
| "editorMode": "code", | |
| "exemplar": false, | |
| "expr": "topk(10, sum by (http_method, http_route)(\n increase(http_server_duration_count{http_route!=\"\",http_status_code=~\"4..\"}[$__range])\n))", | |
| "format": "table", | |
| "instant": true, | |
| "legendFormat": "__auto", | |
| "range": false, | |
| "refId": "A" | |
| } | |
| ], | |
| "title": "Top routes by 4xx errors", | |
| "transformations": [ | |
| { | |
| "id": "organize", | |
| "options": { | |
| "excludeByName": { | |
| "Time": true | |
| }, | |
| "includeByName": {}, | |
| "indexByName": {}, | |
| "renameByName": { | |
| "Value": "QTY", | |
| "http_method": "METHOD", | |
| "http_route": "PATH" | |
| } | |
| } | |
| } | |
| ], | |
| "type": "table" | |
| } | |
| ], | |
| "preload": false, | |
| "refresh": "30s", | |
| "schemaVersion": 41, | |
| "tags": [ | |
| "dojotek", | |
| "nestjs", | |
| "opentelemetry" | |
| ], | |
| "templating": { | |
| "list": [] | |
| }, | |
| "time": { | |
| "from": "2025-09-16T10:19:58.995Z", | |
| "to": "2025-09-16T10:40:04.167Z" | |
| }, | |
| "timepicker": {}, | |
| "timezone": "", | |
| "title": "Dojotek AI Chatbot - NestJS Metrics", | |
| "uid": "dojotek-nestjs", | |
| "version": 39 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment