diff --git a/ci/scripts/publish_test_metrics.py b/ci/scripts/publish_test_metrics.py index 2010b806..97174724 100644 --- a/ci/scripts/publish_test_metrics.py +++ b/ci/scripts/publish_test_metrics.py @@ -190,6 +190,7 @@ def _build_payload( jenkins_job: str, summary: dict | None = None, workspace_line_coverage_percent: float = 0.0, + source_files_total: int = 0, source_lines_over_500: int = 0, check_statuses: dict[str, str] | None = None, ) -> str: @@ -227,6 +228,8 @@ def _build_payload( f"titan_iac_quality_gate_build_info{build_labels} 1", "# TYPE platform_quality_gate_workspace_line_coverage_percent gauge", f'platform_quality_gate_workspace_line_coverage_percent{{suite="{suite}"}} {workspace_line_coverage_percent:.3f}', + "# TYPE platform_quality_gate_source_files_total gauge", + f'platform_quality_gate_source_files_total{{suite="{suite}"}} {source_files_total}', "# TYPE platform_quality_gate_source_lines_over_500_total gauge", f'platform_quality_gate_source_lines_over_500_total{{suite="{suite}"}} {source_lines_over_500}', ] @@ -278,6 +281,7 @@ def main() -> int: workspace_line_coverage_percent = _summary_float(summary, "workspace_line_coverage_percent") if workspace_line_coverage_percent <= 0: workspace_line_coverage_percent = _infer_workspace_coverage_percent(summary, "build/coverage-unit.xml") + source_files_total = _summary_int(summary, "source_files_total") source_lines_over_500 = _summary_int(summary, "source_lines_over_500") if source_lines_over_500 <= 0: source_lines_over_500 = _infer_source_lines_over_500(summary) @@ -325,6 +329,7 @@ def main() -> int: jenkins_job=jenkins_job, summary=summary, workspace_line_coverage_percent=workspace_line_coverage_percent, + source_files_total=source_files_total, source_lines_over_500=source_lines_over_500, check_statuses=check_statuses, ) @@ -342,6 +347,7 @@ def main() -> int: "failed_count": failed_count, "checks_recorded": len(check_statuses), "workspace_line_coverage_percent": workspace_line_coverage_percent, + "source_files_total": source_files_total, "source_lines_over_500": source_lines_over_500, } print(json.dumps(summary, sort_keys=True)) diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index 04586efa..33b8edf0 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -1284,7 +1284,7 @@ def bargauge_panel( "overrides": [], }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": ["lastNotNull"], @@ -3153,9 +3153,31 @@ def build_jobs_dashboard(): ) coverage_gap = f"clamp_min(95 - ({coverage_by_suite}), 0)" smell_by_suite = f'max by (suite) (platform_quality_gate_source_lines_over_500_total{{{smell_selector}}})' + loc_files_by_suite = f'max by (suite) (platform_quality_gate_source_files_total{{{smell_selector}}})' smell_with_missing = ( f"({smell_by_suite}) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_selector}}}[30d])))) - 1)" ) + loc_limit_compliance_by_suite = ( + f"(100 * clamp_min(({loc_files_by_suite}) - ({smell_by_suite}), 0) / ({loc_files_by_suite})) " + f"and on(suite) (({loc_files_by_suite}) > 0)" + ) + loc_limit_compliance_with_missing = ( + f"({loc_limit_compliance_by_suite}) " + f"or on(suite) (100 * (1 - clamp_max(({smell_by_suite}), 1))) " + f"or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_selector}}}[30d])))) - 1)" + ) + loc_files_history = ( + f"max by (suite) (max_over_time(platform_quality_gate_source_files_total{{{smell_selector}}}[$__interval]))" + ) + loc_violations_history = ( + f"max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{{{smell_selector}}}[$__interval]))" + ) + loc_limit_compliance_history = ( + f"(100 * clamp_min(({loc_files_history}) - ({loc_violations_history}), 0) / ({loc_files_history})) " + f"and on(suite) (({loc_files_history}) > 0) " + f"or on(suite) (100 * (1 - clamp_max(({loc_violations_history}), 1))) " + f"or on(suite) ({selected_suite_zero})" + ) average_coverage = f"(avg(({coverage_by_suite})) or on() vector(0))" suites_loc_violating = f'(sum((({smell_by_suite}) > bool 0)) or on() vector(0))' @@ -3224,7 +3246,8 @@ def build_jobs_dashboard(): f"count by (suite) (platform_quality_gate_workspace_line_coverage_percent{{{exported}}})" ) missing_loc_by_suite = _missing_suite_series( - f"count by (suite) (platform_quality_gate_source_lines_over_500_total{{{exported}}})" + f"count by (suite) (platform_quality_gate_source_lines_over_500_total{{{exported}}}) " + f"and on(suite) count by (suite) (platform_quality_gate_source_files_total{{{exported}}})" ) missing_test_case_by_suite = _missing_suite_series( f"count by (suite) (platform_quality_gate_test_case_result{{{exported}}})" @@ -3461,10 +3484,10 @@ def build_jobs_dashboard(): panels.append( timeseries_panel( 13, - "Coverage & LOC History (Selected Scope)", + "Coverage & LOC Compliance History", None, {"h": 8, "w": 8, "x": 8, "y": 21}, - unit="none", + unit="percent", targets=[ { "refId": "A", @@ -3473,8 +3496,8 @@ def build_jobs_dashboard(): }, { "refId": "B", - "expr": f'max_over_time(platform_quality_gate_source_lines_over_500_total{{{smell_selector}}}[$__interval])', - "legendFormat": "{{suite}} files >500 LOC", + "expr": loc_limit_compliance_history, + "legendFormat": "{{suite}} files <=500 LOC %", }, ], legend_display="list", @@ -3623,18 +3646,20 @@ def build_jobs_dashboard(): smell_panel = bargauge_panel( 18, - "Files >500 LOC by Suite (Latest)", - smell_with_missing, + "Files <=500 LOC by Suite (Latest)", + loc_limit_compliance_with_missing, {"h": 8, "w": 12, "x": 12, "y": 73}, - unit="none", + unit="percent", instant=True, legend="{{suite}}", - sort_order="desc", - thresholds=smell_thresholds, + sort_order="asc", + thresholds=success_thresholds, + decimals=0, ) smell_panel["fieldConfig"]["defaults"]["mappings"] = [ {"type": "value", "options": {"-1": {"text": "missing"}}} ] + smell_panel["description"] = "Percent of managed LOC-gated files at or under 500 lines. Older suite payloads fall back to 100%/0% until they emit platform_quality_gate_source_files_total." panels.append(smell_panel) panels.append( @@ -3682,7 +3707,7 @@ def build_jobs_dashboard(): panels.append( bargauge_panel( 30, - "Missing LOC Metrics by Suite", + "Missing LOC Compliance Metrics by Suite", missing_loc_by_suite, {"h": 7, "w": 6, "x": 18, "y": 81}, unit="none", diff --git a/services/logging/Jenkinsfile.data-prepper b/services/logging/Jenkinsfile.data-prepper index a2d7a5c8..919f9b9a 100644 --- a/services/logging/Jenkinsfile.data-prepper +++ b/services/logging/Jenkinsfile.data-prepper @@ -522,6 +522,8 @@ data_prepper_quality_gate_tests_total{suite="${suite}",result="skipped"} ${test_ # No coverable project source is present in this packaging suite; report full # non-applicable coverage so rollups do not confuse N/A with uncovered code. platform_quality_gate_workspace_line_coverage_percent{suite="${suite}"} 100 +# TYPE platform_quality_gate_source_files_total gauge +platform_quality_gate_source_files_total{suite="${suite}"} 0 # TYPE platform_quality_gate_source_lines_over_500_total gauge platform_quality_gate_source_lines_over_500_total{suite="${suite}"} 0 # TYPE platform_quality_gate_build_info gauge diff --git a/services/monitoring/dashboards/atlas-jobs.json b/services/monitoring/dashboards/atlas-jobs.json index dd7faef6..99806e1f 100644 --- a/services/monitoring/dashboards/atlas-jobs.json +++ b/services/monitoring/dashboards/atlas-jobs.json @@ -779,7 +779,7 @@ { "id": 18, "type": "bargauge", - "title": "Files >500 LOC by Suite (Latest)", + "title": "Files <=500 LOC by Suite (Latest)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -792,7 +792,7 @@ }, "targets": [ { - "expr": "sort_desc((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", + "expr": "sort(((100 * clamp_min((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) - (max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 0) / (max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))) and on(suite) ((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) > 0)) or on(suite) (100 * (1 - clamp_max((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", "refId": "A", "legendFormat": "{{suite}}", "instant": true @@ -803,9 +803,9 @@ "color": { "mode": "thresholds" }, - "unit": "none", + "unit": "percent", "min": 0, - "max": null, + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -814,23 +814,24 @@ "value": null }, { - "color": "green", - "value": 0 + "color": "orange", + "value": 90 }, { "color": "yellow", - "value": 1 + "value": 93 }, { - "color": "orange", - "value": 3 + "color": "green", + "value": 95 }, { - "color": "red", - "value": 5 + "color": "blue", + "value": 100 } ] }, + "decimals": 0, "mappings": [ { "type": "value", @@ -862,10 +863,11 @@ "fields": [ "Value" ], - "order": "desc" + "order": "asc" } } - ] + ], + "description": "Percent of managed LOC-gated files at or under 500 lines. Older suite payloads fall back to 100%/0% until they emit platform_quality_gate_source_files_total." }, { "id": 500, @@ -981,7 +983,7 @@ { "id": 13, "type": "timeseries", - "title": "Coverage & LOC History (Selected Scope)", + "title": "Coverage & LOC Compliance History", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -1000,13 +1002,13 @@ }, { "refId": "B", - "expr": "max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])", - "legendFormat": "{{suite}} files >500 LOC" + "expr": "(100 * clamp_min((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) - (max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 0) / (max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0) or on(suite) (100 * (1 - clamp_max((max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])) >= bool 0)))", + "legendFormat": "{{suite}} files <=500 LOC %" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "percent" }, "overrides": [] }, @@ -2612,7 +2614,7 @@ { "id": 30, "type": "bargauge", - "title": "Missing LOC Metrics by Suite", + "title": "Missing LOC Compliance Metrics by Suite", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -2625,7 +2627,7 @@ }, "targets": [ { - "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", + "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}) and on(suite) count by (suite) (platform_quality_gate_source_files_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", "refId": "A", "legendFormat": "{{suite}}", "instant": true diff --git a/services/monitoring/dashboards/atlas-overview.json b/services/monitoring/dashboards/atlas-overview.json index 9df0eb83..8c9873f1 100644 --- a/services/monitoring/dashboards/atlas-overview.json +++ b/services/monitoring/dashboards/atlas-overview.json @@ -129,7 +129,7 @@ }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -204,7 +204,7 @@ }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -354,7 +354,7 @@ }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -429,7 +429,7 @@ }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -567,7 +567,7 @@ }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -644,7 +644,7 @@ }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -713,7 +713,7 @@ }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -782,7 +782,7 @@ }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -857,7 +857,7 @@ }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -932,7 +932,7 @@ }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -999,7 +999,7 @@ }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -1066,7 +1066,7 @@ }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -1075,22 +1075,52 @@ { "id": 40, "type": "stat", - "title": "Pyrphoros UPS Current", + "title": "UPS Current Load", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 3, - "w": 6, + "h": 6, + "w": 4, "x": 0, - "y": 7 + "y": 12 }, "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", - "legendFormat": "{{metric}}", + "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 } ], @@ -1116,128 +1146,127 @@ "unit": "none", "custom": { "displayMode": "auto" - } + }, + "decimals": 1 }, "overrides": [ { "matcher": { "id": "byName", - "options": "Draw" + "options": "Pyrphoros Draw (W)" }, "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": 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 - } - ], - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(115, 115, 115, 1)", - "value": null }, { - "color": "green", - "value": 1 + "id": "description", + "value": "Attached node: titan-db" } ] }, - "unit": "none", - "custom": { - "displayMode": "auto" - } - }, - "overrides": [ { "matcher": { "id": "byName", - "options": "Draw" + "options": "Statera Draw (W)" }, "properties": [ { "id": "unit", "value": "watt" + }, + { + "id": "description", + "value": "Attached node: titan-24" } ] }, { "matcher": { "id": "byName", - "options": "Runtime" + "options": "Pyrphoros 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" + }, + "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" } ] } @@ -1255,18 +1284,17 @@ "values": false }, "textMode": "name_and_value", - "text": { - "titleSize": 14, - "valueSize": 30 - } + "orientation": "horizontal", + "wideLayout": true }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } - ] + ], + "description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status." }, { "id": 41, @@ -1278,9 +1306,9 @@ }, "gridPos": { "h": 6, - "w": 6, - "x": 6, - "y": 7 + "w": 4, + "x": 4, + "y": 12 }, "targets": [ { @@ -1302,8 +1330,8 @@ }, "options": { "legend": { - "displayMode": "table", - "placement": "right" + "displayMode": "list", + "placement": "bottom" }, "tooltip": { "mode": "multi" @@ -1311,7 +1339,7 @@ }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } @@ -1320,22 +1348,40 @@ { "id": 42, "type": "stat", - "title": "Current Enclosure Temperature", + "title": "Current Climate", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 3, - "w": 6, - "x": 0, - "y": 13 + "h": 6, + "w": 4, + "x": 8, + "y": 12 }, "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", - "legendFormat": "{{metric}}", + "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)", "instant": true } ], @@ -1361,13 +1407,14 @@ "unit": "none", "custom": { "displayMode": "auto" - } + }, + "decimals": 2 }, "overrides": [ { "matcher": { "id": "byName", - "options": "\u00b0C" + "options": "Tent Temp (\u00b0C)" }, "properties": [ { @@ -1379,105 +1426,7 @@ { "matcher": { "id": "byName", - "options": "\u00b0F" - }, - "properties": [ - { - "id": "unit", - "value": "fahrenheit" - } - ] - } - ] - }, - "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": 143, - "type": "stat", - "title": "Current Enclosure Climate", - "datasource": { - "type": "prometheus", - "uid": "atlas-vm" - }, - "gridPos": { - "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", - "legendFormat": "{{metric}}", - "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" - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "%RH" - }, - "properties": [ - { - "id": "unit", - "value": "suffix:%RH" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "kPa" + "options": "Tent VPD (kPa)" }, "properties": [ { @@ -1485,6 +1434,30 @@ "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" + } + ] } ] }, @@ -1499,304 +1472,93 @@ "fields": "", "values": false }, - "textMode": "name_and_value", - "text": { - "titleSize": 14, - "valueSize": 30 - } + "textMode": "value", + "orientation": "horizontal", + "wideLayout": true }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } - ] + ], + "description": "Current tent temperature, humidity, VPD, and dew point." }, { "id": 43, "type": "timeseries", - "title": "Enclosure Climate History", + "title": "Climate History", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { "h": 6, - "w": 6, - "x": 6, - "y": 13 + "w": 4, + "x": 12, + "y": 12 }, "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)", - "legendFormat": "C" + "expr": "typhon_temperature_celsius", + "legendFormat": "Temperature (\u00b0C)" }, { "refId": "B", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)", - "legendFormat": "RH" + "expr": "typhon_relative_humidity_percent", + "legendFormat": "Humidity (%)" }, { "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)", - "legendFormat": "P" + "expr": "typhon_vpd_kpa", + "legendFormat": "VPD (kPa)" }, { "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" + "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)" } ], "fieldConfig": { "defaults": { - "unit": "none", - "custom": { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never", - "spanNulls": true - } + "unit": "celsius" }, "overrides": [ { "matcher": { "id": "byName", - "options": "C" + "options": "Humidity (%)" }, "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" - } + "value": "percent" } ] }, { "matcher": { "id": "byName", - "options": "RH" + "options": "VPD (kPa)" }, "properties": [ { "id": "unit", - "value": "suffix:%" + "value": "none" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.axisLabel", + "value": "kPa" }, { "id": "decimals", "value": 2 - }, - { - "id": "custom.axisPlacement", - "value": "right" - }, - { - "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" - } } ] } @@ -1813,12 +1575,12 @@ }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } ], - "description": "Temperature on left axis, humidity and pressure on right axis with dynamic bound series so small swings remain visible." + "description": "Two-axis chart: tent temperature/humidity/dew point (left axis) and VPD in kPa (right axis)." }, { "id": 140, @@ -1830,15 +1592,33 @@ }, "gridPos": { "h": 6, - "w": 6, - "x": 12, - "y": 13 + "w": 4, + "x": 16, + "y": 12 }, "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", - "legendFormat": "{{metric}}", + "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", "instant": true } ], @@ -1871,56 +1651,7 @@ }, "decimals": 0 }, - "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 - } - ] - } - ] + "overrides": [] }, "options": { "colorMode": "value", @@ -1934,15 +1665,12 @@ "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false, - "text": { - "valueSize": 26 - } + "orientation": "horizontal", + "wideLayout": true }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } @@ -1958,30 +1686,30 @@ }, "gridPos": { "h": 6, - "w": 6, - "x": 18, - "y": 13 + "w": 4, + "x": 20, + "y": 12 }, "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})", - "legendFormat": "Outlet" + "expr": "typhon_fan_speed_level{fan_group=\"outlet\"}", + "legendFormat": "Inside Outlet" }, { "refId": "B", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})", - "legendFormat": "Inlet - Inside" + "expr": "typhon_fan_speed_level{fan_group=\"inside_inlet\"}", + "legendFormat": "Inside Inlet" }, { "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})", - "legendFormat": "Inlet - Outside" + "expr": "typhon_fan_speed_level{fan_group=\"outside_inlet\"}", + "legendFormat": "Outside Inlet" }, { "refId": "D", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})", - "legendFormat": "Interior" + "expr": "typhon_fan_speed_level{fan_group=\"interior\"}", + "legendFormat": "Interior Fans" } ], "fieldConfig": { @@ -1993,8 +1721,8 @@ }, "options": { "legend": { - "displayMode": "table", - "placement": "right" + "displayMode": "list", + "placement": "bottom" }, "tooltip": { "mode": "multi" @@ -2002,7 +1730,7 @@ }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } @@ -2018,9 +1746,9 @@ }, "gridPos": { "h": 5, - "w": 8, + "w": 6, "x": 0, - "y": 32 + "y": 7 }, "targets": [ { @@ -2032,6 +1760,9 @@ ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "h", "min": 0, "max": null, @@ -2061,7 +1792,7 @@ "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -2073,7 +1804,7 @@ }, "links": [ { - "title": "Open atlas-jobs dashboard", + "title": "Open Atlas Testing", "url": "/d/atlas-jobs", "targetBlank": true } @@ -2105,19 +1836,19 @@ "uid": "atlas-vm" }, "gridPos": { - "h": 6, + "h": 5, "w": 6, - "x": 12, + "x": 6, "y": 7 }, "targets": [ { - "expr": "sum(increase(ariadne_task_runs_total[$__interval])) or on() vector(0)", + "expr": "sum(increase(ariadne_task_runs_total[$__interval]))", "refId": "A", "legendFormat": "Attempts" }, { - "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval]))", "refId": "B", "legendFormat": "Failures" } @@ -2170,7 +1901,7 @@ }, "links": [ { - "title": "Open atlas-jobs dashboard", + "title": "Open Atlas Testing", "url": "/d/atlas-jobs", "targetBlank": true } @@ -2185,66 +1916,56 @@ "uid": "atlas-vm" }, "gridPos": { - "h": 6, + "h": 5, "w": 6, - "x": 18, + "x": 12, "y": 7 }, "targets": [ { "refId": "A", - "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)", + "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))", "legendFormat": "ariadne" }, { "refId": "B", - "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)", + "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))", "legendFormat": "metis" }, { "refId": "C", - "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)", + "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))", "legendFormat": "ananke" }, { "refId": "D", - "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)", + "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))", "legendFormat": "atlasbot" }, { "refId": "E", - "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=~\"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)", + "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" }, { - "refId": "G", - "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)", + "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" }, + { + "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" + }, { "refId": "H", - "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" + "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" }, { "refId": "I", - "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" + "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" } ], "fieldConfig": { @@ -2278,228 +1999,14 @@ }, "links": [ { - "title": "Open atlas-testing dashboard", - "url": "/d/atlas-testing", + "title": "Open Atlas Testing", + "url": "/d/atlas-jobs", "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", @@ -2510,13 +2017,13 @@ }, "gridPos": { "h": 5, - "w": 8, - "x": 16, - "y": 32 + "w": 6, + "x": 18, + "y": 7 }, "targets": [ { - "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))", + "expr": "sort_desc(max by (namespace, pvc) (pvc_backup_age_hours or on(namespace, pvc) ((1 - pvc_backup_health) * 999)))", "refId": "A", "legendFormat": "{{namespace}}/{{pvc}}", "instant": true @@ -2524,6 +2031,9 @@ ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "h", "min": 0, "max": null, @@ -2552,7 +2062,7 @@ "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -2575,12 +2085,12 @@ ], "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } ], - "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." + "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." }, { "id": 30, @@ -2594,7 +2104,7 @@ "h": 2, "w": 4, "x": 0, - "y": 19 + "y": 18 }, "targets": [ { @@ -2643,7 +2153,7 @@ }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2661,7 +2171,7 @@ "h": 2, "w": 4, "x": 8, - "y": 19 + "y": 18 }, "targets": [ { @@ -2748,7 +2258,7 @@ }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2766,7 +2276,7 @@ "h": 2, "w": 4, "x": 4, - "y": 19 + "y": 18 }, "targets": [ { @@ -2824,7 +2334,7 @@ }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2842,7 +2352,7 @@ "h": 2, "w": 4, "x": 12, - "y": 19 + "y": 18 }, "targets": [ { @@ -2900,7 +2410,7 @@ }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2918,7 +2428,7 @@ "h": 2, "w": 4, "x": 16, - "y": 19 + "y": 18 }, "targets": [ { @@ -2981,7 +2491,7 @@ "h": 2, "w": 4, "x": 20, - "y": 19 + "y": 18 }, "targets": [ { @@ -3251,7 +2761,7 @@ "h": 12, "w": 12, "x": 0, - "y": 44 + "y": 39 }, "targets": [ { @@ -3280,7 +2790,7 @@ }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -3298,7 +2808,7 @@ "h": 12, "w": 12, "x": 12, - "y": 44 + "y": 39 }, "targets": [ { @@ -3327,7 +2837,7 @@ }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -3345,7 +2855,7 @@ "h": 10, "w": 12, "x": 0, - "y": 56 + "y": 51 }, "targets": [ { @@ -3382,7 +2892,7 @@ "h": 10, "w": 12, "x": 12, - "y": 56 + "y": 51 }, "targets": [ { @@ -3419,7 +2929,7 @@ "h": 10, "w": 12, "x": 0, - "y": 66 + "y": 61 }, "targets": [ { @@ -3470,7 +2980,7 @@ "h": 10, "w": 12, "x": 12, - "y": 66 + "y": 61 }, "targets": [ { @@ -3482,6 +2992,9 @@ ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "none", "min": 0, "max": null, @@ -3511,7 +3024,7 @@ "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -3551,7 +3064,7 @@ "h": 7, "w": 8, "x": 0, - "y": 37 + "y": 32 }, "targets": [ { @@ -3577,7 +3090,7 @@ }, "links": [ { - "title": "Open atlas-network dashboard", + "title": "Open Atlas Network", "url": "/d/atlas-network", "targetBlank": true } @@ -3595,7 +3108,7 @@ "h": 7, "w": 8, "x": 8, - "y": 37 + "y": 32 }, "targets": [ { @@ -3621,7 +3134,7 @@ }, "links": [ { - "title": "Open atlas-network dashboard", + "title": "Open Atlas Network", "url": "/d/atlas-network", "targetBlank": true } @@ -3639,7 +3152,7 @@ "h": 7, "w": 8, "x": 16, - "y": 37 + "y": 32 }, "targets": [ { @@ -3665,7 +3178,7 @@ }, "links": [ { - "title": "Open atlas-network dashboard", + "title": "Open Atlas Network", "url": "/d/atlas-network", "targetBlank": true } @@ -3683,7 +3196,7 @@ "h": 16, "w": 12, "x": 0, - "y": 76 + "y": 71 }, "targets": [ { @@ -3713,7 +3226,7 @@ "timeFrom": "30d", "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -3731,7 +3244,7 @@ "h": 16, "w": 12, "x": 12, - "y": 76 + "y": 71 }, "targets": [ { @@ -3761,7 +3274,7 @@ "timeFrom": "1w", "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -3885,5 +3398,11 @@ "to": "now" }, "refresh": "1m", - "links": [] + "links": [ + { + "title": "Atlas Testing (Internal)", + "url": "/d/atlas-jobs", + "targetBlank": false + } + ] } diff --git a/services/monitoring/dashboards/atlas-pods.json b/services/monitoring/dashboards/atlas-pods.json index 0c8104c9..9bd48211 100644 --- a/services/monitoring/dashboards/atlas-pods.json +++ b/services/monitoring/dashboards/atlas-pods.json @@ -447,6 +447,9 @@ ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "none", "min": 0, "max": null, @@ -476,7 +479,7 @@ "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ diff --git a/services/monitoring/dashboards/atlas-power.json b/services/monitoring/dashboards/atlas-power.json index 9a88380e..7d336fed 100644 --- a/services/monitoring/dashboards/atlas-power.json +++ b/services/monitoring/dashboards/atlas-power.json @@ -20,9 +20,39 @@ }, "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\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Runtime\", \"__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\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Runtime\", \"__name__\", \".*\")", "refId": "A", - "legendFormat": "{{ups}} {{metric}}", + "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 } ], @@ -54,25 +84,121 @@ "overrides": [ { "matcher": { - "id": "byRegexp", - "options": ".*Draw$" + "id": "byName", + "options": "Pyrphoros Draw (W)" }, "properties": [ { "id": "unit", "value": "watt" + }, + { + "id": "description", + "value": "Attached node: titan-db" } ] }, { "matcher": { - "id": "byRegexp", - "options": ".*Runtime$" + "id": "byName", + "options": "Statera Draw (W)" + }, + "properties": [ + { + "id": "unit", + "value": "watt" + }, + { + "id": "description", + "value": "Attached node: titan-24" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pyrphoros 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" + }, + "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" } ] } @@ -90,14 +216,10 @@ "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false, - "text": { - "titleSize": 14, - "valueSize": 24 - } + "orientation": "horizontal", + "wideLayout": true }, - "description": "Per-UPS live snapshot: draw, discharge runtime, and charging/discharging status." + "description": "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status." }, { "id": 2, @@ -158,9 +280,27 @@ }, "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\", \"Temp \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\", \"Temp \u00b0F\", \"__name__\", \".*\") or 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\", \"Humidity\", \"__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\", \"Pressure\", \"__name__\", \".*\")", "refId": "A", - "legendFormat": "{{metric}}", + "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)", "instant": true } ], @@ -193,7 +333,7 @@ { "matcher": { "id": "byName", - "options": "Temp \u00b0C" + "options": "Tent Temp (\u00b0C)" }, "properties": [ { @@ -205,19 +345,19 @@ { "matcher": { "id": "byName", - "options": "Temp \u00b0F" + "options": "Tent VPD (kPa)" }, "properties": [ { "id": "unit", - "value": "fahrenheit" + "value": "suffix:kPa" } ] }, { "matcher": { "id": "byName", - "options": "Humidity" + "options": "Tent RH (%)" }, "properties": [ { @@ -229,12 +369,12 @@ { "matcher": { "id": "byName", - "options": "Pressure" + "options": "Dew Point (\u00b0C)" }, "properties": [ { "id": "unit", - "value": "suffix:kPa" + "value": "celsius" } ] } @@ -252,14 +392,10 @@ "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false, - "text": { - "titleSize": 16, - "valueSize": 28 - } + "orientation": "horizontal", + "wideLayout": true }, - "description": "Current tent values: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure." + "description": "Current tent temperature, humidity, VPD, and dew point. These render once Typhon climate telemetry is online." }, { "id": 4, @@ -278,70 +414,30 @@ "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)", + "expr": "typhon_temperature_celsius", "legendFormat": "Temperature (\u00b0C)" }, { "refId": "B", - "expr": "(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)) * 9 / 5 + 32", - "legendFormat": "Temperature (\u00b0F)" - }, - { - "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)", + "expr": "typhon_relative_humidity_percent", "legendFormat": "Humidity (%)" }, + { + "refId": "C", + "expr": "typhon_vpd_kpa", + "legendFormat": "VPD (kPa)" + }, { "refId": "D", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)", - "legendFormat": "Pressure (VPD kPa)" + "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)" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "celsius" }, "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Temperature (\u00b0C)" - }, - "properties": [ - { - "id": "unit", - "value": "suffix:\u00b0C" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.axisCenteredZero", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Temperature (\u00b0F)" - }, - "properties": [ - { - "id": "unit", - "value": "suffix:\u00b0F" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.axisCenteredZero", - "value": false - } - ] - }, { "matcher": { "id": "byName", @@ -350,43 +446,31 @@ "properties": [ { "id": "unit", - "value": "suffix:%" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.axisPlacement", - "value": "right" - }, - { - "id": "custom.axisCenteredZero", - "value": false + "value": "percent" } ] }, { "matcher": { "id": "byName", - "options": "Pressure (VPD kPa)" + "options": "VPD (kPa)" }, "properties": [ { "id": "unit", - "value": "suffix:kPa" + "value": "none" }, { "id": "custom.axisPlacement", "value": "right" }, { - "id": "decimals", - "value": 2 + "id": "custom.axisLabel", + "value": "kPa" }, { - "id": "custom.axisCenteredZero", - "value": false + "id": "decimals", + "value": 2 } ] } @@ -401,7 +485,7 @@ "mode": "multi" } }, - "description": "Historical tent temperature (C/F), humidity, and pressure proxy (VPD kPa)." + "description": "Two-axis chart: tent temperature/humidity/dew point (left axis) and tent VPD in kPa (right axis)." }, { "id": 5, @@ -419,9 +503,27 @@ }, "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", - "legendFormat": "{{metric}}", + "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", "instant": true } ], @@ -454,56 +556,7 @@ }, "decimals": 0 }, - "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 - } - ] - } - ] + "overrides": [] }, "options": { "colorMode": "value", @@ -517,10 +570,10 @@ "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false + "orientation": "horizontal", + "wideLayout": true }, - "description": "Current fan activity levels: outlet, inlet in, inlet out, interior (0-10)." + "description": "Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans." }, { "id": 6, @@ -539,23 +592,23 @@ "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})", - "legendFormat": "Outlet" + "expr": "typhon_fan_speed_level{fan_group=\"outlet\"}", + "legendFormat": "Inside Outlet" }, { "refId": "B", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})", - "legendFormat": "Inlet - Inside" + "expr": "typhon_fan_speed_level{fan_group=\"inside_inlet\"}", + "legendFormat": "Inside Inlet" }, { "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})", - "legendFormat": "Inlet - Outside" + "expr": "typhon_fan_speed_level{fan_group=\"outside_inlet\"}", + "legendFormat": "Outside Inlet" }, { "refId": "D", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})", - "legendFormat": "Interior" + "expr": "typhon_fan_speed_level{fan_group=\"interior\"}", + "legendFormat": "Interior Fans" } ], "fieldConfig": { diff --git a/services/monitoring/dashboards/atlas-testing.json b/services/monitoring/dashboards/atlas-testing.json index e8e57cc4..71d3ed57 100644 --- a/services/monitoring/dashboards/atlas-testing.json +++ b/services/monitoring/dashboards/atlas-testing.json @@ -779,7 +779,7 @@ { "id": 18, "type": "bargauge", - "title": "Files >500 LOC by Suite (Latest)", + "title": "Files <=500 LOC by Suite (Latest)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -792,7 +792,7 @@ }, "targets": [ { - "expr": "sort_desc((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", + "expr": "sort(((100 * clamp_min((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) - (max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 0) / (max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))) and on(suite) ((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) > 0)) or on(suite) (100 * (1 - clamp_max((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", "refId": "A", "legendFormat": "{{suite}}", "instant": true @@ -803,9 +803,9 @@ "color": { "mode": "thresholds" }, - "unit": "none", + "unit": "percent", "min": 0, - "max": null, + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -814,23 +814,24 @@ "value": null }, { - "color": "green", - "value": 0 + "color": "orange", + "value": 90 }, { "color": "yellow", - "value": 1 + "value": 93 }, { - "color": "orange", - "value": 3 + "color": "green", + "value": 95 }, { - "color": "red", - "value": 5 + "color": "blue", + "value": 100 } ] }, + "decimals": 0, "mappings": [ { "type": "value", @@ -862,10 +863,11 @@ "fields": [ "Value" ], - "order": "desc" + "order": "asc" } } - ] + ], + "description": "Percent of managed LOC-gated files at or under 500 lines. Older suite payloads fall back to 100%/0% until they emit platform_quality_gate_source_files_total." }, { "id": 500, @@ -981,7 +983,7 @@ { "id": 13, "type": "timeseries", - "title": "Coverage & LOC History (Selected Scope)", + "title": "Coverage & LOC Compliance History", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -1000,13 +1002,13 @@ }, { "refId": "B", - "expr": "max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])", - "legendFormat": "{{suite}} files >500 LOC" + "expr": "(100 * clamp_min((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) - (max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 0) / (max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0) or on(suite) (100 * (1 - clamp_max((max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])) >= bool 0)))", + "legendFormat": "{{suite}} files <=500 LOC %" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "percent" }, "overrides": [] }, @@ -2612,7 +2614,7 @@ { "id": 30, "type": "bargauge", - "title": "Missing LOC Metrics by Suite", + "title": "Missing LOC Compliance Metrics by Suite", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -2625,7 +2627,7 @@ }, "targets": [ { - "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", + "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}) and on(suite) count by (suite) (platform_quality_gate_source_files_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", "refId": "A", "legendFormat": "{{suite}}", "instant": true diff --git a/services/monitoring/grafana-dashboard-jobs.yaml b/services/monitoring/grafana-dashboard-jobs.yaml index 7b587985..d0b2270b 100644 --- a/services/monitoring/grafana-dashboard-jobs.yaml +++ b/services/monitoring/grafana-dashboard-jobs.yaml @@ -788,7 +788,7 @@ data: { "id": 18, "type": "bargauge", - "title": "Files >500 LOC by Suite (Latest)", + "title": "Files <=500 LOC by Suite (Latest)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -801,7 +801,7 @@ data: }, "targets": [ { - "expr": "sort_desc((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", + "expr": "sort(((100 * clamp_min((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) - (max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 0) / (max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))) and on(suite) ((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) > 0)) or on(suite) (100 * (1 - clamp_max((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", "refId": "A", "legendFormat": "{{suite}}", "instant": true @@ -812,9 +812,9 @@ data: "color": { "mode": "thresholds" }, - "unit": "none", + "unit": "percent", "min": 0, - "max": null, + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -823,23 +823,24 @@ data: "value": null }, { - "color": "green", - "value": 0 + "color": "orange", + "value": 90 }, { "color": "yellow", - "value": 1 + "value": 93 }, { - "color": "orange", - "value": 3 + "color": "green", + "value": 95 }, { - "color": "red", - "value": 5 + "color": "blue", + "value": 100 } ] }, + "decimals": 0, "mappings": [ { "type": "value", @@ -871,10 +872,11 @@ data: "fields": [ "Value" ], - "order": "desc" + "order": "asc" } } - ] + ], + "description": "Percent of managed LOC-gated files at or under 500 lines. Older suite payloads fall back to 100%/0% until they emit platform_quality_gate_source_files_total." }, { "id": 500, @@ -990,7 +992,7 @@ data: { "id": 13, "type": "timeseries", - "title": "Coverage & LOC History (Selected Scope)", + "title": "Coverage & LOC Compliance History", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -1009,13 +1011,13 @@ data: }, { "refId": "B", - "expr": "max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])", - "legendFormat": "{{suite}} files >500 LOC" + "expr": "(100 * clamp_min((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) - (max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 0) / (max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0) or on(suite) (100 * (1 - clamp_max((max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])) >= bool 0)))", + "legendFormat": "{{suite}} files <=500 LOC %" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "percent" }, "overrides": [] }, @@ -2621,7 +2623,7 @@ data: { "id": 30, "type": "bargauge", - "title": "Missing LOC Metrics by Suite", + "title": "Missing LOC Compliance Metrics by Suite", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -2634,7 +2636,7 @@ data: }, "targets": [ { - "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", + "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}) and on(suite) count by (suite) (platform_quality_gate_source_files_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", "refId": "A", "legendFormat": "{{suite}}", "instant": true diff --git a/services/monitoring/grafana-dashboard-overview.yaml b/services/monitoring/grafana-dashboard-overview.yaml index 3013cd35..8f428421 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 dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -213,7 +213,7 @@ data: }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -363,7 +363,7 @@ data: }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -438,7 +438,7 @@ data: }, "links": [ { - "title": "Open atlas-pods dashboard", + "title": "Open Atlas Pods", "url": "/d/atlas-pods", "targetBlank": true } @@ -576,7 +576,7 @@ data: }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -653,7 +653,7 @@ data: }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -722,7 +722,7 @@ data: }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -791,7 +791,7 @@ data: }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -866,7 +866,7 @@ data: }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -941,7 +941,7 @@ data: }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -1008,7 +1008,7 @@ data: }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -1075,7 +1075,7 @@ data: }, "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -1084,22 +1084,52 @@ data: { "id": 40, "type": "stat", - "title": "Pyrphoros UPS Current", + "title": "UPS Current Load", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 3, - "w": 6, + "h": 6, + "w": 4, "x": 0, - "y": 7 + "y": 12 }, "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", - "legendFormat": "{{metric}}", + "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 } ], @@ -1125,128 +1155,127 @@ data: "unit": "none", "custom": { "displayMode": "auto" - } + }, + "decimals": 1 }, "overrides": [ { "matcher": { "id": "byName", - "options": "Draw" + "options": "Pyrphoros Draw (W)" }, "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": 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 - } - ], - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(115, 115, 115, 1)", - "value": null }, { - "color": "green", - "value": 1 + "id": "description", + "value": "Attached node: titan-db" } ] }, - "unit": "none", - "custom": { - "displayMode": "auto" - } - }, - "overrides": [ { "matcher": { "id": "byName", - "options": "Draw" + "options": "Statera Draw (W)" }, "properties": [ { "id": "unit", "value": "watt" + }, + { + "id": "description", + "value": "Attached node: titan-24" } ] }, { "matcher": { "id": "byName", - "options": "Runtime" + "options": "Pyrphoros 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" + }, + "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" } ] } @@ -1264,18 +1293,17 @@ data: "values": false }, "textMode": "name_and_value", - "text": { - "titleSize": 14, - "valueSize": 30 - } + "orientation": "horizontal", + "wideLayout": true }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } - ] + ], + "description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status." }, { "id": 41, @@ -1287,9 +1315,9 @@ data: }, "gridPos": { "h": 6, - "w": 6, - "x": 6, - "y": 7 + "w": 4, + "x": 4, + "y": 12 }, "targets": [ { @@ -1311,8 +1339,8 @@ data: }, "options": { "legend": { - "displayMode": "table", - "placement": "right" + "displayMode": "list", + "placement": "bottom" }, "tooltip": { "mode": "multi" @@ -1320,7 +1348,7 @@ data: }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } @@ -1329,22 +1357,40 @@ data: { "id": 42, "type": "stat", - "title": "Current Enclosure Temperature", + "title": "Current Climate", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { - "h": 3, - "w": 6, - "x": 0, - "y": 13 + "h": 6, + "w": 4, + "x": 8, + "y": 12 }, "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", - "legendFormat": "{{metric}}", + "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)", "instant": true } ], @@ -1370,13 +1416,14 @@ data: "unit": "none", "custom": { "displayMode": "auto" - } + }, + "decimals": 2 }, "overrides": [ { "matcher": { "id": "byName", - "options": "\u00b0C" + "options": "Tent Temp (\u00b0C)" }, "properties": [ { @@ -1388,105 +1435,7 @@ data: { "matcher": { "id": "byName", - "options": "\u00b0F" - }, - "properties": [ - { - "id": "unit", - "value": "fahrenheit" - } - ] - } - ] - }, - "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": 143, - "type": "stat", - "title": "Current Enclosure Climate", - "datasource": { - "type": "prometheus", - "uid": "atlas-vm" - }, - "gridPos": { - "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", - "legendFormat": "{{metric}}", - "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" - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "%RH" - }, - "properties": [ - { - "id": "unit", - "value": "suffix:%RH" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "kPa" + "options": "Tent VPD (kPa)" }, "properties": [ { @@ -1494,6 +1443,30 @@ data: "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" + } + ] } ] }, @@ -1508,304 +1481,93 @@ data: "fields": "", "values": false }, - "textMode": "name_and_value", - "text": { - "titleSize": 14, - "valueSize": 30 - } + "textMode": "value", + "orientation": "horizontal", + "wideLayout": true }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } - ] + ], + "description": "Current tent temperature, humidity, VPD, and dew point." }, { "id": 43, "type": "timeseries", - "title": "Enclosure Climate History", + "title": "Climate History", "datasource": { "type": "prometheus", "uid": "atlas-vm" }, "gridPos": { "h": 6, - "w": 6, - "x": 6, - "y": 13 + "w": 4, + "x": 12, + "y": 12 }, "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)", - "legendFormat": "C" + "expr": "typhon_temperature_celsius", + "legendFormat": "Temperature (\u00b0C)" }, { "refId": "B", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)", - "legendFormat": "RH" + "expr": "typhon_relative_humidity_percent", + "legendFormat": "Humidity (%)" }, { "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)", - "legendFormat": "P" + "expr": "typhon_vpd_kpa", + "legendFormat": "VPD (kPa)" }, { "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" + "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)" } ], "fieldConfig": { "defaults": { - "unit": "none", - "custom": { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 10, - "showPoints": "never", - "spanNulls": true - } + "unit": "celsius" }, "overrides": [ { "matcher": { "id": "byName", - "options": "C" + "options": "Humidity (%)" }, "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" - } + "value": "percent" } ] }, { "matcher": { "id": "byName", - "options": "RH" + "options": "VPD (kPa)" }, "properties": [ { "id": "unit", - "value": "suffix:%" + "value": "none" + }, + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "custom.axisLabel", + "value": "kPa" }, { "id": "decimals", "value": 2 - }, - { - "id": "custom.axisPlacement", - "value": "right" - }, - { - "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" - } } ] } @@ -1822,12 +1584,12 @@ data: }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } ], - "description": "Temperature on left axis, humidity and pressure on right axis with dynamic bound series so small swings remain visible." + "description": "Two-axis chart: tent temperature/humidity/dew point (left axis) and VPD in kPa (right axis)." }, { "id": 140, @@ -1839,15 +1601,33 @@ data: }, "gridPos": { "h": 6, - "w": 6, - "x": 12, - "y": 13 + "w": 4, + "x": 16, + "y": 12 }, "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", - "legendFormat": "{{metric}}", + "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", "instant": true } ], @@ -1880,56 +1660,7 @@ data: }, "decimals": 0 }, - "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 - } - ] - } - ] + "overrides": [] }, "options": { "colorMode": "value", @@ -1943,15 +1674,12 @@ data: "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false, - "text": { - "valueSize": 26 - } + "orientation": "horizontal", + "wideLayout": true }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } @@ -1967,30 +1695,30 @@ data: }, "gridPos": { "h": 6, - "w": 6, - "x": 18, - "y": 13 + "w": 4, + "x": 20, + "y": 12 }, "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})", - "legendFormat": "Outlet" + "expr": "typhon_fan_speed_level{fan_group=\"outlet\"}", + "legendFormat": "Inside Outlet" }, { "refId": "B", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})", - "legendFormat": "Inlet - Inside" + "expr": "typhon_fan_speed_level{fan_group=\"inside_inlet\"}", + "legendFormat": "Inside Inlet" }, { "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})", - "legendFormat": "Inlet - Outside" + "expr": "typhon_fan_speed_level{fan_group=\"outside_inlet\"}", + "legendFormat": "Outside Inlet" }, { "refId": "D", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})", - "legendFormat": "Interior" + "expr": "typhon_fan_speed_level{fan_group=\"interior\"}", + "legendFormat": "Interior Fans" } ], "fieldConfig": { @@ -2002,8 +1730,8 @@ data: }, "options": { "legend": { - "displayMode": "table", - "placement": "right" + "displayMode": "list", + "placement": "bottom" }, "tooltip": { "mode": "multi" @@ -2011,7 +1739,7 @@ data: }, "links": [ { - "title": "Open atlas-power dashboard", + "title": "Open Atlas Power", "url": "/d/atlas-power", "targetBlank": true } @@ -2027,9 +1755,9 @@ data: }, "gridPos": { "h": 5, - "w": 8, + "w": 6, "x": 0, - "y": 32 + "y": 7 }, "targets": [ { @@ -2041,6 +1769,9 @@ data: ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "h", "min": 0, "max": null, @@ -2070,7 +1801,7 @@ data: "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -2082,7 +1813,7 @@ data: }, "links": [ { - "title": "Open atlas-jobs dashboard", + "title": "Open Atlas Testing", "url": "/d/atlas-jobs", "targetBlank": true } @@ -2114,19 +1845,19 @@ data: "uid": "atlas-vm" }, "gridPos": { - "h": 6, + "h": 5, "w": 6, - "x": 12, + "x": 6, "y": 7 }, "targets": [ { - "expr": "sum(increase(ariadne_task_runs_total[$__interval])) or on() vector(0)", + "expr": "sum(increase(ariadne_task_runs_total[$__interval]))", "refId": "A", "legendFormat": "Attempts" }, { - "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval]))", "refId": "B", "legendFormat": "Failures" } @@ -2179,7 +1910,7 @@ data: }, "links": [ { - "title": "Open atlas-jobs dashboard", + "title": "Open Atlas Testing", "url": "/d/atlas-jobs", "targetBlank": true } @@ -2194,66 +1925,56 @@ data: "uid": "atlas-vm" }, "gridPos": { - "h": 6, + "h": 5, "w": 6, - "x": 18, + "x": 12, "y": 7 }, "targets": [ { "refId": "A", - "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)", + "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))", "legendFormat": "ariadne" }, { "refId": "B", - "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)", + "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))", "legendFormat": "metis" }, { "refId": "C", - "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)", + "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))", "legendFormat": "ananke" }, { "refId": "D", - "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)", + "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))", "legendFormat": "atlasbot" }, { "refId": "E", - "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=~\"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)", + "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" }, { - "refId": "G", - "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)", + "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" }, + { + "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" + }, { "refId": "H", - "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" + "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" }, { "refId": "I", - "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" + "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" } ], "fieldConfig": { @@ -2287,228 +2008,14 @@ data: }, "links": [ { - "title": "Open atlas-testing dashboard", - "url": "/d/atlas-testing", + "title": "Open Atlas Testing", + "url": "/d/atlas-jobs", "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", @@ -2519,13 +2026,13 @@ data: }, "gridPos": { "h": 5, - "w": 8, - "x": 16, - "y": 32 + "w": 6, + "x": 18, + "y": 7 }, "targets": [ { - "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))", + "expr": "sort_desc(max by (namespace, pvc) (pvc_backup_age_hours or on(namespace, pvc) ((1 - pvc_backup_health) * 999)))", "refId": "A", "legendFormat": "{{namespace}}/{{pvc}}", "instant": true @@ -2533,6 +2040,9 @@ data: ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "h", "min": 0, "max": null, @@ -2561,7 +2071,7 @@ data: "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -2584,12 +2094,12 @@ data: ], "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } ], - "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." + "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." }, { "id": 30, @@ -2603,7 +2113,7 @@ data: "h": 2, "w": 4, "x": 0, - "y": 19 + "y": 18 }, "targets": [ { @@ -2652,7 +2162,7 @@ data: }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2670,7 +2180,7 @@ data: "h": 2, "w": 4, "x": 8, - "y": 19 + "y": 18 }, "targets": [ { @@ -2757,7 +2267,7 @@ data: }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2775,7 +2285,7 @@ data: "h": 2, "w": 4, "x": 4, - "y": 19 + "y": 18 }, "targets": [ { @@ -2833,7 +2343,7 @@ data: }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2851,7 +2361,7 @@ data: "h": 2, "w": 4, "x": 12, - "y": 19 + "y": 18 }, "targets": [ { @@ -2909,7 +2419,7 @@ data: }, "links": [ { - "title": "Open atlas-mail dashboard", + "title": "Open Atlas Mail", "url": "/d/atlas-mail", "targetBlank": true } @@ -2927,7 +2437,7 @@ data: "h": 2, "w": 4, "x": 16, - "y": 19 + "y": 18 }, "targets": [ { @@ -2990,7 +2500,7 @@ data: "h": 2, "w": 4, "x": 20, - "y": 19 + "y": 18 }, "targets": [ { @@ -3260,7 +2770,7 @@ data: "h": 12, "w": 12, "x": 0, - "y": 44 + "y": 39 }, "targets": [ { @@ -3289,7 +2799,7 @@ data: }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -3307,7 +2817,7 @@ data: "h": 12, "w": 12, "x": 12, - "y": 44 + "y": 39 }, "targets": [ { @@ -3336,7 +2846,7 @@ data: }, "links": [ { - "title": "Open atlas-nodes dashboard", + "title": "Open Atlas Nodes", "url": "/d/atlas-nodes", "targetBlank": true } @@ -3354,7 +2864,7 @@ data: "h": 10, "w": 12, "x": 0, - "y": 56 + "y": 51 }, "targets": [ { @@ -3391,7 +2901,7 @@ data: "h": 10, "w": 12, "x": 12, - "y": 56 + "y": 51 }, "targets": [ { @@ -3428,7 +2938,7 @@ data: "h": 10, "w": 12, "x": 0, - "y": 66 + "y": 61 }, "targets": [ { @@ -3479,7 +2989,7 @@ data: "h": 10, "w": 12, "x": 12, - "y": 66 + "y": 61 }, "targets": [ { @@ -3491,6 +3001,9 @@ data: ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "none", "min": 0, "max": null, @@ -3520,7 +3033,7 @@ data: "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ @@ -3560,7 +3073,7 @@ data: "h": 7, "w": 8, "x": 0, - "y": 37 + "y": 32 }, "targets": [ { @@ -3586,7 +3099,7 @@ data: }, "links": [ { - "title": "Open atlas-network dashboard", + "title": "Open Atlas Network", "url": "/d/atlas-network", "targetBlank": true } @@ -3604,7 +3117,7 @@ data: "h": 7, "w": 8, "x": 8, - "y": 37 + "y": 32 }, "targets": [ { @@ -3630,7 +3143,7 @@ data: }, "links": [ { - "title": "Open atlas-network dashboard", + "title": "Open Atlas Network", "url": "/d/atlas-network", "targetBlank": true } @@ -3648,7 +3161,7 @@ data: "h": 7, "w": 8, "x": 16, - "y": 37 + "y": 32 }, "targets": [ { @@ -3674,7 +3187,7 @@ data: }, "links": [ { - "title": "Open atlas-network dashboard", + "title": "Open Atlas Network", "url": "/d/atlas-network", "targetBlank": true } @@ -3692,7 +3205,7 @@ data: "h": 16, "w": 12, "x": 0, - "y": 76 + "y": 71 }, "targets": [ { @@ -3722,7 +3235,7 @@ data: "timeFrom": "30d", "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -3740,7 +3253,7 @@ data: "h": 16, "w": 12, "x": 12, - "y": 76 + "y": 71 }, "targets": [ { @@ -3770,7 +3283,7 @@ data: "timeFrom": "1w", "links": [ { - "title": "Open atlas-storage dashboard", + "title": "Open Atlas Storage", "url": "/d/atlas-storage", "targetBlank": true } @@ -3894,5 +3407,11 @@ data: "to": "now" }, "refresh": "1m", - "links": [] + "links": [ + { + "title": "Atlas Testing (Internal)", + "url": "/d/atlas-jobs", + "targetBlank": false + } + ] } diff --git a/services/monitoring/grafana-dashboard-pods.yaml b/services/monitoring/grafana-dashboard-pods.yaml index 1461eac6..a5738409 100644 --- a/services/monitoring/grafana-dashboard-pods.yaml +++ b/services/monitoring/grafana-dashboard-pods.yaml @@ -456,6 +456,9 @@ data: ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "none", "min": 0, "max": null, @@ -485,7 +488,7 @@ data: "overrides": [] }, "options": { - "displayMode": "gradient", + "displayMode": "basic", "orientation": "horizontal", "reduceOptions": { "calcs": [ diff --git a/services/monitoring/grafana-dashboard-power.yaml b/services/monitoring/grafana-dashboard-power.yaml index f7009804..762cb733 100644 --- a/services/monitoring/grafana-dashboard-power.yaml +++ b/services/monitoring/grafana-dashboard-power.yaml @@ -29,9 +29,39 @@ 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\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Runtime\", \"__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\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Runtime\", \"__name__\", \".*\")", "refId": "A", - "legendFormat": "{{ups}} {{metric}}", + "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 } ], @@ -63,25 +93,121 @@ data: "overrides": [ { "matcher": { - "id": "byRegexp", - "options": ".*Draw$" + "id": "byName", + "options": "Pyrphoros Draw (W)" }, "properties": [ { "id": "unit", "value": "watt" + }, + { + "id": "description", + "value": "Attached node: titan-db" } ] }, { "matcher": { - "id": "byRegexp", - "options": ".*Runtime$" + "id": "byName", + "options": "Statera Draw (W)" + }, + "properties": [ + { + "id": "unit", + "value": "watt" + }, + { + "id": "description", + "value": "Attached node: titan-24" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pyrphoros 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" + }, + "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" } ] } @@ -99,14 +225,10 @@ data: "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false, - "text": { - "titleSize": 14, - "valueSize": 24 - } + "orientation": "horizontal", + "wideLayout": true }, - "description": "Per-UPS live snapshot: draw, discharge runtime, and charging/discharging status." + "description": "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status." }, { "id": 2, @@ -167,9 +289,27 @@ data: }, "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\", \"Temp \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\", \"Temp \u00b0F\", \"__name__\", \".*\") or 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\", \"Humidity\", \"__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\", \"Pressure\", \"__name__\", \".*\")", "refId": "A", - "legendFormat": "{{metric}}", + "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)", "instant": true } ], @@ -202,7 +342,7 @@ data: { "matcher": { "id": "byName", - "options": "Temp \u00b0C" + "options": "Tent Temp (\u00b0C)" }, "properties": [ { @@ -214,19 +354,19 @@ data: { "matcher": { "id": "byName", - "options": "Temp \u00b0F" + "options": "Tent VPD (kPa)" }, "properties": [ { "id": "unit", - "value": "fahrenheit" + "value": "suffix:kPa" } ] }, { "matcher": { "id": "byName", - "options": "Humidity" + "options": "Tent RH (%)" }, "properties": [ { @@ -238,12 +378,12 @@ data: { "matcher": { "id": "byName", - "options": "Pressure" + "options": "Dew Point (\u00b0C)" }, "properties": [ { "id": "unit", - "value": "suffix:kPa" + "value": "celsius" } ] } @@ -261,14 +401,10 @@ data: "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false, - "text": { - "titleSize": 16, - "valueSize": 28 - } + "orientation": "horizontal", + "wideLayout": true }, - "description": "Current tent values: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure." + "description": "Current tent temperature, humidity, VPD, and dew point. These render once Typhon climate telemetry is online." }, { "id": 4, @@ -287,70 +423,30 @@ data: "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)", + "expr": "typhon_temperature_celsius", "legendFormat": "Temperature (\u00b0C)" }, { "refId": "B", - "expr": "(max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_temperature_celsius != 0)) * 9 / 5 + 32", - "legendFormat": "Temperature (\u00b0F)" - }, - { - "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_relative_humidity_percent != 0)", + "expr": "typhon_relative_humidity_percent", "legendFormat": "Humidity (%)" }, + { + "refId": "C", + "expr": "typhon_vpd_kpa", + "legendFormat": "VPD (kPa)" + }, { "refId": "D", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_vpd_kpa != 0)", - "legendFormat": "Pressure (VPD kPa)" + "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)" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "celsius" }, "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Temperature (\u00b0C)" - }, - "properties": [ - { - "id": "unit", - "value": "suffix:\u00b0C" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.axisCenteredZero", - "value": false - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Temperature (\u00b0F)" - }, - "properties": [ - { - "id": "unit", - "value": "suffix:\u00b0F" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.axisCenteredZero", - "value": false - } - ] - }, { "matcher": { "id": "byName", @@ -359,43 +455,31 @@ data: "properties": [ { "id": "unit", - "value": "suffix:%" - }, - { - "id": "decimals", - "value": 2 - }, - { - "id": "custom.axisPlacement", - "value": "right" - }, - { - "id": "custom.axisCenteredZero", - "value": false + "value": "percent" } ] }, { "matcher": { "id": "byName", - "options": "Pressure (VPD kPa)" + "options": "VPD (kPa)" }, "properties": [ { "id": "unit", - "value": "suffix:kPa" + "value": "none" }, { "id": "custom.axisPlacement", "value": "right" }, { - "id": "decimals", - "value": 2 + "id": "custom.axisLabel", + "value": "kPa" }, { - "id": "custom.axisCenteredZero", - "value": false + "id": "decimals", + "value": 2 } ] } @@ -410,7 +494,7 @@ data: "mode": "multi" } }, - "description": "Historical tent temperature (C/F), humidity, and pressure proxy (VPD kPa)." + "description": "Two-axis chart: tent temperature/humidity/dew point (left axis) and tent VPD in kPa (right axis)." }, { "id": 5, @@ -428,9 +512,27 @@ data: }, "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", - "legendFormat": "{{metric}}", + "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", "instant": true } ], @@ -463,56 +565,7 @@ data: }, "decimals": 0 }, - "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 - } - ] - } - ] + "overrides": [] }, "options": { "colorMode": "value", @@ -526,10 +579,10 @@ data: "values": false }, "textMode": "name_and_value", - "orientation": "vertical", - "wideLayout": false + "orientation": "horizontal", + "wideLayout": true }, - "description": "Current fan activity levels: outlet, inlet in, inlet out, interior (0-10)." + "description": "Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans." }, { "id": 6, @@ -548,23 +601,23 @@ data: "targets": [ { "refId": "A", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"1\"})", - "legendFormat": "Outlet" + "expr": "typhon_fan_speed_level{fan_group=\"outlet\"}", + "legendFormat": "Inside Outlet" }, { "refId": "B", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"2\"})", - "legendFormat": "Inlet - Inside" + "expr": "typhon_fan_speed_level{fan_group=\"inside_inlet\"}", + "legendFormat": "Inside Inlet" }, { "refId": "C", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"3\"})", - "legendFormat": "Inlet - Outside" + "expr": "typhon_fan_speed_level{fan_group=\"outside_inlet\"}", + "legendFormat": "Outside Inlet" }, { "refId": "D", - "expr": "max without (job,instance,pod,service,endpoint,namespace,controller_name,port_name,fan_group) (typhon_fan_speed_level{port=\"4\"})", - "legendFormat": "Interior" + "expr": "typhon_fan_speed_level{fan_group=\"interior\"}", + "legendFormat": "Interior Fans" } ], "fieldConfig": { diff --git a/services/monitoring/grafana-dashboard-testing.yaml b/services/monitoring/grafana-dashboard-testing.yaml index fc1f187d..1100dc33 100644 --- a/services/monitoring/grafana-dashboard-testing.yaml +++ b/services/monitoring/grafana-dashboard-testing.yaml @@ -788,7 +788,7 @@ data: { "id": 18, "type": "bargauge", - "title": "Files >500 LOC by Suite (Latest)", + "title": "Files <=500 LOC by Suite (Latest)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -801,7 +801,7 @@ data: }, "targets": [ { - "expr": "sort_desc((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", + "expr": "sort(((100 * clamp_min((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) - (max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 0) / (max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))) and on(suite) ((max by (suite) (platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) > 0)) or on(suite) (100 * (1 - clamp_max((max by (suite) (platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])))) - 1))", "refId": "A", "legendFormat": "{{suite}}", "instant": true @@ -812,9 +812,9 @@ data: "color": { "mode": "thresholds" }, - "unit": "none", + "unit": "percent", "min": 0, - "max": null, + "max": 100, "thresholds": { "mode": "absolute", "steps": [ @@ -823,23 +823,24 @@ data: "value": null }, { - "color": "green", - "value": 0 + "color": "orange", + "value": 90 }, { "color": "yellow", - "value": 1 + "value": 93 }, { - "color": "orange", - "value": 3 + "color": "green", + "value": 95 }, { - "color": "red", - "value": 5 + "color": "blue", + "value": 100 } ] }, + "decimals": 0, "mappings": [ { "type": "value", @@ -871,10 +872,11 @@ data: "fields": [ "Value" ], - "order": "desc" + "order": "asc" } } - ] + ], + "description": "Percent of managed LOC-gated files at or under 500 lines. Older suite payloads fall back to 100%/0% until they emit platform_quality_gate_source_files_total." }, { "id": 500, @@ -990,7 +992,7 @@ data: { "id": 13, "type": "timeseries", - "title": "Coverage & LOC History (Selected Scope)", + "title": "Coverage & LOC Compliance History", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -1009,13 +1011,13 @@ data: }, { "refId": "B", - "expr": "max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])", - "legendFormat": "{{suite}} files >500 LOC" + "expr": "(100 * clamp_min((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) - (max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 0) / (max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((max by (suite) (max_over_time(platform_quality_gate_source_files_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0) or on(suite) (100 * (1 - clamp_max((max by (suite) (max_over_time(platform_quality_gate_source_lines_over_500_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))), 1))) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d])) >= bool 0)))", + "legendFormat": "{{suite}} files <=500 LOC %" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "percent" }, "overrides": [] }, @@ -2621,7 +2623,7 @@ data: { "id": 30, "type": "bargauge", - "title": "Missing LOC Metrics by Suite", + "title": "Missing LOC Compliance Metrics by Suite", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -2634,7 +2636,7 @@ data: }, "targets": [ { - "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", + "expr": "sort_desc((((label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\")) unless on(suite) count by (suite) (platform_quality_gate_source_lines_over_500_total{exported_job=\"platform-quality-ci\"}) and on(suite) count by (suite) (platform_quality_gate_source_files_total{exported_job=\"platform-quality-ci\"}))) or on(suite) (0 * (label_replace(vector(1), \"suite\", \"ariadne\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"metis\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"ananke\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"atlasbot\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"pegasus\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"soteria\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"titan_iac\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"bstein_home\", \"__name__\", \".*\") or label_replace(vector(1), \"suite\", \"data_prepper\", \"__name__\", \".*\"))))", "refId": "A", "legendFormat": "{{suite}}", "instant": true diff --git a/testing/quality_gate.py b/testing/quality_gate.py index 320d1466..dc5dd1e4 100644 --- a/testing/quality_gate.py +++ b/testing/quality_gate.py @@ -23,6 +23,7 @@ from testing.quality_coverage import ( from testing.quality_docs import run_check as run_docs_check from testing.quality_hygiene import ( count_files_over_line_limit, + count_files_with_line_limit, run_check as run_hygiene_check, ) @@ -366,6 +367,7 @@ def run_profile( "results": results, "manual_scripts": contract.get("manual_scripts", []), "workspace_line_coverage_percent": workspace_line_coverage_percent, + "source_files_total": count_files_with_line_limit(contract, root), "source_lines_over_500": count_files_over_line_limit(contract, root), } diff --git a/testing/quality_hygiene.py b/testing/quality_hygiene.py index 629f2096..5060ca02 100644 --- a/testing/quality_hygiene.py +++ b/testing/quality_hygiene.py @@ -51,3 +51,10 @@ def count_files_over_line_limit(contract: dict[str, Any], root: Path) -> int: if line_count > max_lines: count += 1 return count + + +def count_files_with_line_limit(contract: dict[str, Any], root: Path) -> int: + """Return the number of managed files included in the LOC cap.""" + + config = contract.get("hygiene", {}) + return len(_expand_globs(root, config.get("line_limit_globs", [])))