From dfe7918cdbe93788096d7b67f1727222381e47eb Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Wed, 29 Oct 2025 15:24:57 -0400 Subject: [PATCH 1/2] working json --- clients/quadraticserver/stats/grafana.nix | 24 ++- clients/quadraticserver/stats/status.json | 176 ++++++++++++++++++++++ 2 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 clients/quadraticserver/stats/status.json diff --git a/clients/quadraticserver/stats/grafana.nix b/clients/quadraticserver/stats/grafana.nix index 12f9d51..053639b 100644 --- a/clients/quadraticserver/stats/grafana.nix +++ b/clients/quadraticserver/stats/grafana.nix @@ -43,12 +43,30 @@ in { name = "Prometheus"; type = "prometheus"; + uid = "prometheus"; url = with config.services.prometheus; "http://${listenAddress}:${toString port}"; jsonData.timeInterval = config.services.prometheus.globalConfig.scrape_interval; } ]; dashboards.settings.providers = [ + { + name = "Status"; + options.path = (import ../../../lib/status.nix { inherit pkgs; }) [ + { + name = "Continuwuity (Matrix)"; + service = "continuwuity.service"; + } + { + name = "Forgejo (Git)"; + service = "forgejo.service"; + } + { + name = "SearXNG (Search)"; + service = "searx.service"; + } + ]; + } { name = "Node exporter"; options.path = pkgs.fetchurl { @@ -60,8 +78,10 @@ in ]; }; }; - caddy.virtualHosts."${domain}".extraConfig = - "reverse_proxy unix/${config.services.grafana.settings.server.socket}"; + caddy.virtualHosts."${domain}".extraConfig = '' + redir / /public-dashboards/cf91b463711b401b8bf6336125f70cd3 + reverse_proxy unix/${config.services.grafana.settings.server.socket} + ''; }; users.users.caddy.extraGroups = [ "grafana" ]; diff --git a/clients/quadraticserver/stats/status.json b/clients/quadraticserver/stats/status.json new file mode 100644 index 0000000..b23bb45 --- /dev/null +++ b/clients/quadraticserver/stats/status.json @@ -0,0 +1,176 @@ +{ + "annotations": { + "list": [] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "1": { + "color": "green", + "index": 0, + "text": "Running" + }, + "0": { + "color": "red", + "index": 1, + "text": "Failed" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": 0 + }, + { + "color": "green", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "value" + }, + "pluginVersion": "11.2.0", + "targets": [ + { + "expr": "node_systemd_unit_state{name=\"continuwuity.service\",state=\"active\"}", + "legendFormat": "Matrix", + "refId": "A" + } + ], + "title": "Matrix", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "1": { + "color": "green", + "index": 0, + "text": "Running" + }, + "0": { + "color": "red", + "index": 1, + "text": "Failed" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": 0 + }, + { + "color": "green", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "value" + }, + "pluginVersion": "11.2.0", + "targets": [ + { + "expr": "node_systemd_unit_state{name=\"forgejo.service\",state=\"active\"}", + "legendFormat": "Forgejo (Git)", + "refId": "A" + } + ], + "title": "Forgejo (Git)", + "type": "stat" + } + ], + "refresh": "10s", + "schemaVersion": 39, + "style": "dark", + "tags": ["systemd", "status"], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timezone": "", + "title": "Service Status Dashboard", + "uid": "service-status-dashboard", + "version": 1, + "weekStart": "" +} From e0f20e0e9d61532667973d6d69a1678f9f5bc165 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 30 Oct 2025 16:05:08 -0400 Subject: [PATCH 2/2] working with nix --- clients/quadraticserver/stats/grafana.nix | 43 +++-- clients/quadraticserver/stats/prometheus.nix | 2 +- clients/quadraticserver/stats/status.json | 176 ------------------- lib/status.nix | 59 +++++++ 4 files changed, 81 insertions(+), 199 deletions(-) delete mode 100644 clients/quadraticserver/stats/status.json create mode 100644 lib/status.nix diff --git a/clients/quadraticserver/stats/grafana.nix b/clients/quadraticserver/stats/grafana.nix index 053639b..bef488f 100644 --- a/clients/quadraticserver/stats/grafana.nix +++ b/clients/quadraticserver/stats/grafana.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, pkgs, ... }@attrs: let secretName = "grafanaSecret"; @@ -20,6 +20,7 @@ in enable = true; declarativePlugins = [ ]; settings = { + "auth.anonymous".enabled = true; analytics.feedback_links_enabled = false; users.default_theme = "system"; server = { @@ -35,6 +36,23 @@ in admin_user = "quadradical"; admin_password = "$__file{${credentialDirectory}${passwordName}}"; }; + + dashboards.default_home_dashboard_path = toString ( + (import ../../../lib/status.nix attrs) [ + { + name = "Continuwuity (Matrix)"; + service = "continuwuity.service"; + } + { + name = "Forgejo (Git)"; + service = "forgejo.service"; + } + { + name = "SearXNG (Search)"; + service = "searx.service"; + } + ] + ); }; provision = { @@ -50,23 +68,6 @@ in ]; dashboards.settings.providers = [ - { - name = "Status"; - options.path = (import ../../../lib/status.nix { inherit pkgs; }) [ - { - name = "Continuwuity (Matrix)"; - service = "continuwuity.service"; - } - { - name = "Forgejo (Git)"; - service = "forgejo.service"; - } - { - name = "SearXNG (Search)"; - service = "searx.service"; - } - ]; - } { name = "Node exporter"; options.path = pkgs.fetchurl { @@ -78,10 +79,8 @@ in ]; }; }; - caddy.virtualHosts."${domain}".extraConfig = '' - redir / /public-dashboards/cf91b463711b401b8bf6336125f70cd3 - reverse_proxy unix/${config.services.grafana.settings.server.socket} - ''; + caddy.virtualHosts."${domain}".extraConfig = + "reverse_proxy unix/${config.services.grafana.settings.server.socket}"; }; users.users.caddy.extraGroups = [ "grafana" ]; diff --git a/clients/quadraticserver/stats/prometheus.nix b/clients/quadraticserver/stats/prometheus.nix index e0b2ac1..2ba8dab 100644 --- a/clients/quadraticserver/stats/prometheus.nix +++ b/clients/quadraticserver/stats/prometheus.nix @@ -4,7 +4,7 @@ enable = true; listenAddress = "127.0.0.7"; - globalConfig.scrape_interval = "10s"; + globalConfig.scrape_interval = "3s"; scrapeConfigs = [ { job_name = "node"; diff --git a/clients/quadraticserver/stats/status.json b/clients/quadraticserver/stats/status.json deleted file mode 100644 index b23bb45..0000000 --- a/clients/quadraticserver/stats/status.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "annotations": { - "list": [] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "1": { - "color": "green", - "index": 0, - "text": "Running" - }, - "0": { - "color": "red", - "index": 1, - "text": "Failed" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "value" - }, - "pluginVersion": "11.2.0", - "targets": [ - { - "expr": "node_systemd_unit_state{name=\"continuwuity.service\",state=\"active\"}", - "legendFormat": "Matrix", - "refId": "A" - } - ], - "title": "Matrix", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "1": { - "color": "green", - "index": 0, - "text": "Running" - }, - "0": { - "color": "red", - "index": 1, - "text": "Failed" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 0 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "center", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "textMode": "value" - }, - "pluginVersion": "11.2.0", - "targets": [ - { - "expr": "node_systemd_unit_state{name=\"forgejo.service\",state=\"active\"}", - "legendFormat": "Forgejo (Git)", - "refId": "A" - } - ], - "title": "Forgejo (Git)", - "type": "stat" - } - ], - "refresh": "10s", - "schemaVersion": 39, - "style": "dark", - "tags": ["systemd", "status"], - "templating": { - "list": [] - }, - "time": { - "from": "now-5m", - "to": "now" - }, - "timezone": "", - "title": "Service Status Dashboard", - "uid": "service-status-dashboard", - "version": 1, - "weekStart": "" -} diff --git a/lib/status.nix b/lib/status.nix new file mode 100644 index 0000000..7bb4e6c --- /dev/null +++ b/lib/status.nix @@ -0,0 +1,59 @@ +{ pkgs, lib, ... }: +services: +pkgs.writers.writeJSON "status.json" { + title = "Service Status"; + panels = map ( + { name, service }: + { + datasource = { + type = "prometheus"; + uid = "prometheus"; + }; + fieldConfig = { + defaults = { + color = { + mode = "thresholds"; + }; + mappings = [ + { + options = { + "0" = { + color = "red"; + index = 1; + text = "Failed"; + }; + "1" = { + color = "green"; + index = 0; + text = "Running"; + }; + }; + type = "value"; + } + ]; + thresholds = { + mode = "absolute"; + steps = [ + { + color = "red"; + value = 0; + } + { + color = "green"; + value = 1; + } + ]; + }; + unit = "none"; + }; + }; + targets = [ + { + expr = "node_systemd_unit_state{name=\"${service}\",state=\"active\"}"; + } + ]; + title = name; + type = "stat"; + } + ) services; +}