From 202fefe896e821e8c20c08a916265d220e2d981c Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Mon, 21 Sep 2026 19:06:01 +0100 Subject: [PATCH 1/2] feat(telemetry): scale count units and drop meaningless decimals Panels whose unit counts whole things switch from a custom `suffix:` unit to `si:`, so a large value reads 15 k nodes/s instead of 15000 nodes/s. A custom suffix unit is formatted by toFixedUnit, which never scales; si: goes through SIPrefix and does. decimals is set to 0 on the same panels, because a fraction of a ledger or a node says nothing. The two settings need each other: on its own decimals 0 would round a slow rate down to zero, and si: shifts it to the milli step instead. Left alone: the one panel whose unit is a seconds-per-second ratio. 20 panels across 5 dashboards. --- .../grafana/dashboards/consensus-health.json | 21 ++++++++++++------- .../grafana/dashboards/ledger-operations.json | 3 ++- .../grafana/dashboards/peer-network.json | 6 ++++-- .../grafana/dashboards/rpc-performance.json | 9 +++++--- .../dashboards/transaction-overview.json | 21 ++++++++++++------- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/docker/telemetry/grafana/dashboards/consensus-health.json b/docker/telemetry/grafana/dashboards/consensus-health.json index 977c2fdcd7..1ae6303470 100644 --- a/docker/telemetry/grafana/dashboards/consensus-health.json +++ b/docker/telemetry/grafana/dashboards/consensus-health.json @@ -91,7 +91,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: proposals/s", + "unit": "si: proposals/s", + "decimals": 0, "custom": { "axisLabel": "Proposals / Sec", "spanNulls": 1800000, @@ -306,7 +307,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: closes/s", + "unit": "si: closes/s", + "decimals": 0, "custom": { "axisLabel": "Closes / Sec", "spanNulls": 1800000, @@ -357,7 +359,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: events/s", + "unit": "si: events/s", + "decimals": 0, "custom": { "axisLabel": "Events / Sec", "spanNulls": 1800000, @@ -408,7 +411,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: events/s", + "unit": "si: events/s", + "decimals": 0, "custom": { "axisLabel": "Events / Sec", "spanNulls": 1800000, @@ -820,7 +824,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: failures/s", + "unit": "si: failures/s", + "decimals": 0, "custom": { "axisLabel": "Failures / Sec", "spanNulls": 1800000, @@ -1024,7 +1029,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: checks/s", + "unit": "si: checks/s", + "decimals": 0, "custom": { "axisLabel": "Checks / Sec", "spanNulls": 1800000, @@ -1068,7 +1074,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: changes/s", + "unit": "si: changes/s", + "decimals": 0, "custom": { "axisLabel": "Changes / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/ledger-operations.json b/docker/telemetry/grafana/dashboards/ledger-operations.json index 216d07b608..199645ff3b 100644 --- a/docker/telemetry/grafana/dashboards/ledger-operations.json +++ b/docker/telemetry/grafana/dashboards/ledger-operations.json @@ -246,7 +246,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: transactions/s", + "unit": "si: transactions/s", + "decimals": 0, "custom": { "axisLabel": "Transactions / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/peer-network.json b/docker/telemetry/grafana/dashboards/peer-network.json index 4804111e1a..38e3cc2d4a 100644 --- a/docker/telemetry/grafana/dashboards/peer-network.json +++ b/docker/telemetry/grafana/dashboards/peer-network.json @@ -41,7 +41,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: proposals/s", + "unit": "si: proposals/s", + "decimals": 0, "custom": { "axisLabel": "Proposals / Sec", "spanNulls": 1800000, @@ -85,7 +86,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: validations/s", + "unit": "si: validations/s", + "decimals": 0, "custom": { "axisLabel": "Validations / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/rpc-performance.json b/docker/telemetry/grafana/dashboards/rpc-performance.json index 29720c8fe9..5125e9ac57 100644 --- a/docker/telemetry/grafana/dashboards/rpc-performance.json +++ b/docker/telemetry/grafana/dashboards/rpc-performance.json @@ -274,7 +274,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: commands/s", + "unit": "si: commands/s", + "decimals": 0, "custom": { "axisLabel": "Commands / Sec", "spanNulls": 1800000, @@ -387,7 +388,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: requests/s", + "unit": "si: requests/s", + "decimals": 0, "custom": { "axisLabel": "Requests / Sec", "spanNulls": 1800000, @@ -438,7 +440,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: requests/s", + "unit": "si: requests/s", + "decimals": 0, "custom": { "axisLabel": "Requests / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/transaction-overview.json b/docker/telemetry/grafana/dashboards/transaction-overview.json index 12fc795f63..8d6211580f 100644 --- a/docker/telemetry/grafana/dashboards/transaction-overview.json +++ b/docker/telemetry/grafana/dashboards/transaction-overview.json @@ -47,7 +47,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: transactions/s", + "unit": "si: transactions/s", + "decimals": 0, "custom": { "axisLabel": "Transactions / Sec", "spanNulls": 1800000, @@ -179,7 +180,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: transactions/s", + "unit": "si: transactions/s", + "decimals": 0, "custom": { "axisLabel": "Transactions / Sec", "spanNulls": 1800000, @@ -411,7 +413,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: transactions/s", + "unit": "si: transactions/s", + "decimals": 0, "custom": { "axisLabel": "Transactions / Sec", "spanNulls": 1800000, @@ -460,7 +463,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: transactions/s", + "unit": "si: transactions/s", + "decimals": 0, "custom": { "axisLabel": "Transactions / Sec", "spanNulls": 1800000, @@ -618,7 +622,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: enqueues/s", + "unit": "si: enqueues/s", + "decimals": 0, "custom": { "axisLabel": "Enqueues / Sec", "spanNulls": 1800000, @@ -713,7 +718,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: cleanups/s", + "unit": "si: cleanups/s", + "decimals": 0, "custom": { "axisLabel": "Cleanups / Sec", "spanNulls": 1800000, @@ -860,7 +866,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: failures/s", + "unit": "si: failures/s", + "decimals": 0, "custom": { "axisLabel": "Failures / Sec", "spanNulls": 1800000, From 5c8495e230149e1a45d32c8f7cc9ffb53c873416 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Mon, 21 Sep 2026 19:06:03 +0100 Subject: [PATCH 2/2] feat(telemetry): scale count units and drop meaningless decimals Panels whose unit counts whole things switch from a custom `suffix:` unit to `si:`, so a large value reads 15 k nodes/s instead of 15000 nodes/s. A custom suffix unit is formatted by toFixedUnit, which never scales; si: goes through SIPrefix and does. decimals is set to 0 on the same panels, because a fraction of a ledger or a node says nothing. The two settings need each other: on its own decimals 0 would round a slow rate down to zero, and si: shifts it to the milli step instead. Left alone: the one panel whose unit is a seconds-per-second ratio. 26 panels across 9 dashboards, plus 3 legends and one name placement. --- .../grafana/dashboards/consensus-health.json | 3 ++- .../grafana/dashboards/ledger-data-sync.json | 22 ++++++++++++------- .../grafana/dashboards/ledger-operations.json | 9 +++++--- .../grafana/dashboards/network-traffic.json | 12 ++++++---- .../grafana/dashboards/node-health.json | 6 +++-- .../dashboards/overlay-traffic-detail.json | 9 +++++--- .../grafana/dashboards/rpc-pathfinding.json | 15 ++++++++----- .../grafana/dashboards/rpc-performance.json | 3 ++- .../dashboards/transaction-overview.json | 3 ++- 9 files changed, 54 insertions(+), 28 deletions(-) diff --git a/docker/telemetry/grafana/dashboards/consensus-health.json b/docker/telemetry/grafana/dashboards/consensus-health.json index 80646b94ee..f6a3d21dc3 100644 --- a/docker/telemetry/grafana/dashboards/consensus-health.json +++ b/docker/telemetry/grafana/dashboards/consensus-health.json @@ -119,7 +119,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: validations/s" + "unit": "si: validations/s", + "decimals": 0 }, "overrides": [] }, diff --git a/docker/telemetry/grafana/dashboards/ledger-data-sync.json b/docker/telemetry/grafana/dashboards/ledger-data-sync.json index 0d32621d9d..204f9c1b96 100644 --- a/docker/telemetry/grafana/dashboards/ledger-data-sync.json +++ b/docker/telemetry/grafana/dashboards/ledger-data-sync.json @@ -26,7 +26,7 @@ "sort": "desc" }, "displayMode": "gradient", - "namePlacement": "top", + "namePlacement": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": ["lastNotNull"], @@ -625,7 +625,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -679,7 +680,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -727,7 +729,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -787,7 +790,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -1128,7 +1132,7 @@ ], "fieldConfig": { "defaults": { - "displayName": "State ${__field.labels.xrpl_ident}", + "displayName": "${__field.labels.xrpl_ident}", "unit": "none", "custom": { "fillOpacity": 80, @@ -1243,7 +1247,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} ${__field.labels.xrpl_ident}", - "unit": "suffix: ledgers/s", + "unit": "si: ledgers/s", + "decimals": 0, "custom": { "axisLabel": "Ledgers / Sec & Fetches / Sec", "spanNulls": 1800000, @@ -1554,7 +1559,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} ${__field.labels.xrpl_ident}", - "unit": "suffix: reads/s", + "unit": "si: reads/s", + "decimals": 0, "custom": { "axisLabel": "Reads / Sec & Depth", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/ledger-operations.json b/docker/telemetry/grafana/dashboards/ledger-operations.json index 5797cbcc6b..89b2506313 100644 --- a/docker/telemetry/grafana/dashboards/ledger-operations.json +++ b/docker/telemetry/grafana/dashboards/ledger-operations.json @@ -49,7 +49,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: ledgers/s" + "unit": "si: ledgers/s", + "decimals": 0 }, "overrides": [] }, @@ -86,7 +87,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: ledgers/s" + "unit": "si: ledgers/s", + "decimals": 0 }, "overrides": [] }, @@ -364,7 +366,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: ledgers/s" + "unit": "si: ledgers/s", + "decimals": 0 }, "overrides": [] }, diff --git a/docker/telemetry/grafana/dashboards/network-traffic.json b/docker/telemetry/grafana/dashboards/network-traffic.json index 2e3d8e89eb..6e9dbc1a6d 100644 --- a/docker/telemetry/grafana/dashboards/network-traffic.json +++ b/docker/telemetry/grafana/dashboards/network-traffic.json @@ -218,7 +218,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -278,7 +279,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -344,7 +346,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -410,7 +413,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/node-health.json b/docker/telemetry/grafana/dashboards/node-health.json index 6501e82369..9102791961 100644 --- a/docker/telemetry/grafana/dashboards/node-health.json +++ b/docker/telemetry/grafana/dashboards/node-health.json @@ -140,7 +140,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: fetches/s" + "unit": "si: fetches/s", + "decimals": 0 }, "overrides": [] }, @@ -176,7 +177,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: mismatches/s", + "unit": "si: mismatches/s", + "decimals": 0, "thresholds": { "steps": [ { diff --git a/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json b/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json index 6ce38c9271..1fc334288b 100644 --- a/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json +++ b/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json @@ -71,7 +71,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, @@ -215,7 +216,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec & Bytes / Sec", "spanNulls": 1800000, @@ -364,7 +366,8 @@ "fieldConfig": { "defaults": { "displayName": "${__field.labels.series} [${__field.labels.service_instance_id} ${__field.labels.xrpl_branch} ${__field.labels.xrpl_node_role} ${__field.labels.xrpl_work_item}]", - "unit": "suffix: messages/s", + "unit": "si: messages/s", + "decimals": 0, "custom": { "axisLabel": "Messages / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/rpc-pathfinding.json b/docker/telemetry/grafana/dashboards/rpc-pathfinding.json index aa7cf2e579..da69f37df2 100644 --- a/docker/telemetry/grafana/dashboards/rpc-pathfinding.json +++ b/docker/telemetry/grafana/dashboards/rpc-pathfinding.json @@ -287,7 +287,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: warnings/s", + "unit": "si: warnings/s", + "decimals": 0, "thresholds": { "steps": [ { @@ -340,7 +341,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: drops/s", + "unit": "si: drops/s", + "decimals": 0, "thresholds": { "steps": [ { @@ -525,7 +527,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: calls/s", + "unit": "si: calls/s", + "decimals": 0, "custom": { "axisLabel": "Calls / Sec", "spanNulls": 1800000, @@ -623,7 +626,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: calls/s", + "unit": "si: calls/s", + "decimals": 0, "custom": { "axisLabel": "Calls / Sec", "spanNulls": 1800000, @@ -737,7 +741,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: operations/s", + "unit": "si: operations/s", + "decimals": 0, "custom": { "axisLabel": "Operations / Sec", "spanNulls": 1800000, diff --git a/docker/telemetry/grafana/dashboards/rpc-performance.json b/docker/telemetry/grafana/dashboards/rpc-performance.json index bb264b823d..8e19832dd0 100644 --- a/docker/telemetry/grafana/dashboards/rpc-performance.json +++ b/docker/telemetry/grafana/dashboards/rpc-performance.json @@ -126,7 +126,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: messages/s" + "unit": "si: messages/s", + "decimals": 0 }, "overrides": [] }, diff --git a/docker/telemetry/grafana/dashboards/transaction-overview.json b/docker/telemetry/grafana/dashboards/transaction-overview.json index 6c52b04c9c..7b61eb78d5 100644 --- a/docker/telemetry/grafana/dashboards/transaction-overview.json +++ b/docker/telemetry/grafana/dashboards/transaction-overview.json @@ -37,7 +37,8 @@ ], "fieldConfig": { "defaults": { - "unit": "suffix: transactions/s", + "unit": "si: transactions/s", + "decimals": 0, "thresholds": { "steps": [ {