mirror of
https://github.com/sigp/lighthouse.git
synced 2026-04-29 02:33:48 +00:00
Add extra prom beacon chain metrics
This commit is contained in:
@@ -16,6 +16,7 @@ pub use self::beacon_chain::{
|
||||
pub use self::checkpoint::CheckPoint;
|
||||
pub use self::errors::{BeaconChainError, BlockProductionError};
|
||||
pub use lmd_ghost;
|
||||
pub use metrics::scrape_for_metrics;
|
||||
pub use parking_lot;
|
||||
pub use slot_clock;
|
||||
pub use state_processing::per_block_processing::errors::{
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
use crate::{BeaconChain, BeaconChainTypes};
|
||||
pub use lighthouse_metrics::*;
|
||||
use types::{BeaconState, Epoch, EthSpec, Hash256, Slot};
|
||||
|
||||
lazy_static! {
|
||||
/*
|
||||
@@ -133,15 +135,157 @@ lazy_static! {
|
||||
"Time taken to add an attestation to fork choice"
|
||||
);
|
||||
|
||||
/*
|
||||
* Head Updating
|
||||
*/
|
||||
pub static ref UPDATE_HEAD_TIMES: Result<Histogram> =
|
||||
try_create_histogram("update_head_times", "Time taken to update the canonical head");
|
||||
|
||||
/*
|
||||
* Persisting BeaconChain to disk
|
||||
*/
|
||||
pub static ref PERSIST_CHAIN: Result<Histogram> =
|
||||
try_create_histogram("persist_chain", "Time taken to update the canonical head");
|
||||
}
|
||||
|
||||
// Lazy-static is split so we don't reach the crate-level recursion limit.
|
||||
lazy_static! {
|
||||
/*
|
||||
* Slot Clock
|
||||
*/
|
||||
pub static ref PRESENT_SLOT: Result<IntGauge> =
|
||||
try_create_int_gauge("present_slot", "The present slot, according to system time");
|
||||
pub static ref PRESENT_EPOCH: Result<IntGauge> =
|
||||
try_create_int_gauge("present_epoch", "The present epoch, according to system time");
|
||||
|
||||
/*
|
||||
* Chain Head
|
||||
*/
|
||||
pub static ref UPDATE_HEAD_TIMES: Result<Histogram> =
|
||||
try_create_histogram("update_head_times", "Time taken to update the canonical head");
|
||||
pub static ref HEAD_STATE_SLOT: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_slot", "Slot of the block at the head of the chain");
|
||||
pub static ref HEAD_STATE_ROOT: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_root", "Root of the block at the head of the chain");
|
||||
pub static ref HEAD_STATE_LATEST_BLOCK_SLOT: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_latest_block_slot", "Latest block slot at the head of the chain");
|
||||
pub static ref HEAD_STATE_CURRENT_JUSTIFIED_ROOT: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_current_justified_root", "Current justified root at the head of the chain");
|
||||
pub static ref HEAD_STATE_CURRENT_JUSTIFIED_EPOCH: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_current_justified_epoch", "Current justified epoch at the head of the chain");
|
||||
pub static ref HEAD_STATE_PREVIOUS_JUSTIFIED_ROOT: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_previous_justified_root", "Previous justified root at the head of the chain");
|
||||
pub static ref HEAD_STATE_PREVIOUS_JUSTIFIED_EPOCH: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_previous_justified_epoch", "Previous justified epoch at the head of the chain");
|
||||
pub static ref HEAD_STATE_FINALIZED_ROOT: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_finalized_root", "Finalized root at the head of the chain");
|
||||
pub static ref HEAD_STATE_FINALIZED_EPOCH: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_finalized_epoch", "Finalized epoch at the head of the chain");
|
||||
pub static ref HEAD_STATE_TOTAL_VALIDATORS: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_total_validators", "Count of validators at the head of the chain");
|
||||
pub static ref HEAD_STATE_ACTIVE_VALIDATORS: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_active_validators", "Count of active validators at the head of the chain");
|
||||
pub static ref HEAD_STATE_VALIDATOR_BALANCES: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_validator_balances", "Sum of all validator balances at the head of the chain");
|
||||
pub static ref HEAD_STATE_SLASHED_VALIDATORS: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_slashed_validators", "Count of all slashed validators at the head of the chain");
|
||||
pub static ref HEAD_STATE_WITHDRAWN_VALIDATORS: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_withdrawn_validators", "Sum of all validator balances at the head of the chain");
|
||||
pub static ref HEAD_STATE_ETH1_DEPOSIT_INDEX: Result<IntGauge> =
|
||||
try_create_int_gauge("head_state_eth1_deposit_index", "Eth1 deposit index at the head of the chain");
|
||||
}
|
||||
|
||||
/// Scrape the `beacon_chain` for metrics that are not constantly updated (e.g., the present slot,
|
||||
/// head state info, etc) and update the Prometheus `DEFAULT_REGISTRY`.
|
||||
pub fn scrape_for_metrics<T: BeaconChainTypes>(beacon_chain: &BeaconChain<T>) {
|
||||
set_gauge_by_slot(
|
||||
&PRESENT_SLOT,
|
||||
beacon_chain
|
||||
.read_slot_clock()
|
||||
.unwrap_or_else(|| Slot::new(0)),
|
||||
);
|
||||
|
||||
set_gauge_by_epoch(
|
||||
&PRESENT_EPOCH,
|
||||
beacon_chain
|
||||
.read_slot_clock()
|
||||
.map(|s| s.epoch(T::EthSpec::slots_per_epoch()))
|
||||
.unwrap_or_else(|| Epoch::new(0)),
|
||||
);
|
||||
|
||||
scrape_head_state::<T>(
|
||||
&beacon_chain.head().beacon_state,
|
||||
beacon_chain.head().beacon_state_root,
|
||||
);
|
||||
}
|
||||
|
||||
/// Scrape the given `state` assuming it's the head state, updating the `DEFAULT_REGISTRY`.
|
||||
fn scrape_head_state<T: BeaconChainTypes>(state: &BeaconState<T::EthSpec>, state_root: Hash256) {
|
||||
set_gauge_by_slot(&HEAD_STATE_SLOT, state.slot);
|
||||
set_gauge_by_hash(&HEAD_STATE_ROOT, state_root);
|
||||
set_gauge_by_slot(
|
||||
&HEAD_STATE_LATEST_BLOCK_SLOT,
|
||||
state.latest_block_header.slot,
|
||||
);
|
||||
set_gauge_by_hash(
|
||||
&HEAD_STATE_CURRENT_JUSTIFIED_ROOT,
|
||||
state.current_justified_checkpoint.root,
|
||||
);
|
||||
set_gauge_by_epoch(
|
||||
&HEAD_STATE_CURRENT_JUSTIFIED_EPOCH,
|
||||
state.current_justified_checkpoint.epoch,
|
||||
);
|
||||
set_gauge_by_hash(
|
||||
&HEAD_STATE_PREVIOUS_JUSTIFIED_ROOT,
|
||||
state.previous_justified_checkpoint.root,
|
||||
);
|
||||
set_gauge_by_epoch(
|
||||
&HEAD_STATE_PREVIOUS_JUSTIFIED_EPOCH,
|
||||
state.previous_justified_checkpoint.epoch,
|
||||
);
|
||||
set_gauge_by_hash(&HEAD_STATE_FINALIZED_ROOT, state.finalized_checkpoint.root);
|
||||
set_gauge_by_epoch(
|
||||
&HEAD_STATE_FINALIZED_EPOCH,
|
||||
state.finalized_checkpoint.epoch,
|
||||
);
|
||||
set_gauge_by_usize(&HEAD_STATE_TOTAL_VALIDATORS, state.validators.len());
|
||||
set_gauge_by_u64(
|
||||
&HEAD_STATE_VALIDATOR_BALANCES,
|
||||
state.balances.iter().fold(0_u64, |acc, i| acc + i),
|
||||
);
|
||||
set_gauge_by_usize(
|
||||
&HEAD_STATE_ACTIVE_VALIDATORS,
|
||||
state
|
||||
.validators
|
||||
.iter()
|
||||
.filter(|v| v.is_active_at(state.current_epoch()))
|
||||
.count(),
|
||||
);
|
||||
set_gauge_by_usize(
|
||||
&HEAD_STATE_SLASHED_VALIDATORS,
|
||||
state.validators.iter().filter(|v| v.slashed).count(),
|
||||
);
|
||||
set_gauge_by_usize(
|
||||
&HEAD_STATE_WITHDRAWN_VALIDATORS,
|
||||
state
|
||||
.validators
|
||||
.iter()
|
||||
.filter(|v| v.is_withdrawable_at(state.current_epoch()))
|
||||
.count(),
|
||||
);
|
||||
set_gauge_by_u64(&HEAD_STATE_ETH1_DEPOSIT_INDEX, state.eth1_deposit_index);
|
||||
}
|
||||
|
||||
fn set_gauge_by_slot(gauge: &Result<IntGauge>, value: Slot) {
|
||||
set_gauge(gauge, value.as_u64() as i64);
|
||||
}
|
||||
|
||||
fn set_gauge_by_epoch(gauge: &Result<IntGauge>, value: Epoch) {
|
||||
set_gauge(gauge, value.as_u64() as i64);
|
||||
}
|
||||
|
||||
fn set_gauge_by_hash(gauge: &Result<IntGauge>, value: Hash256) {
|
||||
set_gauge(gauge, value.to_low_u64_le() as i64);
|
||||
}
|
||||
|
||||
fn set_gauge_by_usize(gauge: &Result<IntGauge>, value: usize) {
|
||||
set_gauge(gauge, value as i64);
|
||||
}
|
||||
|
||||
fn set_gauge_by_u64(gauge: &Result<IntGauge>, value: u64) {
|
||||
set_gauge(gauge, value as i64);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user