|
23 | 23 | # Page options: |
24 | 24 | # background: res/themes/<name>/background.png draw widgets over theme art |
25 | 25 | # header: false / footer: false hide chrome (for art pages) |
| 26 | +# disabled: true keep the page, skip the rotation |
| 27 | +# dwell / refresh per-page overrides of the globals |
26 | 28 | # queries: name: <promql> value from the default `prom` source |
27 | 29 | # name: {source: <name>, query: ...} value from a named source (display.yaml) |
28 | | -# derived: name: <python expr over values> computed values |
| 30 | +# derived: name: <python expr over values> computed values; helpers available: |
| 31 | +# human_rate min max round int str abs |
| 32 | +# NOTE: queries/derived may reuse local value names (cpu_pct, ram_pct, ...) to |
| 33 | +# override them -- that's how remote-host pages reuse the HOST widget layout. |
29 | 34 | # |
30 | 35 | # text format: python format string over the value namespace; unavailable -> "-". |
31 | 36 | # Local values (always): cpu_pct ram_pct ram_used_g ram_total_g disk_pct |
|
38 | 43 | # auto:<name>[:warn:bad] green/amber/red by thresholds (default 70:90) |
39 | 44 | # ok_if:<expr>[:<else-color>] OK when expr true, else bad (or <else-color>) |
40 | 45 |
|
41 | | -dwell: 8 |
| 46 | +dwell: 60 |
42 | 47 | refresh: 2 |
43 | 48 |
|
44 | 49 | pages: |
@@ -98,12 +103,81 @@ pages: |
98 | 103 | - {type: metric, x: 16, y: 170, label: CPU, text: "{cpu:.0f}%", color: "auto:cpu"} |
99 | 104 | - {type: metric, x: 176, y: 170, label: MEM, text: "{mem:.0f}%", color: "auto:mem"} |
100 | 105 |
|
101 | | - # The netmap app embedded as a page (settings inherit from display.yaml `netmap:`) |
| 106 | + # The netmap app embedded as a page (settings inherit from display.yaml `netmap:`). |
| 107 | + # Fast refresh animates the packet dots on spokes with live traffic; host/traffic |
| 108 | + # data itself is cached and only re-queried every `data_refresh` (5s) seconds. |
102 | 109 | - type: netmap |
| 110 | + refresh: 0.5 |
| 111 | + |
| 112 | + - title: PVE2 HOST |
| 113 | + queries: |
| 114 | + cpu_pct: 100-(avg(rate(node_cpu_seconds_total{instance="pve2.local:9100",mode="idle"}[2m]))*100) |
| 115 | + ram_t: node_memory_MemTotal_bytes{instance="pve2.local:9100"} |
| 116 | + ram_a: node_memory_MemAvailable_bytes{instance="pve2.local:9100"} |
| 117 | + disk_t: node_filesystem_size_bytes{instance="pve2.local:9100",mountpoint="/"} |
| 118 | + disk_a: node_filesystem_avail_bytes{instance="pve2.local:9100",mountpoint="/"} |
| 119 | + temp: max(node_hwmon_temp_celsius{instance="pve2.local:9100"}) |
| 120 | + load1: node_load1{instance="pve2.local:9100"} |
| 121 | + up_s: time()-node_boot_time_seconds{instance="pve2.local:9100"} |
| 122 | + net_down: sum(rate(node_network_receive_bytes_total{instance="pve2.local:9100",device=~"en.*|eth.*|nic.*"}[2m])) |
| 123 | + net_up: sum(rate(node_network_transmit_bytes_total{instance="pve2.local:9100",device=~"en.*|eth.*|nic.*"}[2m])) |
| 124 | + derived: |
| 125 | + ram_pct: "100*(1-ram_a/ram_t)" |
| 126 | + ram_used_g: "(ram_t-ram_a)/1e9" |
| 127 | + ram_total_g: "ram_t/1e9" |
| 128 | + disk_pct: "100*(1-disk_a/disk_t)" |
| 129 | + disk_used_g: "(disk_t-disk_a)/1e9" |
| 130 | + disk_total_g: "disk_t/1e9" |
| 131 | + uptime: "str(int(up_s//86400))+'d '+str(int(up_s%86400//3600))+'h'" |
| 132 | + net_down_h: "human_rate(net_down)" |
| 133 | + net_up_h: "human_rate(net_up)" |
| 134 | + widgets: |
| 135 | + - {type: bar, x: 16, y: 62, w: 250, label: CPU, pct: cpu_pct, text: "{cpu_pct:.0f}%"} |
| 136 | + - {type: bar, x: 16, y: 122, w: 250, label: RAM, pct: ram_pct, text: "{ram_used_g:.1f}/{ram_total_g:.0f}G"} |
| 137 | + - {type: bar, x: 16, y: 182, w: 250, label: DISK /, pct: disk_pct, text: "{disk_used_g:.0f}/{disk_total_g:.0f}G"} |
| 138 | + - {type: metric, x: 300, y: 58, label: TEMP, text: "{temp:.0f}°C", color: "auto:temp:75:90"} |
| 139 | + - {type: metric, x: 300, y: 138, label: LOAD, text: "{load1:.2f}"} |
| 140 | + - {type: metric, x: 300, y: 218, label: UPTIME, text: "{uptime}"} |
| 141 | + - {type: text, x: 16, y: 254, size: 13, anchor: lm, text: "DN {net_down_h}"} |
| 142 | + - {type: text, x: 16, y: 274, size: 13, anchor: lm, text: "UP {net_up_h}"} |
| 143 | + |
| 144 | + - title: PROXMOX HOST |
| 145 | + queries: |
| 146 | + cpu_pct: 100-(avg(rate(node_cpu_seconds_total{instance="proxmox.local:9100",mode="idle"}[2m]))*100) |
| 147 | + ram_t: node_memory_MemTotal_bytes{instance="proxmox.local:9100"} |
| 148 | + ram_a: node_memory_MemAvailable_bytes{instance="proxmox.local:9100"} |
| 149 | + disk_t: node_filesystem_size_bytes{instance="proxmox.local:9100",mountpoint="/"} |
| 150 | + disk_a: node_filesystem_avail_bytes{instance="proxmox.local:9100",mountpoint="/"} |
| 151 | + temp: max(node_hwmon_temp_celsius{instance="proxmox.local:9100"}) |
| 152 | + load1: node_load1{instance="proxmox.local:9100"} |
| 153 | + up_s: time()-node_boot_time_seconds{instance="proxmox.local:9100"} |
| 154 | + net_down: sum(rate(node_network_receive_bytes_total{instance="proxmox.local:9100",device=~"en.*|eth.*|nic.*"}[2m])) |
| 155 | + net_up: sum(rate(node_network_transmit_bytes_total{instance="proxmox.local:9100",device=~"en.*|eth.*|nic.*"}[2m])) |
| 156 | + derived: |
| 157 | + ram_pct: "100*(1-ram_a/ram_t)" |
| 158 | + ram_used_g: "(ram_t-ram_a)/1e9" |
| 159 | + ram_total_g: "ram_t/1e9" |
| 160 | + disk_pct: "100*(1-disk_a/disk_t)" |
| 161 | + disk_used_g: "(disk_t-disk_a)/1e9" |
| 162 | + disk_total_g: "disk_t/1e9" |
| 163 | + uptime: "str(int(up_s//86400))+'d '+str(int(up_s%86400//3600))+'h'" |
| 164 | + net_down_h: "human_rate(net_down)" |
| 165 | + net_up_h: "human_rate(net_up)" |
| 166 | + widgets: |
| 167 | + - {type: bar, x: 16, y: 62, w: 250, label: CPU, pct: cpu_pct, text: "{cpu_pct:.0f}%"} |
| 168 | + - {type: bar, x: 16, y: 122, w: 250, label: RAM, pct: ram_pct, text: "{ram_used_g:.1f}/{ram_total_g:.0f}G"} |
| 169 | + - {type: bar, x: 16, y: 182, w: 250, label: DISK /, pct: disk_pct, text: "{disk_used_g:.0f}/{disk_total_g:.0f}G"} |
| 170 | + - {type: metric, x: 300, y: 58, label: TEMP, text: "{temp:.0f}°C", color: "auto:temp:75:90"} |
| 171 | + - {type: metric, x: 300, y: 138, label: LOAD, text: "{load1:.2f}"} |
| 172 | + - {type: metric, x: 300, y: 218, label: UPTIME, text: "{uptime}"} |
| 173 | + - {type: text, x: 16, y: 254, size: 13, anchor: lm, text: "DN {net_down_h}"} |
| 174 | + - {type: text, x: 16, y: 274, size: 13, anchor: lm, text: "UP {net_up_h}"} |
103 | 175 |
|
104 | 176 | # Live values over the stock Cyberdeck theme art: radials trace the ring art, |
105 | 177 | # text widgets sit in its value boxes. GPU ring shows disk until the GPU lands. |
| 178 | + # Parked from the rotation -- flip `disabled` to bring it back. |
106 | 179 | - title: CYBERDECK |
| 180 | + disabled: true |
107 | 181 | background: res/themes/Cyberdeck/background.png |
108 | 182 | header: false |
109 | 183 | footer: false |
|
0 commit comments