diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index c0e0960e..9c095e59 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -3426,15 +3426,25 @@ def build_jobs_dashboard(): f'/ clamp_min(sum by (suite) (max by (suite, check) (({{{checks_selector}}} > bool 0))), 1)) ' f'or on(suite) ({selected_suite_zero})' ) - success_history_runs = f'sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_selector}}}[$__interval]))' + success_history_runs = f'sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_selector}}}[7d]))' success_history_by_suite = ( - f'(100 * sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_success_selector}}}[$__interval])) ' + f'(100 * sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_success_selector}}}[7d])) ' f'/ ({success_history_runs})) and on(suite) (({success_history_runs}) > 0)' ) + daily_success_volume = ( + f'sum(increase(platform_quality_gate_runs_total{{{runs_success_selector}}}[24h])) or on() vector(0)' + ) + daily_failure_volume = ( + f'sum(increase(platform_quality_gate_runs_total{{{runs_failure_selector}}}[24h])) or on() vector(0)' + ) coverage_by_suite = ( f'(max by (suite) ({{{coverage_metric_selector}}})) ' f'or on(suite) (max by (suite) (platform_quality_gate_workspace_line_coverage_percent{{{workspace_coverage_selector}}}))' ) + coverage_history_by_suite = ( + f'(max by (suite) (platform_quality_gate_workspace_line_coverage_percent{{{workspace_coverage_selector}}})) ' + f'or on(suite) (max by (suite) ({{{coverage_metric_selector}}}))' + ) coverage_with_missing = ( f"({coverage_by_suite}) or on(suite) ((0 * (sum by (suite) (increase(platform_quality_gate_runs_total{{{runs_selector}}}[30d])))) - 1)" ) @@ -3452,25 +3462,9 @@ def build_jobs_dashboard(): 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})" - ) - coverage_loc_compliance_history = ( - "min by (suite) (" - f'label_replace(max_over_time(platform_quality_gate_workspace_line_coverage_percent{{{workspace_coverage_selector}}}[$__interval]), ' - '"dimension", "coverage", "__name__", ".*") ' - "or " - f'label_replace(({loc_limit_compliance_history}), "dimension", "loc", "__name__", ".*")' - ")" + f"({loc_limit_compliance_by_suite}) " + f"or on(suite) (100 * (1 - clamp_max(({smell_by_suite}), 1)))" ) 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))' @@ -3626,6 +3620,47 @@ def build_jobs_dashboard(): ], } + def _state_timeline_panel( + panel_id: int, + title: str, + expr: str, + grid: dict, + *, + description: str, + thresholds: dict, + ) -> dict: + panel = { + "id": panel_id, + "type": "state-timeline", + "title": title, + "description": description, + "datasource": PROM_DS, + "gridPos": grid, + "targets": [{"expr": expr, "refId": "A", "legendFormat": "{{suite}}"}], + "fieldConfig": { + "defaults": { + "color": {"mode": "thresholds"}, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": thresholds, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": True, + }, + }, + "overrides": [], + }, + "options": { + "mergeValues": True, + "showValue": "never", + "legend": {"displayMode": "list", "placement": "bottom"}, + "tooltip": {"mode": "single", "sort": "none"}, + }, + } + return panel + panels.append( stat_panel( 2, @@ -3737,81 +3772,73 @@ def build_jobs_dashboard(): {"type": "value", "options": {"-1": {"text": "no runs"}}} ] panels.append(reliability_suite_panel) - history_panel = timeseries_panel( + history_panel = _state_timeline_panel( 11, - "Run Reliability History by Suite", + "Run Reliability by Suite (7d rolling)", success_history_by_suite, {"h": 8, "w": 24, "x": 0, "y": 13}, - unit="percent", - legend="{{suite}}", - legend_display="list", - legend_placement="bottom", + thresholds=success_thresholds, + description=( + "Seven-day rolling run success rate per suite. Each suite gets its own lane, " + "so brief failed/debug runs lower the lane color without creating unreadable 0/100 spikes." + ), ) - history_panel["fieldConfig"]["defaults"]["min"] = 0 - history_panel["fieldConfig"]["defaults"]["max"] = 100 - history_panel["fieldConfig"]["defaults"]["custom"] = { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 8, - "showPoints": "always", - "pointSize": 3, - "spanNulls": True, - } panels.append(history_panel) - panels.append( - timeseries_panel( - 12, - "Run Outcomes (Selected Scope)", - None, - {"h": 8, "w": 8, "x": 0, "y": 21}, - unit="none", - targets=[ - { - "refId": "A", - "expr": f'sum(increase(platform_quality_gate_runs_total{{{runs_success_selector}}}[$__interval])) or on() vector(0)', - "legendFormat": "Success", - }, - { - "refId": "B", - "expr": f'sum(increase(platform_quality_gate_runs_total{{{runs_failure_selector}}}[$__interval])) or on() vector(0)', - "legendFormat": "Failure", - }, - ], - legend_display="list", - legend_placement="bottom", - legend_calcs=[], - ) + run_volume_panel = timeseries_panel( + 12, + "Daily Run Volume (Selected Scope)", + None, + {"h": 8, "w": 8, "x": 0, "y": 21}, + unit="none", + targets=[ + {"refId": "A", "expr": daily_success_volume, "legendFormat": "Success"}, + {"refId": "B", "expr": daily_failure_volume, "legendFormat": "Failure"}, + ], + legend_display="list", + legend_placement="bottom", + legend_calcs=[], ) + run_volume_panel["description"] = ( + "Twenty-four-hour rolling run counts for the selected suite/branch scope. " + "This is volume, not a pass-rate percentage." + ) + run_volume_panel["fieldConfig"]["defaults"]["min"] = 0 + run_volume_panel["fieldConfig"]["defaults"]["custom"] = { + "drawStyle": "bars", + "barAlignment": 0, + "lineWidth": 0, + "fillOpacity": 70, + "stacking": {"mode": "normal", "group": "A"}, + } + panels.append(run_volume_panel) + panels.append( - timeseries_panel( + _state_timeline_panel( 13, - "Coverage & LOC Compliance History", - None, + "Coverage History by Suite", + coverage_history_by_suite, {"h": 8, "w": 8, "x": 8, "y": 21}, - unit="percent", - targets=[ - { - "refId": "A", - "expr": coverage_loc_compliance_history, - "legendFormat": "{{suite}}", - }, - ], - legend_display="list", - legend_placement="bottom", - legend_calcs=[], + thresholds=coverage_thresholds, + description=( + "Latest reported line coverage per suite over time. Coverage is separate " + "from LOC compliance so one signal cannot hide the other." + ), ) ) - run_mix_panel = pie_panel( - 14, - "Run Status Mix (30d)", - f'sum by (status) (increase(platform_quality_gate_runs_total{{{runs_selector}}}[30d]))', - {"h": 8, "w": 8, "x": 16, "y": 21}, + panels.append( + _state_timeline_panel( + 14, + "Files <=500 LOC History by Suite", + loc_limit_compliance_history, + {"h": 8, "w": 8, "x": 16, "y": 21}, + thresholds=success_thresholds, + description=( + "Percent of LOC-gated source files at or under the 500-line limit. " + "This uses the existing file-count telemetry; longest-file history needs a new publisher metric." + ), + ) ) - run_mix_panel["targets"][0]["legendFormat"] = "{{status}}" - run_mix_panel["fieldConfig"]["defaults"]["unit"] = "none" - panels.append(run_mix_panel) check_dimensions = [ ("Tests", check_regex_tests), diff --git a/scripts/tests/test_dashboards_render_atlas.py b/scripts/tests/test_dashboards_render_atlas.py index 5ab27a2a..b8b71ef3 100644 --- a/scripts/tests/test_dashboards_render_atlas.py +++ b/scripts/tests/test_dashboards_render_atlas.py @@ -97,7 +97,13 @@ def test_jobs_dashboard_separates_current_gate_health_from_reliability(): assert "Current Gate Health by Suite" in panels_by_title assert "Run Reliability by Suite (24h)" in panels_by_title - assert "Run Reliability History by Suite" in panels_by_title + assert "Run Reliability by Suite (7d rolling)" in panels_by_title + assert "Daily Run Volume (Selected Scope)" in panels_by_title + assert "Coverage History by Suite" in panels_by_title + assert "Files <=500 LOC History by Suite" in panels_by_title + assert "Run Reliability History by Suite" not in panels_by_title + assert "Coverage & LOC Compliance History" not in panels_by_title + assert "Run Status Mix (30d)" not in panels_by_title assert "Failures by Suite (24h)" not in panels_by_title assert "Success Rate by Suite (24h)" not in panels_by_title @@ -114,6 +120,20 @@ def test_jobs_dashboard_separates_current_gate_health_from_reliability(): {"type": "value", "options": {"-1": {"text": "no runs"}}} ] + rolling_panel = panels_by_title["Run Reliability by Suite (7d rolling)"] + assert rolling_panel["type"] == "state-timeline" + assert "[7d]" in rolling_panel["targets"][0]["expr"] + + coverage_panel = panels_by_title["Coverage History by Suite"] + loc_panel = panels_by_title["Files <=500 LOC History by Suite"] + assert coverage_panel["type"] == "state-timeline" + assert loc_panel["type"] == "state-timeline" + assert coverage_panel["targets"][0]["expr"] != loc_panel["targets"][0]["expr"] + + run_volume_panel = panels_by_title["Daily Run Volume (Selected Scope)"] + assert run_volume_panel["fieldConfig"]["defaults"]["custom"]["drawStyle"] == "bars" + assert "[$__interval]" not in run_volume_panel["targets"][0]["expr"] + def test_jobs_dashboard_bar_gauges_use_solid_threshold_colors(): mod = load_module() diff --git a/services/monitoring/dashboards/atlas-jobs.json b/services/monitoring/dashboards/atlas-jobs.json index dbe67191..4cf05596 100644 --- a/services/monitoring/dashboards/atlas-jobs.json +++ b/services/monitoring/dashboards/atlas-jobs.json @@ -804,8 +804,9 @@ "panels": [ { "id": 11, - "type": "timeseries", - "title": "Run Reliability History by Suite", + "type": "state-timeline", + "title": "Run Reliability by Suite (7d rolling)", + "description": "Seven-day rolling run success rate per suite. Each suite gets its own lane, so brief failed/debug runs lower the lane color without creating unreadable 0/100 spikes.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -818,42 +819,69 @@ }, "targets": [ { - "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0)", + "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[7d])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d]))) > 0)", "refId": "A", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "percent", "min": 0, "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, "custom": { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 8, - "showPoints": "always", - "pointSize": 3, + "fillOpacity": 70, + "lineWidth": 0, "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 12, "type": "timeseries", - "title": "Run Outcomes (Selected Scope)", + "title": "Daily Run Volume (Selected Scope)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -867,18 +895,29 @@ "targets": [ { "refId": "A", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Success" }, { "refId": "B", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Failure" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "none", + "min": 0, + "custom": { + "drawStyle": "bars", + "barAlignment": 0, + "lineWidth": 0, + "fillOpacity": 70, + "stacking": { + "mode": "normal", + "group": "A" + } + } }, "overrides": [] }, @@ -890,12 +929,14 @@ "tooltip": { "mode": "multi" } - } + }, + "description": "Twenty-four-hour rolling run counts for the selected suite/branch scope. This is volume, not a pass-rate percentage." }, { "id": 13, - "type": "timeseries", - "title": "Coverage & LOC Compliance History", + "type": "state-timeline", + "title": "Coverage History by Suite", + "description": "Latest reported line coverage per suite over time. Coverage is separate from LOC compliance so one signal cannot hide the other.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -908,31 +949,70 @@ }, "targets": [ { + "expr": "(max by (suite) (platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) (max by (suite) ({__name__=~\".*_quality_gate_coverage_percent\",suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))", "refId": "A", - "expr": "min by (suite) (label_replace(max_over_time(platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]), \"dimension\", \"coverage\", \"__name__\", \".*\") or label_replace(((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)))), \"dimension\", \"loc\", \"__name__\", \".*\"))", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "percent" + "color": { + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true + } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 14, - "type": "piechart", - "title": "Run Status Mix (30d)", + "type": "state-timeline", + "title": "Files <=500 LOC History by Suite", + "description": "Percent of LOC-gated source files at or under the 500-line limit. This uses the existing file-count telemetry; longest-file history needs a new publisher metric.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -945,38 +1025,62 @@ }, "targets": [ { - "expr": "sum by (status) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d]))", + "expr": "((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)))", "refId": "A", - "legendFormat": "{{status}}" + "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "none", "color": { - "mode": "palette-classic" + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", - "placement": "right" + "placement": "bottom" }, - "pieType": "pie", - "displayLabels": [], "tooltip": { - "mode": "single" - }, - "colorScheme": "interpolateSpectral", - "colorBy": "value", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "mode": "single", + "sort": "none" } } } diff --git a/services/monitoring/dashboards/atlas-testing.json b/services/monitoring/dashboards/atlas-testing.json index 4008032e..47939014 100644 --- a/services/monitoring/dashboards/atlas-testing.json +++ b/services/monitoring/dashboards/atlas-testing.json @@ -804,8 +804,9 @@ "panels": [ { "id": 11, - "type": "timeseries", - "title": "Run Reliability History by Suite", + "type": "state-timeline", + "title": "Run Reliability by Suite (7d rolling)", + "description": "Seven-day rolling run success rate per suite. Each suite gets its own lane, so brief failed/debug runs lower the lane color without creating unreadable 0/100 spikes.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -818,42 +819,69 @@ }, "targets": [ { - "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0)", + "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[7d])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d]))) > 0)", "refId": "A", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "percent", "min": 0, "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, "custom": { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 8, - "showPoints": "always", - "pointSize": 3, + "fillOpacity": 70, + "lineWidth": 0, "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 12, "type": "timeseries", - "title": "Run Outcomes (Selected Scope)", + "title": "Daily Run Volume (Selected Scope)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -867,18 +895,29 @@ "targets": [ { "refId": "A", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Success" }, { "refId": "B", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Failure" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "none", + "min": 0, + "custom": { + "drawStyle": "bars", + "barAlignment": 0, + "lineWidth": 0, + "fillOpacity": 70, + "stacking": { + "mode": "normal", + "group": "A" + } + } }, "overrides": [] }, @@ -890,12 +929,14 @@ "tooltip": { "mode": "multi" } - } + }, + "description": "Twenty-four-hour rolling run counts for the selected suite/branch scope. This is volume, not a pass-rate percentage." }, { "id": 13, - "type": "timeseries", - "title": "Coverage & LOC Compliance History", + "type": "state-timeline", + "title": "Coverage History by Suite", + "description": "Latest reported line coverage per suite over time. Coverage is separate from LOC compliance so one signal cannot hide the other.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -908,31 +949,70 @@ }, "targets": [ { + "expr": "(max by (suite) (platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) (max by (suite) ({__name__=~\".*_quality_gate_coverage_percent\",suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))", "refId": "A", - "expr": "min by (suite) (label_replace(max_over_time(platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]), \"dimension\", \"coverage\", \"__name__\", \".*\") or label_replace(((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)))), \"dimension\", \"loc\", \"__name__\", \".*\"))", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "percent" + "color": { + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true + } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 14, - "type": "piechart", - "title": "Run Status Mix (30d)", + "type": "state-timeline", + "title": "Files <=500 LOC History by Suite", + "description": "Percent of LOC-gated source files at or under the 500-line limit. This uses the existing file-count telemetry; longest-file history needs a new publisher metric.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -945,38 +1025,62 @@ }, "targets": [ { - "expr": "sum by (status) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d]))", + "expr": "((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)))", "refId": "A", - "legendFormat": "{{status}}" + "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "none", "color": { - "mode": "palette-classic" + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", - "placement": "right" + "placement": "bottom" }, - "pieType": "pie", - "displayLabels": [], "tooltip": { - "mode": "single" - }, - "colorScheme": "interpolateSpectral", - "colorBy": "value", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "mode": "single", + "sort": "none" } } } diff --git a/services/monitoring/grafana-dashboard-jobs.yaml b/services/monitoring/grafana-dashboard-jobs.yaml index 1a87c9a6..6bf593a0 100644 --- a/services/monitoring/grafana-dashboard-jobs.yaml +++ b/services/monitoring/grafana-dashboard-jobs.yaml @@ -813,8 +813,9 @@ data: "panels": [ { "id": 11, - "type": "timeseries", - "title": "Run Reliability History by Suite", + "type": "state-timeline", + "title": "Run Reliability by Suite (7d rolling)", + "description": "Seven-day rolling run success rate per suite. Each suite gets its own lane, so brief failed/debug runs lower the lane color without creating unreadable 0/100 spikes.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -827,42 +828,69 @@ data: }, "targets": [ { - "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0)", + "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[7d])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d]))) > 0)", "refId": "A", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "percent", "min": 0, "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, "custom": { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 8, - "showPoints": "always", - "pointSize": 3, + "fillOpacity": 70, + "lineWidth": 0, "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 12, "type": "timeseries", - "title": "Run Outcomes (Selected Scope)", + "title": "Daily Run Volume (Selected Scope)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -876,18 +904,29 @@ data: "targets": [ { "refId": "A", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Success" }, { "refId": "B", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Failure" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "none", + "min": 0, + "custom": { + "drawStyle": "bars", + "barAlignment": 0, + "lineWidth": 0, + "fillOpacity": 70, + "stacking": { + "mode": "normal", + "group": "A" + } + } }, "overrides": [] }, @@ -899,12 +938,14 @@ data: "tooltip": { "mode": "multi" } - } + }, + "description": "Twenty-four-hour rolling run counts for the selected suite/branch scope. This is volume, not a pass-rate percentage." }, { "id": 13, - "type": "timeseries", - "title": "Coverage & LOC Compliance History", + "type": "state-timeline", + "title": "Coverage History by Suite", + "description": "Latest reported line coverage per suite over time. Coverage is separate from LOC compliance so one signal cannot hide the other.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -917,31 +958,70 @@ data: }, "targets": [ { + "expr": "(max by (suite) (platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) (max by (suite) ({__name__=~\".*_quality_gate_coverage_percent\",suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))", "refId": "A", - "expr": "min by (suite) (label_replace(max_over_time(platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]), \"dimension\", \"coverage\", \"__name__\", \".*\") or label_replace(((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)))), \"dimension\", \"loc\", \"__name__\", \".*\"))", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "percent" + "color": { + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true + } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 14, - "type": "piechart", - "title": "Run Status Mix (30d)", + "type": "state-timeline", + "title": "Files <=500 LOC History by Suite", + "description": "Percent of LOC-gated source files at or under the 500-line limit. This uses the existing file-count telemetry; longest-file history needs a new publisher metric.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -954,38 +1034,62 @@ data: }, "targets": [ { - "expr": "sum by (status) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d]))", + "expr": "((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)))", "refId": "A", - "legendFormat": "{{status}}" + "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "none", "color": { - "mode": "palette-classic" + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", - "placement": "right" + "placement": "bottom" }, - "pieType": "pie", - "displayLabels": [], "tooltip": { - "mode": "single" - }, - "colorScheme": "interpolateSpectral", - "colorBy": "value", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "mode": "single", + "sort": "none" } } } diff --git a/services/monitoring/grafana-dashboard-testing.yaml b/services/monitoring/grafana-dashboard-testing.yaml index 84cf9ca7..9f4f1617 100644 --- a/services/monitoring/grafana-dashboard-testing.yaml +++ b/services/monitoring/grafana-dashboard-testing.yaml @@ -813,8 +813,9 @@ data: "panels": [ { "id": 11, - "type": "timeseries", - "title": "Run Reliability History by Suite", + "type": "state-timeline", + "title": "Run Reliability by Suite (7d rolling)", + "description": "Seven-day rolling run success rate per suite. Each suite gets its own lane, so brief failed/debug runs lower the lane color without creating unreadable 0/100 spikes.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -827,42 +828,69 @@ data: }, "targets": [ { - "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]))) > 0)", + "expr": "(100 * sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[7d])) / (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d])))) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[7d]))) > 0)", "refId": "A", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { + "color": { + "mode": "thresholds" + }, "unit": "percent", "min": 0, "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, "custom": { - "drawStyle": "line", - "lineInterpolation": "linear", - "lineWidth": 2, - "fillOpacity": 8, - "showPoints": "always", - "pointSize": 3, + "fillOpacity": 70, + "lineWidth": 0, "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 12, "type": "timeseries", - "title": "Run Outcomes (Selected Scope)", + "title": "Daily Run Volume (Selected Scope)", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -876,18 +904,29 @@ data: "targets": [ { "refId": "A", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status=~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Success" }, { "refId": "B", - "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[$__interval])) or on() vector(0)", + "expr": "sum(increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\",status!~\"ok|passed|success\"}[24h])) or on() vector(0)", "legendFormat": "Failure" } ], "fieldConfig": { "defaults": { - "unit": "none" + "unit": "none", + "min": 0, + "custom": { + "drawStyle": "bars", + "barAlignment": 0, + "lineWidth": 0, + "fillOpacity": 70, + "stacking": { + "mode": "normal", + "group": "A" + } + } }, "overrides": [] }, @@ -899,12 +938,14 @@ data: "tooltip": { "mode": "multi" } - } + }, + "description": "Twenty-four-hour rolling run counts for the selected suite/branch scope. This is volume, not a pass-rate percentage." }, { "id": 13, - "type": "timeseries", - "title": "Coverage & LOC Compliance History", + "type": "state-timeline", + "title": "Coverage History by Suite", + "description": "Latest reported line coverage per suite over time. Coverage is separate from LOC compliance so one signal cannot hide the other.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -917,31 +958,70 @@ data: }, "targets": [ { + "expr": "(max by (suite) (platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"})) or on(suite) (max by (suite) ({__name__=~\".*_quality_gate_coverage_percent\",suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}))", "refId": "A", - "expr": "min by (suite) (label_replace(max_over_time(platform_quality_gate_workspace_line_coverage_percent{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[$__interval]), \"dimension\", \"coverage\", \"__name__\", \".*\") or label_replace(((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)))), \"dimension\", \"loc\", \"__name__\", \".*\"))", "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "percent" + "color": { + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true + } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { - "mode": "multi" + "mode": "single", + "sort": "none" } } }, { "id": 14, - "type": "piechart", - "title": "Run Status Mix (30d)", + "type": "state-timeline", + "title": "Files <=500 LOC History by Suite", + "description": "Percent of LOC-gated source files at or under the 500-line limit. This uses the existing file-count telemetry; longest-file history needs a new publisher metric.", "datasource": { "type": "prometheus", "uid": "atlas-vm" @@ -954,38 +1034,62 @@ data: }, "targets": [ { - "expr": "sum by (status) (increase(platform_quality_gate_runs_total{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}[30d]))", + "expr": "((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)))", "refId": "A", - "legendFormat": "{{status}}" + "legendFormat": "{{suite}}" } ], "fieldConfig": { "defaults": { - "unit": "none", "color": { - "mode": "palette-classic" + "mode": "thresholds" + }, + "unit": "percent", + "min": 0, + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red", + "value": null + }, + { + "color": "dark-orange", + "value": 90 + }, + { + "color": "dark-yellow", + "value": 93 + }, + { + "color": "dark-green", + "value": 95 + }, + { + "color": "dark-blue", + "value": 100 + } + ] + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 0, + "spanNulls": true } }, "overrides": [] }, "options": { + "mergeValues": true, + "showValue": "never", "legend": { "displayMode": "list", - "placement": "right" + "placement": "bottom" }, - "pieType": "pie", - "displayLabels": [], "tooltip": { - "mode": "single" - }, - "colorScheme": "interpolateSpectral", - "colorBy": "value", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "mode": "single", + "sort": "none" } } }