feat(otel): propagate session.id to spans and log records (#7490)
Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
@@ -131,8 +131,8 @@ pub fn init_otlp_layers(
|
||||
if let Ok(layer) = create_otlp_metrics_layer() {
|
||||
layers.push(layer.with_filter(create_otlp_metrics_filter()).boxed());
|
||||
}
|
||||
if let Ok(layer) = create_otlp_logs_layer() {
|
||||
layers.push(layer.with_filter(create_otlp_logs_filter()).boxed());
|
||||
if let Ok(bridge) = create_otlp_logs_layer() {
|
||||
layers.push(bridge.with_filter(create_otlp_logs_filter()).boxed());
|
||||
}
|
||||
|
||||
if !layers.is_empty() {
|
||||
@@ -241,7 +241,9 @@ fn create_otlp_logs_layer() -> OtlpResult<OtlpLogsLayer> {
|
||||
ExporterType::None => return Err("Logs exporter set to none".into()),
|
||||
};
|
||||
|
||||
let bridge = OpenTelemetryTracingBridge::new(&logger_provider);
|
||||
let bridge = OpenTelemetryTracingBridge::builder(&logger_provider)
|
||||
.with_span_attribute_allowlist(["session.id"])
|
||||
.build();
|
||||
*LOGGER_PROVIDER.lock().unwrap_or_else(|e| e.into_inner()) = Some(logger_provider);
|
||||
|
||||
Ok(bridge)
|
||||
@@ -368,70 +370,10 @@ pub fn shutdown_otlp() {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use opentelemetry::metrics::{Meter, MeterProvider};
|
||||
use opentelemetry::InstrumentationScope;
|
||||
use goose_test_support::otel::clear_otel_env;
|
||||
use opentelemetry_sdk::metrics::Temporality;
|
||||
use std::sync::Arc;
|
||||
use test_case::test_case;
|
||||
|
||||
// set_meter_provider requires P: MeterProvider, not Arc<dyn MeterProvider>
|
||||
struct SavedMeterProvider(Arc<dyn MeterProvider + Send + Sync>);
|
||||
|
||||
impl MeterProvider for SavedMeterProvider {
|
||||
fn meter_with_scope(&self, scope: InstrumentationScope) -> Meter {
|
||||
self.0.meter_with_scope(scope)
|
||||
}
|
||||
}
|
||||
|
||||
struct OtelTestGuard {
|
||||
_env: env_lock::EnvGuard<'static>,
|
||||
prev_tracer: global::GlobalTracerProvider,
|
||||
prev_meter: Arc<dyn MeterProvider + Send + Sync>,
|
||||
}
|
||||
|
||||
impl Drop for OtelTestGuard {
|
||||
fn drop(&mut self) {
|
||||
global::set_tracer_provider(self.prev_tracer.clone());
|
||||
global::set_meter_provider(SavedMeterProvider(self.prev_meter.clone()));
|
||||
}
|
||||
}
|
||||
|
||||
fn clear_otel_env(overrides: &[(&'static str, &'static str)]) -> OtelTestGuard {
|
||||
let prev_tracer = global::tracer_provider();
|
||||
let prev_meter = global::meter_provider();
|
||||
|
||||
let mut keys: Vec<&'static str> = vec![
|
||||
"OTEL_EXPORTER_OTLP_ENDPOINT",
|
||||
"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT",
|
||||
"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT",
|
||||
"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE",
|
||||
"OTEL_EXPORTER_OTLP_TIMEOUT",
|
||||
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
|
||||
"OTEL_LOG_LEVEL",
|
||||
"OTEL_LOGS_EXPORTER",
|
||||
"OTEL_METRICS_EXPORTER",
|
||||
"OTEL_RESOURCE_ATTRIBUTES",
|
||||
"OTEL_SDK_DISABLED",
|
||||
"OTEL_SERVICE_NAME",
|
||||
"OTEL_TRACES_EXPORTER",
|
||||
];
|
||||
for &(k, _) in overrides {
|
||||
if !keys.contains(&k) {
|
||||
keys.push(k);
|
||||
}
|
||||
}
|
||||
|
||||
let guard = env_lock::lock_env(keys.into_iter().map(|k| (k, None::<&str>)));
|
||||
for &(k, v) in overrides {
|
||||
env::set_var(k, v);
|
||||
}
|
||||
OtelTestGuard {
|
||||
_env: guard,
|
||||
prev_tracer,
|
||||
prev_meter,
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn exporter_type_from_env_value() {
|
||||
assert_eq!(ExporterType::from_env_value("otlp"), ExporterType::Otlp);
|
||||
|
||||
Reference in New Issue
Block a user