From 4b3851829b26b03b7ef6e91d1357321c94bc8718 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sat, 28 Mar 2026 16:23:49 +0200 Subject: [PATCH] feat: organize Grafana dashboards into folders Enable sidecar folderAnnotation + foldersFromFilesStructure to group 26 dashboards into 5 managed folders: - Cluster (6): k8s health, API server, nodes, pods, kube-state-metrics - Networking (6): CoreDNS, Technitium, Headscale, ingress, network traffic - Hardware (5): node-exporter, proxmox, iDRAC, UPS, NVIDIA GPU - Operations (4): backup health, registry, audit logs, Loki - Applications (2): realestate-crawler, qBittorrent Dashboard-to-folder mapping defined in grafana.tf locals block. External stacks (headscale, technitium) annotated individually. --- stacks/headscale/modules/headscale/main.tf | 3 ++ .../monitoring/modules/monitoring/grafana.tf | 38 +++++++++++++++++++ .../monitoring/grafana_chart_values.yaml | 3 ++ stacks/technitium/modules/technitium/main.tf | 3 ++ 4 files changed, 47 insertions(+) diff --git a/stacks/headscale/modules/headscale/main.tf b/stacks/headscale/modules/headscale/main.tf index 6eed919e..305da387 100644 --- a/stacks/headscale/modules/headscale/main.tf +++ b/stacks/headscale/modules/headscale/main.tf @@ -433,6 +433,9 @@ resource "kubernetes_config_map" "grafana_headscale_dashboard" { labels = { grafana_dashboard = "1" } + annotations = { + grafana_folder = "Networking" + } } data = { "headscale.json" = file("${path.module}/dashboards/headscale.json") diff --git a/stacks/monitoring/modules/monitoring/grafana.tf b/stacks/monitoring/modules/monitoring/grafana.tf index 6fa3113a..fe3804cf 100644 --- a/stacks/monitoring/modules/monitoring/grafana.tf +++ b/stacks/monitoring/modules/monitoring/grafana.tf @@ -102,6 +102,41 @@ resource "kubernetes_manifest" "grafana_db_creds" { } } +locals { + # Dashboard folder assignments + dashboard_folders = { + # Cluster & Kubernetes + "api_server.json" = "Cluster" + "cluster_health.json" = "Cluster" + "nodes.json" = "Cluster" + "pods.json" = "Cluster" + "kube-state-metrics.json" = "Cluster" + # Networking & DNS + "caretta-dashboard.json" = "Networking" + "core_dns.json" = "Networking" + "technitium-dns.json" = "Networking" + "nginx_ingress.json" = "Networking" + "network_traffic.json" = "Networking" + + # Hardware & Host + "node_exporter_full.json" = "Hardware" + "proxmox_node_exporter.json" = "Hardware" + "idrac.json" = "Hardware" + "ups.json" = "Hardware" + "nvidia.json" = "Hardware" + + # Operations + "backup_health.json" = "Operations" + "registry.json" = "Operations" + "loki.json" = "Operations" + "k8s-audit.json" = "Operations" + + # Applications + "qbittorrent.json" = "Applications" + "realestate-crawler.json" = "Applications" + } +} + resource "kubernetes_config_map" "grafana_dashboards" { for_each = fileset("${path.module}/dashboards", "*.json") @@ -111,6 +146,9 @@ resource "kubernetes_config_map" "grafana_dashboards" { labels = { grafana_dashboard = "1" } + annotations = { + grafana_folder = lookup(local.dashboard_folders, each.value, "General") + } } data = { (each.value) = file("${path.module}/dashboards/${each.value}") diff --git a/stacks/monitoring/modules/monitoring/grafana_chart_values.yaml b/stacks/monitoring/modules/monitoring/grafana_chart_values.yaml index f6eacb22..48d88c63 100644 --- a/stacks/monitoring/modules/monitoring/grafana_chart_values.yaml +++ b/stacks/monitoring/modules/monitoring/grafana_chart_values.yaml @@ -53,6 +53,9 @@ sidecar: dashboards: enabled: true label: "grafana_dashboard" + folderAnnotation: "grafana_folder" + provider: + foldersFromFilesStructure: true dashboardProviders: dashboardproviders.yaml: apiVersion: 1 diff --git a/stacks/technitium/modules/technitium/main.tf b/stacks/technitium/modules/technitium/main.tf index 5f06b2e8..d1f05412 100644 --- a/stacks/technitium/modules/technitium/main.tf +++ b/stacks/technitium/modules/technitium/main.tf @@ -352,6 +352,9 @@ resource "kubernetes_config_map" "grafana_technitium_dashboard" { labels = { grafana_dashboard = "1" } + annotations = { + grafana_folder = "Networking" + } } data = { "technitium-dns.json" = file("${path.module}/dashboards/technitium-dns.json")