Created
July 11, 2024 13:57
-
-
Save adinhodovic/0ce3f492d566eb453361feadab8aae56 to your computer and use it in GitHub Desktop.
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
| { | |
| "__inputs": [ ], | |
| "__requires": [ ], | |
| "description": "A dashboard that monitors Django which focuses on giving a overview for the system (requests, db, cache). It is created using the [Django-mixin](https://github.com/adinhodovic/django-mixin).", | |
| "editable": true, | |
| "links": [ | |
| { | |
| "tags": [ | |
| "django", | |
| "django-mixin" | |
| ], | |
| "targetBlank": true, | |
| "title": "Django Dashboards", | |
| "type": "dashboards" | |
| } | |
| ], | |
| "panels": [ | |
| { | |
| "collapsed": false, | |
| "gridPos": { | |
| "h": 1, | |
| "w": 24, | |
| "x": 0, | |
| "y": 0 | |
| }, | |
| "id": 1, | |
| "title": "Summary", | |
| "type": "row" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "thresholds": { | |
| "steps": [ | |
| { | |
| "color": "red", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "green", | |
| "value": 0.10000000000000001 | |
| } | |
| ] | |
| }, | |
| "unit": "reqps" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 4, | |
| "w": 8, | |
| "x": 0, | |
| "y": 1 | |
| }, | |
| "id": 2, | |
| "options": { | |
| "reduceOptions": { | |
| "calcs": [ | |
| "lastNotNull" | |
| ] | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n sum(\n rate(\n django_http_requests_total_by_view_transport_method_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n view!~\"<unnamed view>|health_check:health_check_home|prometheus-django-metrics\",\n }[$__rate_interval]\n )\n ), 0.001\n)\n" | |
| } | |
| ], | |
| "title": "Request Volume", | |
| "type": "stat" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "thresholds": { | |
| "steps": [ | |
| { | |
| "color": "red", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "green", | |
| "value": 0.10000000000000001 | |
| } | |
| ] | |
| }, | |
| "unit": "ops" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 4, | |
| "w": 8, | |
| "x": 8, | |
| "y": 1 | |
| }, | |
| "id": 3, | |
| "options": { | |
| "reduceOptions": { | |
| "calcs": [ | |
| "lastNotNull" | |
| ] | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "sum (\n rate (\n django_db_execute_total {\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n )\n) by (namespace, job)\n" | |
| } | |
| ], | |
| "title": "Database Ops", | |
| "type": "stat" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "thresholds": { | |
| "steps": [ | |
| { | |
| "color": "red", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "green", | |
| "value": 0.10000000000000001 | |
| } | |
| ] | |
| }, | |
| "unit": "percentunit" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 4, | |
| "w": 8, | |
| "x": 16, | |
| "y": 1 | |
| }, | |
| "id": 4, | |
| "options": { | |
| "reduceOptions": { | |
| "calcs": [ | |
| "lastNotNull" | |
| ] | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "sum (\n rate (\n django_cache_get_hits_total {\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[30m]\n )\n) by (namespace, job)\n/\nsum (\n rate (\n django_cache_get_total {\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[30m]\n )\n) by (namespace, job)\n" | |
| } | |
| ], | |
| "title": "Cache Hitrate [30m]", | |
| "type": "stat" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "custom": { | |
| "fillOpacity": 100, | |
| "spanNulls": false, | |
| "stacking": { | |
| "mode": "percent" | |
| } | |
| }, | |
| "unit": "reqps" | |
| }, | |
| "overrides": [ | |
| { | |
| "matcher": { | |
| "id": "byName", | |
| "options": "2xx" | |
| }, | |
| "properties": [ | |
| { | |
| "id": "color", | |
| "value": { | |
| "fixedColor": "green", | |
| "mode": "fixed" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "matcher": { | |
| "id": "byName", | |
| "options": "3xx" | |
| }, | |
| "properties": [ | |
| { | |
| "id": "color", | |
| "value": { | |
| "fixedColor": "blue", | |
| "mode": "fixed" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "matcher": { | |
| "id": "byName", | |
| "options": "4xx" | |
| }, | |
| "properties": [ | |
| { | |
| "id": "color", | |
| "value": { | |
| "fixedColor": "yellow", | |
| "mode": "fixed" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "matcher": { | |
| "id": "byName", | |
| "options": "5xx" | |
| }, | |
| "properties": [ | |
| { | |
| "id": "color", | |
| "value": { | |
| "fixedColor": "red", | |
| "mode": "fixed" | |
| } | |
| } | |
| ] | |
| } | |
| ] | |
| }, | |
| "gridPos": { | |
| "h": 6, | |
| "w": 24, | |
| "x": 0, | |
| "y": 5 | |
| }, | |
| "id": 5, | |
| "options": { | |
| "legend": { | |
| "calcs": [ | |
| "lastNotNull", | |
| "mean", | |
| "max" | |
| ], | |
| "displayMode": "table", | |
| "placement": "right", | |
| "showLegend": true, | |
| "sortBy": "Mean", | |
| "sortDesc": true | |
| }, | |
| "tooltip": { | |
| "mode": "multi", | |
| "sort": "desc" | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n sum(\n rate(\n django_http_responses_total_by_status_view_method_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n view!~\"<unnamed view>|health_check:health_check_home|prometheus-django-metrics\",\n status=~\"2.*\",\n }[$__rate_interval]\n ) > 0\n ) by (job), 0.001\n)\n", | |
| "legendFormat": "2xx" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n sum(\n rate(\n django_http_responses_total_by_status_view_method_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n view!~\"<unnamed view>|health_check:health_check_home|prometheus-django-metrics\",\n status=~\"3.*\",\n }[$__rate_interval]\n ) > 0\n ) by (job), 0.001\n)\n", | |
| "legendFormat": "3xx" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n sum(\n rate(\n django_http_responses_total_by_status_view_method_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n view!~\"<unnamed view>|health_check:health_check_home|prometheus-django-metrics\",\n status=~\"4.*\",\n }[$__rate_interval]\n ) > 0\n ) by (job), 0.001\n)\n", | |
| "legendFormat": "4xx" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n sum(\n rate(\n django_http_responses_total_by_status_view_method_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n view!~\"<unnamed view>|health_check:health_check_home|prometheus-django-metrics\",\n status=~\"5.*\",\n }[$__rate_interval]\n ) > 0\n ) by (job), 0.001\n)\n", | |
| "legendFormat": "5xx" | |
| } | |
| ], | |
| "title": "Responses", | |
| "type": "timeseries" | |
| }, | |
| { | |
| "collapsed": false, | |
| "gridPos": { | |
| "h": 1, | |
| "w": 24, | |
| "x": 0, | |
| "y": 11 | |
| }, | |
| "id": 6, | |
| "title": "Database", | |
| "type": "row" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "thresholds": { | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| } | |
| ] | |
| }, | |
| "unit": "short" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 3, | |
| "w": 6, | |
| "x": 0, | |
| "y": 12 | |
| }, | |
| "id": 7, | |
| "options": { | |
| "reduceOptions": { | |
| "calcs": [ | |
| "lastNotNull" | |
| ] | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "max (\n django_migrations_applied_total {\n namespace=~\"$namespace\",\n job=~\"$job\"\n }\n) by (namespace, job)\n" | |
| } | |
| ], | |
| "title": "Migrations Applied", | |
| "type": "stat" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "thresholds": { | |
| "steps": [ | |
| { | |
| "color": "green", | |
| "value": 0 | |
| }, | |
| { | |
| "color": "red", | |
| "value": 0.10000000000000001 | |
| } | |
| ] | |
| }, | |
| "unit": "short" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 3, | |
| "w": 6, | |
| "x": 6, | |
| "y": 12 | |
| }, | |
| "id": 8, | |
| "options": { | |
| "reduceOptions": { | |
| "calcs": [ | |
| "lastNotNull" | |
| ] | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "max (\n django_migrations_unapplied_total {\n namespace=~\"$namespace\",\n job=~\"$job\"\n }\n) by (namespace, job)\n" | |
| } | |
| ], | |
| "title": "Migrations Unapplied", | |
| "type": "stat" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "unit": "short" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 9, | |
| "w": 12, | |
| "x": 0, | |
| "y": 15 | |
| }, | |
| "id": 9, | |
| "options": { | |
| "sortBy": [ | |
| { | |
| "displayName": "Type" | |
| } | |
| ] | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n topk(10,\n sum by (type) (\n increase(\n django_db_errors_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[1w]\n ) > 0\n )\n )\n)\n", | |
| "format": "table", | |
| "instant": true | |
| } | |
| ], | |
| "title": "Top Database Errors (1w)", | |
| "transformations": [ | |
| { | |
| "id": "organize", | |
| "options": { | |
| "excludeByName": { | |
| "Time": true | |
| }, | |
| "indexByName": { | |
| "job": 1, | |
| "namespace": 0, | |
| "type": 2 | |
| }, | |
| "renameByName": { | |
| "job": "Job", | |
| "namespace": "Namespace", | |
| "type": "Type" | |
| } | |
| } | |
| } | |
| ], | |
| "type": "table" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "custom": { | |
| "fillOpacity": 10, | |
| "spanNulls": false | |
| }, | |
| "unit": "short" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 6, | |
| "w": 12, | |
| "x": 12, | |
| "y": 12 | |
| }, | |
| "id": 10, | |
| "options": { | |
| "legend": { | |
| "calcs": [ | |
| "lastNotNull", | |
| "mean", | |
| "max" | |
| ], | |
| "displayMode": "table", | |
| "placement": "right", | |
| "showLegend": true, | |
| "sortBy": "Mean", | |
| "sortDesc": true | |
| }, | |
| "tooltip": { | |
| "mode": "multi", | |
| "sort": "desc" | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "round(\n sum(\n increase(\n django_db_new_connections_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n ) by (namespace, job, vendor)\n)\n", | |
| "legendFormat": "{{ vendor }}" | |
| } | |
| ], | |
| "title": "Database Connections", | |
| "type": "timeseries" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "custom": { | |
| "fillOpacity": 10, | |
| "spanNulls": false | |
| }, | |
| "unit": "s" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 6, | |
| "w": 12, | |
| "x": 12, | |
| "y": 18 | |
| }, | |
| "id": 11, | |
| "options": { | |
| "legend": { | |
| "calcs": [ | |
| "lastNotNull", | |
| "mean", | |
| "max" | |
| ], | |
| "displayMode": "table", | |
| "placement": "right", | |
| "showLegend": true, | |
| "sortBy": "Mean", | |
| "sortDesc": true | |
| }, | |
| "tooltip": { | |
| "mode": "multi", | |
| "sort": "desc" | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "histogram_quantile(0.50,\n sum(\n irate(\n django_db_query_duration_seconds_bucket{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n ) by (vendor, namespace, job, le)\n)\n", | |
| "legendFormat": "50 - {{ vendor }}" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "histogram_quantile(0.95,\n sum(\n irate(\n django_db_query_duration_seconds_bucket{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n ) by (vendor, namespace, job, le)\n)\n", | |
| "legendFormat": "95 - {{ vendor }}" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "histogram_quantile(0.99,\n sum(\n irate(\n django_db_query_duration_seconds_bucket{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n ) by (vendor, namespace, job, le)\n)\n", | |
| "legendFormat": "99 - {{ vendor }}" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "histogram_quantile(0.999,\n sum(\n irate(\n django_db_query_duration_seconds_bucket{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n ) by (vendor, namespace, job, le)\n)\n", | |
| "legendFormat": "99.9 - {{ vendor }}" | |
| } | |
| ], | |
| "title": "Database Latency", | |
| "type": "timeseries" | |
| }, | |
| { | |
| "collapsed": false, | |
| "gridPos": { | |
| "h": 1, | |
| "w": 24, | |
| "x": 0, | |
| "y": 24 | |
| }, | |
| "id": 12, | |
| "title": "Cache", | |
| "type": "row" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "datasource", | |
| "uid": "-- Mixed --" | |
| }, | |
| "fieldConfig": { | |
| "defaults": { | |
| "custom": { | |
| "fillOpacity": 100, | |
| "spanNulls": false, | |
| "stacking": { | |
| "mode": "percent" | |
| } | |
| }, | |
| "unit": "ops" | |
| } | |
| }, | |
| "gridPos": { | |
| "h": 6, | |
| "w": 24, | |
| "x": 0, | |
| "y": 25 | |
| }, | |
| "id": 13, | |
| "options": { | |
| "legend": { | |
| "calcs": [ | |
| "lastNotNull", | |
| "mean", | |
| "max" | |
| ], | |
| "displayMode": "table", | |
| "placement": "right", | |
| "showLegend": true, | |
| "sortBy": "Mean", | |
| "sortDesc": true | |
| }, | |
| "tooltip": { | |
| "mode": "multi", | |
| "sort": "desc" | |
| } | |
| }, | |
| "pluginVersion": "v11.0.0", | |
| "targets": [ | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "sum(\n rate(\n django_cache_get_hits_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n) by (namespace, job, backend)\n", | |
| "legendFormat": "Hit - {{ backend }}" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "$datasource" | |
| }, | |
| "expr": "sum(\n rate(\n django_cache_get_misses_total{\n namespace=~\"$namespace\",\n job=~\"$job\",\n }[$__rate_interval]\n ) > 0\n) by (namespace, job, backend)\n", | |
| "legendFormat": "Miss - {{ backend }}" | |
| } | |
| ], | |
| "title": "Cache Get", | |
| "type": "timeseries" | |
| } | |
| ], | |
| "schemaVersion": 39, | |
| "tags": [ | |
| "django", | |
| "django-mixin" | |
| ], | |
| "templating": { | |
| "list": [ | |
| { | |
| "label": "Data source", | |
| "name": "datasource", | |
| "query": "prometheus", | |
| "type": "datasource" | |
| }, | |
| { | |
| "allValue": ".*", | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "${datasource}" | |
| }, | |
| "includeAll": true, | |
| "label": "Namespace", | |
| "multi": true, | |
| "name": "namespace", | |
| "query": "label_values(django_http_responses_total_by_status_view_method_total{}, namespace)", | |
| "refresh": 2, | |
| "sort": 1, | |
| "type": "query" | |
| }, | |
| { | |
| "datasource": { | |
| "type": "prometheus", | |
| "uid": "${datasource}" | |
| }, | |
| "includeAll": false, | |
| "label": "Job", | |
| "multi": false, | |
| "name": "job", | |
| "query": "label_values(django_http_responses_total_by_status_view_method_total{namespace=~\"$namespace\"}, job)", | |
| "refresh": 2, | |
| "sort": 1, | |
| "type": "query" | |
| } | |
| ] | |
| }, | |
| "time": { | |
| "from": "now-6h", | |
| "to": "now" | |
| }, | |
| "timezone": "utc", | |
| "title": "Django / Overview", | |
| "uid": "django-overview-jkwq" | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment