diff --git a/config/standalone.example.toml b/config/standalone.example.toml index 629c9bdb9a73..9055b7eca088 100644 --- a/config/standalone.example.toml +++ b/config/standalone.example.toml @@ -134,7 +134,7 @@ worker_request_batch_size = 64 # Number of meta action updated to trigger a new checkpoint for the manifest manifest_checkpoint_distance = 10 # Manifest compression type -manifest_compress_type = "Uncompressed" +manifest_compress_type = "uncompressed" # Max number of running background jobs max_background_jobs = 4 # Interval to auto flush a region if it has not flushed yet. @@ -162,3 +162,5 @@ sst_write_buffer_size = "8MB" # enable_otlp_tracing = false # tracing exporter endpoint with format `ip:port`, we use grpc oltp as exporter, default endpoint is `localhost:4317` # otlp_endpoint = "localhost:4317" +# The percentage of tracing will be sampled and exported. Valid range `[0, 1]`, 1 means all traces are sampled, 0 means all traces are not sampled, the default value is 1. ratio > 1 are treated as 1. Fractions < 0 are treated as 0 +# tracing_sample_ratio = 1.0 diff --git a/src/common/telemetry/src/logging.rs b/src/common/telemetry/src/logging.rs index 9ff9306973ad..f825d8f3835b 100644 --- a/src/common/telemetry/src/logging.rs +++ b/src/common/telemetry/src/logging.rs @@ -20,6 +20,7 @@ use once_cell::sync::Lazy; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::propagation::TraceContextPropagator; +use opentelemetry_sdk::trace::Sampler; use opentelemetry_semantic_conventions::resource; use serde::{Deserialize, Serialize}; use tracing_appender::non_blocking::WorkerGuard; @@ -34,15 +35,28 @@ pub use crate::{debug, error, info, trace, warn}; const DEFAULT_OTLP_ENDPOINT: &str = "http://localhost:4317"; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default)] pub struct LoggingOptions { pub dir: String, pub level: Option, pub enable_otlp_tracing: bool, pub otlp_endpoint: Option, + pub tracing_sample_ratio: Option, } +impl PartialEq for LoggingOptions { + fn eq(&self, other: &Self) -> bool { + self.dir == other.dir + && self.level == other.level + && self.enable_otlp_tracing == other.enable_otlp_tracing + && self.otlp_endpoint == other.otlp_endpoint + && self.tracing_sample_ratio == other.tracing_sample_ratio + } +} + +impl Eq for LoggingOptions {} + impl Default for LoggingOptions { fn default() -> Self { Self { @@ -50,6 +64,7 @@ impl Default for LoggingOptions { level: None, enable_otlp_tracing: false, otlp_endpoint: None, + tracing_sample_ratio: None, } } } @@ -145,7 +160,10 @@ pub fn init_global_logging( let filter = targets_string .parse::() .expect("error parsing log level string"); - + let sampler = opts + .tracing_sample_ratio + .map(Sampler::TraceIdRatioBased) + .unwrap_or(Sampler::AlwaysOn); // Must enable 'tokio_unstable' cfg to use this feature. // For example: `RUSTFLAGS="--cfg tokio_unstable" cargo run -F common-telemetry/console -- standalone start` #[cfg(feature = "tokio-console")] @@ -200,17 +218,19 @@ pub fn init_global_logging( .unwrap_or(DEFAULT_OTLP_ENDPOINT.to_string()), ), ) - .with_trace_config(opentelemetry_sdk::trace::config().with_resource( - opentelemetry_sdk::Resource::new(vec![ - KeyValue::new(resource::SERVICE_NAME, app_name.to_string()), - KeyValue::new( - resource::SERVICE_INSTANCE_ID, - node_id.unwrap_or("none".to_string()), - ), - KeyValue::new(resource::SERVICE_VERSION, env!("CARGO_PKG_VERSION")), - KeyValue::new(resource::PROCESS_PID, std::process::id().to_string()), - ]), - )) + .with_trace_config( + opentelemetry_sdk::trace::config() + .with_sampler(sampler) + .with_resource(opentelemetry_sdk::Resource::new(vec![ + KeyValue::new(resource::SERVICE_NAME, app_name.to_string()), + KeyValue::new( + resource::SERVICE_INSTANCE_ID, + node_id.unwrap_or("none".to_string()), + ), + KeyValue::new(resource::SERVICE_VERSION, env!("CARGO_PKG_VERSION")), + KeyValue::new(resource::PROCESS_PID, std::process::id().to_string()), + ])), + ) .install_batch(opentelemetry_sdk::runtime::Tokio) .expect("otlp tracer install failed"); let tracing_layer = Some(tracing_opentelemetry::layer().with_tracer(tracer));