nix

configuration files that power my machines
Log | Files | Refs | README | LICENSE

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 }