Skip to content

Commit 818cb4d

Browse files
committed
otel support
1 parent f776bca commit 818cb4d

File tree

11 files changed

+208
-7
lines changed

11 files changed

+208
-7
lines changed

Cargo.lock

Lines changed: 113 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ eyre = "0.6.12"
4444
futures = "0.3.30"
4545
headers = "0.4.0"
4646
indexmap = "2.2.6"
47+
jsonwebtoken = { version = "9.3.1", default-features = false }
4748
lazy_static = "1.5.0"
49+
opentelemetry = { version = "0.29", features = ["trace"] }
50+
opentelemetry-otlp = { version = "0.29", features = ["grpc-tonic", "http-proto", "trace"] }
51+
opentelemetry_sdk = { version = "0.29", features = ["rt-tokio", "trace"] }
4852
parking_lot = "0.12.3"
4953
pbkdf2 = "0.12.2"
5054
prometheus = "0.13.4"
@@ -63,11 +67,11 @@ tonic = { version = "0.12.3", features = ["channel", "prost", "tls"] }
6367
tonic-build = "0.12.3"
6468
tracing = "0.1.40"
6569
tracing-appender = "0.2.3"
70+
tracing-opentelemetry = "0.30"
6671
tracing-subscriber = { version = "0.3.18", features = ["env-filter", "json"] }
6772
tree_hash = "0.9"
6873
tree_hash_derive = "0.9"
6974
typenum = "1.17.0"
7075
unicode-normalization = "0.1.24"
7176
url = { version = "2.5.0", features = ["serde"] }
7277
uuid = { version = "1.8.0", features = ["fast-rng", "serde", "v4"] }
73-
jsonwebtoken = { version = "9.3.1", default-features = false }

config.example.toml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ loader = "./tests/data/mux_keys.example.json"
129129
# loader = { url = "http://localhost:8000/keys" }
130130
# loader = { registry = "lido", node_operator_id = 8 }
131131
# loader = { registry = "ssv", node_operator_id = 8 }
132-
timeout_get_header_ms = 900
133132
late_in_slot_time_ms = 1500
133+
timeout_get_header_ms = 900
134134
# For each mux, one or more [[mux.relays]] can be defined, which will be used for the matching validator pubkeys
135135
# Only the relays defined here will be used, and the relays defined in the main [[relays]] config will be ignored
136136
# The fields specified here are the same as in [[relays]] (headers, get_params, enable_timing_games, target_first_request_ms, frequency_get_header_ms)
@@ -254,6 +254,12 @@ host = "127.0.0.1"
254254
# OPTIONAL, DEFAULT: 10000
255255
start_port = 10000
256256

257+
[logs]
258+
# Whether to export OpenTelemtry traces. OTEL is configured via env variables, set those in the [env] section or in your docker compose.
259+
# For more info see: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md
260+
# OPTIONAL, DEFAULT: false
261+
export_traces = false
262+
257263
# Configuration stdout logs
258264
# OPTIONAL, DEFAULT: enabled
259265
[logs.stdout]
@@ -288,3 +294,8 @@ dir_path = "./logs"
288294
# Maximum number of log files to keep
289295
# OPTIONAL
290296
max_files = 30
297+
298+
# Env variables set for all services.
299+
# OPTIONAL
300+
[env]
301+
A_COMMON_ENV = "a_common_value"

crates/cli/src/docker_init.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ pub async fn handle_docker_init(config_path: PathBuf, output_dir: PathBuf) -> Re
7272
// targets to pass to prometheus
7373
let mut targets = Vec::new();
7474

75+
let mut service_common_envs = IndexMap::new();
76+
for (key, val) in cb_config.env {
77+
let (key, val) = get_env_val(key.as_str(), val.as_str());
78+
service_common_envs.insert(key, val);
79+
}
80+
7581
// address for signer API communication
7682
let signer_port = 20000;
7783
let signer_server =
@@ -112,6 +118,7 @@ pub async fn handle_docker_init(config_path: PathBuf, output_dir: PathBuf) -> Re
112118
get_env_interp(MODULE_JWT_ENV, &jwt_name),
113119
get_env_val(SIGNER_URL_ENV, &signer_server),
114120
]);
121+
module_envs.extend(service_common_envs.clone());
115122

116123
// Pass on the env variables
117124
if let Some(envs) = module.env {
@@ -198,6 +205,7 @@ pub async fn handle_docker_init(config_path: PathBuf, output_dir: PathBuf) -> Re
198205
get_env_val(CONFIG_ENV, CONFIG_DEFAULT),
199206
get_env_uval(BUILDER_PORT_ENV, builder_events_port),
200207
]);
208+
module_envs.extend(service_common_envs.clone());
201209

202210
if let Some((key, val)) = chain_spec_env.clone() {
203211
module_envs.insert(key, val);
@@ -247,6 +255,7 @@ pub async fn handle_docker_init(config_path: PathBuf, output_dir: PathBuf) -> Re
247255
// setup pbs service
248256

249257
let mut pbs_envs = IndexMap::from([get_env_val(CONFIG_ENV, CONFIG_DEFAULT)]);
258+
pbs_envs.extend(service_common_envs.clone());
250259
let mut pbs_volumes = vec![config_volume.clone()];
251260

252261
// ports
@@ -336,6 +345,7 @@ pub async fn handle_docker_init(config_path: PathBuf, output_dir: PathBuf) -> Re
336345
get_env_same(JWTS_ENV),
337346
get_env_uval(SIGNER_PORT_ENV, signer_port as u64),
338347
]);
348+
signer_envs.extend(service_common_envs.clone());
339349

340350
let mut ports = vec![];
341351

@@ -464,6 +474,7 @@ pub async fn handle_docker_init(config_path: PathBuf, output_dir: PathBuf) -> Re
464474
get_env_val(DIRK_KEY_ENV, DIRK_KEY_DEFAULT),
465475
get_env_val(DIRK_DIR_SECRETS_ENV, DIRK_DIR_SECRETS_DEFAULT),
466476
]);
477+
signer_envs.extend(service_common_envs.clone());
467478

468479
let mut ports = vec![];
469480

crates/common/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ ethereum_serde_utils.workspace = true
2121
ethereum_ssz.workspace = true
2222
ethereum_ssz_derive.workspace = true
2323
eyre.workspace = true
24+
jsonwebtoken.workspace = true
25+
opentelemetry.workspace = true
26+
opentelemetry-otlp.workspace = true
27+
opentelemetry_sdk.workspace = true
2428
pbkdf2.workspace = true
2529
rand.workspace = true
2630
reqwest.workspace = true
@@ -35,9 +39,9 @@ toml.workspace = true
3539
tonic.workspace = true
3640
tracing.workspace = true
3741
tracing-appender.workspace = true
42+
tracing-opentelemetry.workspace = true
3843
tracing-subscriber.workspace = true
3944
tree_hash.workspace = true
4045
tree_hash_derive.workspace = true
4146
unicode-normalization.workspace = true
4247
url.workspace = true
43-
jsonwebtoken.workspace = true

crates/common/src/config/log.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ use crate::utils::default_bool;
88

99
#[derive(Clone, Default, Debug, Deserialize, Serialize)]
1010
pub struct LogsSettings {
11+
/// Whether to export OpenTelemetry traces
12+
#[serde(default = "default_bool::<false>")]
13+
pub export_traces: bool,
14+
#[serde(default)]
1115
pub stdout: StdoutLogSettings,
16+
#[serde(default)]
1217
pub file: FileLogSettings,
1318
}
1419

crates/common/src/config/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::path::PathBuf;
1+
use std::{collections::HashMap, path::PathBuf};
22

33
use eyre::Result;
44
use serde::{Deserialize, Serialize};
@@ -35,6 +35,8 @@ pub struct CommitBoostConfig {
3535
pub metrics: Option<MetricsConfig>,
3636
#[serde(default)]
3737
pub logs: LogsSettings,
38+
#[serde(default)]
39+
pub env: HashMap<String, String>,
3840
}
3941

4042
impl CommitBoostConfig {
@@ -81,6 +83,7 @@ impl CommitBoostConfig {
8183
signer: helper_config.signer,
8284
metrics: helper_config.metrics,
8385
logs: helper_config.logs,
86+
env: helper_config.env,
8487
};
8588

8689
Ok(config)
@@ -120,4 +123,6 @@ struct HelperConfig {
120123
metrics: Option<MetricsConfig>,
121124
#[serde(default)]
122125
logs: LogsSettings,
126+
#[serde(default)]
127+
env: HashMap<String, String>,
123128
}

crates/common/src/utils.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ use alloy::{
99
};
1010
use axum::http::HeaderValue;
1111
use blst::min_pk::{PublicKey, Signature};
12+
use opentelemetry::trace::TracerProvider as _;
13+
use opentelemetry_otlp::OTEL_EXPORTER_OTLP_PROTOCOL;
1214
use rand::{distr::Alphanumeric, Rng};
1315
use reqwest::header::HeaderMap;
1416
use serde::{de::DeserializeOwned, Serialize};
1517
use serde_json::Value;
1618
use ssz::{Decode, Encode};
1719
use tracing::Level;
1820
use tracing_appender::{non_blocking::WorkerGuard, rolling::Rotation};
21+
use tracing_opentelemetry::OpenTelemetryLayer;
1922
use tracing_subscriber::{
2023
fmt::{format::Format, Layer},
2124
prelude::*,
@@ -235,6 +238,32 @@ pub fn initialize_tracing_log(
235238
}
236239
};
237240

241+
if settings.export_traces {
242+
// grpc by default
243+
let exporter = if let Ok(protocol) = std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL) {
244+
if protocol.contains("http") {
245+
opentelemetry_otlp::SpanExporter::builder().with_http().build()?
246+
} else {
247+
opentelemetry_otlp::SpanExporter::builder().with_tonic().build()?
248+
}
249+
} else {
250+
opentelemetry_otlp::SpanExporter::builder().with_tonic().build()?
251+
};
252+
253+
let tracer = opentelemetry_sdk::trace::SdkTracerProvider::builder()
254+
.with_batch_exporter(exporter)
255+
.build()
256+
.tracer("commit_boost");
257+
258+
let layer = OpenTelemetryLayer::new(tracer)
259+
.with_tracked_inactivity(false)
260+
.with_threads(false)
261+
.with_filter(format_crates_filter("info", "trace"))
262+
.boxed();
263+
264+
layers.push(layer);
265+
}
266+
238267
tracing_subscriber::registry().with(layers).init();
239268

240269
Ok((stdout_guard, file_guard))

crates/pbs/src/routes/router.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub fn create_app_router<S: BuilderApiState, A: BuilderApi<S>>(state: PbsStateGu
4242
}
4343

4444
#[tracing::instrument(
45-
name = "",
45+
name = "request",
4646
skip_all,
4747
fields(
4848
method = %req.extensions().get::<MatchedPath>().map(|m| m.as_str()).unwrap_or("unknown"),

0 commit comments

Comments
 (0)