From dcadfb7b1f06b92da5d05f53fce08f2976fa4793 Mon Sep 17 00:00:00 2001 From: Denis Kolodin Date: Thu, 5 Jun 2025 12:18:30 +0200 Subject: [PATCH] feat: add a feature to activate otlp telemetry --- Cargo.lock | 145 +++++++++++++++++++++++++++++---- Cargo.toml | 2 + crates/op-rbuilder/Cargo.toml | 5 ++ crates/op-rbuilder/src/main.rs | 92 +++++++++++++++------ 4 files changed, 206 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23614dfb..fb72ebab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5529,7 +5529,9 @@ dependencies = [ "reth-chain-state", "reth-chainspec", "reth-cli", + "reth-cli-commands", "reth-cli-util", + "reth-db", "reth-evm", "reth-execution-types", "reth-exex", @@ -5559,6 +5561,7 @@ dependencies = [ "reth-rpc-eth-types", "reth-rpc-layer", "reth-testing-utils", + "reth-tracing-otlp", "reth-transaction-pool", "reth-trie", "revm", @@ -5660,6 +5663,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "opentelemetry" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e87237e2775f74896f9ad219d26a2081751187eb7c9f5c58dde20a23b95d16c" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "opentelemetry-http" version = "0.28.0" @@ -5669,7 +5686,21 @@ dependencies = [ "async-trait", "bytes", "http", - "opentelemetry", + "opentelemetry 0.28.0", + "reqwest", + "tracing", +] + +[[package]] +name = "opentelemetry-http" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46d7ab32b827b5b495bd90fa95a6cb65ccc293555dcc3199ae2937d2d237c8ed" +dependencies = [ + "async-trait", + "bytes", + "http", + "opentelemetry 0.29.1", "reqwest", "tracing", ] @@ -5683,10 +5714,10 @@ dependencies = [ "async-trait", "futures-core", "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", + "opentelemetry 0.28.0", + "opentelemetry-http 0.28.0", + "opentelemetry-proto 0.28.0", + "opentelemetry_sdk 0.28.0", "prost", "reqwest", "serde_json", @@ -5696,6 +5727,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "opentelemetry-otlp" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d899720fe06916ccba71c01d04ecd77312734e2de3467fd30d9d580c8ce85656" +dependencies = [ + "futures-core", + "http", + "opentelemetry 0.29.1", + "opentelemetry-http 0.29.0", + "opentelemetry-proto 0.29.0", + "opentelemetry_sdk 0.29.0", + "prost", + "reqwest", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "opentelemetry-proto" version = "0.28.0" @@ -5704,13 +5753,31 @@ checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" dependencies = [ "base64", "hex", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.28.0", + "opentelemetry_sdk 0.28.0", "prost", "serde", "tonic", ] +[[package]] +name = "opentelemetry-proto" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c40da242381435e18570d5b9d50aca2a4f4f4d8e146231adb4e7768023309b3" +dependencies = [ + "opentelemetry 0.29.1", + "opentelemetry_sdk 0.29.0", + "prost", + "tonic", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b29a9f89f1a954936d5aa92f19b2feec3c8f3971d3e96206640db7f9706ae3" + [[package]] name = "opentelemetry_sdk" version = "0.28.0" @@ -5722,7 +5789,7 @@ dependencies = [ "futures-executor", "futures-util", "glob", - "opentelemetry", + "opentelemetry 0.28.0", "percent-encoding", "rand 0.8.5", "serde_json", @@ -5732,6 +5799,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "opentelemetry_sdk" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afdefb21d1d47394abc1ba6c57363ab141be19e27cc70d0e422b7f303e4d290b" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "opentelemetry 0.29.1", + "percent-encoding", + "rand 0.9.0", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -9307,6 +9392,20 @@ dependencies = [ "tracing-subscriber 0.3.19", ] +[[package]] +name = "reth-tracing-otlp" +version = "1.4.7" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.4.7#dc7cb6e6670b0da294a0e5010e02855f5aaf6b49" +dependencies = [ + "opentelemetry 0.29.1", + "opentelemetry-otlp 0.29.0", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk 0.29.0", + "tracing", + "tracing-opentelemetry 0.30.0", + "tracing-subscriber 0.3.19", +] + [[package]] name = "reth-transaction-pool" version = "1.4.7" @@ -9788,9 +9887,9 @@ dependencies = [ "metrics-util", "moka", "op-alloy-rpc-types-engine", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", + "opentelemetry 0.28.0", + "opentelemetry-otlp 0.28.0", + "opentelemetry_sdk 0.28.0", "parking_lot", "paste", "rustls", @@ -9802,7 +9901,7 @@ dependencies = [ "tower 0.5.2", "tower-http", "tracing", - "tracing-opentelemetry", + "tracing-opentelemetry 0.29.0", "tracing-subscriber 0.3.19", "url", ] @@ -11231,8 +11330,26 @@ checksum = "721f2d2569dce9f3dfbbddee5906941e953bfcdf736a62da3377f5751650cc36" dependencies = [ "js-sys", "once_cell", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.28.0", + "opentelemetry_sdk 0.28.0", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber 0.3.19", + "web-time", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd8e764bd6f5813fd8bebc3117875190c5b0415be8f7f8059bffb6ecd979c444" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry 0.29.1", + "opentelemetry_sdk 0.29.0", "smallvec", "tracing", "tracing-core", diff --git a/Cargo.toml b/Cargo.toml index 3376461f..a5c5b127 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,7 @@ incremental = false reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-chain-state = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } +reth-cli-commands = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-cli-util = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-db-common = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } @@ -77,6 +78,7 @@ reth-network-peers = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4. reth-testing-utils = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } +reth-tracing-otlp = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } # reth optimism reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.4.7" } diff --git a/crates/op-rbuilder/Cargo.toml b/crates/op-rbuilder/Cargo.toml index 1326c6be..8a1a8182 100644 --- a/crates/op-rbuilder/Cargo.toml +++ b/crates/op-rbuilder/Cargo.toml @@ -18,7 +18,9 @@ reth-optimism-consensus.workspace = true reth-optimism-primitives.workspace = true reth-optimism-txpool.workspace = true reth-cli.workspace = true +reth-cli-commands.workspace = true reth-cli-util.workspace = true +reth-db.workspace = true reth-payload-primitives.workspace = true reth-evm.workspace = true reth-exex.workspace = true @@ -45,6 +47,7 @@ reth-optimism-forks.workspace = true reth-node-builder.workspace = true reth-rpc-eth-types.workspace = true reth-optimism-rpc.workspace = true +reth-tracing-otlp = { workspace = true, optional = true } alloy-primitives.workspace = true alloy-consensus.workspace = true @@ -143,6 +146,8 @@ testing = [] interop = [] +telemetry = ["reth-tracing-otlp"] + [[bin]] name = "op-rbuilder" path = "src/main.rs" diff --git a/crates/op-rbuilder/src/main.rs b/crates/op-rbuilder/src/main.rs index 969c0871..d13b669c 100644 --- a/crates/op-rbuilder/src/main.rs +++ b/crates/op-rbuilder/src/main.rs @@ -1,11 +1,6 @@ use args::*; -use builders::{BuilderConfig, BuilderMode, FlashblocksBuilder, StandardBuilder}; -use core::fmt::Debug; -use reth_optimism_node::{ - node::{OpAddOnsBuilder, OpPoolBuilder}, - OpNode, -}; -use reth_transaction_pool::TransactionPool; +use builders::{BuilderMode, FlashblocksBuilder, StandardBuilder}; +use eyre::Result; /// CLI argument parsing. pub mod args; @@ -18,10 +13,23 @@ mod traits; mod tx; mod tx_signer; +use builders::{BuilderConfig, PayloadBuilder}; +use core::fmt::Debug; use metrics::VERSION; use moka::future::Cache; use monitor_tx_pool::monitor_tx_pool; +use reth::builder::{NodeBuilder, WithLaunchContext}; +use reth_cli_commands::launcher::Launcher; +use reth_db::mdbx::DatabaseEnv; +use reth_optimism_chainspec::OpChainSpec; +use reth_optimism_cli::chainspec::OpChainSpecParser; +use reth_optimism_node::{ + node::{OpAddOnsBuilder, OpPoolBuilder}, + OpNode, +}; +use reth_transaction_pool::TransactionPool; use revert_protection::{EthApiExtServer, EthApiOverrideServer, RevertProtectionExt}; +use std::{marker::PhantomData, sync::Arc}; use tx::FBPooledTransaction; // Prefer jemalloc for performance reasons. @@ -29,32 +37,68 @@ use tx::FBPooledTransaction; #[global_allocator] static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; -fn main() { +fn main() -> Result<()> { let cli = Cli::parsed(); - cli.logs - .init_tracing() - .expect("Failed to initialize tracing"); + let mode = cli.builder_mode(); + let mut cli_app = cli.configure(); - match cli.builder_mode() { + #[cfg(feature = "telemetry")] + { + let otlp = reth_tracing_otlp::layer("op-reth"); + cli_app.access_tracing_layers()?.add_layer(otlp); + } + + cli_app.init_tracing()?; + match mode { BuilderMode::Standard => { tracing::info!("Starting OP builder in standard mode"); - start_builder_node::(cli); + let launcher = BuilderLauncher::::new(); + cli_app.run(launcher)?; } BuilderMode::Flashblocks => { tracing::info!("Starting OP builder in flashblocks mode"); - start_builder_node::(cli); + let launcher = BuilderLauncher::::new(); + cli_app.run(launcher)?; + } + } + Ok(()) +} + +pub struct BuilderLauncher { + _builder: PhantomData, +} + +impl BuilderLauncher +where + B: PayloadBuilder, +{ + pub fn new() -> Self { + Self { + _builder: PhantomData, } - }; + } +} + +impl Default for BuilderLauncher +where + B: PayloadBuilder, +{ + fn default() -> Self { + Self::new() + } } -/// Starts the OP builder node with a given payload builder implementation. -fn start_builder_node(cli: Cli) +impl Launcher for BuilderLauncher where - BuilderConfig<::Config>: TryFrom, - ::Config> as TryFrom>::Error: - Debug, + B: PayloadBuilder, + BuilderConfig: TryFrom, + as TryFrom>::Error: Debug, { - cli.run(|builder, builder_args| async move { + async fn entrypoint( + self, + builder: WithLaunchContext, OpChainSpec>>, + builder_args: OpRbuilderArgs, + ) -> Result<()> { let builder_config = BuilderConfig::::try_from(builder_args.clone()) .expect("Failed to convert rollup args to builder config"); let da_config = builder_config.da_config.clone(); @@ -133,7 +177,7 @@ where .launch() .await?; - handle.node_exit_future.await - }) - .unwrap(); + handle.node_exit_future.await?; + Ok(()) + } }