diff --git a/infrastructure/loki/dashboard-logs-overview.yaml b/infrastructure/loki/dashboard-logs-overview.yaml new file mode 100644 index 0000000..7479072 --- /dev/null +++ b/infrastructure/loki/dashboard-logs-overview.yaml @@ -0,0 +1,88 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: logs-overview-grafana-dashboard + namespace: monitoring + labels: + grafana_dashboard: "1" +data: + logs-overview.json: | + { + "title": "Logs Overview", + "uid": "logs-overview", + "schemaVersion": 39, + "time": { "from": "now-1h", "to": "now" }, + "refresh": "30s", + "templating": { + "list": [ + { + "name": "datasource", + "type": "datasource", + "query": "loki", + "current": {} + }, + { + "name": "namespace", + "type": "query", + "datasource": { "type": "loki", "uid": "${datasource}" }, + "query": "label_values(namespace)", + "refresh": 2, + "includeAll": true, + "multi": true, + "current": { "text": "All", "value": "$__all" } + } + ] + }, + "panels": [ + { + "id": 1, + "title": "Log-Volumen nach Namespace", + "type": "timeseries", + "datasource": { "type": "loki", "uid": "${datasource}" }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 0 }, + "targets": [ + { + "expr": "sum by (namespace) (count_over_time({namespace=~\"$namespace\"}[$__interval]))", + "legendFormat": "{{namespace}}", + "refId": "A" + } + ] + }, + { + "id": 2, + "title": "Errors / Crashes / Panics", + "type": "logs", + "datasource": { "type": "loki", "uid": "${datasource}" }, + "gridPos": { "h": 10, "w": 24, "x": 0, "y": 8 }, + "options": { + "showTime": true, + "showLabels": true, + "sortOrder": "Descending" + }, + "targets": [ + { + "expr": "{namespace=~\"$namespace\"} |~ \"(?i)error|panic|fatal|crashloopbackoff|exception\"", + "refId": "A" + } + ] + }, + { + "id": 3, + "title": "Alle Logs (gefiltert nach Namespace)", + "type": "logs", + "datasource": { "type": "loki", "uid": "${datasource}" }, + "gridPos": { "h": 10, "w": 24, "x": 0, "y": 18 }, + "options": { + "showTime": true, + "showLabels": true, + "sortOrder": "Descending" + }, + "targets": [ + { + "expr": "{namespace=~\"$namespace\"}", + "refId": "A" + } + ] + } + ] + } diff --git a/infrastructure/prometheus/dashboard-cluster-health.yaml b/infrastructure/prometheus/dashboard-cluster-health.yaml new file mode 100644 index 0000000..eabb516 --- /dev/null +++ b/infrastructure/prometheus/dashboard-cluster-health.yaml @@ -0,0 +1,118 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cluster-health-grafana-dashboard + namespace: monitoring + labels: + grafana_dashboard: "1" +data: + cluster-health.json: | + { + "title": "Cluster Health / Crash Overview", + "uid": "cluster-health", + "schemaVersion": 39, + "time": { "from": "now-6h", "to": "now" }, + "refresh": "30s", + "templating": { + "list": [ + { + "name": "datasource", + "type": "datasource", + "query": "prometheus", + "current": {} + } + ] + }, + "panels": [ + { + "id": 1, + "title": "Container aktuell im Waiting-Zustand", + "type": "stat", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 5, "w": 24, "x": 0, "y": 0 }, + "fieldConfig": { + "defaults": { + "thresholds": { + "mode": "absolute", + "steps": [ + { "color": "green", "value": null }, + { "color": "red", "value": 1 } + ] + } + }, + "overrides": [] + }, + "targets": [ + { + "expr": "sum(kube_pod_container_status_waiting == 1) or vector(0)", + "legendFormat": "Waiting Container", + "refId": "A" + } + ] + }, + { + "id": 2, + "title": "Welche Pods/Container warten", + "type": "table", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 5 }, + "targets": [ + { + "expr": "kube_pod_container_status_waiting == 1", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + } + ] + }, + { + "id": 3, + "title": "Letzter Terminierungsgrund (ohne 'Completed')", + "type": "table", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 13 }, + "targets": [ + { + "expr": "kube_pod_container_status_last_terminated_reason{reason!=\"Completed\"} == 1", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + } + ] + }, + { + "id": 4, + "title": "Pods nicht im Running/Succeeded Zustand", + "type": "table", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 21 }, + "targets": [ + { + "expr": "kube_pod_status_phase{phase=~\"Failed|Unknown|Pending\"} == 1", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + } + ] + }, + { + "id": 5, + "title": "Meiste Container-Restarts (letzte Stunde)", + "type": "table", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 29 }, + "targets": [ + { + "expr": "topk(10, increase(kube_pod_container_status_restarts_total[1h]) > 0)", + "format": "table", + "instant": true, + "legendFormat": "", + "refId": "A" + } + ] + } + ] + }