grafana.nix (4963B)
1 { 2 config, 3 lib, 4 pkgs, 5 haravara, 6 ... 7 }: let 8 cfg = config.services.haravara.monitoring; 9 authSnippet = haravara.mkAuthImport cfg.authLabel; 10 11 fetchDashboard = { 12 name, 13 sha256, 14 url, 15 }: { 16 inherit name; 17 path = pkgs.runCommand name {} '' 18 sed 's/''${DS_PROMETHEUS}/VictoriaMetrics/g; s/''${DS_LOKI}/Loki/g' ${pkgs.fetchurl {inherit url sha256;}} > $out 19 ''; 20 }; 21 22 grafonnet = pkgs.fetchFromGitHub { 23 owner = "grafana"; 24 repo = "grafonnet"; 25 rev = "7380c9c64fb973f34c3ec46265621a2b0dee0058"; 26 sha256 = "0pablj8mw48hcqqzkgs5cklbcjgma0qksmd45dg2j3az9zzdjbar"; 27 }; 28 grafonnetPath = pkgs.runCommand "grafonnet-jpath" {} '' 29 mkdir -p $out/github.com/grafana 30 ln -s ${grafonnet} $out/github.com/grafana/grafonnet 31 ''; 32 mkGrafonnet = name: src: 33 pkgs.runCommand name {nativeBuildInputs = [pkgs.go-jsonnet];} '' 34 jsonnet -J ${grafonnetPath} ${src} > $out 35 ''; 36 37 dashboards = pkgs.linkFarm "grafana-dashboards" (map fetchDashboard [ 38 { 39 name = "node_exporter.json"; 40 url = "https://grafana.com/api/dashboards/1860/revisions/42/download"; 41 sha256 = "a4d827eb1819044bba2d6d257347175f6811910f2583fadeaf7e123c4df2125e"; 42 } 43 { 44 name = "systemd_exporter.json"; 45 url = "https://grafana.com/api/dashboards/22872/revisions/1/download"; 46 sha256 = "665bc3e86b79749b2fdae7787f4b7502e00830898bf48f73c68134471f72bf33"; 47 } 48 { 49 name = "alertmanager.json"; 50 url = "https://grafana.com/api/dashboards/9578/revisions/4/download"; 51 sha256 = "16jvazvjswiyn281z4r7wmwb18841d3ar24951538kma28l05izy"; 52 } 53 { 54 name = "node_exporter_bsd.json"; 55 url = "https://grafana.com/api/dashboards/4260/revisions/19/download"; 56 sha256 = "ad3aef8744750f1b61f8905b1cddffe1f4274f5594e4aba5e8193f1a617ce765"; 57 } 58 ] 59 ++ lib.optional config.services.haravara.seaweedfs.enable { 60 name = "seaweedfs.json"; 61 url = "https://raw.githubusercontent.com/chrislusf/seaweedfs/c9100a7213e27963f58a0ba783c9598a177384b6/other/metrics/grafana_seaweedfs.json"; 62 sha256 = "e364d113fed54127cbda10c4c2809d99a90dcc38bcd949b91846d0831e1a68e4"; 63 } 64 ++ [ 65 { 66 name = "caddy.json"; 67 path = 68 pkgs.runCommand "caddy.json" { 69 nativeBuildInputs = [pkgs.go-jsonnet]; 70 } '' 71 jsonnet ${../../mixins/monitoring/caddy.jsonnet} > $out 72 ''; 73 } 74 { 75 name = "zfs_exporter.json"; 76 path = mkGrafonnet "zfs_exporter.json" ../../mixins/monitoring/zfs_exporter.jsonnet; 77 } 78 { 79 name = "h2o.json"; 80 path = mkGrafonnet "h2o.json" ../../mixins/monitoring/h2o.jsonnet; 81 } 82 ] 83 ++ lib.optional config.services.haravara.corpus.enable (fetchDashboard { 84 name = "corpus.json"; 85 url = "https://raw.githubusercontent.com/mtmn/corpus/master/monitoring/grafana-dashboard.json"; 86 sha256 = "0b6d4kvcwarv1isy3i4x0l4an7b3zyxyy9af3acr9gbfkkrbyjv5"; 87 }) 88 ++ lib.optional config.services.haravara.monitoring.exporters.blackbox.enable (fetchDashboard { 89 name = "blackbox_exporter.json"; 90 url = "https://grafana.com/api/dashboards/14928/revisions/6/download"; 91 sha256 = "4643193a1d77ba6c7e8d57e13d517531e2e7a6358cd0d1c832f9999229529286"; 92 })); 93 in { 94 options.services.haravara.monitoring.grafana = { 95 enable = lib.mkEnableOption "Grafana dashboard and visualization" // {default = true;}; 96 }; 97 98 config = lib.mkIf (cfg.enable && cfg.grafana.enable) { 99 services.grafana = { 100 enable = true; 101 settings = { 102 server = { 103 http_addr = "127.0.0.1"; 104 http_port = 3001; 105 }; 106 security = { 107 secret_key = "$__file{${cfg.grafanaSecretKeyFile}}"; 108 }; 109 }; 110 provision = { 111 enable = true; 112 datasources.settings = { 113 apiVersion = 1; 114 datasources = 115 (lib.optional cfg.victoriametrics.enable { 116 name = "VictoriaMetrics"; 117 type = "prometheus"; 118 url = "http://127.0.0.1:8428"; 119 uid = "DS_PROMETHEUS"; 120 isDefault = true; 121 }) 122 ++ (lib.optional cfg.loki.enable { 123 name = "Loki"; 124 type = "loki"; 125 url = "http://127.0.0.1:3100"; 126 }) 127 ++ (lib.optional cfg.alertmanager.enable { 128 name = "Alertmanager"; 129 type = "alertmanager"; 130 url = "http://127.0.0.1:${toString cfg.alertmanager.port}"; 131 jsonData = { 132 implementation = "prometheus"; 133 }; 134 }); 135 }; 136 dashboards.settings.providers = [ 137 { 138 name = "Default"; 139 options.path = dashboards; 140 } 141 ]; 142 }; 143 }; 144 145 services.caddy.virtualHosts."${cfg.grafanaDomain}".extraConfig = '' 146 ${authSnippet} 147 reverse_proxy 127.0.0.1:3001 148 ''; 149 }; 150 }