Files
server-config/containers/common/overseer/helpers.nix
Floweynt 76fa38e34c
flake-check / flake-check (push) Canceled after 0s
lint / lint (push) Canceled after 0s
diff-tag / dix (push) Canceled after 0s
initial commit
2026-08-31 08:41:45 -05:00

229 lines
4.2 KiB
Nix

{ pkgs, lib }:
let
prom = {
type = "prometheus";
uid = "prometheus";
};
loki = {
type = "loki";
uid = "loki";
};
autoLayout =
panels:
let
step =
acc: panel:
let
w = panel.gridPos.w;
h = panel.gridPos.h;
wrap = acc.x + w > 24;
x = if wrap then 0 else acc.x;
y = if wrap then acc.y + acc.rowH else acc.y;
rowH = if wrap then h else lib.max acc.rowH h;
in
{
x = x + w;
inherit y rowH;
result = acc.result ++ [
(
panel
// {
gridPos = panel.gridPos // {
inherit x y;
};
}
)
];
};
in
(lib.foldl' step {
x = 0;
y = 0;
rowH = 0;
result = [ ];
} panels).result;
T = expr: legendFormat: {
datasource = prom;
inherit expr legendFormat;
};
mkRow = title: {
inherit title;
type = "row";
collapsed = false;
panels = [ ];
gridPos = {
w = 24;
h = 1;
};
};
mkStat =
{
title,
w ? 4,
h ? 4,
expr,
unit ? "short",
decimals ? 2,
}:
{
inherit title;
type = "stat";
datasource = prom;
gridPos = { inherit w h; };
fieldConfig.defaults = {
inherit unit decimals;
color.mode = "thresholds";
thresholds = {
mode = "absolute";
steps = [
{
color = "blue";
value = null;
}
];
};
};
options = {
reduceOptions.calcs = [ "lastNotNull" ];
colorMode = "value";
textMode = "value";
};
targets = [
{
datasource = prom;
inherit expr;
instant = true;
legendFormat = "";
}
];
};
mkGauge =
{
title,
w ? 4,
h ? 4,
expr,
unit ? "percent",
min ? 0,
max ? 100,
}:
{
inherit title;
type = "gauge";
datasource = prom;
gridPos = { inherit w h; };
fieldConfig.defaults = {
inherit unit min max;
thresholds = {
mode = "absolute";
steps = [
{
color = "green";
value = null;
}
{
color = "yellow";
value = 70;
}
{
color = "red";
value = 90;
}
];
};
};
options = {
reduceOptions.calcs = [ "lastNotNull" ];
orientation = "auto";
showThresholdLabels = false;
showThresholdMarkers = true;
};
targets = [
{
datasource = prom;
inherit expr;
instant = true;
legendFormat = "";
}
];
};
mkTs =
{
title,
w ? 24,
h ? 8,
unit ? "short",
targets,
}:
{
inherit title targets;
type = "timeseries";
datasource = prom;
gridPos = { inherit w h; };
fieldConfig.defaults = {
inherit unit;
custom = {
lineWidth = 1;
fillOpacity = 5;
};
color.mode = "palette-classic";
};
options = {
tooltip.mode = "multi";
legend = {
displayMode = "table";
placement = "bottom";
calcs = [
"mean"
"max"
"lastNotNull"
];
};
};
};
mkDashboard =
{
name,
title,
uid,
from ? "now-1h",
panels,
templating ? [ ],
}:
pkgs.writeText name (
builtins.toJSON (
{
inherit title uid;
schemaVersion = 37;
refresh = "30s";
time = {
inherit from;
to = "now";
};
panels = lib.imap1 (id: p: p // { inherit id; }) (autoLayout panels);
}
// lib.optionalAttrs (templating != [ ]) { templating.list = templating; }
)
);
in
{
inherit
prom
loki
autoLayout
T
mkRow
mkStat
mkGauge
mkTs
mkDashboard
;
}