Skip to content

Commit

Permalink
chore: use format_gas and format_gas_throughput for gas logs (#9247)
Browse files Browse the repository at this point in the history
  • Loading branch information
Rjected authored Jul 2, 2024
1 parent 95f2281 commit e95c6db
Show file tree
Hide file tree
Showing 13 changed files with 93 additions and 51 deletions.
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/exex/exex/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ reth-metrics.workspace = true
reth-node-api.workspace = true
reth-node-core.workspace = true
reth-primitives.workspace = true
reth-primitives-traits.workspace = true
reth-provider.workspace = true
reth-tasks.workspace = true
reth-tracing.workspace = true
Expand Down
3 changes: 2 additions & 1 deletion crates/exex/exex/src/backfill.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ use reth_db_api::database::Database;
use reth_evm::execute::{BatchExecutor, BlockExecutionError, BlockExecutorProvider};
use reth_node_api::FullNodeComponents;
use reth_primitives::{Block, BlockNumber};
use reth_primitives_traits::format_gas_throughput;
use reth_provider::{Chain, FullProvider, ProviderError, TransactionVariant};
use reth_prune_types::PruneModes;
use reth_revm::database::StateProviderDatabase;
use reth_stages_api::{format_gas_throughput, ExecutionStageThresholds};
use reth_stages_api::ExecutionStageThresholds;
use reth_tracing::tracing::{debug, trace};
use std::{
marker::PhantomData,
Expand Down
1 change: 1 addition & 0 deletions crates/node/events/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ reth-prune.workspace = true
reth-static-file.workspace = true
reth-db-api.workspace = true
reth-primitives.workspace = true
reth-primitives-traits.workspace = true

# alloy
alloy-rpc-types-engine.workspace = true
Expand Down
5 changes: 3 additions & 2 deletions crates/node/events/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use reth_db_api::{database::Database, database_metrics::DatabaseMetadata};
use reth_network::{NetworkEvent, NetworkHandle};
use reth_network_api::PeersInfo;
use reth_primitives::{constants, BlockNumber, B256};
use reth_primitives_traits::{format_gas, format_gas_throughput};
use reth_prune::PrunerEvent;
use reth_stages::{EntitiesCheckpoint, ExecOutput, PipelineEvent, StageCheckpoint, StageId};
use reth_static_file::StaticFileProducerEvent;
Expand Down Expand Up @@ -279,8 +280,8 @@ impl<DB> NodeState<DB> {
hash=?block.hash(),
peers=self.num_connected_peers(),
txs=block.body.len(),
mgas=%format!("{:.3}MGas", block.header.gas_used as f64 / constants::MGAS_TO_GAS as f64),
mgas_throughput=%format!("{:.3}MGas/s", block.header.gas_used as f64 / elapsed.as_secs_f64() / constants::MGAS_TO_GAS as f64),
gas=format_gas(block.header.gas_used),
gas_throughput=format_gas_throughput(block.header.gas_used, elapsed),
full=%format!("{:.1}%", block.header.gas_used as f64 * 100.0 / block.header.gas_limit as f64),
base_fee=%format!("{:.2}gwei", block.header.base_fee_per_gas.unwrap_or(0) as f64 / constants::GWEI_TO_WEI as f64),
blobs=block.header.blob_gas_used.unwrap_or(0) / constants::eip4844::DATA_GAS_PER_BLOB,
Expand Down
72 changes: 72 additions & 0 deletions crates/primitives-traits/src/constants/gas_units.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::time::Duration;

/// Represents one Kilogas, or `1_000` gas.
pub const KILOGAS: u64 = 1_000;

Expand All @@ -6,3 +8,73 @@ pub const MEGAGAS: u64 = KILOGAS * 1_000;

/// Represents one Gigagas, or `1_000_000_000` gas.
pub const GIGAGAS: u64 = MEGAGAS * 1_000;

/// Returns a formatted gas throughput log, showing either:
/// * "Kgas/s", or 1,000 gas per second
/// * "Mgas/s", or 1,000,000 gas per second
/// * "Ggas/s", or 1,000,000,000 gas per second
///
/// Depending on the magnitude of the gas throughput.
pub fn format_gas_throughput(gas: u64, execution_duration: Duration) -> String {
let gas_per_second = gas as f64 / execution_duration.as_secs_f64();
if gas_per_second < MEGAGAS as f64 {
format!("{:.} Kgas/second", gas_per_second / KILOGAS as f64)
} else if gas_per_second < GIGAGAS as f64 {
format!("{:.} Mgas/second", gas_per_second / MEGAGAS as f64)
} else {
format!("{:.} Ggas/second", gas_per_second / GIGAGAS as f64)
}
}

/// Returns a formatted gas log, showing either:
/// * "Kgas", or 1,000 gas
/// * "Mgas", or 1,000,000 gas
/// * "Ggas", or 1,000,000,000 gas
///
/// Depending on the magnitude of gas.
pub fn format_gas(gas: u64) -> String {
let gas = gas as f64;
if gas < MEGAGAS as f64 {
format!("{:.} Kgas", gas / KILOGAS as f64)
} else if gas < GIGAGAS as f64 {
format!("{:.} Mgas", gas / MEGAGAS as f64)
} else {
format!("{:.} Ggas", gas / GIGAGAS as f64)
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_gas_fmt() {
let gas = 100_000;
let gas_unit = format_gas(gas);
assert_eq!(gas_unit, "100 Kgas");

let gas = 100_000_000;
let gas_unit = format_gas(gas);
assert_eq!(gas_unit, "100 Mgas");

let gas = 100_000_000_000;
let gas_unit = format_gas(gas);
assert_eq!(gas_unit, "100 Ggas");
}

#[test]
fn test_gas_throughput_fmt() {
let duration = Duration::from_secs(1);
let gas = 100_000;
let throughput = format_gas_throughput(gas, duration);
assert_eq!(throughput, "100 Kgas/second");

let gas = 100_000_000;
let throughput = format_gas_throughput(gas, duration);
assert_eq!(throughput, "100 Mgas/second");

let gas = 100_000_000_000;
let throughput = format_gas_throughput(gas, duration);
assert_eq!(throughput, "100 Ggas/second");
}
}
6 changes: 2 additions & 4 deletions crates/primitives-traits/src/constants/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
use alloy_primitives::{address, b256, Address, B256, U256};
use core::time::Duration;

/// Gas units, for example [`GIGAGAS`](gas_units::GIGAGAS).
/// Gas units, for example [`GIGAGAS`].
pub mod gas_units;
pub use gas_units::{GIGAGAS, KILOGAS, MEGAGAS};

/// The client version: `reth/v{major}.{minor}.{patch}`
pub const RETH_CLIENT_VERSION: &str = concat!("reth/v", env!("CARGO_PKG_VERSION"));
Expand Down Expand Up @@ -98,9 +99,6 @@ pub const FINNEY_TO_WEI: u128 = (GWEI_TO_WEI as u128) * 1_000_000;
/// Multiplier for converting ether to wei.
pub const ETH_TO_WEI: u128 = FINNEY_TO_WEI * 1000;

/// Multiplier for converting mgas to gas.
pub const MGAS_TO_GAS: u64 = 1_000_000u64;

/// The Ethereum mainnet genesis hash:
/// `0x0d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3`
pub const MAINNET_GENESIS_HASH: B256 =
Expand Down
1 change: 1 addition & 0 deletions crates/primitives-traits/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ mod alloy_compat;

/// Common constants.
pub mod constants;
pub use constants::gas_units::{format_gas, format_gas_throughput};

/// Minimal account
pub mod account;
Expand Down
20 changes: 0 additions & 20 deletions crates/stages/api/src/metrics/execution.rs

This file was deleted.

4 changes: 2 additions & 2 deletions crates/stages/api/src/metrics/listener.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::{metrics::SyncMetrics, StageCheckpoint, StageId};
use alloy_primitives::BlockNumber;
use reth_primitives_traits::constants::MGAS_TO_GAS;
use reth_primitives_traits::constants::MEGAGAS;
use std::{
future::Future,
pin::Pin,
Expand Down Expand Up @@ -83,7 +83,7 @@ impl MetricsListener {
}
}
MetricEvent::ExecutionStageGas { gas } => {
self.sync_metrics.execution_stage.mgas_processed_total.increment(gas / MGAS_TO_GAS)
self.sync_metrics.execution_stage.mgas_processed_total.increment(gas / MEGAGAS)
}
}
}
Expand Down
2 changes: 0 additions & 2 deletions crates/stages/api/src/metrics/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
mod execution;
mod listener;
mod sync_metrics;

pub use execution::format_gas_throughput;
pub use listener::{MetricEvent, MetricEventsSender, MetricsListener};
use sync_metrics::*;
1 change: 1 addition & 0 deletions crates/stages/stages/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ reth-evm.workspace = true
reth-exex.workspace = true
reth-network-p2p.workspace = true
reth-primitives.workspace = true
reth-primitives-traits.workspace = true
reth-provider.workspace = true
reth-execution-types.workspace = true
reth-prune-types.workspace = true
Expand Down
25 changes: 5 additions & 20 deletions crates/stages/stages/src/stages/execution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use reth_evm::execute::{BatchExecutor, BlockExecutorProvider};
use reth_execution_types::{Chain, ExecutionOutcome};
use reth_exex::{ExExManagerHandle, ExExNotification};
use reth_primitives::{BlockNumber, Header, StaticFileSegment};
use reth_primitives_traits::format_gas_throughput;
use reth_provider::{
providers::{StaticFileProvider, StaticFileProviderRWRefMut, StaticFileWriter},
BlockReader, DatabaseProviderRW, HeaderProvider, LatestStateProviderRef, OriginalValuesKnown,
Expand All @@ -15,9 +16,9 @@ use reth_provider::{
use reth_prune_types::PruneModes;
use reth_revm::database::StateProviderDatabase;
use reth_stages_api::{
format_gas_throughput, BlockErrorKind, CheckpointBlockRange, EntitiesCheckpoint, ExecInput,
ExecOutput, ExecutionCheckpoint, ExecutionStageThresholds, MetricEvent, MetricEventsSender,
Stage, StageCheckpoint, StageError, StageId, UnwindInput, UnwindOutput,
BlockErrorKind, CheckpointBlockRange, EntitiesCheckpoint, ExecInput, ExecOutput,
ExecutionCheckpoint, ExecutionStageThresholds, MetricEvent, MetricEventsSender, Stage,
StageCheckpoint, StageError, StageId, UnwindInput, UnwindOutput,
};
use std::{
cmp::Ordering,
Expand Down Expand Up @@ -640,7 +641,7 @@ mod tests {
StaticFileProviderFactory,
};
use reth_prune_types::{PruneMode, ReceiptsLogPruneConfig};
use reth_stages_api::{format_gas_throughput, StageUnitCheckpoint};
use reth_stages_api::StageUnitCheckpoint;
use std::collections::BTreeMap;

fn stage() -> ExecutionStage<EthExecutorProvider> {
Expand All @@ -661,22 +662,6 @@ mod tests {
)
}

#[test]
fn test_gas_throughput_fmt() {
let duration = Duration::from_secs(1);
let gas = 100_000;
let throughput = format_gas_throughput(gas, duration);
assert_eq!(throughput, "100 Kgas/second");

let gas = 100_000_000;
let throughput = format_gas_throughput(gas, duration);
assert_eq!(throughput, "100 Mgas/second");

let gas = 100_000_000_000;
let throughput = format_gas_throughput(gas, duration);
assert_eq!(throughput, "100 Ggas/second");
}

#[test]
fn execution_checkpoint_matches() {
let factory = create_test_provider_factory();
Expand Down

0 comments on commit e95c6db

Please sign in to comment.