Skip to content

Commit c1e3348

Browse files
committed
chain: Instrument provider initialization
1 parent 14d4d2e commit c1e3348

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

chain/ethereum/src/adapter.rs

+37
Original file line numberDiff line numberDiff line change
@@ -727,10 +727,32 @@ impl EthereumBlockFilter {
727727
}
728728
}
729729

730+
pub enum ProviderStatus {
731+
Working,
732+
VersionFail,
733+
GenesisFail,
734+
VersionTimeout,
735+
GenesisTimeout,
736+
}
737+
738+
impl From<ProviderStatus> for f64 {
739+
fn from(state: ProviderStatus) -> Self {
740+
match state {
741+
ProviderStatus::Working => 0.0,
742+
ProviderStatus::VersionFail => 1.0,
743+
ProviderStatus::GenesisFail => 2.0,
744+
ProviderStatus::VersionTimeout => 3.0,
745+
ProviderStatus::GenesisTimeout => 4.0,
746+
}
747+
}
748+
}
749+
750+
const STATUS_HELP: &str = "0 = ok, 1 = net_version failed, 2 = get genesis failed, 3 = net_version timeout, 4 = get genesis timeout";
730751
#[derive(Clone)]
731752
pub struct ProviderEthRpcMetrics {
732753
request_duration: Box<HistogramVec>,
733754
errors: Box<CounterVec>,
755+
status: Box<GaugeVec>,
734756
}
735757

736758
impl ProviderEthRpcMetrics {
@@ -750,9 +772,18 @@ impl ProviderEthRpcMetrics {
750772
vec![String::from("method"), String::from("provider")],
751773
)
752774
.unwrap();
775+
let status_help = format!("Whether the provider has failed ({STATUS_HELP})");
776+
let status = registry
777+
.new_gauge_vec(
778+
"eth_rpc_status",
779+
&status_help,
780+
vec![String::from("provider")],
781+
)
782+
.unwrap();
753783
Self {
754784
request_duration,
755785
errors,
786+
status,
756787
}
757788
}
758789

@@ -765,6 +796,12 @@ impl ProviderEthRpcMetrics {
765796
pub fn add_error(&self, method: &str, provider: &str) {
766797
self.errors.with_label_values(&[method, provider]).inc();
767798
}
799+
800+
pub fn set_status(&self, status: ProviderStatus, provider: &str) {
801+
self.status
802+
.with_label_values(&[provider])
803+
.set(status.into());
804+
}
768805
}
769806

770807
#[derive(Clone)]

chain/ethereum/src/ethereum_adapter.rs

+32-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ use std::pin::Pin;
4242
use std::sync::Arc;
4343
use std::time::Instant;
4444

45+
use crate::adapter::ProviderStatus;
4546
use crate::chain::BlockFinality;
4647
use crate::{
4748
adapter::{
@@ -820,29 +821,56 @@ impl EthereumAdapterTrait for EthereumAdapter {
820821
let logger = self.logger.clone();
821822

822823
let web3 = self.web3.clone();
824+
let metrics = self.metrics.clone();
825+
let provider = self.provider().to_string();
823826
let net_version_future = retry("net_version RPC call", &logger)
824827
.no_limit()
825828
.timeout_secs(20)
826829
.run(move || {
827830
let web3 = web3.cheap_clone();
828-
async move { web3.net().version().await.map_err(Into::into) }
831+
let metrics = metrics.cheap_clone();
832+
let provider = provider.clone();
833+
async move {
834+
web3.net().version().await.map_err(|e| {
835+
metrics.set_status(ProviderStatus::VersionFail, &provider);
836+
e.into()
837+
})
838+
}
839+
})
840+
.map_err(|e| {
841+
self.metrics
842+
.set_status(ProviderStatus::VersionTimeout, self.provider());
843+
e
829844
})
830845
.boxed();
831846

832847
let web3 = self.web3.clone();
848+
let metrics = self.metrics.clone();
849+
let provider = self.provider().to_string();
833850
let gen_block_hash_future = retry("eth_getBlockByNumber(0, false) RPC call", &logger)
834851
.no_limit()
835852
.timeout_secs(30)
836853
.run(move || {
837854
let web3 = web3.cheap_clone();
855+
let metrics = metrics.cheap_clone();
856+
let provider = provider.clone();
838857
async move {
839858
web3.eth()
840859
.block(BlockId::Number(Web3BlockNumber::Number(0.into())))
841-
.await?
860+
.await
861+
.map_err(|e| {
862+
metrics.set_status(ProviderStatus::GenesisFail, &provider);
863+
e
864+
})?
842865
.map(|gen_block| gen_block.hash.map(BlockHash::from))
843866
.flatten()
844867
.ok_or_else(|| anyhow!("Ethereum node could not find genesis block"))
845868
}
869+
})
870+
.map_err(|e| {
871+
self.metrics
872+
.set_status(ProviderStatus::GenesisTimeout, self.provider());
873+
e
846874
});
847875

848876
let (net_version, genesis_block_hash) =
@@ -858,6 +886,8 @@ impl EthereumAdapterTrait for EthereumAdapter {
858886
genesis_block_hash,
859887
};
860888

889+
self.metrics
890+
.set_status(ProviderStatus::Working, self.provider());
861891
Ok(ident)
862892
}
863893

0 commit comments

Comments
 (0)