diff --git a/docker/grafana/dashboards/system-overview.json b/docker/grafana/dashboards/system-overview.json index da4cde3e8..874edc87c 100644 --- a/docker/grafana/dashboards/system-overview.json +++ b/docker/grafana/dashboards/system-overview.json @@ -13,177 +13,109 @@ "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, "panels": [], - "title": "System Overview", + "title": "Service Status", + "type": "row" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [ + { + "options": { + "0": { "color": "red", "index": 1, "text": "DOWN" }, + "1": { "color": "green", "index": 0, "text": "UP" } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { "color": "red", "value": null }, + { "color": "green", "value": 1 } + ] + } + }, + "overrides": [] + }, + "gridPos": { "h": 4, "w": 24, "x": 0, "y": 1 }, + "id": 2, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "center", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.0", + "targets": [ + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "up{job=\"mana-core-auth\"}", + "legendFormat": "Auth", + "refId": "A" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "up{job=\"chat-backend\"}", + "legendFormat": "Chat", + "refId": "B" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "up{job=\"todo-backend\"}", + "legendFormat": "Todo", + "refId": "C" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "up{job=\"calendar-backend\"}", + "legendFormat": "Calendar", + "refId": "D" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "up{job=\"clock-backend\"}", + "legendFormat": "Clock", + "refId": "E" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "up{job=\"contacts-backend\"}", + "legendFormat": "Contacts", + "refId": "F" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "pg_up", + "legendFormat": "PostgreSQL", + "refId": "G" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "redis_up", + "legendFormat": "Redis", + "refId": "H" + } + ], + "title": "All Services", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, + "id": 3, + "panels": [], + "title": "Traffic Overview", "type": "row" }, - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 70 }, - { "color": "red", "value": 85 } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { "h": 6, "w": 6, "x": 0, "y": 1 }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)", - "refId": "A" - } - ], - "title": "CPU Usage", - "type": "stat" - }, - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 70 }, - { "color": "red", "value": 85 } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { "h": 6, "w": 6, "x": 6, "y": 1 }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100", - "refId": "A" - } - ], - "title": "Memory Usage", - "type": "stat" - }, - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { "color": "green", "value": null }, - { "color": "yellow", "value": 70 }, - { "color": "red", "value": 85 } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { "h": 6, "w": 6, "x": 12, "y": 1 }, - "id": 4, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "(1 - (node_filesystem_avail_bytes{mountpoint=~\"/host_mnt/Users|/\"} / node_filesystem_size_bytes{mountpoint=~\"/host_mnt/Users|/\"})) * 100", - "refId": "A" - } - ], - "title": "Disk Usage", - "type": "stat" - }, - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "fieldConfig": { - "defaults": { - "color": { "mode": "palette-classic" }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [{ "color": "green", "value": null }] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { "h": 6, "w": 6, "x": 18, "y": 1 }, - "id": 5, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "count(container_last_seen{id=~\"/docker/.+\"})", - "refId": "A" - } - ], - "title": "Running Containers", - "type": "stat" - }, { "datasource": { "type": "prometheus", "uid": "${datasource}" }, "fieldConfig": { @@ -197,12 +129,12 @@ "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", + "fillOpacity": 20, + "gradientMode": "opacity", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, + "lineInterpolation": "smooth", + "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", @@ -215,32 +147,30 @@ "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, - "unit": "percent" + "unit": "reqps" }, "overrides": [] }, - "gridPos": { "h": 8, "w": 12, "x": 0, "y": 7 }, - "id": 6, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 }, + "id": 4, "options": { - "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, - "tooltip": { "mode": "single", "sort": "none" } + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { "mode": "multi", "sort": "desc" } }, - "pluginVersion": "10.0.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)", - "legendFormat": "CPU", + "expr": "sum(rate(http_requests_total[5m])) by (job)", + "legendFormat": "{{job}}", "refId": "A" - }, - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100", - "legendFormat": "Memory", - "refId": "B" } ], - "title": "CPU & Memory Over Time", + "title": "Request Rate by Service", "type": "timeseries" }, { @@ -256,12 +186,12 @@ "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", + "fillOpacity": 20, + "gradientMode": "opacity", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, + "lineInterpolation": "smooth", + "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", @@ -274,37 +204,35 @@ "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, - "unit": "Bps" + "unit": "s" }, "overrides": [] }, - "gridPos": { "h": 8, "w": 12, "x": 12, "y": 7 }, - "id": 7, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 }, + "id": 5, "options": { - "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, - "tooltip": { "mode": "single", "sort": "none" } + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { "mode": "multi", "sort": "desc" } }, - "pluginVersion": "10.0.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "rate(node_network_receive_bytes_total{device!~\"lo|veth.*|br.*|docker.*\"}[5m])", - "legendFormat": "Receive {{device}}", + "expr": "histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, job))", + "legendFormat": "p95 {{job}}", "refId": "A" - }, - { - "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|br.*|docker.*\"}[5m])", - "legendFormat": "Transmit {{device}}", - "refId": "B" } ], - "title": "Network I/O", + "title": "Response Time (p95)", "type": "timeseries" }, { "collapsed": false, - "gridPos": { "h": 1, "w": 24, "x": 0, "y": 15 }, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 14 }, "id": 8, "panels": [], "title": "Database", @@ -314,17 +242,21 @@ "datasource": { "type": "prometheus", "uid": "${datasource}" }, "fieldConfig": { "defaults": { - "color": { "mode": "palette-classic" }, + "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", - "steps": [{ "color": "green", "value": null }] + "steps": [ + { "color": "green", "value": null }, + { "color": "yellow", "value": 50 }, + { "color": "red", "value": 80 } + ] }, "unit": "short" }, "overrides": [] }, - "gridPos": { "h": 6, "w": 6, "x": 0, "y": 16 }, + "gridPos": { "h": 5, "w": 6, "x": 0, "y": 15 }, "id": 9, "options": { "colorMode": "value", @@ -342,18 +274,18 @@ "targets": [ { "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "pg_stat_activity_count{state=\"active\"}", + "expr": "sum(pg_stat_activity_count)", "refId": "A" } ], - "title": "PostgreSQL Active Connections", + "title": "PostgreSQL Connections", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${datasource}" }, "fieldConfig": { "defaults": { - "color": { "mode": "palette-classic" }, + "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", @@ -363,7 +295,7 @@ }, "overrides": [] }, - "gridPos": { "h": 6, "w": 6, "x": 6, "y": 16 }, + "gridPos": { "h": 5, "w": 6, "x": 6, "y": 15 }, "id": 10, "options": { "colorMode": "value", @@ -385,14 +317,14 @@ "refId": "A" } ], - "title": "Redis Connected Clients", + "title": "Redis Clients", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${datasource}" }, "fieldConfig": { "defaults": { - "color": { "mode": "palette-classic" }, + "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", @@ -402,7 +334,7 @@ }, "overrides": [] }, - "gridPos": { "h": 6, "w": 6, "x": 12, "y": 16 }, + "gridPos": { "h": 5, "w": 6, "x": 12, "y": 15 }, "id": 11, "options": { "colorMode": "value", @@ -424,24 +356,28 @@ "refId": "A" } ], - "title": "Redis Memory Usage", + "title": "Redis Memory", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${datasource}" }, "fieldConfig": { "defaults": { - "color": { "mode": "palette-classic" }, + "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", - "steps": [{ "color": "green", "value": null }] + "steps": [ + { "color": "red", "value": null }, + { "color": "yellow", "value": 90 }, + { "color": "green", "value": 95 } + ] }, "unit": "percent" }, "overrides": [] }, - "gridPos": { "h": 6, "w": 6, "x": 18, "y": 16 }, + "gridPos": { "h": 5, "w": 6, "x": 18, "y": 15 }, "id": 12, "options": { "colorMode": "value", @@ -449,7 +385,7 @@ "justifyMode": "auto", "orientation": "auto", "reduceOptions": { - "calcs": ["lastNotNull"], + "calcs": ["mean"], "fields": "", "values": false }, @@ -459,13 +395,126 @@ "targets": [ { "datasource": { "type": "prometheus", "uid": "${datasource}" }, - "expr": "pg_stat_database_blks_hit{datname!~\"template.*|postgres\"} / (pg_stat_database_blks_hit{datname!~\"template.*|postgres\"} + pg_stat_database_blks_read{datname!~\"template.*|postgres\"}) * 100", + "expr": "avg(pg_stat_database_blks_hit{datname!~\"template.*|postgres\"} / (pg_stat_database_blks_hit{datname!~\"template.*|postgres\"} + pg_stat_database_blks_read{datname!~\"template.*|postgres\"} + 0.0001)) * 100", + "refId": "A" + } + ], + "title": "PG Cache Hit Rate", + "type": "stat" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "opacity", + "hideFrom": { "legend": false, "tooltip": false, "viz": false }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "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 }] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { "h": 7, "w": 12, "x": 0, "y": 20 }, + "id": 13, + "options": { + "legend": { + "calcs": ["lastNotNull"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { "mode": "multi", "sort": "desc" } + }, + "targets": [ + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "pg_database_size_bytes{datname!~\"template.*|postgres\"}", "legendFormat": "{{datname}}", "refId": "A" } ], - "title": "PostgreSQL Cache Hit Ratio", - "type": "stat" + "title": "Database Size", + "type": "timeseries" + }, + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 20, + "gradientMode": "opacity", + "hideFrom": { "legend": false, "tooltip": false, "viz": false }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "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 }] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { "h": 7, "w": 12, "x": 12, "y": 20 }, + "id": 14, + "options": { + "legend": { + "calcs": ["lastNotNull"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { "mode": "multi", "sort": "desc" } + }, + "targets": [ + { + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "expr": "redis_memory_used_bytes", + "legendFormat": "Used", + "refId": "A" + } + ], + "title": "Redis Memory Over Time", + "type": "timeseries" } ], "refresh": "30s",