Skip to content

Commit

Permalink
final touches
Browse files Browse the repository at this point in the history
Signed-off-by: Iulian Barbu <iulian.barbu@parity.io>
  • Loading branch information
iulianbarbu committed Sep 10, 2024
1 parent a0fb74d commit cf3c960
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 312 deletions.
289 changes: 19 additions & 270 deletions cumulus/client/relay-chain-rpc-interface/src/metrics.rs
Original file line number Diff line number Diff line change
@@ -1,284 +1,33 @@
use std::collections::HashMap;

use prometheus::{Error as PrometheusError, HistogramTimer, Registry};
use prometheus_endpoint::{HistogramOpts, HistogramVec, Opts};

use crate::constants::{
AUTHORITY_DISCOVERY_API_AUTHORITIES, BABE_API_CURRENT_EPOCH, CHAIN_GET_BLOCKHASH,
CHAIN_GET_FINALIZED_HEAD, CHAIN_GET_HEAD, CHAIN_GET_HEADER,
PARACHAIN_HOST_ASYNC_BACKING_PARAMS, PARACHAIN_HOST_AVAILABILITY_CORES,
PARACHAIN_HOST_CANDIDATES_PENDING_AVAILABILITY, PARACHAIN_HOST_CANDIDATE_EVENTS,
PARACHAIN_HOST_CANDIDATE_PENDING_AVAILABILITY, PARACHAIN_HOST_CHECK_VALIDATION_OUTPUTS,
PARACHAIN_HOST_CLAIM_QUEUE, PARACHAIN_HOST_DISABLED_VALIDATORS, PARACHAIN_HOST_DISPUTES,
PARACHAIN_HOST_DMQ_CONTENTS, PARACHAIN_HOST_INBOUND_HRMP_CHANNELS_CONTENTS,
PARACHAIN_HOST_KEY_OWNERSHIP_PROOF, PARACHAIN_HOST_MINIMUM_BACKING_VOTES,
PARACHAIN_HOST_NODE_FEATURES, PARACHAIN_HOST_ON_CHAIN_VOTES, PARACHAIN_HOST_PARA_BACKING_STATE,
PARACHAIN_HOST_PERSISTED_ASSUMED_VALIDATION_DATA, PARACHAIN_HOST_PERSISTED_VALIDATION_DATA,
PARACHAIN_HOST_PVFS_REQUIRE_PRECHECK, PARACHAIN_HOST_SESSION_EXECUTOR_PARAMS,
PARACHAIN_HOST_SESSION_INDEX_FOR_CHILD, PARACHAIN_HOST_SESSION_INFO,
PARACHAIN_HOST_STAGING_APPROVAL_VOTING_PARAMS, PARACHAIN_HOST_SUBMIT_PVF_CHECK_STATEMENT,
PARACHAIN_HOST_SUBMIT_REPORT_DISPUTE_LOST, PARACHAIN_HOST_UNAPPLIED_SLASHES,
PARACHAIN_HOST_VALIATOR_GROUPS, PARACHAIN_HOST_VALIDATION_CODE,
PARACHAIN_HOST_VALIDATION_CODE_BY_HASH, PARACHAIN_HOST_VALIDATION_CODE_HASH,
PARACHAIN_HOST_VALIDATORS, STATE_GET_RUNTIME_VERSION,
};

pub(crate) const DURATION_LABEL_NAME: &str = "duration";

// Gathers metrics about the blockchain RPC client.
#[derive(Clone)]
pub(crate) struct BlockchainRpcMetrics {
inner: HashMap<String, HistogramVec>,
rpc_request: HistogramVec,
}

impl BlockchainRpcMetrics {
fn create_histogram_vec(
registry: &Registry,
method: &str,
) -> Result<HistogramVec, PrometheusError> {
Ok(prometheus_endpoint::register(
HistogramVec::new(
HistogramOpts {
common_opts: Opts::new(
format!("cumulus_rpc_{}", method),
format!("Tracks stats about {} rpc call", method),
),
buckets: prometheus::exponential_buckets(0.5, 2.0, 10)
.expect("parameters are always valid values; qed"),
},
&[DURATION_LABEL_NAME, method],
)?,
registry,
)?)
}

pub(crate) fn register(registry: &Registry) -> Result<Self, PrometheusError> {
let mut metrics = HashMap::new();
metrics.insert(
CHAIN_GET_HEAD.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, CHAIN_GET_HEAD)?,
);
metrics.insert(
CHAIN_GET_HEADER.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, CHAIN_GET_HEADER)?,
);
metrics.insert(
CHAIN_GET_BLOCKHASH.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, CHAIN_GET_BLOCKHASH)?,
);
metrics.insert(
CHAIN_GET_FINALIZED_HEAD.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, CHAIN_GET_FINALIZED_HEAD)?,
);
metrics.insert(
PARACHAIN_HOST_VALIDATORS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_VALIDATORS)?,
);
metrics.insert(
PARACHAIN_HOST_VALIATOR_GROUPS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_VALIATOR_GROUPS)?,
);
metrics.insert(
PARACHAIN_HOST_AVAILABILITY_CORES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_AVAILABILITY_CORES,
)?,
);
metrics.insert(
PARACHAIN_HOST_PERSISTED_VALIDATION_DATA.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_PERSISTED_VALIDATION_DATA,
)?,
);
metrics.insert(
PARACHAIN_HOST_PERSISTED_ASSUMED_VALIDATION_DATA.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_PERSISTED_ASSUMED_VALIDATION_DATA,
)?,
);
metrics.insert(
PARACHAIN_HOST_CHECK_VALIDATION_OUTPUTS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_CHECK_VALIDATION_OUTPUTS,
)?,
);
metrics.insert(
PARACHAIN_HOST_SESSION_INDEX_FOR_CHILD.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_SESSION_INDEX_FOR_CHILD,
)?,
);
metrics.insert(
PARACHAIN_HOST_VALIDATION_CODE.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_VALIDATION_CODE)?,
);
metrics.insert(
PARACHAIN_HOST_CANDIDATE_PENDING_AVAILABILITY.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_CANDIDATE_PENDING_AVAILABILITY,
)?,
);
metrics.insert(
PARACHAIN_HOST_CANDIDATE_EVENTS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_CANDIDATE_EVENTS)?,
);
metrics.insert(
PARACHAIN_HOST_DMQ_CONTENTS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_DMQ_CONTENTS)?,
);
metrics.insert(
PARACHAIN_HOST_INBOUND_HRMP_CHANNELS_CONTENTS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_INBOUND_HRMP_CHANNELS_CONTENTS,
)?,
);
metrics.insert(
PARACHAIN_HOST_VALIDATION_CODE_BY_HASH.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_VALIDATION_CODE_BY_HASH,
)?,
);
metrics.insert(
PARACHAIN_HOST_SESSION_INFO.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_SESSION_INFO)?,
);
metrics.insert(
PARACHAIN_HOST_SESSION_EXECUTOR_PARAMS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_SESSION_EXECUTOR_PARAMS,
)?,
);
metrics.insert(
PARACHAIN_HOST_SUBMIT_PVF_CHECK_STATEMENT.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_SUBMIT_PVF_CHECK_STATEMENT,
)?,
);
metrics.insert(
PARACHAIN_HOST_PVFS_REQUIRE_PRECHECK.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_PVFS_REQUIRE_PRECHECK,
)?,
);
metrics.insert(
PARACHAIN_HOST_VALIDATION_CODE_HASH.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_VALIDATION_CODE_HASH,
)?,
);
metrics.insert(
PARACHAIN_HOST_DISPUTES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_DISPUTES)?,
);
metrics.insert(
PARACHAIN_HOST_UNAPPLIED_SLASHES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_UNAPPLIED_SLASHES)?,
);
metrics.insert(
PARACHAIN_HOST_KEY_OWNERSHIP_PROOF.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_KEY_OWNERSHIP_PROOF,
)?,
);
metrics.insert(
PARACHAIN_HOST_SUBMIT_REPORT_DISPUTE_LOST.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_SUBMIT_REPORT_DISPUTE_LOST,
)?,
);
metrics.insert(
PARACHAIN_HOST_MINIMUM_BACKING_VOTES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_MINIMUM_BACKING_VOTES,
)?,
);
metrics.insert(
PARACHAIN_HOST_DISABLED_VALIDATORS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_DISABLED_VALIDATORS,
)?,
);
metrics.insert(
PARACHAIN_HOST_ASYNC_BACKING_PARAMS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_ASYNC_BACKING_PARAMS,
)?,
);
metrics.insert(
PARACHAIN_HOST_CLAIM_QUEUE.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_CLAIM_QUEUE)?,
);
metrics.insert(
PARACHAIN_HOST_NODE_FEATURES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_NODE_FEATURES)?,
);
metrics.insert(
PARACHAIN_HOST_STAGING_APPROVAL_VOTING_PARAMS.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_STAGING_APPROVAL_VOTING_PARAMS,
)?,
);
metrics.insert(
PARACHAIN_HOST_PARA_BACKING_STATE.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_PARA_BACKING_STATE,
)?,
);
metrics.insert(
PARACHAIN_HOST_CANDIDATES_PENDING_AVAILABILITY.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
PARACHAIN_HOST_CANDIDATES_PENDING_AVAILABILITY,
)?,
);
metrics.insert(
BABE_API_CURRENT_EPOCH.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, BABE_API_CURRENT_EPOCH)?,
);
metrics.insert(
AUTHORITY_DISCOVERY_API_AUTHORITIES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(
registry,
AUTHORITY_DISCOVERY_API_AUTHORITIES,
)?,
);
metrics.insert(
PARACHAIN_HOST_ON_CHAIN_VOTES.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, PARACHAIN_HOST_ON_CHAIN_VOTES)?,
);
metrics.insert(
STATE_GET_RUNTIME_VERSION.to_string(),
BlockchainRpcMetrics::create_histogram_vec(registry, STATE_GET_RUNTIME_VERSION)?,
);
Ok(Self { inner: metrics })
Ok(Self {
rpc_request: prometheus_endpoint::register(
HistogramVec::new(
HistogramOpts {
common_opts: Opts::new(
"cumulus_relay_chain_rpc_request",
"Tracks stats about cumulus relay chain RPC interface",
),
buckets: prometheus::exponential_buckets(0.001, 4.0, 9)
.expect("function parameters are constant and always valid; qed"),
},
&["method"],
)?,
registry,
)?,
})
}

pub(crate) fn start_request_timer<'a>(
&self,
method: &str,
labels: &[&'a str],
) -> Option<HistogramTimer> {
self.inner
.get(method)
.map(|inner| inner.with_label_values(labels).start_timer())
pub(crate) fn start_request_timer(&self, method: &str) -> HistogramTimer {
self.rpc_request.with_label_values(&[method]).start_timer()
}
}
7 changes: 2 additions & 5 deletions cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ use crate::{
PARACHAIN_HOST_VALIDATORS, STATE_GET_RUNTIME_VERSION,
},
light_client_worker::{build_smoldot_client, LightClientRpcWorker},
metrics::{BlockchainRpcMetrics, DURATION_LABEL_NAME},
metrics::BlockchainRpcMetrics,
reconnecting_ws_client::ReconnectingWebsocketWorker,
};
pub use url::Url;
Expand Down Expand Up @@ -224,10 +224,7 @@ impl RelayChainRpcClient {
R: DeserializeOwned + std::fmt::Debug,
OR: Fn(&RelayChainError),
{
let _timer = self
.metrics
.as_ref()
.and_then(|inner| inner.start_request_timer(method, &[DURATION_LABEL_NAME, method]));
let _timer = self.metrics.as_ref().map(|inner| inner.start_request_timer(method));

let (tx, rx) = futures::channel::oneshot::channel();

Expand Down
Loading

0 comments on commit cf3c960

Please sign in to comment.