Skip to content

Commit e440620

Browse files
authored
fix(init-tracing-opentelemetry): apply custom resource configuration to OpenTelemetry layers (#297)
1 parent 8cc4e92 commit e440620

File tree

2 files changed

+58
-26
lines changed

2 files changed

+58
-26
lines changed

init-tracing-opentelemetry/src/config.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use crate::formats::{
5353
CompactLayerBuilder, FullLayerBuilder, JsonLayerBuilder, LayerBuilder, PrettyLayerBuilder,
5454
};
5555

56-
use crate::tracing_subscriber_ext::regiter_otel_layers;
56+
use crate::tracing_subscriber_ext::register_otel_layers_with_resource;
5757
use crate::{otlp::OtelGuard, resource::DetectResource, Error};
5858

5959
/// Combined guard that handles both `OtelGuard` and optional `DefaultGuard`
@@ -572,10 +572,13 @@ impl TracingConfig {
572572
// Build the final subscriber based on OTEL configuration
573573
if self.otel_config.enabled {
574574
let subscriber = transform(tracing_subscriber::registry());
575-
let (subscriber, otel_guard) = regiter_otel_layers(subscriber)?;
576-
let subscriber = subscriber
577-
.with(self.build_layer()?)
578-
.with(self.build_filter_layer()?);
575+
let layer = self.build_layer()?;
576+
let filter_layer = self.build_filter_layer()?;
577+
let (subscriber, otel_guard) = register_otel_layers_with_resource(
578+
subscriber,
579+
self.otel_config.resource_config.unwrap_or_default().build(),
580+
)?;
581+
let subscriber = subscriber.with(layer).with(filter_layer);
579582

580583
if self.global_subscriber {
581584
tracing::subscriber::set_global_default(subscriber)?;

init-tracing-opentelemetry/src/tracing_subscriber_ext.rs

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use opentelemetry::trace::TracerProvider;
22
#[cfg(feature = "metrics")]
33
use opentelemetry_sdk::metrics::SdkMeterProvider;
4-
use opentelemetry_sdk::trace::{SdkTracerProvider, Tracer};
4+
use opentelemetry_sdk::{
5+
trace::{SdkTracerProvider, Tracer},
6+
Resource,
7+
};
58
use tracing::{level_filters::LevelFilter, Subscriber};
69
#[cfg(feature = "metrics")]
710
use tracing_opentelemetry::MetricsLayer;
@@ -77,34 +80,51 @@ pub fn regiter_otel_layers<S>(
7780
where
7881
S: Subscriber + for<'a> LookupSpan<'a>,
7982
{
80-
let (trace_layer, tracer_provider) = build_tracer_layer()?;
81-
let subscriber = subscriber.with(trace_layer);
83+
register_otel_layers_with_resource(subscriber, DetectResource::default().build())
84+
}
8285

86+
pub fn register_otel_layers_with_resource<S>(
87+
subscriber: S,
88+
otel_rsrc: Resource,
89+
) -> Result<(impl Subscriber + for<'span> LookupSpan<'span>, OtelGuard), Error>
90+
where
91+
S: Subscriber + for<'a> LookupSpan<'a>,
92+
{
8393
#[cfg(feature = "metrics")]
84-
{
85-
let (metrics_layer, meter_provider) = build_metrics_layer()?;
86-
let subscriber = subscriber.with(metrics_layer);
87-
Ok((
88-
subscriber,
89-
OtelGuard {
90-
meter_provider,
91-
tracer_provider,
92-
},
93-
))
94-
}
95-
#[cfg(not(feature = "metrics"))]
96-
Ok((subscriber, OtelGuard { tracer_provider }))
94+
let (metrics_layer, meter_provider) = build_metrics_layer_with_resource(otel_rsrc.clone())?;
95+
let (trace_layer, tracer_provider) = build_tracer_layer_with_resource(otel_rsrc)?;
96+
let subscriber = subscriber.with(trace_layer);
97+
#[cfg(feature = "metrics")]
98+
let subscriber = subscriber.with(metrics_layer);
99+
Ok((
100+
subscriber,
101+
OtelGuard {
102+
#[cfg(feature = "metrics")]
103+
meter_provider,
104+
tracer_provider,
105+
},
106+
))
97107
}
98108

99109
/// change (version 0.31): no longer set the glabal tracer
100110
pub fn build_tracer_layer<S>() -> Result<(OpenTelemetryLayer<S, Tracer>, SdkTracerProvider), Error>
101111
where
102112
S: Subscriber + for<'span> LookupSpan<'span>,
103113
{
104-
let otel_rsrc = DetectResource::default()
105-
//.with_fallback_service_name(env!("CARGO_PKG_NAME"))
106-
//.with_fallback_service_version(env!("CARGO_PKG_VERSION"))
107-
.build();
114+
build_tracer_layer_with_resource(
115+
DetectResource::default()
116+
//.with_fallback_service_name(env!("CARGO_PKG_NAME"))
117+
//.with_fallback_service_version(env!("CARGO_PKG_VERSION"))
118+
.build(),
119+
)
120+
}
121+
122+
pub fn build_tracer_layer_with_resource<S>(
123+
otel_rsrc: Resource,
124+
) -> Result<(OpenTelemetryLayer<S, Tracer>, SdkTracerProvider), Error>
125+
where
126+
S: Subscriber + for<'span> LookupSpan<'span>,
127+
{
108128
let tracer_provider = otlp::traces::init_tracerprovider(otel_rsrc, otlp::traces::identity)?;
109129
// to not send trace somewhere, but continue to create and propagate,...
110130
// then send them to `init_tracing_opentelemetry::stdio::WriteNoWhere::default()`
@@ -126,10 +146,19 @@ where
126146
#[cfg(feature = "metrics")]
127147
pub fn build_metrics_layer<S>(
128148
) -> Result<(MetricsLayer<S, SdkMeterProvider>, SdkMeterProvider), Error>
149+
where
150+
S: Subscriber + for<'span> LookupSpan<'span>,
151+
{
152+
build_metrics_layer_with_resource(DetectResource::default().build())
153+
}
154+
155+
#[cfg(feature = "metrics")]
156+
pub fn build_metrics_layer_with_resource<S>(
157+
otel_rsrc: Resource,
158+
) -> Result<(MetricsLayer<S, SdkMeterProvider>, SdkMeterProvider), Error>
129159
where
130160
S: Subscriber + for<'a> LookupSpan<'a>,
131161
{
132-
let otel_rsrc = DetectResource::default().build();
133162
let meter_provider = otlp::metrics::init_meterprovider(otel_rsrc, otlp::metrics::identity)?;
134163
let layer = MetricsLayer::new(meter_provider.clone());
135164
opentelemetry::global::set_meter_provider(meter_provider.clone());

0 commit comments

Comments
 (0)