// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Polkadot is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . use polkadot_node_subsystem_util::metrics::{self, prometheus}; #[derive(Clone)] pub(crate) struct MetricsInner { pub(crate) signed_statements_total: prometheus::Counter, pub(crate) candidates_seconded_total: prometheus::Counter, pub(crate) process_second: prometheus::Histogram, pub(crate) process_statement: prometheus::Histogram, pub(crate) get_backed_candidates: prometheus::Histogram, } /// Candidate backing metrics. #[derive(Default, Clone)] pub struct Metrics(pub(crate) Option); impl Metrics { pub fn on_statement_signed(&self) { if let Some(metrics) = &self.0 { metrics.signed_statements_total.inc(); } } pub fn on_candidate_seconded(&self) { if let Some(metrics) = &self.0 { metrics.candidates_seconded_total.inc(); } } /// Provide a timer for handling `CandidateBackingMessage:Second` which observes on drop. pub fn time_process_second(&self) -> Option { self.0.as_ref().map(|metrics| metrics.process_second.start_timer()) } /// Provide a timer for handling `CandidateBackingMessage::Statement` which observes on drop. pub fn time_process_statement( &self, ) -> Option { self.0.as_ref().map(|metrics| metrics.process_statement.start_timer()) } /// Provide a timer for handling `CandidateBackingMessage::GetBackedCandidates` which observes /// on drop. pub fn time_get_backed_candidates( &self, ) -> Option { self.0.as_ref().map(|metrics| metrics.get_backed_candidates.start_timer()) } } impl metrics::Metrics for Metrics { fn try_register(registry: &prometheus::Registry) -> Result { let metrics = MetricsInner { signed_statements_total: prometheus::register( prometheus::Counter::new( "polkadot_parachain_candidate_backing_signed_statements_total", "Number of statements signed.", )?, registry, )?, candidates_seconded_total: prometheus::register( prometheus::Counter::new( "polkadot_parachain_candidate_backing_candidates_seconded_total", "Number of candidates seconded.", )?, registry, )?, process_second: prometheus::register( prometheus::Histogram::with_opts(prometheus::HistogramOpts::new( "polkadot_parachain_candidate_backing_process_second", "Time spent within `candidate_backing::process_second`", ))?, registry, )?, process_statement: prometheus::register( prometheus::Histogram::with_opts(prometheus::HistogramOpts::new( "polkadot_parachain_candidate_backing_process_statement", "Time spent within `candidate_backing::process_statement`", ))?, registry, )?, get_backed_candidates: prometheus::register( prometheus::Histogram::with_opts(prometheus::HistogramOpts::new( "polkadot_parachain_candidate_backing_get_backed_candidates", "Time spent within `candidate_backing::get_backed_candidates`", ))?, registry, )?, }; Ok(Metrics(Some(metrics))) } }