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.
This commit is contained in:
Alex Pearwin 2024-06-06 17:09:45 +01:00 committed by GitHub
parent 12e74823f4
commit eb3bac5543
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 92 additions and 2 deletions

View File

@ -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

View File

@ -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";
};