From d1cdb4fd136b79bf05828cd4d1deca673f00ed03 Mon Sep 17 00:00:00 2001 From: jenkins Date: Tue, 12 May 2026 03:59:10 -0300 Subject: [PATCH] monitoring: restore atlas overview dashboard --- scripts/dashboards_render_atlas.py | 2 +- .../monitoring/dashboards/atlas-overview.json | 1223 ++++++++++++----- .../grafana-dashboard-overview.yaml | 1223 ++++++++++++----- 3 files changed, 1705 insertions(+), 743 deletions(-) diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index 33b8edf0..d5ff261e 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -1284,7 +1284,7 @@ def bargauge_panel( "overrides": [], }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": ["lastNotNull"], diff --git a/services/monitoring/dashboards/atlas-overview.json b/services/monitoring/dashboards/atlas-overview.json index 8c9873f1..9df0eb83 100644 --- a/services/monitoring/dashboards/atlas-overview.json +++ b/services/monitoring/dashboards/atlas-overview.json @@ -129,7 +129,7 @@ }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -204,7 +204,7 @@ }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -354,7 +354,7 @@ }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -429,7 +429,7 @@ }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -567,7 +567,7 @@ }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -644,7 +644,7 @@ }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -713,7 +713,7 @@ }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -782,7 +782,7 @@ }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -857,7 +857,7 @@ }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -932,7 +932,7 @@ }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -999,7 +999,7 @@ }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -1066,7 +1066,7 @@ }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -1075,52 +1075,22 @@ { "id": 40, "type": "stat", - "title": "UPS Current Load", + "title": "Pyrphoros UPS Current", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 6, - "w": 4, + "h": 3, + "w": 6, "x": 0, - "y": 12 + "y": 7 }, "targets": [ { + "expr": "label_replace(max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0), \"metric\", \"Draw\", \"__name__\", \".*\") or label_replace(max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0), \"metric\", \"Runtime\", \"__name__\", \".*\")", "refId": "A", - "expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)", - "legendFormat": "Pyrphoros Draw (W)", - "instant": true - }, - { - "refId": "B", - "expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)", - "legendFormat": "Pyrphoros Discharge", - "instant": true - }, - { - "refId": "C", - "expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)", - "legendFormat": "Pyrphoros Status", - "instant": true - }, - { - "refId": "D", - "expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)", - "legendFormat": "Statera Draw (W)", - "instant": true - }, - { - "refId": "E", - "expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)", - "legendFormat": "Statera Discharge", - "instant": true - }, - { - "refId": "F", - "expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)", - "legendFormat": "Statera Status", + "legendFormat": "{{metric}}", "instant": true } ], @@ -1146,127 +1116,30 @@ "unit": "none", "custom": { "displayMode": "auto" - }, - "decimals": 1 + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Pyrphoros Draw (W)" + "options": "Draw" }, "properties": [ { "id": "unit", "value": "watt" - }, - { - "id": "description", - "value": "Attached node: titan-db" } ] }, { "matcher": { "id": "byName", - "options": "Statera Draw (W)" - }, - "properties": [ - { - "id": "unit", - "value": "watt" - }, - { - "id": "description", - "value": "Attached node: titan-24" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Pyrphoros Discharge" + "options": "Runtime" }, "properties": [ { "id": "unit", "value": "s" - }, - { - "id": "description", - "value": "Attached node: titan-db" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Statera Discharge" - }, - "properties": [ - { - "id": "unit", - "value": "s" - }, - { - "id": "description", - "value": "Attached node: titan-24" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Pyrphoros Status" - }, - "properties": [ - { - "id": "mappings", - "value": [ - { - "type": "value", - "options": { - "0": { - "text": "\u26a1 Charging" - }, - "1": { - "text": "\ud83d\udd0b Discharging" - } - } - } - ] - }, - { - "id": "description", - "value": "Attached node: titan-db" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Statera Status" - }, - "properties": [ - { - "id": "mappings", - "value": [ - { - "type": "value", - "options": { - "0": { - "text": "\u26a1 Charging" - }, - "1": { - "text": "\ud83d\udd0b Discharging" - } - } - } - ] - }, - { - "id": "description", - "value": "Attached node: titan-24" } ] } @@ -1284,17 +1157,116 @@ "values": false }, "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": true + "text": { + "titleSize": 14, + "valueSize": 30 + } }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } + ] + }, + { + "id": 144, + "type": "stat", + "title": "Statera UPS Current", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 10 + }, + "targets": [ + { + "expr": "label_replace(max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0), \"metric\", \"Draw\", \"__name__\", \".*\") or label_replace(max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0), \"metric\", \"Runtime\", \"__name__\", \".*\")", + "refId": "A", + "legendFormat": "{{metric}}", + "instant": true + } ], - "description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status." + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(115, 115, 115, 1)", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + }, + "unit": "none", + "custom": { + "displayMode": "auto" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Draw" + }, + "properties": [ + { + "id": "unit", + "value": "watt" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Runtime" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 14, + "valueSize": 30 + } + }, + "links": [ + { + "title": "Open atlas-power dashboard", + "url": "/d/atlas-power", + "targetBlank": true + } + ] }, { "id": 41, @@ -1306,9 +1278,9 @@ }, "gridPos": { "h": 6, - "w": 4, - "x": 4, - "y": 12 + "w": 6, + "x": 6, + "y": 7 }, "targets": [ { @@ -1330,8 +1302,8 @@ }, "options": { "legend": { - "displayMode": "list", - "placement": "bottom" + "displayMode": "table", + "placement": "right" }, "tooltip": { "mode": "multi" @@ -1339,7 +1311,7 @@ }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } @@ -1348,40 +1320,22 @@ { "id": 42, "type": "stat", - "title": "Current Climate", + "title": "Current Enclosure Temperature", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 6, - "w": 4, - "x": 8, - "y": 12 + "h": 3, + "w": 6, + "x": 0, + "y": 13 }, "targets": [ { + "expr": "label_replace(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)) or on() vector(0), \"metric\", \"\u00b0C\", \"__name__\", \".*\") or label_replace(max((max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)) * 9 / 5 + 32) or on() vector(0), \"metric\", \"\u00b0F\", \"__name__\", \".*\")", "refId": "A", - "expr": "max(typhon_temperature_celsius) or on() vector(0)", - "legendFormat": "Tent Temp (\u00b0C)", - "instant": true - }, - { - "refId": "B", - "expr": "max(typhon_vpd_kpa) or on() vector(0)", - "legendFormat": "Tent VPD (kPa)", - "instant": true - }, - { - "refId": "C", - "expr": "max(typhon_relative_humidity_percent) or on() vector(0)", - "legendFormat": "Tent RH (%)", - "instant": true - }, - { - "refId": "D", - "expr": "max((243.12 * (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius))) / (17.62 - (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius)))) or on() vector(0)", - "legendFormat": "Dew Point (\u00b0C)", + "legendFormat": "{{metric}}", "instant": true } ], @@ -1407,14 +1361,13 @@ "unit": "none", "custom": { "displayMode": "auto" - }, - "decimals": 2 + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Tent Temp (\u00b0C)" + "options": "\u00b0C" }, "properties": [ { @@ -1426,36 +1379,12 @@ { "matcher": { "id": "byName", - "options": "Tent VPD (kPa)" + "options": "\u00b0F" }, "properties": [ { "id": "unit", - "value": "suffix:kPa" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Tent RH (%)" - }, - "properties": [ - { - "id": "unit", - "value": "percent" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dew Point (\u00b0C)" - }, - "properties": [ - { - "id": "unit", - "value": "celsius" + "value": "fahrenheit" } ] } @@ -1472,93 +1401,402 @@ "fields": "", "values": false }, - "textMode": "value", - "orientation": "horizontal", - "wideLayout": true + "textMode": "name_and_value", + "text": { + "titleSize": 14, + "valueSize": 30 + } }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } - ], - "description": "Current tent temperature, humidity, VPD, and dew point." + ] }, { - "id": 43, - "type": "timeseries", - "title": "Climate History", + "id": 143, + "type": "stat", + "title": "Current Enclosure Climate", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 6, - "w": 4, - "x": 12, - "y": 12 + "h": 3, + "w": 6, + "x": 0, + "y": 16 }, "targets": [ { + "expr": "label_replace(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)) or on() vector(0), \"metric\", \"%RH\", \"__name__\", \".*\") or label_replace(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)) or on() vector(0), \"metric\", \"kPa\", \"__name__\", \".*\")", "refId": "A", - "expr": "typhon_temperature_celsius", - "legendFormat": "Temperature (\u00b0C)" - }, - { - "refId": "B", - "expr": "typhon_relative_humidity_percent", - "legendFormat": "Humidity (%)" - }, - { - "refId": "C", - "expr": "typhon_vpd_kpa", - "legendFormat": "VPD (kPa)" - }, - { - "refId": "D", - "expr": "(243.12 * (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius))) / (17.62 - (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius)))", - "legendFormat": "Dew Point (\u00b0C)" + "legendFormat": "{{metric}}", + "instant": true } ], "fieldConfig": { "defaults": { - "unit": "celsius" + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(115, 115, 115, 1)", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + }, + "unit": "none", + "custom": { + "displayMode": "auto" + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Humidity (%)" + "options": "%RH" }, "properties": [ { "id": "unit", - "value": "percent" + "value": "suffix:%RH" } ] }, { "matcher": { "id": "byName", - "options": "VPD (kPa)" + "options": "kPa" }, "properties": [ { "id": "unit", - "value": "none" + "value": "suffix:kPa" + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 14, + "valueSize": 30 + } + }, + "links": [ + { + "title": "Open atlas-power dashboard", + "url": "/d/atlas-power", + "targetBlank": true + } + ] + }, + { + "id": 43, + "type": "timeseries", + "title": "Enclosure Climate History", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 13 + }, + "targets": [ + { + "refId": "A", + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)", + "legendFormat": "C" + }, + { + "refId": "B", + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)", + "legendFormat": "RH" + }, + { + "refId": "C", + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)", + "legendFormat": "P" + }, + { + "refId": "D", + "expr": "(min_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)[$__range]) - 0.08)", + "legendFormat": "C bound min" + }, + { + "refId": "E", + "expr": "(max_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)[$__range]) + 0.08)", + "legendFormat": "C bound max" + }, + { + "refId": "F", + "expr": "clamp_min((min_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)[$__range]) - 0.35), 0)", + "legendFormat": "RH bound min" + }, + { + "refId": "G", + "expr": "clamp_max((max_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)[$__range]) + 0.35), 100)", + "legendFormat": "RH bound max" + }, + { + "refId": "H", + "expr": "clamp_min((min_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)[$__range]) - 0.03), 0)", + "legendFormat": "P bound min" + }, + { + "refId": "I", + "expr": "(max_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)[$__range]) + 0.03)", + "legendFormat": "P bound max" + } + ], + "fieldConfig": { + "defaults": { + "unit": "none", + "custom": { + "drawStyle": "line", + "lineInterpolation": "linear", + "lineWidth": 2, + "fillOpacity": 10, + "showPoints": "never", + "spanNulls": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "C" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:\u00b0C" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.axisPlacement", + "value": "left" + }, + { + "id": "custom.axisCenteredZero", + "value": false + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "C bound .*" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:\u00b0C" + }, + { + "id": "custom.axisPlacement", + "value": "left" + }, + { + "id": "custom.axisCenteredZero", + "value": false + }, + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.showPoints", + "value": "never" + }, + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "transparent" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RH" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:%" + }, + { + "id": "decimals", + "value": 2 }, { "id": "custom.axisPlacement", "value": "right" }, { - "id": "custom.axisLabel", - "value": "kPa" + "id": "custom.axisCenteredZero", + "value": false + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "RH bound .*" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:%" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.axisCenteredZero", + "value": false + }, + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.showPoints", + "value": "never" + }, + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "transparent" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "P" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:kPa" + }, + { + "id": "custom.axisPlacement", + "value": "right" }, { "id": "decimals", "value": 2 + }, + { + "id": "custom.axisCenteredZero", + "value": false + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "P bound .*" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:kPa" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.axisCenteredZero", + "value": false + }, + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.showPoints", + "value": "never" + }, + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "transparent" + } } ] } @@ -1575,12 +1813,12 @@ }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } ], - "description": "Two-axis chart: tent temperature/humidity/dew point (left axis) and VPD in kPa (right axis)." + "description": "Temperature on left axis, humidity and pressure on right axis with dynamic bound series so small swings remain visible." }, { "id": 140, @@ -1592,33 +1830,15 @@ }, "gridPos": { "h": 6, - "w": 4, - "x": 16, - "y": 12 + "w": 6, + "x": 12, + "y": 13 }, "targets": [ { + "expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})) or on() vector(0))), \"metric\", \"Inlet - In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})) or on() vector(0))), \"metric\", \"Inlet - Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")", "refId": "A", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"outlet\"}) or on() vector(0))", - "legendFormat": "Inside Outlet", - "instant": true - }, - { - "refId": "B", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"inside_inlet\"}) or on() vector(0))", - "legendFormat": "Inside Inlet", - "instant": true - }, - { - "refId": "C", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"outside_inlet\"}) or on() vector(0))", - "legendFormat": "Outside Inlet", - "instant": true - }, - { - "refId": "D", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"interior\"}) or on() vector(0))", - "legendFormat": "Interior Fans", + "legendFormat": "{{metric}}", "instant": true } ], @@ -1651,7 +1871,56 @@ }, "decimals": 0 }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Outlet" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inlet - In" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inlet - Out" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Interior" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + } + ] }, "options": { "colorMode": "value", @@ -1665,12 +1934,15 @@ "values": false }, "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": true + "orientation": "vertical", + "wideLayout": false, + "text": { + "valueSize": 26 + } }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } @@ -1686,30 +1958,30 @@ }, "gridPos": { "h": 6, - "w": 4, - "x": 20, - "y": 12 + "w": 6, + "x": 18, + "y": 13 }, "targets": [ { "refId": "A", - "expr": "typhon_fan_speed_level{fan_group=\"outlet\"}", - "legendFormat": "Inside Outlet" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})", + "legendFormat": "Outlet" }, { "refId": "B", - "expr": "typhon_fan_speed_level{fan_group=\"inside_inlet\"}", - "legendFormat": "Inside Inlet" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})", + "legendFormat": "Inlet - Inside" }, { "refId": "C", - "expr": "typhon_fan_speed_level{fan_group=\"outside_inlet\"}", - "legendFormat": "Outside Inlet" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})", + "legendFormat": "Inlet - Outside" }, { "refId": "D", - "expr": "typhon_fan_speed_level{fan_group=\"interior\"}", - "legendFormat": "Interior Fans" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})", + "legendFormat": "Interior" } ], "fieldConfig": { @@ -1721,8 +1993,8 @@ }, "options": { "legend": { - "displayMode": "list", - "placement": "bottom" + "displayMode": "table", + "placement": "right" }, "tooltip": { "mode": "multi" @@ -1730,7 +2002,7 @@ }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } @@ -1746,9 +2018,9 @@ }, "gridPos": { "h": 5, - "w": 6, + "w": 8, "x": 0, - "y": 7 + "y": 32 }, "targets": [ { @@ -1760,9 +2032,6 @@ ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "unit": "h", "min": 0, "max": null, @@ -1792,7 +2061,7 @@ "overrides": [] }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -1804,7 +2073,7 @@ }, "links": [ { - "title": "Open Atlas Testing", + "title": "Open atlas-jobs dashboard", "url": "/d/atlas-jobs", "targetBlank": true } @@ -1836,19 +2105,19 @@ "uid": "atlas-vm" }, "gridPos": { - "h": 5, + "h": 6, "w": 6, - "x": 6, + "x": 12, "y": 7 }, "targets": [ { - "expr": "sum(increase(ariadne_task_runs_total[$__interval]))", + "expr": "sum(increase(ariadne_task_runs_total[$__interval])) or on() vector(0)", "refId": "A", "legendFormat": "Attempts" }, { - "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval]))", + "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval])) or on() vector(0)", "refId": "B", "legendFormat": "Failures" } @@ -1901,7 +2170,7 @@ }, "links": [ { - "title": "Open Atlas Testing", + "title": "Open atlas-jobs dashboard", "url": "/d/atlas-jobs", "targetBlank": true } @@ -1916,56 +2185,66 @@ "uid": "atlas-vm" }, "gridPos": { - "h": 5, + "h": 6, "w": 6, - "x": 12, + "x": 18, "y": 7 }, "targets": [ { "refId": "A", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "ariadne" }, { "refId": "B", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"metis\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"metis\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"metis\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"metis\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"metis\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "metis" }, { "refId": "C", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "ananke" }, { "refId": "D", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "atlasbot" }, { "refId": "E", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "pegasus" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"lesavka\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"lesavka\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"lesavka\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "lesavka" }, { "refId": "F", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "soteria" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "pegasus" }, { "refId": "G", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"titan_iac|titan-iac\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"titan_iac|titan-iac\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "titan_iac" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "soteria" }, { "refId": "H", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"bstein_home|bstein-home\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"bstein_home|bstein-home\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "bstein_home" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"titan-iac|titan_iac\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"titan-iac|titan_iac\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"titan-iac|titan_iac\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "titan-iac" }, { "refId": "I", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"data_prepper|data-prepper\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"data_prepper|data-prepper\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "data_prepper" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"bstein-home|bstein_home\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"bstein-home|bstein_home\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"bstein-home|bstein_home\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "bstein-home" + }, + { + "refId": "J", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"arcanagon\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"arcanagon\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"arcanagon\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "arcanagon" + }, + { + "refId": "K", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"data-prepper|data_prepper\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"data-prepper|data_prepper\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"data-prepper|data_prepper\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "data-prepper" } ], "fieldConfig": { @@ -1999,14 +2278,228 @@ }, "links": [ { - "title": "Open Atlas Testing", - "url": "/d/atlas-jobs", + "title": "Open atlas-testing dashboard", + "url": "/d/atlas-testing", "targetBlank": true } ], "timeFrom": "7d", "description": "Per-run interval pass points (0-100) for each software suite over the last 7 days. Points are connected to show trend; missing-run intervals are ignored." }, + { + "id": 142, + "type": "stat", + "title": "Jenkins Last Success (h, newest first)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 8, + "y": 32 + }, + "targets": [ + { + "refId": "A", + "expr": "sort((label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1), \"run_state\", \"ok\", \"exported_job\", \".*\")) or (label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) != 1), \"run_state\", \"bad\", \"exported_job\", \".*\")))", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "h", + "decimals": 1, + "min": 0, + "displayName": "${__field.labels.weather_icon} ${__field.labels.exported_job}", + "links": [ + { + "title": "Open Jenkins job", + "url": "https://ci.bstein.dev/job/${__field.labels.exported_job}/", + "targetBlank": true + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"ok\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "green" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"bad\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "red" + } + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "left", + "orientation": "horizontal", + "wideLayout": true, + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 11, + "valueSize": 11 + } + }, + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "asc" + } + } + ], + "links": [ + { + "title": "Open atlas-jobs dashboard", + "url": "/d/atlas-jobs", + "targetBlank": true + } + ], + "description": "Top 6 most recent Jenkins successes by age (newest first). Green means last run succeeded; red means last run did not succeed. Use Atlas Jobs for the full list." + }, + { + "id": 243, + "type": "stat", + "title": "Jenkins Last Failure (h, newest first)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 12, + "y": 32 + }, + "targets": [ + { + "refId": "A", + "expr": "sort((label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1), \"run_state\", \"ok\", \"exported_job\", \".*\")) or (label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) != 1), \"run_state\", \"bad\", \"exported_job\", \".*\")))", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "h", + "decimals": 1, + "min": 0, + "displayName": "${__field.labels.weather_icon} ${__field.labels.exported_job}", + "links": [ + { + "title": "Open Jenkins job", + "url": "https://ci.bstein.dev/job/${__field.labels.exported_job}/", + "targetBlank": true + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"ok\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "green" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"bad\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "red" + } + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "left", + "orientation": "horizontal", + "wideLayout": true, + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 11, + "valueSize": 11 + } + }, + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "asc" + } + } + ], + "links": [ + { + "title": "Open atlas-jobs dashboard", + "url": "/d/atlas-jobs", + "targetBlank": true + } + ], + "description": "Top 6 most recent Jenkins failures by age (newest first). Green means last run succeeded; red means last run did not succeed. Use Atlas Jobs for the full list." + }, { "id": 47, "type": "bargauge", @@ -2017,13 +2510,13 @@ }, "gridPos": { "h": 5, - "w": 6, - "x": 18, - "y": 7 + "w": 8, + "x": 16, + "y": 32 }, "targets": [ { - "expr": "sort_desc(max by (namespace, pvc) (pvc_backup_age_hours or on(namespace, pvc) ((1 - pvc_backup_health) * 999)))", + "expr": "sort_desc(max by (namespace, pvc) (((time() - pvc_backup_last_success_timestamp_seconds{driver=\"restic\"}) / 3600) or on(namespace,pvc,volume,driver) ((((pvc_backup_health_reason{driver=\"restic\",reason=~\"missing|no_completed|lookup_failed|unknown_timestamp\"} > 0) * (pvc_backup_count{driver=\"restic\"} > bool 0)) * 999))) or on() vector(0))", "refId": "A", "legendFormat": "{{namespace}}/{{pvc}}", "instant": true @@ -2031,9 +2524,6 @@ ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "unit": "h", "min": 0, "max": null, @@ -2062,7 +2552,7 @@ "overrides": [] }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -2085,12 +2575,12 @@ ], "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } ], - "description": "Oldest successful backup age in hours by PVC with nightly cadence thresholds (green <=20h, yellow <40h, orange <50h, red >=50h). PVCs with missing or unhealthy backup state are forced to 999h so critical bars stay visible." + "description": "Backup age in hours computed from last-success timestamps for restic-managed PVCs (nightly target: <=20h green, <40h yellow, <50h orange, >=50h red). PVCs that have backup history but currently no successful backup (missing/no_completed/error) are pinned to 999h for visibility." }, { "id": 30, @@ -2104,7 +2594,7 @@ "h": 2, "w": 4, "x": 0, - "y": 18 + "y": 19 }, "targets": [ { @@ -2153,7 +2643,7 @@ }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2171,7 +2661,7 @@ "h": 2, "w": 4, "x": 8, - "y": 18 + "y": 19 }, "targets": [ { @@ -2258,7 +2748,7 @@ }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2276,7 +2766,7 @@ "h": 2, "w": 4, "x": 4, - "y": 18 + "y": 19 }, "targets": [ { @@ -2334,7 +2824,7 @@ }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2352,7 +2842,7 @@ "h": 2, "w": 4, "x": 12, - "y": 18 + "y": 19 }, "targets": [ { @@ -2410,7 +2900,7 @@ }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2428,7 +2918,7 @@ "h": 2, "w": 4, "x": 16, - "y": 18 + "y": 19 }, "targets": [ { @@ -2491,7 +2981,7 @@ "h": 2, "w": 4, "x": 20, - "y": 18 + "y": 19 }, "targets": [ { @@ -2761,7 +3251,7 @@ "h": 12, "w": 12, "x": 0, - "y": 39 + "y": 44 }, "targets": [ { @@ -2790,7 +3280,7 @@ }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -2808,7 +3298,7 @@ "h": 12, "w": 12, "x": 12, - "y": 39 + "y": 44 }, "targets": [ { @@ -2837,7 +3327,7 @@ }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -2855,7 +3345,7 @@ "h": 10, "w": 12, "x": 0, - "y": 51 + "y": 56 }, "targets": [ { @@ -2892,7 +3382,7 @@ "h": 10, "w": 12, "x": 12, - "y": 51 + "y": 56 }, "targets": [ { @@ -2929,7 +3419,7 @@ "h": 10, "w": 12, "x": 0, - "y": 61 + "y": 66 }, "targets": [ { @@ -2980,7 +3470,7 @@ "h": 10, "w": 12, "x": 12, - "y": 61 + "y": 66 }, "targets": [ { @@ -2992,9 +3482,6 @@ ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "unit": "none", "min": 0, "max": null, @@ -3024,7 +3511,7 @@ "overrides": [] }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -3064,7 +3551,7 @@ "h": 7, "w": 8, "x": 0, - "y": 32 + "y": 37 }, "targets": [ { @@ -3090,7 +3577,7 @@ }, "links": [ { - "title": "Open Atlas Network", + "title": "Open atlas-network dashboard", "url": "/d/atlas-network", "targetBlank": true } @@ -3108,7 +3595,7 @@ "h": 7, "w": 8, "x": 8, - "y": 32 + "y": 37 }, "targets": [ { @@ -3134,7 +3621,7 @@ }, "links": [ { - "title": "Open Atlas Network", + "title": "Open atlas-network dashboard", "url": "/d/atlas-network", "targetBlank": true } @@ -3152,7 +3639,7 @@ "h": 7, "w": 8, "x": 16, - "y": 32 + "y": 37 }, "targets": [ { @@ -3178,7 +3665,7 @@ }, "links": [ { - "title": "Open Atlas Network", + "title": "Open atlas-network dashboard", "url": "/d/atlas-network", "targetBlank": true } @@ -3196,7 +3683,7 @@ "h": 16, "w": 12, "x": 0, - "y": 71 + "y": 76 }, "targets": [ { @@ -3226,7 +3713,7 @@ "timeFrom": "30d", "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -3244,7 +3731,7 @@ "h": 16, "w": 12, "x": 12, - "y": 71 + "y": 76 }, "targets": [ { @@ -3274,7 +3761,7 @@ "timeFrom": "1w", "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -3398,11 +3885,5 @@ "to": "now" }, "refresh": "1m", - "links": [ - { - "title": "Atlas Testing (Internal)", - "url": "/d/atlas-jobs", - "targetBlank": false - } - ] + "links": [] } diff --git a/services/monitoring/grafana-dashboard-overview.yaml b/services/monitoring/grafana-dashboard-overview.yaml index 8f428421..3013cd35 100644 --- a/services/monitoring/grafana-dashboard-overview.yaml +++ b/services/monitoring/grafana-dashboard-overview.yaml @@ -138,7 +138,7 @@ data: }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -213,7 +213,7 @@ data: }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -363,7 +363,7 @@ data: }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -438,7 +438,7 @@ data: }, "links": [ { - "title": "Open Atlas Pods", + "title": "Open atlas-pods dashboard", "url": "/d/atlas-pods", "targetBlank": true } @@ -576,7 +576,7 @@ data: }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -653,7 +653,7 @@ data: }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -722,7 +722,7 @@ data: }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -791,7 +791,7 @@ data: }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -866,7 +866,7 @@ data: }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -941,7 +941,7 @@ data: }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -1008,7 +1008,7 @@ data: }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -1075,7 +1075,7 @@ data: }, "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -1084,52 +1084,22 @@ data: { "id": 40, "type": "stat", - "title": "UPS Current Load", + "title": "Pyrphoros UPS Current", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 6, - "w": 4, + "h": 3, + "w": 6, "x": 0, - "y": 12 + "y": 7 }, "targets": [ { + "expr": "label_replace(max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0), \"metric\", \"Draw\", \"__name__\", \".*\") or label_replace(max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0), \"metric\", \"Runtime\", \"__name__\", \".*\")", "refId": "A", - "expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)", - "legendFormat": "Pyrphoros Draw (W)", - "instant": true - }, - { - "refId": "B", - "expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)", - "legendFormat": "Pyrphoros Discharge", - "instant": true - }, - { - "refId": "C", - "expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)", - "legendFormat": "Pyrphoros Status", - "instant": true - }, - { - "refId": "D", - "expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)", - "legendFormat": "Statera Draw (W)", - "instant": true - }, - { - "refId": "E", - "expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)", - "legendFormat": "Statera Discharge", - "instant": true - }, - { - "refId": "F", - "expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)", - "legendFormat": "Statera Status", + "legendFormat": "{{metric}}", "instant": true } ], @@ -1155,127 +1125,30 @@ data: "unit": "none", "custom": { "displayMode": "auto" - }, - "decimals": 1 + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Pyrphoros Draw (W)" + "options": "Draw" }, "properties": [ { "id": "unit", "value": "watt" - }, - { - "id": "description", - "value": "Attached node: titan-db" } ] }, { "matcher": { "id": "byName", - "options": "Statera Draw (W)" - }, - "properties": [ - { - "id": "unit", - "value": "watt" - }, - { - "id": "description", - "value": "Attached node: titan-24" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Pyrphoros Discharge" + "options": "Runtime" }, "properties": [ { "id": "unit", "value": "s" - }, - { - "id": "description", - "value": "Attached node: titan-db" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Statera Discharge" - }, - "properties": [ - { - "id": "unit", - "value": "s" - }, - { - "id": "description", - "value": "Attached node: titan-24" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Pyrphoros Status" - }, - "properties": [ - { - "id": "mappings", - "value": [ - { - "type": "value", - "options": { - "0": { - "text": "\u26a1 Charging" - }, - "1": { - "text": "\ud83d\udd0b Discharging" - } - } - } - ] - }, - { - "id": "description", - "value": "Attached node: titan-db" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Statera Status" - }, - "properties": [ - { - "id": "mappings", - "value": [ - { - "type": "value", - "options": { - "0": { - "text": "\u26a1 Charging" - }, - "1": { - "text": "\ud83d\udd0b Discharging" - } - } - } - ] - }, - { - "id": "description", - "value": "Attached node: titan-24" } ] } @@ -1293,17 +1166,116 @@ data: "values": false }, "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": true + "text": { + "titleSize": 14, + "valueSize": 30 + } }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } + ] + }, + { + "id": 144, + "type": "stat", + "title": "Statera UPS Current", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 10 + }, + "targets": [ + { + "expr": "label_replace(max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0), \"metric\", \"Draw\", \"__name__\", \".*\") or label_replace(max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0), \"metric\", \"Runtime\", \"__name__\", \".*\")", + "refId": "A", + "legendFormat": "{{metric}}", + "instant": true + } ], - "description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status." + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(115, 115, 115, 1)", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + }, + "unit": "none", + "custom": { + "displayMode": "auto" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Draw" + }, + "properties": [ + { + "id": "unit", + "value": "watt" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Runtime" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 14, + "valueSize": 30 + } + }, + "links": [ + { + "title": "Open atlas-power dashboard", + "url": "/d/atlas-power", + "targetBlank": true + } + ] }, { "id": 41, @@ -1315,9 +1287,9 @@ data: }, "gridPos": { "h": 6, - "w": 4, - "x": 4, - "y": 12 + "w": 6, + "x": 6, + "y": 7 }, "targets": [ { @@ -1339,8 +1311,8 @@ data: }, "options": { "legend": { - "displayMode": "list", - "placement": "bottom" + "displayMode": "table", + "placement": "right" }, "tooltip": { "mode": "multi" @@ -1348,7 +1320,7 @@ data: }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } @@ -1357,40 +1329,22 @@ data: { "id": 42, "type": "stat", - "title": "Current Climate", + "title": "Current Enclosure Temperature", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 6, - "w": 4, - "x": 8, - "y": 12 + "h": 3, + "w": 6, + "x": 0, + "y": 13 }, "targets": [ { + "expr": "label_replace(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)) or on() vector(0), \"metric\", \"\u00b0C\", \"__name__\", \".*\") or label_replace(max((max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)) * 9 / 5 + 32) or on() vector(0), \"metric\", \"\u00b0F\", \"__name__\", \".*\")", "refId": "A", - "expr": "max(typhon_temperature_celsius) or on() vector(0)", - "legendFormat": "Tent Temp (\u00b0C)", - "instant": true - }, - { - "refId": "B", - "expr": "max(typhon_vpd_kpa) or on() vector(0)", - "legendFormat": "Tent VPD (kPa)", - "instant": true - }, - { - "refId": "C", - "expr": "max(typhon_relative_humidity_percent) or on() vector(0)", - "legendFormat": "Tent RH (%)", - "instant": true - }, - { - "refId": "D", - "expr": "max((243.12 * (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius))) / (17.62 - (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius)))) or on() vector(0)", - "legendFormat": "Dew Point (\u00b0C)", + "legendFormat": "{{metric}}", "instant": true } ], @@ -1416,14 +1370,13 @@ data: "unit": "none", "custom": { "displayMode": "auto" - }, - "decimals": 2 + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Tent Temp (\u00b0C)" + "options": "\u00b0C" }, "properties": [ { @@ -1435,36 +1388,12 @@ data: { "matcher": { "id": "byName", - "options": "Tent VPD (kPa)" + "options": "\u00b0F" }, "properties": [ { "id": "unit", - "value": "suffix:kPa" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Tent RH (%)" - }, - "properties": [ - { - "id": "unit", - "value": "percent" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dew Point (\u00b0C)" - }, - "properties": [ - { - "id": "unit", - "value": "celsius" + "value": "fahrenheit" } ] } @@ -1481,93 +1410,402 @@ data: "fields": "", "values": false }, - "textMode": "value", - "orientation": "horizontal", - "wideLayout": true + "textMode": "name_and_value", + "text": { + "titleSize": 14, + "valueSize": 30 + } }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } - ], - "description": "Current tent temperature, humidity, VPD, and dew point." + ] }, { - "id": 43, - "type": "timeseries", - "title": "Climate History", + "id": 143, + "type": "stat", + "title": "Current Enclosure Climate", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 6, - "w": 4, - "x": 12, - "y": 12 + "h": 3, + "w": 6, + "x": 0, + "y": 16 }, "targets": [ { + "expr": "label_replace(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)) or on() vector(0), \"metric\", \"%RH\", \"__name__\", \".*\") or label_replace(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)) or on() vector(0), \"metric\", \"kPa\", \"__name__\", \".*\")", "refId": "A", - "expr": "typhon_temperature_celsius", - "legendFormat": "Temperature (\u00b0C)" - }, - { - "refId": "B", - "expr": "typhon_relative_humidity_percent", - "legendFormat": "Humidity (%)" - }, - { - "refId": "C", - "expr": "typhon_vpd_kpa", - "legendFormat": "VPD (kPa)" - }, - { - "refId": "D", - "expr": "(243.12 * (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius))) / (17.62 - (ln(clamp_min(typhon_relative_humidity_percent, 1) / 100) + (17.62 * typhon_temperature_celsius) / (243.12 + typhon_temperature_celsius)))", - "legendFormat": "Dew Point (\u00b0C)" + "legendFormat": "{{metric}}", + "instant": true } ], "fieldConfig": { "defaults": { - "unit": "celsius" + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(115, 115, 115, 1)", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + }, + "unit": "none", + "custom": { + "displayMode": "auto" + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Humidity (%)" + "options": "%RH" }, "properties": [ { "id": "unit", - "value": "percent" + "value": "suffix:%RH" } ] }, { "matcher": { "id": "byName", - "options": "VPD (kPa)" + "options": "kPa" }, "properties": [ { "id": "unit", - "value": "none" + "value": "suffix:kPa" + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 14, + "valueSize": 30 + } + }, + "links": [ + { + "title": "Open atlas-power dashboard", + "url": "/d/atlas-power", + "targetBlank": true + } + ] + }, + { + "id": 43, + "type": "timeseries", + "title": "Enclosure Climate History", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 13 + }, + "targets": [ + { + "refId": "A", + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)", + "legendFormat": "C" + }, + { + "refId": "B", + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)", + "legendFormat": "RH" + }, + { + "refId": "C", + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)", + "legendFormat": "P" + }, + { + "refId": "D", + "expr": "(min_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)[$__range]) - 0.08)", + "legendFormat": "C bound min" + }, + { + "refId": "E", + "expr": "(max_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)[$__range]) + 0.08)", + "legendFormat": "C bound max" + }, + { + "refId": "F", + "expr": "clamp_min((min_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)[$__range]) - 0.35), 0)", + "legendFormat": "RH bound min" + }, + { + "refId": "G", + "expr": "clamp_max((max_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)[$__range]) + 0.35), 100)", + "legendFormat": "RH bound max" + }, + { + "refId": "H", + "expr": "clamp_min((min_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)[$__range]) - 0.03), 0)", + "legendFormat": "P bound min" + }, + { + "refId": "I", + "expr": "(max_over_time(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)[$__range]) + 0.03)", + "legendFormat": "P bound max" + } + ], + "fieldConfig": { + "defaults": { + "unit": "none", + "custom": { + "drawStyle": "line", + "lineInterpolation": "linear", + "lineWidth": 2, + "fillOpacity": 10, + "showPoints": "never", + "spanNulls": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "C" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:\u00b0C" + }, + { + "id": "decimals", + "value": 2 + }, + { + "id": "custom.axisPlacement", + "value": "left" + }, + { + "id": "custom.axisCenteredZero", + "value": false + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "C bound .*" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:\u00b0C" + }, + { + "id": "custom.axisPlacement", + "value": "left" + }, + { + "id": "custom.axisCenteredZero", + "value": false + }, + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.showPoints", + "value": "never" + }, + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "transparent" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RH" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:%" + }, + { + "id": "decimals", + "value": 2 }, { "id": "custom.axisPlacement", "value": "right" }, { - "id": "custom.axisLabel", - "value": "kPa" + "id": "custom.axisCenteredZero", + "value": false + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "RH bound .*" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:%" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.axisCenteredZero", + "value": false + }, + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.showPoints", + "value": "never" + }, + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "transparent" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "P" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:kPa" + }, + { + "id": "custom.axisPlacement", + "value": "right" }, { "id": "decimals", "value": 2 + }, + { + "id": "custom.axisCenteredZero", + "value": false + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "P bound .*" + }, + "properties": [ + { + "id": "unit", + "value": "suffix:kPa" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.axisCenteredZero", + "value": false + }, + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false + } + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.showPoints", + "value": "never" + }, + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "transparent" + } } ] } @@ -1584,12 +1822,12 @@ data: }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } ], - "description": "Two-axis chart: tent temperature/humidity/dew point (left axis) and VPD in kPa (right axis)." + "description": "Temperature on left axis, humidity and pressure on right axis with dynamic bound series so small swings remain visible." }, { "id": 140, @@ -1601,33 +1839,15 @@ data: }, "gridPos": { "h": 6, - "w": 4, - "x": 16, - "y": 12 + "w": 6, + "x": 12, + "y": 13 }, "targets": [ { + "expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})) or on() vector(0))), \"metric\", \"Inlet - In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})) or on() vector(0))), \"metric\", \"Inlet - Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")", "refId": "A", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"outlet\"}) or on() vector(0))", - "legendFormat": "Inside Outlet", - "instant": true - }, - { - "refId": "B", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"inside_inlet\"}) or on() vector(0))", - "legendFormat": "Inside Inlet", - "instant": true - }, - { - "refId": "C", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"outside_inlet\"}) or on() vector(0))", - "legendFormat": "Outside Inlet", - "instant": true - }, - { - "refId": "D", - "expr": "round(max(typhon_fan_speed_level{fan_group=\"interior\"}) or on() vector(0))", - "legendFormat": "Interior Fans", + "legendFormat": "{{metric}}", "instant": true } ], @@ -1660,7 +1880,56 @@ data: }, "decimals": 0 }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Outlet" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inlet - In" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inlet - Out" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Interior" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + } + ] }, "options": { "colorMode": "value", @@ -1674,12 +1943,15 @@ data: "values": false }, "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": true + "orientation": "vertical", + "wideLayout": false, + "text": { + "valueSize": 26 + } }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } @@ -1695,30 +1967,30 @@ data: }, "gridPos": { "h": 6, - "w": 4, - "x": 20, - "y": 12 + "w": 6, + "x": 18, + "y": 13 }, "targets": [ { "refId": "A", - "expr": "typhon_fan_speed_level{fan_group=\"outlet\"}", - "legendFormat": "Inside Outlet" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})", + "legendFormat": "Outlet" }, { "refId": "B", - "expr": "typhon_fan_speed_level{fan_group=\"inside_inlet\"}", - "legendFormat": "Inside Inlet" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})", + "legendFormat": "Inlet - Inside" }, { "refId": "C", - "expr": "typhon_fan_speed_level{fan_group=\"outside_inlet\"}", - "legendFormat": "Outside Inlet" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})", + "legendFormat": "Inlet - Outside" }, { "refId": "D", - "expr": "typhon_fan_speed_level{fan_group=\"interior\"}", - "legendFormat": "Interior Fans" + "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})", + "legendFormat": "Interior" } ], "fieldConfig": { @@ -1730,8 +2002,8 @@ data: }, "options": { "legend": { - "displayMode": "list", - "placement": "bottom" + "displayMode": "table", + "placement": "right" }, "tooltip": { "mode": "multi" @@ -1739,7 +2011,7 @@ data: }, "links": [ { - "title": "Open Atlas Power", + "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } @@ -1755,9 +2027,9 @@ data: }, "gridPos": { "h": 5, - "w": 6, + "w": 8, "x": 0, - "y": 7 + "y": 32 }, "targets": [ { @@ -1769,9 +2041,6 @@ data: ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "unit": "h", "min": 0, "max": null, @@ -1801,7 +2070,7 @@ data: "overrides": [] }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -1813,7 +2082,7 @@ data: }, "links": [ { - "title": "Open Atlas Testing", + "title": "Open atlas-jobs dashboard", "url": "/d/atlas-jobs", "targetBlank": true } @@ -1845,19 +2114,19 @@ data: "uid": "atlas-vm" }, "gridPos": { - "h": 5, + "h": 6, "w": 6, - "x": 6, + "x": 12, "y": 7 }, "targets": [ { - "expr": "sum(increase(ariadne_task_runs_total[$__interval]))", + "expr": "sum(increase(ariadne_task_runs_total[$__interval])) or on() vector(0)", "refId": "A", "legendFormat": "Attempts" }, { - "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval]))", + "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval])) or on() vector(0)", "refId": "B", "legendFormat": "Failures" } @@ -1910,7 +2179,7 @@ data: }, "links": [ { - "title": "Open Atlas Testing", + "title": "Open atlas-jobs dashboard", "url": "/d/atlas-jobs", "targetBlank": true } @@ -1925,56 +2194,66 @@ data: "uid": "atlas-vm" }, "gridPos": { - "h": 5, + "h": 6, "w": 6, - "x": 12, + "x": 18, "y": 7 }, "targets": [ { "refId": "A", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"ariadne\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "ariadne" }, { "refId": "B", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"metis\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"metis\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"metis\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"metis\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"metis\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "metis" }, { "refId": "C", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"ananke\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "ananke" }, { "refId": "D", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"atlasbot\"}[1h]))) > 0) or on() vector(0)", "legendFormat": "atlasbot" }, { "refId": "E", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "pegasus" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"lesavka\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"lesavka\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"lesavka\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "lesavka" }, { "refId": "F", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "soteria" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"pegasus|pegasus-health|pegasus_health\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "pegasus" }, { "refId": "G", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"titan_iac|titan-iac\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"titan_iac|titan-iac\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "titan_iac" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"soteria\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "soteria" }, { "refId": "H", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"bstein_home|bstein-home\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"bstein_home|bstein-home\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "bstein_home" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"titan-iac|titan_iac\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"titan-iac|titan_iac\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"titan-iac|titan_iac\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "titan-iac" }, { "refId": "I", - "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"data_prepper|data-prepper\",status=~\"ok|passed|success\",exported_job=\"platform-quality-ci\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"data_prepper|data-prepper\",exported_job=\"platform-quality-ci\"}[1h]))), 1))", - "legendFormat": "data_prepper" + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"bstein-home|bstein_home\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"bstein-home|bstein_home\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"bstein-home|bstein_home\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "bstein-home" + }, + { + "refId": "J", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"arcanagon\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"arcanagon\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"arcanagon\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "arcanagon" + }, + { + "refId": "K", + "expr": "(100 * (sum(increase(platform_quality_gate_runs_total{suite=~\"data-prepper|data_prepper\",status=~\"ok|passed|success\"}[1h]))) / clamp_min((sum(increase(platform_quality_gate_runs_total{suite=~\"data-prepper|data_prepper\"}[1h]))), 1)) and on() ((sum(increase(platform_quality_gate_runs_total{suite=~\"data-prepper|data_prepper\"}[1h]))) > 0) or on() vector(0)", + "legendFormat": "data-prepper" } ], "fieldConfig": { @@ -2008,14 +2287,228 @@ data: }, "links": [ { - "title": "Open Atlas Testing", - "url": "/d/atlas-jobs", + "title": "Open atlas-testing dashboard", + "url": "/d/atlas-testing", "targetBlank": true } ], "timeFrom": "7d", "description": "Per-run interval pass points (0-100) for each software suite over the last 7 days. Points are connected to show trend; missing-run intervals are ignored." }, + { + "id": 142, + "type": "stat", + "title": "Jenkins Last Success (h, newest first)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 8, + "y": 32 + }, + "targets": [ + { + "refId": "A", + "expr": "sort((label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1), \"run_state\", \"ok\", \"exported_job\", \".*\")) or (label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) != 1), \"run_state\", \"bad\", \"exported_job\", \".*\")))", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "h", + "decimals": 1, + "min": 0, + "displayName": "${__field.labels.weather_icon} ${__field.labels.exported_job}", + "links": [ + { + "title": "Open Jenkins job", + "url": "https://ci.bstein.dev/job/${__field.labels.exported_job}/", + "targetBlank": true + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"ok\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "green" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"bad\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "red" + } + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "left", + "orientation": "horizontal", + "wideLayout": true, + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 11, + "valueSize": 11 + } + }, + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "asc" + } + } + ], + "links": [ + { + "title": "Open atlas-jobs dashboard", + "url": "/d/atlas-jobs", + "targetBlank": true + } + ], + "description": "Top 6 most recent Jenkins successes by age (newest first). Green means last run succeeded; red means last run did not succeed. Use Atlas Jobs for the full list." + }, + { + "id": 243, + "type": "stat", + "title": "Jenkins Last Failure (h, newest first)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 12, + "y": 32 + }, + "targets": [ + { + "refId": "A", + "expr": "sort((label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1), \"run_state\", \"ok\", \"exported_job\", \".*\")) or (label_replace((sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) != 1), \"run_state\", \"bad\", \"exported_job\", \".*\")))", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "h", + "decimals": 1, + "min": 0, + "displayName": "${__field.labels.weather_icon} ${__field.labels.exported_job}", + "links": [ + { + "title": "Open Jenkins job", + "url": "https://ci.bstein.dev/job/${__field.labels.exported_job}/", + "targetBlank": true + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"ok\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "green" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": ".*run_state=\"bad\".*" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "fixed", + "fixedColor": "red" + } + } + ] + } + ] + }, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "left", + "orientation": "horizontal", + "wideLayout": true, + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "name_and_value", + "text": { + "titleSize": 11, + "valueSize": 11 + } + }, + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "asc" + } + } + ], + "links": [ + { + "title": "Open atlas-jobs dashboard", + "url": "/d/atlas-jobs", + "targetBlank": true + } + ], + "description": "Top 6 most recent Jenkins failures by age (newest first). Green means last run succeeded; red means last run did not succeed. Use Atlas Jobs for the full list." + }, { "id": 47, "type": "bargauge", @@ -2026,13 +2519,13 @@ data: }, "gridPos": { "h": 5, - "w": 6, - "x": 18, - "y": 7 + "w": 8, + "x": 16, + "y": 32 }, "targets": [ { - "expr": "sort_desc(max by (namespace, pvc) (pvc_backup_age_hours or on(namespace, pvc) ((1 - pvc_backup_health) * 999)))", + "expr": "sort_desc(max by (namespace, pvc) (((time() - pvc_backup_last_success_timestamp_seconds{driver=\"restic\"}) / 3600) or on(namespace,pvc,volume,driver) ((((pvc_backup_health_reason{driver=\"restic\",reason=~\"missing|no_completed|lookup_failed|unknown_timestamp\"} > 0) * (pvc_backup_count{driver=\"restic\"} > bool 0)) * 999))) or on() vector(0))", "refId": "A", "legendFormat": "{{namespace}}/{{pvc}}", "instant": true @@ -2040,9 +2533,6 @@ data: ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "unit": "h", "min": 0, "max": null, @@ -2071,7 +2561,7 @@ data: "overrides": [] }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -2094,12 +2584,12 @@ data: ], "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } ], - "description": "Oldest successful backup age in hours by PVC with nightly cadence thresholds (green <=20h, yellow <40h, orange <50h, red >=50h). PVCs with missing or unhealthy backup state are forced to 999h so critical bars stay visible." + "description": "Backup age in hours computed from last-success timestamps for restic-managed PVCs (nightly target: <=20h green, <40h yellow, <50h orange, >=50h red). PVCs that have backup history but currently no successful backup (missing/no_completed/error) are pinned to 999h for visibility." }, { "id": 30, @@ -2113,7 +2603,7 @@ data: "h": 2, "w": 4, "x": 0, - "y": 18 + "y": 19 }, "targets": [ { @@ -2162,7 +2652,7 @@ data: }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2180,7 +2670,7 @@ data: "h": 2, "w": 4, "x": 8, - "y": 18 + "y": 19 }, "targets": [ { @@ -2267,7 +2757,7 @@ data: }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2285,7 +2775,7 @@ data: "h": 2, "w": 4, "x": 4, - "y": 18 + "y": 19 }, "targets": [ { @@ -2343,7 +2833,7 @@ data: }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2361,7 +2851,7 @@ data: "h": 2, "w": 4, "x": 12, - "y": 18 + "y": 19 }, "targets": [ { @@ -2419,7 +2909,7 @@ data: }, "links": [ { - "title": "Open Atlas Mail", + "title": "Open atlas-mail dashboard", "url": "/d/atlas-mail", "targetBlank": true } @@ -2437,7 +2927,7 @@ data: "h": 2, "w": 4, "x": 16, - "y": 18 + "y": 19 }, "targets": [ { @@ -2500,7 +2990,7 @@ data: "h": 2, "w": 4, "x": 20, - "y": 18 + "y": 19 }, "targets": [ { @@ -2770,7 +3260,7 @@ data: "h": 12, "w": 12, "x": 0, - "y": 39 + "y": 44 }, "targets": [ { @@ -2799,7 +3289,7 @@ data: }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -2817,7 +3307,7 @@ data: "h": 12, "w": 12, "x": 12, - "y": 39 + "y": 44 }, "targets": [ { @@ -2846,7 +3336,7 @@ data: }, "links": [ { - "title": "Open Atlas Nodes", + "title": "Open atlas-nodes dashboard", "url": "/d/atlas-nodes", "targetBlank": true } @@ -2864,7 +3354,7 @@ data: "h": 10, "w": 12, "x": 0, - "y": 51 + "y": 56 }, "targets": [ { @@ -2901,7 +3391,7 @@ data: "h": 10, "w": 12, "x": 12, - "y": 51 + "y": 56 }, "targets": [ { @@ -2938,7 +3428,7 @@ data: "h": 10, "w": 12, "x": 0, - "y": 61 + "y": 66 }, "targets": [ { @@ -2989,7 +3479,7 @@ data: "h": 10, "w": 12, "x": 12, - "y": 61 + "y": 66 }, "targets": [ { @@ -3001,9 +3491,6 @@ data: ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, "unit": "none", "min": 0, "max": null, @@ -3033,7 +3520,7 @@ data: "overrides": [] }, "options": { - "displayMode": "basic", + "displayMode": "gradient", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -3073,7 +3560,7 @@ data: "h": 7, "w": 8, "x": 0, - "y": 32 + "y": 37 }, "targets": [ { @@ -3099,7 +3586,7 @@ data: }, "links": [ { - "title": "Open Atlas Network", + "title": "Open atlas-network dashboard", "url": "/d/atlas-network", "targetBlank": true } @@ -3117,7 +3604,7 @@ data: "h": 7, "w": 8, "x": 8, - "y": 32 + "y": 37 }, "targets": [ { @@ -3143,7 +3630,7 @@ data: }, "links": [ { - "title": "Open Atlas Network", + "title": "Open atlas-network dashboard", "url": "/d/atlas-network", "targetBlank": true } @@ -3161,7 +3648,7 @@ data: "h": 7, "w": 8, "x": 16, - "y": 32 + "y": 37 }, "targets": [ { @@ -3187,7 +3674,7 @@ data: }, "links": [ { - "title": "Open Atlas Network", + "title": "Open atlas-network dashboard", "url": "/d/atlas-network", "targetBlank": true } @@ -3205,7 +3692,7 @@ data: "h": 16, "w": 12, "x": 0, - "y": 71 + "y": 76 }, "targets": [ { @@ -3235,7 +3722,7 @@ data: "timeFrom": "30d", "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -3253,7 +3740,7 @@ data: "h": 16, "w": 12, "x": 12, - "y": 71 + "y": 76 }, "targets": [ { @@ -3283,7 +3770,7 @@ data: "timeFrom": "1w", "links": [ { - "title": "Open Atlas Storage", + "title": "Open atlas-storage dashboard", "url": "/d/atlas-storage", "targetBlank": true } @@ -3407,11 +3894,5 @@ data: "to": "now" }, "refresh": "1m", - "links": [ - { - "title": "Atlas Testing (Internal)", - "url": "/d/atlas-jobs", - "targetBlank": false - } - ] + "links": [] }