From 57fbe5b50be69365ab4be1c45b6d5b4e607acb05 Mon Sep 17 00:00:00 2001 From: Crony Akatsuki Date: Sun, 5 Oct 2025 18:18:56 +0200 Subject: [PATCH] feat(glance): add stats for beszel monitoring of my servers --- modules/servers/tyr/glance.nix | 239 +++++++++++++++++++++++++++++++- modules/servers/tyr/secrets.nix | 3 + secrets/glance.age | Bin 0 -> 1484 bytes secrets/secrets.nix | 1 + 4 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 secrets/glance.age diff --git a/modules/servers/tyr/glance.nix b/modules/servers/tyr/glance.nix index 77b65d4..5da1f26 100644 --- a/modules/servers/tyr/glance.nix +++ b/modules/servers/tyr/glance.nix @@ -1,4 +1,4 @@ -{ +{config, ...}: { services.glance = { enable = true; openFirewall = true; @@ -45,10 +45,235 @@ ]; } { - type = "videos"; - channels = [ - "UCR-DXc1voovS8nhAvccRZhg" - ]; + type = "custom-api"; + title = "Beszel stats"; + cache = "5m"; + options = { + base-url = "\${BESZEL_URL}"; + api-key = "\${BESZEL_TOKEN}"; + }; + template = '' + {{/* Required config options */}} + {{ $baseURL := .Options.StringOr "base-url" "" }} + {{ $apiKey := .Options.StringOr "api-key" "" }} + + {{/* Error message template */}} + {{ define "errorMsg" }} +
+
ERROR
+ + + +
+

{{ . }}

+ {{ end }} + + {{ define "formatGigabytes" }} + {{ $value := . }} + {{ $label := "GB" }} + {{- if lt $value 1.0 }} + {{ $value = mul $value 1000.0 }} + {{ $label = "MB" }} + {{- else if lt $value 1000.0 }} + {{ else }} + {{ $value = div $value 1000.0 }} + {{ $label = "TB" }} + {{ end }} + {{ printf "%.1f" $value }} {{ $label }} + {{ end }} + + {{/* Check required fields */}} + {{ if or (eq $baseURL "") (eq $apiKey "") }} + {{ template "errorMsg" "Some required options are not set." }} + {{ else }} + + {{ $token := concat "Bearer " $apiKey }} + + {{ $systemsResponse := newRequest (print $baseURL "/api/collections/systems/records") + | withHeader "Authorization" $token + | getResponse }} + {{ $systems := $systemsResponse.JSON.Array "items" }} + + + {{ range $n, $system := $systems }} + {{ $status := $system.String "status" }} + + {{ $systemStatsRequest := newRequest (print $baseURL "/api/collections/system_stats/records") + | withHeader "Authorization" $token + | withParameter "sort" "-created" + | withParameter "page" "1" + | withParameter "perPage" "1" + | withParameter "filter" (print "type='1m'&&system='" ($system.String "id") "'") + | getResponse }} + {{ $systemStats := index ($systemStatsRequest.JSON.Array "items") 0 }} + + {{ $hostname := $system.String "name" }} + {{ $uptimeSec := $system.Float "info.u" }} + + {{ $systemTemp := $system.Float "info.dt"}} + + {{ $cpuLoad := $system.Float "info.cpu" }} + {{ $cpuLoad1m := $system.Float "info.l1" }} + {{ $cpuLoad15m := $system.Float "info.l15" }} + + {{ $memoryUsedPercent := $system.Float "info.mp" }} + {{ $memoryTotalGb := $systemStats.Float "stats.m" }} + {{ $memoryUsedGb := $systemStats.Float "stats.mu" }} + + {{ $swapTotalGb := $systemStats.Float "stats.s" }} + {{ $swapUsedGb := $systemStats.Float "stats.su" }} + {{ $swapUsedPercent := mul (div $swapUsedGb $swapTotalGb) 100.0 }} + + {{ $rootUsedPercent := $system.Float "info.dp" }} + {{ $rootTotalGb := $systemStats.Float "stats.d" }} + {{ $rootUsedGb := $systemStats.Float "stats.du" }} + +
+
+
+
{{ $hostname }}
+
+ {{ if eq $status "up" }} + {{ printf "%.1f" (mul $uptimeSec 0.000011574) }}d uptime + {{ else }} + unreachable + {{ end }} +
+
+
+ {{- if eq $status "up" }} +
+
+
Kernel
+
+
{{ $system.String "info.k" }}
+
+
+
CPU
+
+
{{ $system.String "info.m" }}
+
+
+ {{- end }} + + + +
+
+ +
+
+
+
CPU
+ {{- if ge $systemTemp 80.0 }} + + + + {{- end }} +
{{ $cpuLoad }} %
+
+
+
+
+
1M AVG
+
+
{{ printf "%.1f" $cpuLoad1m }} %
+
+
+
15M AVG
+
+
{{ printf "%.1f" $cpuLoad15m }} %
+
+
+
TEMP C
+
+
{{ printf "%.1f" $systemTemp }} °
+
+
+ +
+
+
+
+
+
+ +
+
+
RAM
+
{{ $memoryUsedPercent }} %
+
+
+
+
+
RAM
+
+
+ {{ template "formatGigabytes" $memoryUsedGb }} / {{ template "formatGigabytes" $memoryTotalGb }} +
+
+ {{- if gt $swapTotalGb 0.0 }} +
+
SWAP
+
+
+ {{ template "formatGigabytes" $swapUsedGb }} / {{ template "formatGigabytes" $swapTotalGb }} +
+
+ {{- end }} +
+
+
+ {{- if gt $swapTotalGb 0.0 }} +
+ {{- end }} +
+
+
+ +
+
+
DISK
+
{{ $rootUsedPercent }} %
+
+
+
+
    +
  • +
    /
    +
    +
    + {{ template "formatGigabytes" $rootUsedGb }} / {{ template "formatGigabytes" $rootTotalGb }} +
    +
  • + {{ range $key, $efs := ($systemStats.Get "stats.efs").Map }} +
  • +
    {{ $key }}
    +
    +
    + {{ template "formatGigabytes" (($efs.Get "du").Float) }} / {{ template "formatGigabytes" (($efs.Get "d").Float) }} +
    +
  • + {{ end }} +
+
+
+
+ {{ range $key, $efs := ($systemStats.Get "stats.efs").Map }} + {{ $efsTotalGb := (($efs.Get "d").Float) }} + {{ $efsUsedGb := (($efs.Get "du").Float) }} + {{ $efsPercent := mul (div $efsUsedGb $efsTotalGb) 100 }} +
+ {{ end }} +
+
+
+ +
+
+ {{ end }} + {{ end }} + ''; } ]; } @@ -77,4 +302,8 @@ ]; }; }; + + systemd.services.glance.serviceConfig = { + EnvironmentFile = ["${config.age.secrets.glance.path}"]; + }; } diff --git a/modules/servers/tyr/secrets.nix b/modules/servers/tyr/secrets.nix index 2c23a49..14d10a8 100644 --- a/modules/servers/tyr/secrets.nix +++ b/modules/servers/tyr/secrets.nix @@ -19,6 +19,9 @@ restic-server-env = { file = ../../../secrets/restic-server-env.age; }; + glance = { + file = ../../../secrets/glance.age; + }; }; }; } diff --git a/secrets/glance.age b/secrets/glance.age new file mode 100644 index 0000000000000000000000000000000000000000..43efa986fdb1625173654c19fae17d4f6423a792 GIT binary patch literal 1484 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCSP3NXp@E>|cCjI7K{ z_cb>3DGhOp^6*cpDhiGYsWdbwH+9J z@2uidAK%idpfHnc54Vg0_khG4gL1AwZ^yh66T{T7(uh=Zch3q>$0FBq=d42gj12AI zVEv>h$3Xoc!<0O8({gm%{L2kO+{+bmGLkJVy#tH%Q=!YhIzoJ)&x%QL(TElMN(9jn}3i%negBTOwyjl2t8O)|9& zoWm;pLp{-LOLq12^L126uSoJuHZ3smuF!T5jmRy}$?*&E%QOuLH802u2?)-q%rwa{ zadOEH2?^y&%}NXQF;CB|Oe@VP@v{gHu?UK&h;mFVcP}r?bPi9Aa?dkx4{&jHkBCIK ztuV>gyC_h>*|$6}IjkzV(lgbl$~B_OD z%-72`C9yD9-!;J3Co0&i+{M$(r#vgqAT7+?EyJSB$Iz)H(=yxKqbM8QwkU&K$EtFL zV85iW@?gWld^byTL(f2qC=Y*=beDAh$f(S+s>)nCF{M-u9%8;@Y%WxBP+uZ%4B7@QuJSz$UQ_8|~ z%}i1=GYvgVOuYgf&B8(q1A_uf1N6fT%hEEOa|8WLJOVAaQVhLAL$v*T%-nKv!m~28 zD-*rUEG*JIElk3*v?GnoP09;Bs?sA0ozgIDOH0v@@(EN3anHy}(N7OGO!7)LN{fo9 zOieX$DGtdl%QDI`PEILx3(U!Jb_sMh%gW};2=fezFtoJvtFmy*EJ%*B2n;MQi}VOL zuSoJv@^gwXb&AN&v2ZL24ZuhxRe?^KQRNE7m5zmlrbQuTX6`0lkzvV|E*%B*^ylSk#5D2fsvIZd0yuEIl)DS;Z52MP{*}&t zxhDSE*-7rDCFxwcy1EJx*%{7}g(1OZMM)L87LLU^5xJ4x!A@xr=IOtb0;e>Kz;V@+pH$q|vX= zj^ndk|N2xP^C>)fn5SEZD`MZaJF|}_DK(v6ug{XjrEXwua5>ku$@l&~-qxhLjgK#U z-@#I{`h%S8vcq@HCtsNq`M~*Mw`@g8+ACQe#~Wu~cF1u*Z?)RF+i>%Qmua)ApZLsI z>#1CO|Nhxtd7&Ei9~x|2g$wo>U9_?NqkO{4wrrM`>c`D|g*zvh>u8xN)AJrY|zS zzRw|F{qmEP2Vu__g=|UOrgTdxH}j&9y`z#=Pbq_XX7ln>tpU(mmY~ eW3_GTnU}&-_g(mXq4V49@Y6{P4(NS)vKau>nGW&* literal 0 HcmV?d00001 diff --git a/secrets/secrets.nix b/secrets/secrets.nix index a6f6211..5198713 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -42,4 +42,5 @@ in { "wg-ymir-home.age".publicKeys = systems ++ users; "wg-tyr.age".publicKeys = systems ++ users; "duckdns.age".publicKeys = systems ++ users; + "glance.age".publicKeys = systems ++ users; }