{ config, lib, pkgs, ... }: let cfg = config.nixfiles.modules.monitoring; in { options.nixfiles.modules.monitoring.enable = lib.mkEnableOption '' a glue to provision a monitoring stack ''; config = lib.mkIf cfg.enable { nixfiles.modules = { loki.enable = true; grafana.enable = true; tempo.enable = false; mimir.enable = true; }; services = { grafana = { declarativePlugins = with pkgs.grafanaPlugins; [ redis-app redis-datasource redis-explorer-app ]; provision = { enable = true; # https://grafana.com/docs/grafana/latest/administration/provisioning/#data-sources datasources.settings.datasources = with config.nixfiles.modules; [ (lib.mkIf mimir.enable { name = "Alertmanager"; type = "alertmanager"; access = "proxy"; url = "https://${mimir.domain}/alertmanager"; jsonData.implementation = "prometheus"; }) (lib.mkIf mimir.enable { name = "Mimir"; type = "prometheus"; access = "proxy"; url = "https://${mimir.domain}/prometheus"; isDefault = true; }) (lib.mkIf loki.enable { name = "Loki"; type = "loki"; access = "proxy"; url = "https://${loki.domain}"; }) (lib.mkIf tempo.enable { name = "Tempo"; type = "tempo"; access = "proxy"; url = "https://${tempo.domain}"; }) (lib.mkIf redis.enable { name = "Redis"; type = "redis-datasource"; access = "proxy"; url = with config.services.redis.servers.default; "redis://${bind}:${toString port}"; jsonData.client = "standalone"; }) ]; datasources.settings.deleteDatasources = with config.nixfiles.modules; [ (lib.mkIf (!mimir.enable) { name = "Alertmanager"; orgId = 1; }) (lib.mkIf (!mimir.enable) { name = "Mimir"; orgId = 1; }) (lib.mkIf (!loki.enable) { name = "Loki"; orgId = 1; }) (lib.mkIf (!tempo.enable) { name = "Tempo"; orgId = 1; }) (lib.mkIf (!redis.enable) { name = "Redis"; orgId = 1; }) ]; # https://grafana.com/docs/grafana/latest/administration/provisioning/#alerting alerting.contactPoints.settings.contactPoints = [ { name = "Alertmanager"; receivers = [ { uid = 1; type = "prometheus-alertmanager"; settings.url = "https://${config.nixfiles.modules.mimir.domain}/alertmanager"; } ]; } ]; }; }; mimir.configuration = { ruler = { alertmanager_url = "https://${config.nixfiles.modules.mimir.domain}/alertmanager"; }; alertmanager = { external_url = "https://${config.nixfiles.modules.mimir.domain}/alertmanager"; }; }; loki.configuration = { ruler = { alertmanager_url = "https://${config.nixfiles.modules.mimir.domain}/alertmanager"; }; }; tempo.settings = { }; }; }; }