From eeec8b72dc885950dd116d6dc2ad6574c1cbe6b1 Mon Sep 17 00:00:00 2001 From: jenkins Date: Wed, 5 Aug 2026 12:02:51 -0300 Subject: [PATCH] monitoring(network): organize Traefik traffic lanes --- scripts/dashboards_render_atlas.py | 18 ++-- scripts/tests/test_dashboards_render_atlas.py | 17 +++ .../monitoring/dashboards/atlas-network.json | 102 ++++++++++++++---- .../monitoring/grafana-dashboard-network.yaml | 102 ++++++++++++++---- 4 files changed, 189 insertions(+), 50 deletions(-) diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index 4be4f6b0c..e6384f591 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -3786,28 +3786,34 @@ def build_network_dashboard(): transformations=[{"id": "labelsToFields", "options": {}}], ) ) + traffic_thresholds = { + "mode": "absolute", + "steps": [{"color": "blue", "value": None}], + } panels.append( - timeseries_panel( + bargauge_panel( 11, "Traefik Routers (req/s)", f"topk(10, {TRAEFIK_ROUTER_EXPR})", {"h": 9, "w": 12, "x": 0, "y": 25}, unit="req/s", legend="{{router}}", - legend_display="table", - legend_placement="right", + instant=True, + thresholds=traffic_thresholds, + description="Current five-minute request rate, with one vertically aligned lane per router.", ) ) panels.append( - timeseries_panel( + bargauge_panel( 12, "Traefik Entrypoints (req/s)", 'sum by (entrypoint) (rate(traefik_entrypoint_requests_total[5m]))', {"h": 9, "w": 12, "x": 12, "y": 25}, unit="req/s", legend="{{entrypoint}}", - legend_display="table", - legend_placement="right", + instant=True, + thresholds=traffic_thresholds, + description="Current five-minute request rate, with one vertically aligned lane per entrypoint.", ) ) return { diff --git a/scripts/tests/test_dashboards_render_atlas.py b/scripts/tests/test_dashboards_render_atlas.py index 4fdb10712..ce3f4b0b2 100644 --- a/scripts/tests/test_dashboards_render_atlas.py +++ b/scripts/tests/test_dashboards_render_atlas.py @@ -52,6 +52,23 @@ def test_node_filter_and_expr_helpers(): assert "node_memory_MemAvailable_bytes" in mem_expr +def test_network_routes_render_as_vertical_lanes(): + mod = load_module() + dashboard = mod.build_network_dashboard() + panels_by_title = {panel["title"]: panel for panel in dashboard["panels"]} + + for title, label in ( + ("Traefik Routers (req/s)", "{{router}}"), + ("Traefik Entrypoints (req/s)", "{{entrypoint}}"), + ): + panel = panels_by_title[title] + assert panel["type"] == "bargauge" + assert panel["options"]["orientation"] == "horizontal" + assert panel["targets"][0]["instant"] is True + assert panel["targets"][0]["legendFormat"] == label + assert "one vertically aligned lane" in panel["description"] + + def test_overview_availability_panel_uses_recorded_365d_rollup(): mod = load_module() dashboard = mod.build_overview() diff --git a/services/monitoring/dashboards/atlas-network.json b/services/monitoring/dashboards/atlas-network.json index 90ccaa6cc..c66920c1b 100644 --- a/services/monitoring/dashboards/atlas-network.json +++ b/services/monitoring/dashboards/atlas-network.json @@ -579,7 +579,7 @@ }, { "id": 11, - "type": "timeseries", + "type": "bargauge", "title": "Traefik Routers (req/s)", "datasource": { "type": "prometheus", @@ -593,30 +593,59 @@ }, "targets": [ { - "expr": "topk(10, sum by (router) (rate(traefik_router_requests_total[5m])))", + "expr": "sort_desc(topk(10, sum by (router) (rate(traefik_router_requests_total[5m]))))", "refId": "A", - "legendFormat": "{{router}}" + "legendFormat": "{{router}}", + "instant": true } ], "fieldConfig": { "defaults": { - "unit": "req/s" + "color": { + "mode": "thresholds" + }, + "unit": "req/s", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-blue", + "value": null + } + ] + } }, "overrides": [] }, "options": { - "legend": { - "displayMode": "table", - "placement": "right" - }, - "tooltip": { - "mode": "multi" + "displayMode": "basic", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false } - } + }, + "description": "Current five-minute request rate, with one vertically aligned lane per router.", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] }, { "id": 12, - "type": "timeseries", + "type": "bargauge", "title": "Traefik Entrypoints (req/s)", "datasource": { "type": "prometheus", @@ -630,26 +659,55 @@ }, "targets": [ { - "expr": "sum by (entrypoint) (rate(traefik_entrypoint_requests_total[5m]))", + "expr": "sort_desc(sum by (entrypoint) (rate(traefik_entrypoint_requests_total[5m])))", "refId": "A", - "legendFormat": "{{entrypoint}}" + "legendFormat": "{{entrypoint}}", + "instant": true } ], "fieldConfig": { "defaults": { - "unit": "req/s" + "color": { + "mode": "thresholds" + }, + "unit": "req/s", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-blue", + "value": null + } + ] + } }, "overrides": [] }, "options": { - "legend": { - "displayMode": "table", - "placement": "right" - }, - "tooltip": { - "mode": "multi" + "displayMode": "basic", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false } - } + }, + "description": "Current five-minute request rate, with one vertically aligned lane per entrypoint.", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] } ], "time": { diff --git a/services/monitoring/grafana-dashboard-network.yaml b/services/monitoring/grafana-dashboard-network.yaml index c3faad4b8..d9e723246 100644 --- a/services/monitoring/grafana-dashboard-network.yaml +++ b/services/monitoring/grafana-dashboard-network.yaml @@ -588,7 +588,7 @@ data: }, { "id": 11, - "type": "timeseries", + "type": "bargauge", "title": "Traefik Routers (req/s)", "datasource": { "type": "prometheus", @@ -602,30 +602,59 @@ data: }, "targets": [ { - "expr": "topk(10, sum by (router) (rate(traefik_router_requests_total[5m])))", + "expr": "sort_desc(topk(10, sum by (router) (rate(traefik_router_requests_total[5m]))))", "refId": "A", - "legendFormat": "{{router}}" + "legendFormat": "{{router}}", + "instant": true } ], "fieldConfig": { "defaults": { - "unit": "req/s" + "color": { + "mode": "thresholds" + }, + "unit": "req/s", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-blue", + "value": null + } + ] + } }, "overrides": [] }, "options": { - "legend": { - "displayMode": "table", - "placement": "right" - }, - "tooltip": { - "mode": "multi" + "displayMode": "basic", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false } - } + }, + "description": "Current five-minute request rate, with one vertically aligned lane per router.", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] }, { "id": 12, - "type": "timeseries", + "type": "bargauge", "title": "Traefik Entrypoints (req/s)", "datasource": { "type": "prometheus", @@ -639,26 +668,55 @@ data: }, "targets": [ { - "expr": "sum by (entrypoint) (rate(traefik_entrypoint_requests_total[5m]))", + "expr": "sort_desc(sum by (entrypoint) (rate(traefik_entrypoint_requests_total[5m])))", "refId": "A", - "legendFormat": "{{entrypoint}}" + "legendFormat": "{{entrypoint}}", + "instant": true } ], "fieldConfig": { "defaults": { - "unit": "req/s" + "color": { + "mode": "thresholds" + }, + "unit": "req/s", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-blue", + "value": null + } + ] + } }, "overrides": [] }, "options": { - "legend": { - "displayMode": "table", - "placement": "right" - }, - "tooltip": { - "mode": "multi" + "displayMode": "basic", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false } - } + }, + "description": "Current five-minute request rate, with one vertically aligned lane per entrypoint.", + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] } ], "time": {