diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index 2bf09ca6..6ea0cb62 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -594,6 +594,47 @@ CLIMATE_FAN_OUTSIDE_INLET_SERIES = ( CLIMATE_FAN_INTERIOR_SERIES = ( f'max without ({CLIMATE_DEDUP_LABELS}) (typhon_fan_speed_level{{fan_group=~"interior|unknown"}})' ) + + +def with_metric_label(expr, metric): + return f'label_replace(({expr}), "metric", "{metric}", "__name__", ".*")' + + +def with_ups_metric_labels(expr, ups, metric): + return ( + f'label_replace(' + f'label_replace(({expr}), "ups", "{ups}", "__name__", ".*"), ' + f'"metric", "{metric}", "__name__", ".*"' + f')' + ) + + +CLIMATE_CURRENT_ROW_EXPR = " or ".join( + [ + with_metric_label(CLIMATE_TEMP_MAX, "Temp °C"), + with_metric_label(CLIMATE_TEMP_FAHRENHEIT_MAX, "Temp °F"), + with_metric_label(CLIMATE_HUMIDITY_MAX, "Humidity"), + with_metric_label(CLIMATE_PRESSURE_CURRENT, "Pressure"), + ] +) +CLIMATE_FAN_CURRENT_ROW_EXPR = " or ".join( + [ + with_metric_label(f"round({CLIMATE_FAN_OUTLET_CURRENT})", "Outlet"), + with_metric_label(f"round({CLIMATE_FAN_INSIDE_INLET_CURRENT})", "Inlet In"), + with_metric_label(f"round({CLIMATE_FAN_OUTSIDE_INLET_CURRENT})", "Inlet Out"), + with_metric_label(f"round({CLIMATE_FAN_INTERIOR_CURRENT})", "Interior"), + ] +) +UPS_CURRENT_ROW_EXPR = " or ".join( + [ + with_ups_metric_labels(ANANKE_UPS_DRAW_WATTS_DB, ANANKE_UPS_DB_NAME, "Draw (W)"), + with_ups_metric_labels(ANANKE_UPS_RUNTIME_DB, ANANKE_UPS_DB_NAME, "Discharge"), + with_ups_metric_labels(ANANKE_UPS_ON_BATTERY_DB, ANANKE_UPS_DB_NAME, "Status"), + with_ups_metric_labels(ANANKE_UPS_DRAW_WATTS_TETHYS, ANANKE_UPS_TETHYS_NAME, "Draw (W)"), + with_ups_metric_labels(ANANKE_UPS_RUNTIME_TETHYS, ANANKE_UPS_TETHYS_NAME, "Discharge"), + with_ups_metric_labels(ANANKE_UPS_ON_BATTERY_TETHYS, ANANKE_UPS_TETHYS_NAME, "Status"), + ] +) POSTGRES_CONN_USED = ( 'label_replace(sum(pg_stat_activity_count), "conn", "used", "__name__", ".*") ' 'or label_replace(max(pg_settings_max_connections), "conn", "max", "__name__", ".*")' @@ -861,6 +902,10 @@ def table_panel( filterable=True, footer=None, format=None, + targets=None, + field_overrides=None, + links=None, + description=None, ): """Return a Grafana table panel definition.""" # Optional PromQL subquery helpers in expr: share(), etc. @@ -870,21 +915,29 @@ def table_panel( if footer is not None: panel_options["footer"] = footer field_defaults = {"unit": unit, "custom": {"filterable": filterable}} - target = {"expr": expr, "refId": "A", **({"instant": True} if instant else {})} + target_list = targets if targets is not None else [{"expr": expr, "refId": "A"}] + if instant: + for target in target_list: + target.setdefault("instant", True) if format: - target["format"] = format + for target in target_list: + target.setdefault("format", format) panel = { "id": panel_id, "type": "table", "title": title, "datasource": PROM_DS, "gridPos": grid, - "targets": [target], - "fieldConfig": {"defaults": field_defaults, "overrides": []}, + "targets": target_list, + "fieldConfig": {"defaults": field_defaults, "overrides": field_overrides or []}, "options": panel_options, } if transformations: panel["transformations"] = transformations + if links: + panel["links"] = links + if description: + panel["description"] = description return panel @@ -1344,54 +1397,23 @@ def build_overview(): ] panels.append( - stat_panel( + table_panel( 40, "UPS Current Load", - None, + UPS_CURRENT_ROW_EXPR, {"h": 5, "w": 6, "x": 0, "y": 7}, - unit="none", - decimals=1, - text_mode="name_and_value", - targets=[ - {"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Draw (W)", "instant": True}, - {"refId": "B", "expr": ANANKE_UPS_RUNTIME_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Discharge", "instant": True}, - {"refId": "C", "expr": ANANKE_UPS_ON_BATTERY_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Status", "instant": True}, - {"refId": "D", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)", "instant": True}, - {"refId": "E", "expr": ANANKE_UPS_RUNTIME_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Discharge", "instant": True}, - {"refId": "F", "expr": ANANKE_UPS_ON_BATTERY_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Status", "instant": True}, + instant=True, + transformations=[ + {"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}}, + {"id": "organize", "options": {"excludeByName": {"Time": True}}}, ], field_overrides=[ - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Draw (W)"}, - "properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)"}, - "properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Discharge"}, - "properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Discharge"}, - "properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Status"}, - "properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Status"}, - "properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}], - }, + {"matcher": {"id": "byName", "options": "Draw (W)"}, "properties": [{"id": "unit", "value": "watt"}]}, + {"matcher": {"id": "byName", "options": "Discharge"}, "properties": [{"id": "unit", "value": "s"}]}, + {"matcher": {"id": "byName", "options": "Status"}, "properties": [{"id": "mappings", "value": status_mapping}]}, ], links=link_to("atlas-power"), - description="Per-UPS live snapshot: current draw, discharge, and charging/discharging status.", - orientation="horizontal", - wide_layout=False, - graph_mode="none", - justify_mode="auto", + description="Per-UPS two-row snapshot: draw (W), discharge runtime, and status.", ) ) panels.append( @@ -1412,19 +1434,15 @@ def build_overview(): ) ) panels.append( - stat_panel( + table_panel( 42, "Current Climate", - None, + CLIMATE_CURRENT_ROW_EXPR, {"h": 6, "w": 6, "x": 0, "y": 12}, - unit="none", - decimals=2, - text_mode="name_and_value", - targets=[ - {"refId": "A", "expr": CLIMATE_TEMP_MAX, "legendFormat": "Temp °C", "instant": True}, - {"refId": "B", "expr": CLIMATE_TEMP_FAHRENHEIT_MAX, "legendFormat": "Temp °F", "instant": True}, - {"refId": "C", "expr": CLIMATE_HUMIDITY_MAX, "legendFormat": "Humidity", "instant": True}, - {"refId": "D", "expr": CLIMATE_PRESSURE_CURRENT, "legendFormat": "Pressure", "instant": True}, + instant=True, + transformations=[ + {"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}}, + {"id": "organize", "options": {"excludeByName": {"Time": True}}}, ], field_overrides=[ {"matcher": {"id": "byName", "options": "Temp °C"}, "properties": [{"id": "unit", "value": "celsius"}]}, @@ -1433,11 +1451,7 @@ def build_overview(): {"matcher": {"id": "byName", "options": "Pressure"}, "properties": [{"id": "unit", "value": "suffix:kPa"}]}, ], links=link_to("atlas-power"), - description="Current tent values on one row: temperature (C/F), humidity (RH), and pressure proxy (VPD).", - orientation="horizontal", - wide_layout=False, - graph_mode="none", - justify_mode="auto", + description="Single-row climate snapshot: Temp °C, Temp °F, Humidity, Pressure.", ) ) panels.append( @@ -1476,33 +1490,24 @@ def build_overview(): ) ) panels.append( - stat_panel( + table_panel( 140, "Fan Activity", - None, + CLIMATE_FAN_CURRENT_ROW_EXPR, {"h": 6, "w": 6, "x": 12, "y": 12}, - unit="none", - decimals=0, - text_mode="name_and_value", - targets=[ - {"refId": "A", "expr": f"round({CLIMATE_FAN_OUTLET_CURRENT})", "legendFormat": "Outlet", "instant": True}, - {"refId": "B", "expr": f"round({CLIMATE_FAN_INSIDE_INLET_CURRENT})", "legendFormat": "Inlet In", "instant": True}, - {"refId": "C", "expr": f"round({CLIMATE_FAN_OUTSIDE_INLET_CURRENT})", "legendFormat": "Inlet Out", "instant": True}, - {"refId": "D", "expr": f"round({CLIMATE_FAN_INTERIOR_CURRENT})", "legendFormat": "Interior", "instant": True}, + instant=True, + transformations=[ + {"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}}, + {"id": "organize", "options": {"excludeByName": {"Time": True}}}, + ], + field_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}]}, ], - thresholds={ - "mode": "absolute", - "steps": [ - {"color": "green", "value": None}, - {"color": "yellow", "value": 7}, - {"color": "red", "value": 9}, - ], - }, links=link_to("atlas-power"), - orientation="horizontal", - wide_layout=False, - graph_mode="none", - justify_mode="auto", + description="Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10).", ) ) panels.append( @@ -3248,54 +3253,23 @@ def build_power_dashboard(): ] panels.append( - stat_panel( + table_panel( 1, "UPS Current Load", - None, + UPS_CURRENT_ROW_EXPR, {"h": 8, "w": 12, "x": 0, "y": 0}, - unit="none", - decimals=1, - text_mode="name_and_value", - targets=[ - {"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Draw (W)", "instant": True}, - {"refId": "B", "expr": ANANKE_UPS_RUNTIME_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Discharge", "instant": True}, - {"refId": "C", "expr": ANANKE_UPS_ON_BATTERY_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Status", "instant": True}, - {"refId": "D", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)", "instant": True}, - {"refId": "E", "expr": ANANKE_UPS_RUNTIME_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Discharge", "instant": True}, - {"refId": "F", "expr": ANANKE_UPS_ON_BATTERY_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Status", "instant": True}, + instant=True, + transformations=[ + {"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}}, + {"id": "organize", "options": {"excludeByName": {"Time": True}}}, ], field_overrides=[ - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Draw (W)"}, - "properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)"}, - "properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Discharge"}, - "properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Discharge"}, - "properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Status"}, - "properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}], - }, - { - "matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Status"}, - "properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}], - }, + {"matcher": {"id": "byName", "options": "Draw (W)"}, "properties": [{"id": "unit", "value": "watt"}]}, + {"matcher": {"id": "byName", "options": "Discharge"}, "properties": [{"id": "unit", "value": "s"}]}, + {"matcher": {"id": "byName", "options": "Status"}, "properties": [{"id": "mappings", "value": status_mapping}]}, ], - orientation="horizontal", - wide_layout=False, - graph_mode="none", - justify_mode="auto", description=( - "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status." + "Per-UPS two-row snapshot: draw (W), discharge runtime, and charging/discharging status." ), ) ) @@ -3317,31 +3291,23 @@ def build_power_dashboard(): ) ) panels.append( - stat_panel( + table_panel( 3, "Current Climate", - None, + CLIMATE_CURRENT_ROW_EXPR, {"h": 8, "w": 12, "x": 0, "y": 8}, - unit="none", - decimals=2, - text_mode="name_and_value", - targets=[ - {"refId": "A", "expr": CLIMATE_TEMP_MAX, "legendFormat": "Tent Temp (°C)", "instant": True}, - {"refId": "B", "expr": CLIMATE_TEMP_FAHRENHEIT_MAX, "legendFormat": "Tent Temp (°F)", "instant": True}, - {"refId": "C", "expr": CLIMATE_HUMIDITY_MAX, "legendFormat": "Tent RH (%)", "instant": True}, - {"refId": "D", "expr": CLIMATE_PRESSURE_CURRENT, "legendFormat": "Tent Pressure (VPD kPa)", "instant": True}, + instant=True, + transformations=[ + {"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}}, + {"id": "organize", "options": {"excludeByName": {"Time": True}}}, ], field_overrides=[ - {"matcher": {"id": "byName", "options": "Tent Temp (°C)"}, "properties": [{"id": "unit", "value": "celsius"}]}, - {"matcher": {"id": "byName", "options": "Tent Temp (°F)"}, "properties": [{"id": "unit", "value": "fahrenheit"}]}, - {"matcher": {"id": "byName", "options": "Tent RH (%)"}, "properties": [{"id": "unit", "value": "percent"}]}, - {"matcher": {"id": "byName", "options": "Tent Pressure (VPD kPa)"}, "properties": [{"id": "unit", "value": "suffix:kPa"}]}, + {"matcher": {"id": "byName", "options": "Temp °C"}, "properties": [{"id": "unit", "value": "celsius"}]}, + {"matcher": {"id": "byName", "options": "Temp °F"}, "properties": [{"id": "unit", "value": "fahrenheit"}]}, + {"matcher": {"id": "byName", "options": "Humidity"}, "properties": [{"id": "unit", "value": "percent"}]}, + {"matcher": {"id": "byName", "options": "Pressure"}, "properties": [{"id": "unit", "value": "suffix:kPa"}]}, ], - orientation="horizontal", - wide_layout=False, - graph_mode="none", - justify_mode="auto", - description="Current tent temperature in C/F, humidity, and pressure proxy (VPD kPa).", + description="Single-row climate snapshot: Temp °C, Temp °F, Humidity, Pressure.", ) ) panels.append( @@ -3386,33 +3352,23 @@ def build_power_dashboard(): ) ) panels.append( - stat_panel( + table_panel( 5, "Fan Activity", - None, + CLIMATE_FAN_CURRENT_ROW_EXPR, {"h": 8, "w": 12, "x": 0, "y": 16}, - unit="none", - decimals=0, - text_mode="name_and_value", - targets=[ - {"refId": "A", "expr": f"round({CLIMATE_FAN_OUTLET_CURRENT})", "legendFormat": "Inside Outlet", "instant": True}, - {"refId": "B", "expr": f"round({CLIMATE_FAN_INSIDE_INLET_CURRENT})", "legendFormat": "Inside Inlet", "instant": True}, - {"refId": "C", "expr": f"round({CLIMATE_FAN_OUTSIDE_INLET_CURRENT})", "legendFormat": "Outside Inlet", "instant": True}, - {"refId": "D", "expr": f"round({CLIMATE_FAN_INTERIOR_CURRENT})", "legendFormat": "Interior Fans", "instant": True}, + instant=True, + transformations=[ + {"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}}, + {"id": "organize", "options": {"excludeByName": {"Time": True}}}, ], - thresholds={ - "mode": "absolute", - "steps": [ - {"color": "green", "value": None}, - {"color": "yellow", "value": 7}, - {"color": "red", "value": 9}, - ], - }, - orientation="horizontal", - wide_layout=False, - graph_mode="none", - justify_mode="auto", - description="Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans.", + field_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}]}, + ], + description="Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10).", ) ) panels.append( diff --git a/services/monitoring/dashboards/atlas-overview.json b/services/monitoring/dashboards/atlas-overview.json index 5e170187..f540bc07 100644 --- a/services/monitoring/dashboards/atlas-overview.json +++ b/services/monitoring/dashboards/atlas-overview.json @@ -1072,7 +1072,7 @@ }, { "id": 40, - "type": "stat", + "type": "table", "title": "UPS Current Load", "datasource": { "type": "prometheus", @@ -1086,136 +1086,47 @@ }, "targets": [ { + "expr": "label_replace(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)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(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)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__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", "instant": true } ], "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" - }, - "decimals": 1 + "filterable": true + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Pyrphoros Draw (W)" + "options": "Draw (W)" }, "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": "Discharge" }, "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" + "options": "Status" }, "properties": [ { @@ -1233,58 +1144,32 @@ } } ] - }, - { - "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" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], "links": [ { "title": "Open atlas-power dashboard", @@ -1292,7 +1177,7 @@ "targetBlank": true } ], - "description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status." + "description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and status." }, { "id": 41, @@ -1350,7 +1235,7 @@ }, { "id": 42, - "type": "stat", + "type": "table", "title": "Current Climate", "datasource": { "type": "prometheus", @@ -1364,54 +1249,17 @@ }, "targets": [ { + "expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")", "refId": "A", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)", - "legendFormat": "Temp \u00b0C", - "instant": true - }, - { - "refId": "B", - "expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)", - "legendFormat": "Temp \u00b0F", - "instant": true - }, - { - "refId": "C", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)", - "legendFormat": "Humidity", - "instant": true - }, - { - "refId": "D", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)", - "legendFormat": "Pressure", "instant": true } ], "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" - }, - "decimals": 2 + "filterable": true + } }, "overrides": [ { @@ -1465,20 +1313,26 @@ ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], "links": [ { "title": "Open atlas-power dashboard", @@ -1486,7 +1340,7 @@ "targetBlank": true } ], - "description": "Current tent values on one row: temperature (C/F), humidity (RH), and pressure proxy (VPD)." + "description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure." }, { "id": 43, @@ -1582,7 +1436,7 @@ }, { "id": 140, - "type": "stat", + "type": "table", "title": "Fan Activity", "datasource": { "type": "prometheus", @@ -1596,83 +1450,98 @@ }, "targets": [ { + "expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")", "refId": "A", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))", - "legendFormat": "Outlet", - "instant": true - }, - { - "refId": "B", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))", - "legendFormat": "Inlet In", - "instant": true - }, - { - "refId": "C", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))", - "legendFormat": "Inlet Out", - "instant": true - }, - { - "refId": "D", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))", - "legendFormat": "Interior", "instant": true } ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "none", + "custom": { + "filterable": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Outlet" + }, + "properties": [ { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 7 - }, - { - "color": "red", - "value": 9 + "id": "decimals", + "value": 0 } ] }, - "unit": "none", - "custom": { - "displayMode": "auto" + { + "matcher": { + "id": "byName", + "options": "Inlet In" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] }, - "decimals": 0 - }, - "overrides": [] + { + "matcher": { + "id": "byName", + "options": "Inlet Out" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Interior" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + } + ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], "links": [ { "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } - ] + ], + "description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)." }, { "id": 141, diff --git a/services/monitoring/dashboards/atlas-power.json b/services/monitoring/dashboards/atlas-power.json index 35c5a7f1..7677abd1 100644 --- a/services/monitoring/dashboards/atlas-power.json +++ b/services/monitoring/dashboards/atlas-power.json @@ -6,7 +6,7 @@ "panels": [ { "id": 1, - "type": "stat", + "type": "table", "title": "UPS Current Load", "datasource": { "type": "prometheus", @@ -20,136 +20,47 @@ }, "targets": [ { + "expr": "label_replace(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)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(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)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__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", "instant": true } ], "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" - }, - "decimals": 1 + "filterable": true + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Pyrphoros Draw (W)" + "options": "Draw (W)" }, "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": "Discharge" }, "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" + "options": "Status" }, "properties": [ { @@ -167,59 +78,33 @@ } } ] - }, - { - "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" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, - "description": "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status." + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], + "description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and charging/discharging status." }, { "id": 2, @@ -271,7 +156,7 @@ }, { "id": 3, - "type": "stat", + "type": "table", "title": "Current Climate", "datasource": { "type": "prometheus", @@ -285,60 +170,23 @@ }, "targets": [ { + "expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")", "refId": "A", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)", - "legendFormat": "Tent Temp (\u00b0C)", - "instant": true - }, - { - "refId": "B", - "expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)", - "legendFormat": "Tent Temp (\u00b0F)", - "instant": true - }, - { - "refId": "C", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)", - "legendFormat": "Tent RH (%)", - "instant": true - }, - { - "refId": "D", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)", - "legendFormat": "Tent Pressure (VPD kPa)", "instant": true } ], "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" - }, - "decimals": 2 + "filterable": true + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Tent Temp (\u00b0C)" + "options": "Temp \u00b0C" }, "properties": [ { @@ -350,7 +198,7 @@ { "matcher": { "id": "byName", - "options": "Tent Temp (\u00b0F)" + "options": "Temp \u00b0F" }, "properties": [ { @@ -362,7 +210,7 @@ { "matcher": { "id": "byName", - "options": "Tent RH (%)" + "options": "Humidity" }, "properties": [ { @@ -374,7 +222,7 @@ { "matcher": { "id": "byName", - "options": "Tent Pressure (VPD kPa)" + "options": "Pressure" }, "properties": [ { @@ -386,21 +234,27 @@ ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, - "description": "Current tent temperature in C/F, humidity, and pressure proxy (VPD kPa)." + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], + "description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure." }, { "id": 4, @@ -506,7 +360,7 @@ }, { "id": 5, - "type": "stat", + "type": "table", "title": "Fan Activity", "datasource": { "type": "prometheus", @@ -520,77 +374,91 @@ }, "targets": [ { + "expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")", "refId": "A", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))", - "legendFormat": "Inside Outlet", - "instant": true - }, - { - "refId": "B", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))", - "legendFormat": "Inside Inlet", - "instant": true - }, - { - "refId": "C", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))", - "legendFormat": "Outside Inlet", - "instant": true - }, - { - "refId": "D", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))", - "legendFormat": "Interior Fans", "instant": true } ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "none", + "custom": { + "filterable": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Outlet" + }, + "properties": [ { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 7 - }, - { - "color": "red", - "value": 9 + "id": "decimals", + "value": 0 } ] }, - "unit": "none", - "custom": { - "displayMode": "auto" + { + "matcher": { + "id": "byName", + "options": "Inlet In" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] }, - "decimals": 0 - }, - "overrides": [] + { + "matcher": { + "id": "byName", + "options": "Inlet Out" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Interior" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + } + ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, - "description": "Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans." + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], + "description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)." }, { "id": 6, diff --git a/services/monitoring/grafana-dashboard-overview.yaml b/services/monitoring/grafana-dashboard-overview.yaml index 2858e34a..c7e0724f 100644 --- a/services/monitoring/grafana-dashboard-overview.yaml +++ b/services/monitoring/grafana-dashboard-overview.yaml @@ -1081,7 +1081,7 @@ data: }, { "id": 40, - "type": "stat", + "type": "table", "title": "UPS Current Load", "datasource": { "type": "prometheus", @@ -1095,136 +1095,47 @@ data: }, "targets": [ { + "expr": "label_replace(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)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(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)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__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", "instant": true } ], "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" - }, - "decimals": 1 + "filterable": true + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Pyrphoros Draw (W)" + "options": "Draw (W)" }, "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": "Discharge" }, "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" + "options": "Status" }, "properties": [ { @@ -1242,58 +1153,32 @@ data: } } ] - }, - { - "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" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], "links": [ { "title": "Open atlas-power dashboard", @@ -1301,7 +1186,7 @@ data: "targetBlank": true } ], - "description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status." + "description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and status." }, { "id": 41, @@ -1359,7 +1244,7 @@ data: }, { "id": 42, - "type": "stat", + "type": "table", "title": "Current Climate", "datasource": { "type": "prometheus", @@ -1373,54 +1258,17 @@ data: }, "targets": [ { + "expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")", "refId": "A", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)", - "legendFormat": "Temp \u00b0C", - "instant": true - }, - { - "refId": "B", - "expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)", - "legendFormat": "Temp \u00b0F", - "instant": true - }, - { - "refId": "C", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)", - "legendFormat": "Humidity", - "instant": true - }, - { - "refId": "D", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)", - "legendFormat": "Pressure", "instant": true } ], "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" - }, - "decimals": 2 + "filterable": true + } }, "overrides": [ { @@ -1474,20 +1322,26 @@ data: ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], "links": [ { "title": "Open atlas-power dashboard", @@ -1495,7 +1349,7 @@ data: "targetBlank": true } ], - "description": "Current tent values on one row: temperature (C/F), humidity (RH), and pressure proxy (VPD)." + "description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure." }, { "id": 43, @@ -1591,7 +1445,7 @@ data: }, { "id": 140, - "type": "stat", + "type": "table", "title": "Fan Activity", "datasource": { "type": "prometheus", @@ -1605,83 +1459,98 @@ data: }, "targets": [ { + "expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")", "refId": "A", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))", - "legendFormat": "Outlet", - "instant": true - }, - { - "refId": "B", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))", - "legendFormat": "Inlet In", - "instant": true - }, - { - "refId": "C", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))", - "legendFormat": "Inlet Out", - "instant": true - }, - { - "refId": "D", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))", - "legendFormat": "Interior", "instant": true } ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "none", + "custom": { + "filterable": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Outlet" + }, + "properties": [ { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 7 - }, - { - "color": "red", - "value": 9 + "id": "decimals", + "value": 0 } ] }, - "unit": "none", - "custom": { - "displayMode": "auto" + { + "matcher": { + "id": "byName", + "options": "Inlet In" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] }, - "decimals": 0 - }, - "overrides": [] + { + "matcher": { + "id": "byName", + "options": "Inlet Out" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Interior" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + } + ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], "links": [ { "title": "Open atlas-power dashboard", "url": "/d/atlas-power", "targetBlank": true } - ] + ], + "description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)." }, { "id": 141, diff --git a/services/monitoring/grafana-dashboard-power.yaml b/services/monitoring/grafana-dashboard-power.yaml index 7d6be024..90745b9d 100644 --- a/services/monitoring/grafana-dashboard-power.yaml +++ b/services/monitoring/grafana-dashboard-power.yaml @@ -15,7 +15,7 @@ data: "panels": [ { "id": 1, - "type": "stat", + "type": "table", "title": "UPS Current Load", "datasource": { "type": "prometheus", @@ -29,136 +29,47 @@ data: }, "targets": [ { + "expr": "label_replace(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)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(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)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__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", "instant": true } ], "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" - }, - "decimals": 1 + "filterable": true + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Pyrphoros Draw (W)" + "options": "Draw (W)" }, "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": "Discharge" }, "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" + "options": "Status" }, "properties": [ { @@ -176,59 +87,33 @@ data: } } ] - }, - { - "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" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, - "description": "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status." + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], + "description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and charging/discharging status." }, { "id": 2, @@ -280,7 +165,7 @@ data: }, { "id": 3, - "type": "stat", + "type": "table", "title": "Current Climate", "datasource": { "type": "prometheus", @@ -294,60 +179,23 @@ data: }, "targets": [ { + "expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")", "refId": "A", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)", - "legendFormat": "Tent Temp (\u00b0C)", - "instant": true - }, - { - "refId": "B", - "expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)", - "legendFormat": "Tent Temp (\u00b0F)", - "instant": true - }, - { - "refId": "C", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)", - "legendFormat": "Tent RH (%)", - "instant": true - }, - { - "refId": "D", - "expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)", - "legendFormat": "Tent Pressure (VPD kPa)", "instant": true } ], "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" - }, - "decimals": 2 + "filterable": true + } }, "overrides": [ { "matcher": { "id": "byName", - "options": "Tent Temp (\u00b0C)" + "options": "Temp \u00b0C" }, "properties": [ { @@ -359,7 +207,7 @@ data: { "matcher": { "id": "byName", - "options": "Tent Temp (\u00b0F)" + "options": "Temp \u00b0F" }, "properties": [ { @@ -371,7 +219,7 @@ data: { "matcher": { "id": "byName", - "options": "Tent RH (%)" + "options": "Humidity" }, "properties": [ { @@ -383,7 +231,7 @@ data: { "matcher": { "id": "byName", - "options": "Tent Pressure (VPD kPa)" + "options": "Pressure" }, "properties": [ { @@ -395,21 +243,27 @@ data: ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, - "description": "Current tent temperature in C/F, humidity, and pressure proxy (VPD kPa)." + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], + "description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure." }, { "id": 4, @@ -515,7 +369,7 @@ data: }, { "id": 5, - "type": "stat", + "type": "table", "title": "Fan Activity", "datasource": { "type": "prometheus", @@ -529,77 +383,91 @@ data: }, "targets": [ { + "expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")", "refId": "A", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))", - "legendFormat": "Inside Outlet", - "instant": true - }, - { - "refId": "B", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))", - "legendFormat": "Inside Inlet", - "instant": true - }, - { - "refId": "C", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))", - "legendFormat": "Outside Inlet", - "instant": true - }, - { - "refId": "D", - "expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))", - "legendFormat": "Interior Fans", "instant": true } ], "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "none", + "custom": { + "filterable": true + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Outlet" + }, + "properties": [ { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 7 - }, - { - "color": "red", - "value": 9 + "id": "decimals", + "value": 0 } ] }, - "unit": "none", - "custom": { - "displayMode": "auto" + { + "matcher": { + "id": "byName", + "options": "Inlet In" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] }, - "decimals": 0 - }, - "overrides": [] + { + "matcher": { + "id": "byName", + "options": "Inlet Out" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Interior" + }, + "properties": [ + { + "id": "decimals", + "value": 0 + } + ] + } + ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "name_and_value", - "orientation": "horizontal", - "wideLayout": false + "showHeader": true, + "columnFilters": false }, - "description": "Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans." + "transformations": [ + { + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "metric" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + } + } + } + ], + "description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)." }, { "id": 6,