diff --git a/docker/telemetry/grafana/dashboards/consensus-health.json b/docker/telemetry/grafana/dashboards/consensus-health.json index 78fcc21d55..0c127ddcb3 100644 --- a/docker/telemetry/grafana/dashboards/consensus-health.json +++ b/docker/telemetry/grafana/dashboards/consensus-health.json @@ -8,6 +8,19 @@ "id": null, "links": [], "panels": [ + { + "title": "Consensus Rounds", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "collapsed": false, + "panels": [], + "id": 1 + }, { "title": "Consensus Round Duration", "description": "**What:** Time to process an accepted ledger, from the moment consensus is reached through applying the transaction set and finalising state.\n**How it's computed:** 95th and 50th percentile of per-round durations over a 5-minute window, per node.\n**Reading it:** Flat p50 with a modest p95 gap is normal; both track network transaction load.\n**Healthy range:** Roughly 3-6 seconds on mainnet.\n**Watch for:** A rising p95 that pulls away from p50 means occasional slow rounds; sustained growth precedes ledger-age alarms.\n**Source:** src/xrpld/app/consensus/RCLConsensus.cpp:RCLConsensus::Adaptor::makeAcceptSpan", @@ -16,7 +29,7 @@ "h": 8, "w": 12, "x": 0, - "y": 0 + "y": 1 }, "options": { "tooltip": { @@ -51,11 +64,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 2 + }, + { + "title": "Proposals & Validations", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "collapsed": false, + "panels": [], + "id": 3 }, { "title": "Consensus Proposals Sent Rate", @@ -64,8 +94,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 0 + "x": 0, + "y": 10 }, "options": { "tooltip": { @@ -92,11 +122,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 4 }, { "title": "Ledger Close Duration", @@ -105,8 +139,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 8 + "x": 12, + "y": 10 }, "options": { "tooltip": { @@ -133,21 +167,25 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 5 }, { - "title": "Validation Send Rate", + "title": "Validation Send Rate [$xrpl_network_type]", "description": "**What:** How often this node issues a validation confirming it has fully validated a ledger.\n**How it's computed:** Per-second rate over a 5-minute window, per node.\n**Reading it:** Should closely track the ledger close rate on a healthy validator.\n**Healthy range:** About one per ledger (~0.25/s on mainnet).\n**Watch for:** Validations lagging closes suggests the node is falling behind on validation.\n**Source:** src/xrpld/app/consensus/RCLConsensus.cpp:RCLConsensus::Adaptor::createValidationSpan", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, - "x": 12, - "y": 8 + "x": 0, + "y": 18 }, "options": { "tooltip": { @@ -170,7 +208,11 @@ "unit": "suffix: validations/s" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 6 }, { "title": "Ledger Apply Duration (doAccept)", @@ -180,7 +222,7 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 22 }, "targets": [ { @@ -215,11 +257,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 7 }, { "title": "Close Time Agreement", @@ -229,7 +275,7 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 22 }, "targets": [ { @@ -256,11 +302,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 8 }, { "title": "Consensus Mode Over Time", @@ -270,7 +320,7 @@ "h": 8, "w": 12, "x": 0, - "y": 24 + "y": 30 }, "options": { "tooltip": { @@ -297,11 +347,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 9 }, { "title": "Accept vs Close Rate", @@ -311,7 +365,7 @@ "h": 8, "w": 12, "x": 12, - "y": 24 + "y": 30 }, "options": { "tooltip": { @@ -346,11 +400,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 10 }, { "title": "Validation vs Close Rate", @@ -360,7 +418,7 @@ "h": 8, "w": 12, "x": 0, - "y": 32 + "y": 38 }, "options": { "tooltip": { @@ -395,11 +453,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 11 }, { "title": "Consensus Accept Duration Heatmap", @@ -409,7 +471,7 @@ "h": 8, "w": 12, "x": 12, - "y": 32 + "y": 38 }, "options": { "tooltip": { @@ -440,7 +502,21 @@ "spanNulls": 1800000 } } - } + }, + "id": 12 + }, + { + "title": "Close Time Analysis", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "collapsed": false, + "panels": [], + "id": 13 }, { "title": "Close Time: Raw Proposals (Per Node)", @@ -450,7 +526,7 @@ "h": 8, "w": 12, "x": 0, - "y": 40 + "y": 47 }, "fieldConfig": { "defaults": { @@ -458,8 +534,11 @@ "custom": { "spanNulls": 1800000, "drawStyle": "points", - "pointSize": 6, - "showPoints": "always" + "pointSize": 5, + "showPoints": "always", + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -485,7 +564,8 @@ "query": "{name=\"consensus.accept.apply\" && resource.service.instance.id=~\"$node\" && span.close_time_correct=~\"$close_time_correct\"} | select(span.close_time_self)", "refId": "A" } - ] + ], + "id": 14 }, { "title": "Close Time: Effective / Quantized", @@ -495,7 +575,7 @@ "h": 8, "w": 12, "x": 12, - "y": 40 + "y": 47 }, "fieldConfig": { "defaults": { @@ -503,8 +583,11 @@ "custom": { "spanNulls": 1800000, "drawStyle": "points", - "pointSize": 6, - "showPoints": "always" + "pointSize": 5, + "showPoints": "always", + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -530,7 +613,8 @@ "query": "{name=\"consensus.accept.apply\" && resource.service.instance.id=~\"$node\" && span.close_time_correct=~\"$close_time_correct\"} | select(span.close_time)", "refId": "A" } - ] + ], + "id": 15 }, { "title": "Close Time Vote Bins & Resolution", @@ -540,7 +624,7 @@ "h": 8, "w": 12, "x": 0, - "y": 48 + "y": 55 }, "fieldConfig": { "defaults": { @@ -549,7 +633,10 @@ "drawStyle": "line", "lineInterpolation": "stepAfter", "pointSize": 5, - "showPoints": "auto" + "showPoints": "auto", + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [ @@ -616,7 +703,8 @@ "query": "{name=\"consensus.accept.apply\" && resource.service.instance.id=~\"$node\" && span.close_time_correct=~\"$close_time_correct\"} | select(span.close_resolution_ms)", "refId": "B" } - ] + ], + "id": 16 }, { "title": "Close Time Resolution Direction", @@ -626,16 +714,18 @@ "h": 8, "w": 12, "x": 12, - "y": 48 + "y": 55 }, "fieldConfig": { "defaults": { "custom": { "spanNulls": 1800000, "drawStyle": "bars", - "fillOpacity": 40, + "fillOpacity": 0, "pointSize": 5, - "showPoints": "auto" + "showPoints": "auto", + "lineWidth": 1, + "gradientMode": "none" } }, "overrides": [] @@ -661,7 +751,8 @@ "query": "{name=\"consensus.accept.apply\" && resource.service.instance.id=~\"$node\" && span.close_time_correct=~\"$close_time_correct\" && span.resolution_direction=~\"$resolution_direction\"} | select(span.resolution_direction)", "refId": "A" } - ] + ], + "id": 17 }, { "title": "Close Time Bin Distribution", @@ -669,9 +760,9 @@ "type": "barchart", "gridPos": { "h": 8, - "w": 24, + "w": 12, "x": 0, - "y": 56 + "y": 63 }, "fieldConfig": { "defaults": { @@ -707,7 +798,21 @@ "query": "{name=\"consensus.accept.apply\" && resource.service.instance.id=~\"$node\" && span.close_time_correct=~\"$close_time_correct\"} | select(span.close_time, span.close_time_vote_bins)", "refId": "A" } - ] + ], + "id": 18 + }, + { + "title": "Outcomes & Failures", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 71 + }, + "collapsed": false, + "panels": [], + "id": 19 }, { "title": "Consensus Outcome Distribution", @@ -715,9 +820,9 @@ "type": "piechart", "gridPos": { "h": 8, - "w": 8, + "w": 24, "x": 0, - "y": 64 + "y": 72 }, "options": { "legend": { @@ -744,7 +849,8 @@ "unit": "short" }, "overrides": [] - } + }, + "id": 20 }, { "title": "Consensus Failures Over Time", @@ -752,9 +858,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 16, - "x": 8, - "y": 64 + "w": 12, + "x": 0, + "y": 80 }, "options": { "tooltip": { @@ -789,11 +895,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 21 }, { "title": "Consensus Round Duration (Full Round)", @@ -802,8 +912,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 72 + "x": 12, + "y": 80 }, "options": { "tooltip": { @@ -838,11 +948,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 22 }, { "title": "Consensus Phase Duration (Open vs Establish)", @@ -851,8 +965,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 72 + "x": 0, + "y": 88 }, "options": { "tooltip": { @@ -887,11 +1001,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 23 + }, + { + "title": "Timing", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 96 + }, + "collapsed": false, + "panels": [], + "id": 24 }, { "title": "Position Update Duration", @@ -901,7 +1032,7 @@ "h": 8, "w": 12, "x": 0, - "y": 80 + "y": 97 }, "options": { "tooltip": { @@ -936,11 +1067,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 25 }, { "title": "Consensus Stall Rate", @@ -950,7 +1085,7 @@ "h": 8, "w": 12, "x": 12, - "y": 80 + "y": 97 }, "options": { "tooltip": { @@ -985,11 +1120,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 26 }, { "title": "Consensus Mode-Change Rate by Target Mode", @@ -997,9 +1136,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 24, + "w": 12, "x": 0, - "y": 88 + "y": 105 }, "options": { "tooltip": { @@ -1026,11 +1165,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 27 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/ledger-data-sync.json b/docker/telemetry/grafana/dashboards/ledger-data-sync.json index 5f02984c72..3532137aef 100644 --- a/docker/telemetry/grafana/dashboards/ledger-data-sync.json +++ b/docker/telemetry/grafana/dashboards/ledger-data-sync.json @@ -49,7 +49,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -108,7 +111,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -155,7 +161,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -202,7 +211,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -261,7 +273,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -308,7 +323,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -355,7 +373,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -414,7 +435,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -461,7 +485,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -502,7 +529,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -549,7 +579,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -590,7 +623,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -643,7 +679,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -720,7 +759,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -728,12 +770,12 @@ "id": 14 }, { - "title": "Overlay Traffic Heatmap (All Categories, Bytes In)", + "title": "Overlay Traffic Heatmap (All Categories, Bytes In) [$xrpl_network_type]", "description": "###### What this is:\n*All overlay traffic categories ranked by inbound bytes, giving an at-a-glance view of which message types consume the most receive bandwidth.*\n\n###### How it's computed:\n*Top categories by latest inbound byte value across all traffic categories. Each bar is labelled with its traffic category followed by the node identity; the shared `_bytes_in` suffix is dropped from the category name because the panel already reports inbound bytes.*\n\n###### Reading it:\n*The longest bars are the biggest bandwidth consumers; on a synced node transactions, proposals, and validations usually lead.*\n\n###### Healthy range:\n*workload-dependent.*\n\n###### Watch for:\n*A single ledger-data or fetch category dominating (ongoing sync) or an unexpected category topping the list.*\n\n###### Source:\n[OverlayImpl.cpp](https://github.com/XRPLF/rippled/blob/develop/src/xrpld/overlay/detail/OverlayImpl.cpp)\n\n###### Function:\n`OverlayImpl ctor (TrafficGauges)`", "type": "bargauge", "gridPos": { - "h": 18, - "w": 24, + "h": 4, + "w": 12, "x": 0, "y": 56 }, @@ -783,7 +825,10 @@ }, "overrides": [] }, - "id": 15 + "id": 15, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2 }, { "title": "Sync Diagnostics", @@ -793,7 +838,7 @@ "h": 1, "w": 24, "x": 0, - "y": 74 + "y": 60 }, "id": 16, "panels": [] @@ -806,7 +851,7 @@ "h": 8, "w": 12, "x": 0, - "y": 75 + "y": 61 }, "options": { "tooltip": { @@ -833,7 +878,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" }, "mappings": [ { @@ -928,7 +976,7 @@ "h": 8, "w": 12, "x": 12, - "y": 75 + "y": 61 }, "options": { "tooltip": { @@ -962,7 +1010,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] @@ -970,14 +1021,14 @@ "id": 18 }, { - "title": "Time Spent Per State", + "title": "Time Spent Per State [$xrpl_network_type]", "description": "###### What this is:\n*Operating mode as a colour-coded timeline. Each band's width is the time spent in that state, so short-lived states show as thin slivers instead of vanishing.*\n\n###### How it's computed:\n*server_info{metric=\"server_state\"} (gauge), the raw OperatingMode 0-4. Uses server_state rather than state_value because state_value folds 5 and 6 onto FULL, which would split one Full band into three colours.*\n\n###### Reading it:\n*One green band across the window = healthy. Red/orange/yellow bands show when and for how long the node was degraded.*\n\n###### Healthy range:\n*Continuously green (Full), brief orange/yellow/blue only after a restart.*\n\n###### Watch for:\n*Repeated thin bands = the node is oscillating. This is sampled every 10s, so a state shorter than one sample can still be missed.*\n\n###### Source:\n[app/misc/NetworkOPs.cpp](https://github.com/XRPLF/rippled/blob/develop/src/xrpld/app/misc/NetworkOPs.cpp)\n\n###### Function:\n`NetworkOPsImp::setMode`", "type": "state-timeline", "gridPos": { - "h": 6, - "w": 24, + "h": 8, + "w": 12, "x": 0, - "y": 83 + "y": 69 }, "options": { "mergeValues": true, @@ -1080,7 +1131,10 @@ }, "overrides": [] }, - "id": 27 + "id": 19, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2 }, { "title": "Ledger Close Rate", @@ -1089,8 +1143,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 89 + "x": 12, + "y": 69 }, "options": { "tooltip": { @@ -1124,7 +1178,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [ @@ -1146,7 +1203,7 @@ } ] }, - "id": 19 + "id": 20 }, { "title": "Job Queue Wait p95 By Type", @@ -1155,8 +1212,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 89 + "x": 0, + "y": 77 }, "options": { "tooltip": { @@ -1218,12 +1275,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] }, - "id": 20 + "id": 21 }, { "title": "NuDB Read Latency", @@ -1232,8 +1292,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 97 + "x": 12, + "y": 77 }, "options": { "tooltip": { @@ -1260,12 +1320,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] }, - "id": 21 + "id": 22 }, { "title": "I/O Scheduler Latency p95", @@ -1274,8 +1337,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 97 + "x": 0, + "y": 85 }, "options": { "tooltip": { @@ -1302,12 +1365,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] }, - "id": 22 + "id": 23 }, { "title": "NuDB Read Found Ratio", @@ -1316,8 +1382,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 105 + "x": 12, + "y": 85 }, "options": { "tooltip": { @@ -1344,12 +1410,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] }, - "id": 23 + "id": 24 }, { "title": "NuDB Read Pressure", @@ -1358,8 +1427,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 105 + "x": 0, + "y": 93 }, "options": { "tooltip": { @@ -1400,7 +1469,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [ @@ -1438,7 +1510,7 @@ } ] }, - "id": 24 + "id": 25 }, { "title": "Job Queue Depth", @@ -1447,8 +1519,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 113 + "x": 12, + "y": 93 }, "options": { "tooltip": { @@ -1475,12 +1547,16 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 - } + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" + }, + "decimals": 0 }, "overrides": [] }, - "id": 25 + "id": 26 }, { "title": "Load Factor & Peers", @@ -1489,8 +1565,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 113 + "x": 0, + "y": 101 }, "options": { "tooltip": { @@ -1531,12 +1607,16 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 - } + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" + }, + "decimals": 0 }, "overrides": [] }, - "id": 26 + "id": 27 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/ledger-operations.json b/docker/telemetry/grafana/dashboards/ledger-operations.json index 281731ad2a..4c04a97c66 100644 --- a/docker/telemetry/grafana/dashboards/ledger-operations.json +++ b/docker/telemetry/grafana/dashboards/ledger-operations.json @@ -9,14 +9,27 @@ "links": [], "panels": [ { - "title": "Ledger Build Rate", + "title": "Ledger Build & Validate", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "collapsed": false, + "panels": [], + "id": 1 + }, + { + "title": "Ledger Build Rate [$xrpl_network_type]", "description": "**What:** How often the node constructs a new ledger from its parent, applying transactions and writing state.\n**How it's computed:** Per-second rate over a 5-minute window, per node.\n**Reading it:** Should match the consensus close cadence.\n**Healthy range:** About 0.25/s on mainnet (~4s rounds).\n**Watch for:** A drop below the close rate means the node is not keeping up with ledger construction.\n**Source:** src/xrpld/app/ledger/detail/BuildLedger.cpp:buildLedgerImpl", "type": "stat", "gridPos": { - "h": 8, - "w": 8, + "h": 4, + "w": 12, "x": 0, - "y": 0 + "y": 1 }, "options": { "tooltip": { @@ -39,7 +52,11 @@ "unit": "suffix: ledgers/s" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 2 }, { "title": "Ledger Build Duration", @@ -49,7 +66,7 @@ "h": 8, "w": 12, "x": 0, - "y": 8 + "y": 5 }, "options": { "tooltip": { @@ -84,21 +101,25 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 3 }, { - "title": "Ledger Validation Rate", + "title": "Ledger Validation Rate [$xrpl_network_type]", "description": "**What:** How often ledgers reach the trusted-validation quorum and become fully validated.\n**How it's computed:** Per-second rate over a 5-minute window, per node.\n**Reading it:** Should match the build and close rates on a healthy node.\n**Healthy range:** About 0.25/s on mainnet.\n**Watch for:** A shortfall means ledgers are not accumulating enough trusted validations to be accepted.\n**Source:** src/xrpld/app/ledger/detail/LedgerMaster.cpp:LedgerMaster::checkAccept", "type": "stat", "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 0 + "h": 4, + "w": 12, + "x": 0, + "y": 13 }, "options": { "tooltip": { @@ -121,7 +142,11 @@ "unit": "suffix: ledgers/s" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 4 }, { "title": "Ledger Build Duration Heatmap", @@ -130,8 +155,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 8 + "x": 0, + "y": 17 }, "options": { "tooltip": { @@ -162,7 +187,21 @@ } }, "overrides": [] - } + }, + "id": 5 + }, + { + "title": "Transaction Apply", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "collapsed": false, + "panels": [], + "id": 6 }, { "title": "Transaction Apply Duration", @@ -172,7 +211,7 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 26 }, "options": { "tooltip": { @@ -207,11 +246,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 7 }, { "title": "Transaction Apply Rate", @@ -221,7 +264,7 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 26 }, "options": { "tooltip": { @@ -248,21 +291,38 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 8 }, { - "title": "Ledger Store Rate", + "title": "Store & Close Timing", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 34 + }, + "collapsed": false, + "panels": [], + "id": 9 + }, + { + "title": "Ledger Store Rate [$xrpl_network_type]", "description": "**What:** How often completed ledgers are written into the local ledger history.\n**How it's computed:** Per-second rate over a 5-minute window, per node.\n**Reading it:** Should match the build rate under normal operation.\n**Healthy range:** About 0.25/s on mainnet.\n**Watch for:** A store rate below the build rate means ledgers are being built but not persisted.\n**Source:** src/xrpld/app/ledger/detail/LedgerMaster.cpp:LedgerMaster::storeLedger", "type": "stat", "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 0 + "h": 4, + "w": 12, + "x": 0, + "y": 35 }, "options": { "tooltip": { @@ -285,7 +345,11 @@ "unit": "suffix: ledgers/s" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 10 }, { "title": "Build vs Close Duration", @@ -293,9 +357,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 24, + "w": 12, "x": 0, - "y": 24 + "y": 39 }, "options": { "tooltip": { @@ -330,11 +394,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 11 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/network-traffic.json b/docker/telemetry/grafana/dashboards/network-traffic.json index 724f05f652..5b2e0d809f 100644 --- a/docker/telemetry/grafana/dashboards/network-traffic.json +++ b/docker/telemetry/grafana/dashboards/network-traffic.json @@ -9,6 +9,19 @@ "id": null, "links": [], "panels": [ + { + "title": "Peer Connectivity", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "collapsed": false, + "panels": [], + "id": 1 + }, { "title": "Active Peers", "description": "###### What this is:\n*Number of active inbound and outbound peer connections the node currently holds.*\n\n###### How it's computed:\n*Current value of the inbound and outbound active-peer counts per node.*\n\n###### Reading it:\n*Outbound is what the node dials out; inbound is what others open to it. Both should be stable.*\n\n###### Healthy range:\n*roughly 10-21 outbound and 0-85 inbound on mainnet, depending on config.*\n\n###### Watch for:\n*Outbound dropping toward zero (isolation) or inbound pinned at the limit with churn (connection pressure).*\n\n###### Source:\n[PeerfinderManager.cpp](https://github.com/XRPLF/rippled/blob/develop/src/xrpld/peerfinder/detail/PeerfinderManager.cpp)\n\n###### Function:\n`Logic Stats ctor`", @@ -17,7 +30,7 @@ "h": 8, "w": 12, "x": 0, - "y": 0 + "y": 1 }, "options": { "tooltip": { @@ -49,11 +62,16 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 - } + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" + }, + "decimals": 0 }, "overrides": [] - } + }, + "id": 2 }, { "title": "Peer Disconnects", @@ -63,7 +81,7 @@ "h": 8, "w": 12, "x": 12, - "y": 24 + "y": 1 }, "options": { "tooltip": { @@ -89,11 +107,16 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 - } + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" + }, + "decimals": 0 }, "overrides": [] - } + }, + "id": 3 }, { "title": "Total Network Bytes", @@ -103,7 +126,7 @@ "h": 8, "w": 12, "x": 0, - "y": 8 + "y": 9 }, "options": { "tooltip": { @@ -135,11 +158,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 4 }, { "title": "Total Network Messages", @@ -149,7 +176,7 @@ "h": 8, "w": 12, "x": 12, - "y": 8 + "y": 9 }, "options": { "tooltip": { @@ -181,11 +208,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 5 }, { "title": "Transaction Traffic", @@ -195,7 +226,7 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 17 }, "options": { "tooltip": { @@ -233,11 +264,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 6 }, { "title": "Proposal Traffic", @@ -247,7 +282,7 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 17 }, "options": { "tooltip": { @@ -291,11 +326,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 7 }, { "title": "Validation Traffic", @@ -305,7 +344,7 @@ "h": 8, "w": 12, "x": 0, - "y": 24 + "y": 25 }, "options": { "tooltip": { @@ -349,21 +388,38 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 8 }, { - "title": "Overlay Traffic by Category (Bytes In)", + "title": "Traffic by Category", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "collapsed": false, + "panels": [], + "id": 9 + }, + { + "title": "Overlay Traffic by Category (Bytes In) [$xrpl_network_type]", "description": "###### What this is:\n*Top overlay traffic categories ranked by inbound bytes, excluding the all-traffic total.*\n\n###### How it's computed:\n*Top categories by inbound byte rate per node.*\n\n###### Reading it:\n*Shows which message types dominate receive bandwidth right now.*\n\n###### Healthy range:\n*workload-dependent; transactions, proposals, and validations typically lead on a synced node.*\n\n###### Watch for:\n*A fetch or ledger-data category topping the list (sync activity) or an unexpected category dominating.*\n\n###### Source:\n[OverlayImpl.cpp](https://github.com/XRPLF/rippled/blob/develop/src/xrpld/overlay/detail/OverlayImpl.cpp)\n\n###### Function:\n`OverlayImpl ctor (TrafficGauges)`", "type": "bargauge", "gridPos": { - "h": 8, + "h": 4, "w": 12, - "x": 12, - "y": 0 + "x": 0, + "y": 34 }, "options": { "tooltip": { @@ -650,7 +706,11 @@ ] } ] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 10 }, { "title": "Duplicate Traffic (Wasted Bandwidth)", @@ -660,7 +720,7 @@ "h": 8, "w": 12, "x": 0, - "y": 32 + "y": 38 }, "options": { "tooltip": { @@ -716,11 +776,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 11 + }, + { + "title": "Detail", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "collapsed": false, + "panels": [], + "id": 12 }, { "title": "All Traffic Categories (Detail)", @@ -729,8 +806,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 32 + "x": 0, + "y": 47 }, "options": { "tooltip": { @@ -756,11 +833,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 13 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/node-health.json b/docker/telemetry/grafana/dashboards/node-health.json index 44ea4cc5cb..f0a560c73a 100644 --- a/docker/telemetry/grafana/dashboards/node-health.json +++ b/docker/telemetry/grafana/dashboards/node-health.json @@ -10,11 +10,11 @@ "links": [], "panels": [ { - "title": "Validated Ledger Age", + "title": "Validated Ledger Age [$xrpl_network_type]", "description": "**What:** Seconds since the most recently validated ledger, i.e. how far behind the network the node is.\n**How it's computed:** Current value of the validated-ledger-age gauge per node.\n**Reading it:** Lower is better; a healthy node stays within a few ledger-close intervals.\n**Healthy range:** under ~10s (the network closes a ledger every 3-5s).\n**Watch for:** Above 20s or climbing steadily (the node is falling behind or has lost sync).\n**Source:** src/xrpld/app/ledger/LedgerMaster.h LedgerMaster::Stats ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, "y": 0 @@ -55,14 +55,18 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 1 }, { - "title": "Published Ledger Age", + "title": "Published Ledger Age [$xrpl_network_type]", "description": "**What:** Seconds since the most recently published ledger (the ledger exposed to clients and subscribers).\n**How it's computed:** Current value of the published-ledger-age gauge per node.\n**Reading it:** Should track validated-ledger age closely.\n**Healthy range:** under ~10s.\n**Watch for:** Published age growing while validated age stays low (publish-pipeline backlog).\n**Source:** src/xrpld/app/ledger/LedgerMaster.h LedgerMaster::Stats ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 12, "y": 0 @@ -103,7 +107,11 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 2 }, { "title": "Operating Mode (Time Share)", @@ -113,7 +121,7 @@ "h": 8, "w": 12, "x": 0, - "y": 24 + "y": 4 }, "options": { "tooltip": { @@ -167,14 +175,18 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3, + "pointSize": 5, "stacking": { "mode": "normal" - } + }, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 3 }, { "title": "Operating Mode Transitions", @@ -184,7 +196,7 @@ "h": 8, "w": 12, "x": 12, - "y": 24 + "y": 4 }, "options": { "tooltip": { @@ -238,11 +250,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 4 }, { "title": "I/O Latency", @@ -252,7 +268,7 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 12 }, "options": { "tooltip": { @@ -285,11 +301,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 5 }, { "title": "Job Queue Depth", @@ -299,7 +319,7 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 12 }, "options": { "tooltip": { @@ -325,21 +345,26 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 - } + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" + }, + "decimals": 0 }, "overrides": [] - } + }, + "id": 6 }, { - "title": "Ledger Fetch Rate", + "title": "Ledger Fetch Rate [$xrpl_network_type]", "description": "**What:** Rate at which the node requests ledgers from peers.\n**How it's computed:** Per-second rate of the ledger-fetches counter over 5 minutes.\n**Reading it:** Near zero when synced; rises when catching up or backfilling history.\n**Healthy range:** workload-dependent; low on a synced node.\n**Watch for:** Sustained high fetch rate on a node that should be current (repeatedly missing ledgers).\n**Source:** src/xrpld/app/ledger/detail/InboundLedgers.cpp InboundLedgersImp ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, - "y": 8 + "y": 20 }, "options": { "tooltip": { @@ -361,17 +386,21 @@ "unit": "suffix: fetches/s" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 7 }, { - "title": "Ledger History Mismatches", + "title": "Ledger History Mismatches [$xrpl_network_type]", "description": "**What:** Rate of ledger-history hash mismatches: built ledgers whose hash disagrees with the validated hash.\n**How it's computed:** Per-second rate of the history-mismatch counter over 5 minutes.\n**Reading it:** Should be flat at zero.\n**Healthy range:** zero.\n**Watch for:** Any non-zero value (consensus divergence, corrupted history, or database issues).\n**Source:** src/xrpld/telemetry/MetricsRegistry.cpp incrementLedgerHistoryMismatch (caller LedgerHistory.cpp)", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 12, - "y": 8 + "y": 20 }, "options": { "tooltip": { @@ -405,7 +434,11 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 8 }, { "title": "--- Extended Metrics (Recovered from Phase 6) ---", @@ -414,10 +447,11 @@ "h": 1, "w": 24, "x": 0, - "y": 32 + "y": 24 }, "collapsed": false, - "panels": [] + "panels": [], + "id": 9 }, { "title": "Key Jobs Execution Time", @@ -427,7 +461,7 @@ "h": 8, "w": 12, "x": 0, - "y": 33 + "y": 25 }, "options": { "tooltip": { @@ -523,11 +557,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 10 }, { "title": "Key Jobs Dequeue Wait Time", @@ -537,7 +575,7 @@ "h": 8, "w": 12, "x": 12, - "y": 33 + "y": 25 }, "options": { "tooltip": { @@ -633,11 +671,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 11 }, { "title": "FullBelowCache Size", @@ -647,7 +689,7 @@ "h": 8, "w": 12, "x": 0, - "y": 41 + "y": 33 }, "options": { "tooltip": { @@ -673,20 +715,24 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 12 }, { - "title": "FullBelowCache Hit Rate", + "title": "FullBelowCache Hit Rate [$xrpl_network_type]", "description": "**What:** Hit-rate percentage of the FullBelowCache.\n**How it's computed:** Current value of the cache hit-rate gauge (0-100%).\n**Reading it:** Higher is better; means the node reuses knowledge of complete subtrees.\n**Healthy range:** above ~50% in steady state.\n**Watch for:** Low hit rate during steady state (cache too small or constant re-acquisition).\n**Source:** include/xrpl/basics/TaggedCache.h TaggedCache::Stats ctor", "type": "gauge", "gridPos": { - "h": 8, + "h": 4, "w": 12, - "x": 12, + "x": 0, "y": 41 }, "options": { @@ -727,17 +773,21 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 13 }, { - "title": "Ledger Publish Gap", + "title": "Ledger Publish Gap [$xrpl_network_type]", "description": "**What:** Difference between published and validated ledger ages: how far the publish pipeline trails validation.\n**How it's computed:** Published-ledger age minus validated-ledger age, in seconds.\n**Reading it:** Near zero means publishing keeps up with validation.\n**Healthy range:** within a few seconds of zero.\n**Watch for:** A growing gap (publish backlog, stale data for subscribers).\n**Source:** src/xrpld/app/ledger/LedgerMaster.h LedgerMaster::Stats ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, - "x": 0, - "y": 49 + "x": 12, + "y": 41 }, "options": { "tooltip": { @@ -775,7 +825,11 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 14 }, { "title": "State Duration Rate (Full vs Tracking)", @@ -784,8 +838,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 49 + "x": 0, + "y": 45 }, "options": { "tooltip": { @@ -818,11 +872,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 15 }, { "title": "All Jobs Execution Time (Detail)", @@ -830,9 +888,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 24, - "x": 0, - "y": 57 + "w": 12, + "x": 12, + "y": 45 }, "options": { "tooltip": { @@ -858,11 +916,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 16 }, { "title": "All Jobs Dequeue Wait (Detail)", @@ -870,9 +932,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 24, + "w": 12, "x": 0, - "y": 65 + "y": 53 }, "options": { "tooltip": { @@ -898,11 +960,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 17 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json b/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json index 2b1ffc8ea1..458cc5e087 100644 --- a/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json +++ b/docker/telemetry/grafana/dashboards/overlay-traffic-detail.json @@ -73,11 +73,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 1 }, { "title": "Overhead Traffic Breakdown (Bytes)", @@ -143,11 +147,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 2 }, { "title": "Validator List Traffic", @@ -201,7 +209,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [ @@ -222,7 +233,8 @@ ] } ] - } + }, + "id": 3 }, { "title": "Set Get/Share Traffic (Bytes)", @@ -276,11 +288,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 4 }, { "title": "Have/Requested Transactions (Messages)", @@ -334,11 +350,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 5 }, { "title": "Unknown / Unclassified Traffic", @@ -392,7 +412,10 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [ @@ -413,7 +436,8 @@ ] } ] - } + }, + "id": 6 }, { "title": "Proof Path Traffic", @@ -467,11 +491,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 7 }, { "title": "Replay Delta Traffic", @@ -525,11 +553,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 8 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/peer-network.json b/docker/telemetry/grafana/dashboards/peer-network.json index 74739c657b..279ab600e2 100644 --- a/docker/telemetry/grafana/dashboards/peer-network.json +++ b/docker/telemetry/grafana/dashboards/peer-network.json @@ -9,6 +9,19 @@ "id": null, "links": [], "panels": [ + { + "title": "Proposal & Validation Receive", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "collapsed": false, + "panels": [], + "id": 1 + }, { "title": "Peer Proposal Receive Rate", "description": "**What:** Rate of consensus proposals arriving from connected network peers.\n**How it's computed:** Per-second rate over a 5-minute window, per node.\n**Reading it:** Reflects how many validators' proposals reach this node each round.\n**Healthy range:** Workload-dependent; scales with peer count and network activity.\n**Watch for:** A sudden drop means loss of proposal flow; a sharp sustained spike from a single peer can indicate flooding.\n**Source:** src/xrpld/overlay/detail/PeerImp.cpp:PeerImp::onMessage(TMProposeSet)", @@ -17,7 +30,7 @@ "h": 8, "w": 12, "x": 0, - "y": 0 + "y": 1 }, "options": { "tooltip": { @@ -44,11 +57,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 2 }, { "title": "Peer Validation Receive Rate", @@ -58,7 +75,7 @@ "h": 8, "w": 12, "x": 12, - "y": 0 + "y": 1 }, "options": { "tooltip": { @@ -85,11 +102,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 3 + }, + { + "title": "Trust Split", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "collapsed": false, + "panels": [], + "id": 4 }, { "title": "Proposals Trusted vs Untrusted", @@ -99,7 +133,7 @@ "h": 8, "w": 12, "x": 0, - "y": 8 + "y": 10 }, "options": { "tooltip": { @@ -122,7 +156,8 @@ "unit": "short" }, "overrides": [] - } + }, + "id": 5 }, { "title": "Validations Trusted vs Untrusted", @@ -132,7 +167,7 @@ "h": 8, "w": 12, "x": 12, - "y": 8 + "y": 10 }, "options": { "tooltip": { @@ -155,7 +190,8 @@ "unit": "short" }, "overrides": [] - } + }, + "id": 6 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/rpc-pathfinding.json b/docker/telemetry/grafana/dashboards/rpc-pathfinding.json index bae50fa772..094f864531 100644 --- a/docker/telemetry/grafana/dashboards/rpc-pathfinding.json +++ b/docker/telemetry/grafana/dashboards/rpc-pathfinding.json @@ -10,11 +10,11 @@ "links": [], "panels": [ { - "title": "RPC Request Rate", + "title": "RPC Request Rate [$xrpl_network_type]", "description": "**What:** Rate of RPC requests handled, counting every HTTP and WebSocket call.\n**How it's computed:** Per-second rate of the RPC-requests counter over 5 minutes.\n**Reading it:** Tracks client demand on the node.\n**Healthy range:** workload-dependent.\n**Watch for:** Sudden sustained spikes (client surge or abusive polling) or a drop to zero (endpoint unavailable).\n**Source:** src/xrpld/rpc/detail/ServerHandler.cpp ServerHandler ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, "y": 0 @@ -40,7 +40,24 @@ "unit": "reqps" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 1 + }, + { + "title": "RPC Response", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 4 + }, + "collapsed": false, + "panels": [], + "id": 2 }, { "title": "RPC Response Time", @@ -49,8 +66,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 0 + "x": 0, + "y": 5 }, "options": { "tooltip": { @@ -85,11 +102,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 3 }, { "title": "RPC Response Size", @@ -98,8 +119,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 24 + "x": 12, + "y": 5 }, "options": { "tooltip": { @@ -134,11 +155,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 4 }, { "title": "RPC Response Time Distribution", @@ -147,8 +172,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 24 + "x": 0, + "y": 13 }, "options": { "tooltip": { @@ -199,11 +224,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 5 + }, + { + "title": "Pathfinding", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "collapsed": false, + "panels": [], + "id": 6 }, { "title": "Pathfinding Fast Duration", @@ -213,7 +255,7 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 22 }, "options": { "tooltip": { @@ -248,11 +290,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 7 }, { "title": "Pathfinding Full Duration", @@ -262,7 +308,7 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 22 }, "options": { "tooltip": { @@ -297,21 +343,25 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 8 }, { - "title": "Resource Warnings Rate", + "title": "Resource Warnings Rate [$xrpl_network_type]", "description": "**What:** Rate of resource-limit warnings raised when a peer or client exceeds its usage warning threshold.\n**How it's computed:** Per-second rate of the warn counter over 5 minutes.\n**Reading it:** Occasional warnings are normal under load; a rising rate flags aggressive clients.\n**Healthy range:** workload-dependent; low.\n**Watch for:** A climbing warning rate (clients approaching limits, a precursor to drops).\n**Source:** include/xrpl/resource/detail/Logic.h Logic::Stats ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, - "y": 8 + "y": 30 }, "options": { "tooltip": { @@ -350,17 +400,21 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 9 }, { - "title": "Resource Drops Rate", + "title": "Resource Drops Rate [$xrpl_network_type]", "description": "**What:** Rate of resource drops: consumers disconnected or blocked for excessive usage.\n**How it's computed:** Per-second rate of the drop counter over 5 minutes.\n**Reading it:** Non-zero means the node is actively rejecting abusive connections.\n**Healthy range:** at or near zero.\n**Watch for:** Sustained non-zero drops (ongoing abuse or a misbehaving client/peer being throttled).\n**Source:** include/xrpl/resource/detail/Logic.h Logic::Stats ctor", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 12, - "y": 8 + "y": 30 }, "options": { "tooltip": { @@ -399,7 +453,24 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 10 + }, + { + "title": "gRPC (Spans)", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 34 + }, + "collapsed": false, + "panels": [], + "id": 11 }, { "title": "gRPC Request Rate by Method (Spans)", @@ -409,7 +480,7 @@ "h": 8, "w": 12, "x": 0, - "y": 32 + "y": 35 }, "options": { "tooltip": { @@ -436,11 +507,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 12 }, { "title": "gRPC Latency P95 by Method (Spans)", @@ -450,7 +525,7 @@ "h": 8, "w": 12, "x": 12, - "y": 32 + "y": 35 }, "options": { "tooltip": { @@ -477,11 +552,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 13 }, { "title": "gRPC Error Rate by Status (Spans)", @@ -491,7 +570,7 @@ "h": 8, "w": 12, "x": 0, - "y": 40 + "y": 43 }, "options": { "tooltip": { @@ -518,11 +597,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 14 }, { "title": "Pathfinding Compute Duration (Spans)", @@ -532,7 +615,7 @@ "h": 8, "w": 12, "x": 12, - "y": 40 + "y": 43 }, "options": { "tooltip": { @@ -567,11 +650,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 15 }, { "title": "Pathfinding Request & Discovery Rate (Spans)", @@ -579,9 +666,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 24, + "w": 12, "x": 0, - "y": 48 + "y": 51 }, "options": { "tooltip": { @@ -616,11 +703,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 16 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/rpc-performance.json b/docker/telemetry/grafana/dashboards/rpc-performance.json index 27be31f54d..f2f19ce578 100644 --- a/docker/telemetry/grafana/dashboards/rpc-performance.json +++ b/docker/telemetry/grafana/dashboards/rpc-performance.json @@ -16,7 +16,7 @@ "h": 8, "w": 12, "x": 0, - "y": 24 + "y": 0 }, "options": { "tooltip": { @@ -43,11 +43,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 1 }, { "title": "RPC Latency P95 by Command", @@ -57,7 +61,7 @@ "h": 8, "w": 12, "x": 12, - "y": 24 + "y": 0 }, "options": { "tooltip": { @@ -84,18 +88,22 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 2 }, { - "title": "RPC Error Rate", + "title": "RPC Error Rate [$xrpl_network_type]", "description": "**What:** Percentage of each RPC command's calls that ended in an error.\n**How it's computed:** Error calls divided by total calls per command over a 5-minute window, per node.\n**Reading it:** Green below 1%, yellow 1-5%, red above 5%.\n**Healthy range:** Below 1% for healthy commands.\n**Watch for:** A sustained error spike on one command is consistent with a client probing or misusing that endpoint.\n**Source:** src/xrpld/rpc/detail/RPCHandler.cpp:callMethod", "type": "bargauge", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, "y": 8 @@ -137,7 +145,11 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 3 }, { "title": "RPC Latency Heatmap", @@ -146,8 +158,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 8 + "x": 0, + "y": 12 }, "options": { "tooltip": { @@ -178,7 +190,8 @@ "spanNulls": 1800000 } } - } + }, + "id": 4 }, { "title": "Overall RPC Throughput", @@ -187,8 +200,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 16 + "x": 12, + "y": 12 }, "options": { "tooltip": { @@ -223,11 +236,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 5 }, { "title": "RPC Success vs Error", @@ -236,8 +253,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 16 + "x": 0, + "y": 20 }, "options": { "tooltip": { @@ -272,21 +289,25 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 6 }, { - "title": "Top Commands by Volume", + "title": "Top Commands by Volume [$xrpl_network_type]", "description": "**What:** The ten most-called RPC commands by total invocations recently.\n**How it's computed:** Ranked total counts per command over a 5-minute window, per node.\n**Reading it:** Identifies the hottest API endpoints driving node load.\n**Healthy range:** Workload-dependent.\n**Watch for:** An unexpected command dominating the ranking can indicate scripted abuse or a misbehaving client.\n**Source:** src/xrpld/rpc/detail/RPCHandler.cpp:callMethod", "type": "bargauge", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, - "y": 0 + "y": 28 }, "options": { "tooltip": { @@ -309,17 +330,21 @@ "unit": "none" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 7 }, { - "title": "WebSocket Message Rate", + "title": "WebSocket Message Rate [$xrpl_network_type]", "description": "**What:** Rate of incoming WebSocket RPC messages the server processes.\n**How it's computed:** Per-second rate over a 5-minute window, per node.\n**Reading it:** Non-zero only when clients connect over WebSocket rather than HTTP.\n**Healthy range:** Zero is normal for HTTP-only deployments; otherwise workload-dependent.\n**Watch for:** An unexpected surge points to a chatty or abusive WebSocket client.\n**Source:** src/xrpld/rpc/detail/ServerHandler.cpp:ServerHandler::processSession", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 12, - "y": 0 + "y": 28 }, "options": { "tooltip": { @@ -342,7 +367,11 @@ "unit": "suffix: messages/s" }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 8 }, { "title": "RPC Resource Cost by Command", @@ -350,7 +379,7 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 12, + "w": 24, "x": 0, "y": 32 }, @@ -384,11 +413,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 9 }, { "title": "Batch vs Single RPC Requests", @@ -397,8 +430,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 32 + "x": 0, + "y": 40 }, "options": { "tooltip": { @@ -433,11 +466,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 10 } ], "schemaVersion": 39, diff --git a/docker/telemetry/grafana/dashboards/transaction-overview.json b/docker/telemetry/grafana/dashboards/transaction-overview.json index b6ece294c5..27e7254194 100644 --- a/docker/telemetry/grafana/dashboards/transaction-overview.json +++ b/docker/telemetry/grafana/dashboards/transaction-overview.json @@ -51,11 +51,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 1 }, { "title": "Transaction Processing Latency by Type", @@ -63,9 +67,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 12, - "x": 12, - "y": 0 + "w": 24, + "x": 0, + "y": 8 }, "options": { "tooltip": { @@ -105,11 +109,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 2 }, { "title": "Transaction Path Distribution", @@ -119,7 +127,7 @@ "h": 8, "w": 12, "x": 0, - "y": 8 + "y": 16 }, "options": { "tooltip": { @@ -142,7 +150,8 @@ "unit": "short" }, "overrides": [] - } + }, + "id": 3 }, { "title": "Transaction Receive vs Suppressed", @@ -152,7 +161,7 @@ "h": 8, "w": 12, "x": 12, - "y": 8 + "y": 16 }, "options": { "tooltip": { @@ -179,11 +188,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 4 }, { "title": "Transaction Processing Duration Heatmap", @@ -193,7 +206,7 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 24 }, "options": { "tooltip": { @@ -224,7 +237,8 @@ "spanNulls": 1800000 } } - } + }, + "id": 5 }, { "title": "Transaction Apply Duration per Ledger", @@ -234,7 +248,7 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 24 }, "options": { "tooltip": { @@ -269,21 +283,25 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 6 }, { - "title": "Transaction Apply Failed Rate", + "title": "Transaction Apply Failed Rate [$xrpl_network_type]", "description": "**What:** Rate of transactor-stage applies that returned a non-success result while building a ledger.\n**How it's computed:** Per-second rate of tx.transactor spans at stage=apply whose ter_result is not tesSUCCESS, per node.\n**Reading it:** Green below 1/s, yellow 1-5/s, red above 5/s.\n**Healthy range:** A steady low non-zero rate is normal (e.g. tefPAST_SEQ, tecUNFUNDED and other benign conflicts).\n**Watch for:** A sustained jump above the normal baseline can indicate malformed transaction floods or a systemic issue.\n**Source:** src/libxrpl/tx/Transactor.cpp:Transactor::operator()", "type": "stat", "gridPos": { - "h": 8, + "h": 4, "w": 12, "x": 0, - "y": 24 + "y": 32 }, "options": { "tooltip": { @@ -323,7 +341,24 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 7 + }, + { + "title": "Throughput & Results", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 36 + }, + "collapsed": false, + "panels": [], + "id": 8 }, { "title": "Transaction Rate by Type", @@ -331,9 +366,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 12, + "w": 24, "x": 0, - "y": 32 + "y": 37 }, "options": { "tooltip": { @@ -365,11 +400,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 9 }, { "title": "Transaction Results by Type", @@ -377,9 +416,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 12, - "x": 12, - "y": 32 + "w": 24, + "x": 0, + "y": 45 }, "options": { "tooltip": { @@ -411,21 +450,25 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 10 }, { - "title": "TxQ Accept: Applied Ratio per Node (State Timeline)", + "title": "TxQ Accept: Applied Ratio per Node (State Timeline) [$xrpl_network_type]", "description": "**What:** Applied fraction of TxQ accepts per node over time: the share of queued transactions that were included in a ledger versus removed on failure.\n**How it's computed:** Per node, applied accepts divided by applied-plus-failed accepts over a 5-minute window.\n**Reading it:** Green (>=90% applied) is a healthy drain; yellow is degraded; red means accepts are mostly failing.\n**Healthy range:** At or near 100% applied when the queue is draining healthily; workload-dependent.\n**Watch for:** A node dropping into yellow or red, which signals queue pressure, under-bidding, or fee escalation on that node.\n**Source:** src/xrpld/app/misc/detail/TxQ.cpp:TxQ::accept", "type": "state-timeline", "gridPos": { "h": 8, - "w": 8, + "w": 12, "x": 0, - "y": 40 + "y": 53 }, "options": { "mergeValues": true, @@ -476,7 +519,11 @@ } }, "overrides": [] - } + }, + "repeat": "xrpl_network_type", + "repeatDirection": "h", + "maxPerRow": 2, + "id": 11 }, { "title": "Transactor Duration by Type (p95)", @@ -484,9 +531,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 16, - "x": 8, - "y": 40 + "w": 24, + "x": 0, + "y": 61 }, "options": { "tooltip": { @@ -518,11 +565,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 12 + }, + { + "title": "Transaction Queue", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 69 + }, + "collapsed": false, + "panels": [], + "id": 13 }, { "title": "TxQ Enqueue Rate by Transaction Type", @@ -530,9 +594,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 24, + "w": 12, "x": 0, - "y": 48 + "y": 70 }, "options": { "tooltip": { @@ -559,11 +623,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 14 }, { "title": "Queue Accept (Drain) Duration per Ledger", @@ -572,8 +640,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 56 + "x": 12, + "y": 70 }, "options": { "tooltip": { @@ -608,11 +676,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 15 }, { "title": "Queue Cleanup Rate (Expired Entries)", @@ -621,8 +693,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 56 + "x": 0, + "y": 78 }, "options": { "tooltip": { @@ -649,11 +721,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 16 }, { "title": "Tx Apply Pipeline Rate by Stage", @@ -661,9 +737,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 12, + "w": 24, "x": 0, - "y": 64 + "y": 86 }, "options": { "tooltip": { @@ -695,11 +771,28 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 17 + }, + { + "title": "Apply Pipeline", + "type": "row", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 94 + }, + "collapsed": false, + "panels": [], + "id": 18 }, { "title": "Tx Apply Pipeline Latency by Stage (p95)", @@ -707,9 +800,9 @@ "type": "timeseries", "gridPos": { "h": 8, - "w": 12, - "x": 12, - "y": 64 + "w": 24, + "x": 0, + "y": 95 }, "options": { "tooltip": { @@ -741,11 +834,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 19 }, { "title": "Tx Apply Pipeline Failure Rate by Stage", @@ -755,7 +852,7 @@ "h": 8, "w": 24, "x": 0, - "y": 80 + "y": 103 }, "options": { "tooltip": { @@ -787,11 +884,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 20 }, { "title": "Tx Apply Pipeline Latency by Type and Stage (p95)", @@ -801,7 +902,7 @@ "h": 8, "w": 24, "x": 0, - "y": 72 + "y": 111 }, "options": { "tooltip": { @@ -833,11 +934,15 @@ "spanNulls": 1800000, "insertNulls": false, "showPoints": "auto", - "pointSize": 3 + "pointSize": 5, + "lineWidth": 1, + "fillOpacity": 0, + "gradientMode": "none" } }, "overrides": [] - } + }, + "id": 21 } ], "schemaVersion": 39,