From eb3bac5543951d06f79424f6c619a966c8c3d671 Mon Sep 17 00:00:00 2001 From: Alex Pearwin Date: Thu, 6 Jun 2024 17:09:45 +0100 Subject: [PATCH] feat(grafana): add providers configuration (#211) Addresses juspay/services-flake#210. I've tested this by hand with configuration: ```nix services.grafana."grafana" = { enable = true; providers = [ { name = "Databases"; type = "file"; options = { path = ./dashboards; foldersFromFilesStructure = true; }; } ]; }; ``` I haven't looked into it, but it might be possible to extend the existing Grafana test to check that a folder of dashboards is loaded. --- nix/grafana.nix | 33 +++++++++++++++++++++++- nix/grafana_test.nix | 61 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/nix/grafana.nix b/nix/grafana.nix index 3d317303..69690a8a 100644 --- a/nix/grafana.nix +++ b/nix/grafana.nix @@ -51,7 +51,11 @@ in datasources = lib.mkOption { type = types.listOf yamlFormat.type; - description = "List of data sources to configure."; + description = '' + List of data sources to configure. + + See https://grafana.com/docs/grafana/latest/administration/provisioning/#data-sources for the schema. + ''; default = [ ]; example = '' [ @@ -75,6 +79,28 @@ in ''; }; + providers = lib.mkOption { + type = types.listOf yamlFormat.type; + description = '' + List of dashboard providers to configure. + + See https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards for the schema. + ''; + default = [ ]; + example = '' + [ + { + name = "Databases"; + type = "file"; + options = { + path = ./dashboards; + foldersFromFilesStructure = true; + }; + } + ] + ''; + }; + outputs.settings = lib.mkOption { type = types.deferredModule; internal = true; @@ -97,10 +123,15 @@ in deleteDatasources = config.deleteDatasources; datasources = config.datasources; }; + providersYaml = yamlFormat.generate "providers.yaml" { + apiVersion = 1; + providers = config.providers; + }; buildCommand = '' mkdir -p $out mkdir -p $out/alerting mkdir -p $out/dashboards + ln -s "$providersYaml" "$out/dashboards/providers.yaml" mkdir -p $out/datasources ln -s "$datasourcesYaml" "$out/datasources/datasources.yaml" mkdir -p $out/notifiers diff --git a/nix/grafana_test.nix b/nix/grafana_test.nix index 9d0cb725..1b358428 100644 --- a/nix/grafana_test.nix +++ b/nix/grafana_test.nix @@ -1,4 +1,50 @@ -{ pkgs, config, ... }: { +{ pkgs, config, ... }: +let + dashboardUid = "adnyzrfa5cqv4c"; + dashboardTitle = "Test dashboard"; + dashboards = pkgs.writeTextDir "dashboards/test_dashboard.json" '' + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [], + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "${dashboardTitle}", + "uid": "${dashboardUid}", + "version": 1, + "weekStart": "" + } + ''; +in +{ services.grafana."gf1" = { enable = true; @@ -7,6 +53,15 @@ security.admin_user = "patato"; security.admin_password = "potato"; }; + providers = [ + { + name = "Test dashboard provider"; + type = "file"; + options = { + path = "${dashboards}/dashboards"; + }; + } + ]; }; settings.processes.test = @@ -22,8 +77,12 @@ ADMIN=${cfg.extraConf.security.admin_user} PASSWORD=${cfg.extraConf.security.admin_password} ROOT_URL="${cfg.protocol}://${cfg.domain}:${builtins.toString cfg.http_port}"; + # The admin user can authenticate against the running service. curl -sSfN -u $ADMIN:$PASSWORD $ROOT_URL/api/org/users -i curl -sSfN -u $ADMIN:$PASSWORD $ROOT_URL/api/org/users | grep admin\@localhost + # The dashboard provisioner was used to create a dashboard. + curl -sSfN -u $ADMIN:$PASSWORD $ROOT_URL/api/dashboards/uid/${dashboardUid} -i + curl -sSfN -u $ADMIN:$PASSWORD $ROOT_URL/api/dashboards/uid/${dashboardUid} | grep '"title":"${dashboardTitle}"' ''; name = "grafana-test"; };