From e056bfb213e7ddb2f4345d9717735475229024dd Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Wed, 8 Nov 2023 17:10:40 +0000 Subject: [PATCH] feat(rpc): measure request/call time in seconds (#5361) --- crates/rpc/rpc-builder/src/metrics.rs | 24 +- etc/grafana/dashboards/overview.json | 443 +++++++++++++++----------- 2 files changed, 267 insertions(+), 200 deletions(-) diff --git a/crates/rpc/rpc-builder/src/metrics.rs b/crates/rpc/rpc-builder/src/metrics.rs index c55400861c3a..64a005037f04 100644 --- a/crates/rpc/rpc-builder/src/metrics.rs +++ b/crates/rpc/rpc-builder/src/metrics.rs @@ -73,8 +73,8 @@ struct RpcServerConnectionMetrics { requests_started: Counter, /// The number of requests finished requests_finished: Counter, - /// Latency for a single request/response pair - request_latency: Histogram, + /// Response for a single request/response pair + request_time_seconds: Histogram, } /// Metrics for the RPC calls @@ -82,13 +82,13 @@ struct RpcServerConnectionMetrics { #[metrics(scope = "rpc_server.calls")] struct RpcServerCallMetrics { /// The number of calls started - calls_started: Counter, + started: Counter, /// The number of successful calls - successful_calls: Counter, + successful: Counter, /// The number of failed calls - failed_calls: Counter, - /// Latency for a single call - call_latency: Histogram, + failed: Counter, + /// Response for a single call + time_seconds: Histogram, } impl Logger for RpcServerMetrics { @@ -116,7 +116,7 @@ impl Logger for RpcServerMetrics { _transport: TransportProtocol, ) { let Some(call_metrics) = self.inner.call_metrics.get(method_name) else { return }; - call_metrics.calls_started.increment(1); + call_metrics.started.increment(1); } fn on_result( @@ -129,18 +129,18 @@ impl Logger for RpcServerMetrics { let Some(call_metrics) = self.inner.call_metrics.get(method_name) else { return }; // capture call latency - call_metrics.call_latency.record(started_at.elapsed().as_millis() as f64); + call_metrics.time_seconds.record(started_at.elapsed().as_secs_f64()); if success.is_success() { - call_metrics.successful_calls.increment(1); + call_metrics.successful.increment(1); } else { - call_metrics.failed_calls.increment(1); + call_metrics.failed.increment(1); } } fn on_response(&self, _result: &str, started_at: Self::Instant, transport: TransportProtocol) { let metrics = self.inner.connection_metrics.get_metrics(transport); // capture request latency for this request/response pair - metrics.request_latency.record(started_at.elapsed().as_millis() as f64); + metrics.request_time_seconds.record(started_at.elapsed().as_secs_f64()); metrics.requests_finished.increment(1); } diff --git a/etc/grafana/dashboards/overview.json b/etc/grafana/dashboards/overview.json index 1a654e9885d0..4949632a7d11 100644 --- a/etc/grafana/dashboards/overview.json +++ b/etc/grafana/dashboards/overview.json @@ -29,12 +29,6 @@ "name": "Grafana", "version": "10.1.0" }, - { - "type": "panel", - "id": "graph", - "name": "Graph (old)", - "version": "" - }, { "type": "panel", "id": "heatmap", @@ -627,7 +621,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "avg(avg_over_time(reth_database_transaction_close_duration_seconds{instance=~\"$instance\", outcome=\"commit\"}[$__interval])) by (quantile)", + "expr": "avg(max_over_time(reth_database_transaction_close_duration_seconds{instance=~\"$instance\", outcome=\"commit\"}[$__rate_interval])) by (quantile)", "format": "time_series", "instant": false, "legendFormat": "{{quantile}}", @@ -942,6 +936,7 @@ "custom": { "axisCenteredZero": false, "axisColorMode": "text", + "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "points", @@ -3061,7 +3056,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3166,7 +3162,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3305,7 +3302,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3423,7 +3421,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3540,7 +3539,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3677,7 +3677,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3771,7 +3772,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -3865,7 +3867,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4012,7 +4015,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4157,7 +4161,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4321,7 +4326,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4415,7 +4421,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4509,7 +4516,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4602,7 +4610,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4712,7 +4721,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4805,7 +4815,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4910,7 +4921,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5018,7 +5030,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5111,7 +5124,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5204,7 +5218,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5309,7 +5324,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5469,7 +5485,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5564,7 +5581,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5659,7 +5677,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5767,7 +5786,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5862,7 +5882,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5924,180 +5945,130 @@ "type": "row" }, { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "description": "The number of active requests.", - "fill": 1, - "fillGradient": 0, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "http" + }, + "properties": [ + { + "id": "displayName", + "value": "HTTP" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "ws" + }, + "properties": [ + { + "id": "displayName", + "value": "WebSocket" + } + ] + } + ] + }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 237 }, - "hiddenSeries": false, "id": 109, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "10.1.0", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "editorMode": "builder", - "expr": "reth_rpc_server_requests_started{instance=~\"$instance\"} - reth_rpc_server_requests_finished{instance=~\"$instance\"}", - "format": "time_series", - "legendFormat": "Active Requests", - "range": true, - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Active Requests", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "show": true + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true }, - { - "format": "short", - "logBase": 1, - "show": true + "tooltip": { + "mode": "multi", + "sort": "none" } - ], - "yaxis": { - "align": false - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": { - "type": "prometheus", - "uid": "${DS_PROMETHEUS}" - }, - "description": "The number of active websocket connections.", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 237 - }, - "hiddenSeries": false, - "id": 110, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true }, - "percentage": false, "pluginVersion": "10.1.0", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "editorMode": "builder", - "expr": "reth_rpc_server_ws_session_opened{instance=~\"$instance\"} - reth_rpc_server_ws_session_closed{instance=~\"$instance\"}", + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(reth_rpc_server_connections_connections_opened{instance=~\"$instance\"} - reth_rpc_server_connections_connections_closed{instance=~\"$instance\"}) by (transport)", "format": "time_series", - "legendFormat": "Active Websocket Connections", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{transport}}", "range": true, - "refId": "A" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "Active Websocket Connections", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "mode": "time", - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "show": true - }, - { - "format": "short", - "logBase": 1, - "show": true + "refId": "A", + "useBackend": false } ], - "yaxis": { - "align": false - } + "title": "Active Connections", + "type": "timeseries" }, { "datasource": { @@ -6123,8 +6094,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 0, - "y": 245 + "x": 12, + "y": 237 }, "id": 111, "maxDataPoints": 25, @@ -6177,10 +6148,10 @@ }, "editorMode": "code", "exemplar": false, - "expr": "sum(increase(reth_rpc_server_request_latency{instance=~\"$instance\"}[$__rate_interval])) by (quantile)", + "expr": "avg(max_over_time(reth_rpc_server_connections_request_time_seconds{instance=~\"$instance\"}[$__rate_interval]) > 0) by (quantile)", "format": "time_series", "instant": false, - "legendFormat": "{{quantile}}", + "legendFormat": "__auto", "range": true, "refId": "A" } @@ -6188,6 +6159,102 @@ "title": "Request Latency time", "type": "heatmap" }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 245 + }, + "id": 120, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "max(max_over_time(reth_rpc_server_calls_time_seconds[$__rate_interval])) by (method) > 0", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Maximum call latency per method", + "type": "timeseries" + }, { "datasource": { "type": "prometheus", @@ -6266,7 +6333,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "sum(increase(reth_rpc_server_call_latency{instance=~\"$instance\"}[$__rate_interval])) by (quantile)", + "expr": "avg(max_over_time(reth_rpc_server_calls_time_seconds{instance=~\"$instance\"}[$__rate_interval]) > 0) by (quantile)", "format": "time_series", "instant": false, "legendFormat": "{{quantile}}", @@ -6317,6 +6384,6 @@ "timezone": "", "title": "reth", "uid": "2k8BXz24x", - "version": 11, + "version": 12, "weekStart": "" -} +} \ No newline at end of file