reth_rpc_engine_api/
metrics.rs1use std::time::Duration;
2
3use crate::EngineApiError;
4use alloy_rpc_types_engine::{ForkchoiceUpdated, PayloadStatus, PayloadStatusEnum};
5use metrics::{Counter, Histogram};
6use reth_metrics::Metrics;
7
8#[derive(Default)]
10pub(crate) struct EngineApiMetrics {
11 pub(crate) latency: EngineApiLatencyMetrics,
13 pub(crate) fcu_response: ForkchoiceUpdatedResponseMetrics,
15 pub(crate) new_payload_response: NewPayloadStatusResponseMetrics,
17}
18
19#[derive(Metrics)]
21#[metrics(scope = "engine.rpc")]
22pub(crate) struct EngineApiLatencyMetrics {
23 pub(crate) new_payload_v1: Histogram,
25 pub(crate) new_payload_v2: Histogram,
27 pub(crate) new_payload_v3: Histogram,
29 pub(crate) new_payload_v4: Histogram,
31 pub(crate) fork_choice_updated_v1: Histogram,
33 pub(crate) fork_choice_updated_v2: Histogram,
35 pub(crate) fork_choice_updated_v3: Histogram,
37 pub(crate) new_payload_forkchoice_updated_time_diff: Histogram,
39 pub(crate) get_payload_v1: Histogram,
41 pub(crate) get_payload_v2: Histogram,
43 pub(crate) get_payload_v3: Histogram,
45 pub(crate) get_payload_v4: Histogram,
47 pub(crate) get_payload_bodies_by_range_v1: Histogram,
49 pub(crate) get_payload_bodies_by_hash_v1: Histogram,
51 pub(crate) exchange_transition_configuration: Histogram,
53}
54
55#[derive(Metrics)]
57#[metrics(scope = "engine.rpc")]
58pub(crate) struct ForkchoiceUpdatedResponseMetrics {
59 pub(crate) forkchoice_updated_messages: Counter,
61 pub(crate) forkchoice_updated_invalid: Counter,
64 pub(crate) forkchoice_updated_valid: Counter,
67 pub(crate) forkchoice_updated_syncing: Counter,
70 pub(crate) forkchoice_updated_accepted: Counter,
73 pub(crate) forkchoice_updated_error: Counter,
76}
77
78#[derive(Metrics)]
80#[metrics(scope = "engine.rpc")]
81pub(crate) struct NewPayloadStatusResponseMetrics {
82 pub(crate) new_payload_messages: Counter,
84 pub(crate) new_payload_invalid: Counter,
87 pub(crate) new_payload_valid: Counter,
90 pub(crate) new_payload_syncing: Counter,
93 pub(crate) new_payload_accepted: Counter,
96 pub(crate) new_payload_error: Counter,
99 pub(crate) new_payload_total_gas: Histogram,
101 pub(crate) new_payload_gas_per_second: Histogram,
103}
104
105impl NewPayloadStatusResponseMetrics {
106 pub(crate) fn update_response_metrics(
108 &self,
109 result: &Result<PayloadStatus, EngineApiError>,
110 gas_used: u64,
111 time: Duration,
112 ) {
113 match result {
114 Ok(status) => match status.status {
115 PayloadStatusEnum::Valid => {
116 self.new_payload_valid.increment(1);
117 self.new_payload_total_gas.record(gas_used as f64);
118 self.new_payload_gas_per_second.record(gas_used as f64 / time.as_secs_f64());
119 }
120 PayloadStatusEnum::Syncing => self.new_payload_syncing.increment(1),
121 PayloadStatusEnum::Accepted => self.new_payload_accepted.increment(1),
122 PayloadStatusEnum::Invalid { .. } => self.new_payload_invalid.increment(1),
123 },
124 Err(_) => self.new_payload_error.increment(1),
125 }
126 self.new_payload_messages.increment(1);
127 }
128}
129
130impl ForkchoiceUpdatedResponseMetrics {
131 pub(crate) fn update_response_metrics(
133 &self,
134 result: &Result<ForkchoiceUpdated, EngineApiError>,
135 ) {
136 match result {
137 Ok(status) => match status.payload_status.status {
138 PayloadStatusEnum::Valid => self.forkchoice_updated_valid.increment(1),
139 PayloadStatusEnum::Syncing => self.forkchoice_updated_syncing.increment(1),
140 PayloadStatusEnum::Accepted => self.forkchoice_updated_accepted.increment(1),
141 PayloadStatusEnum::Invalid { .. } => self.forkchoice_updated_invalid.increment(1),
142 },
143 Err(_) => self.forkchoice_updated_error.increment(1),
144 }
145 self.forkchoice_updated_messages.increment(1);
146 }
147}