Skip to content

Commit b76f7dd

Browse files
committed
refactor: group subscriber layer construction
1 parent 0026a82 commit b76f7dd

File tree

2 files changed

+57
-52
lines changed

2 files changed

+57
-52
lines changed

init-tracing-opentelemetry/src/otlp/metrics.rs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,14 @@
11
use super::infer_protocol;
2-
use crate::resource::DetectResource;
3-
use crate::Error;
4-
use opentelemetry::global;
52
use opentelemetry_otlp::{ExporterBuildError, MetricExporter, WithExportConfig};
63
use opentelemetry_sdk::metrics::{
74
MeterProviderBuilder, PeriodicReader, SdkMeterProvider, Temporality,
85
};
96
use opentelemetry_sdk::Resource;
107
use std::env;
118
use std::time::Duration;
12-
use tracing::Subscriber;
13-
use tracing_opentelemetry::MetricsLayer;
14-
use tracing_subscriber::registry::LookupSpan;
159
#[cfg(feature = "tls")]
1610
use {opentelemetry_otlp::WithTonicConfig, tonic::transport::ClientTlsConfig};
1711

18-
pub fn build_metrics_layer<S>() -> Result<(MetricsLayer<S>, SdkMeterProvider), Error>
19-
where
20-
S: Subscriber + for<'a> LookupSpan<'a>,
21-
{
22-
let otel_rsrc = DetectResource::default().build();
23-
let meter_provider = init_meterprovider(otel_rsrc, identity)?;
24-
global::set_meter_provider(meter_provider.clone());
25-
let layer = tracing_opentelemetry::MetricsLayer::new(meter_provider.clone());
26-
Ok((layer, meter_provider))
27-
}
28-
2912
#[must_use]
3013
pub fn identity(v: MeterProviderBuilder) -> MeterProviderBuilder {
3114
v

init-tracing-opentelemetry/src/tracing_subscriber_ext.rs

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1+
use opentelemetry::global;
12
use opentelemetry::trace::TracerProvider;
3+
#[cfg(feature = "metrics")]
4+
use opentelemetry_sdk::metrics::SdkMeterProvider;
25
use opentelemetry_sdk::trace::{SdkTracerProvider, Tracer};
36
use tracing::{info, level_filters::LevelFilter, Subscriber};
7+
#[cfg(feature = "metrics")]
8+
use tracing_opentelemetry::MetricsLayer;
49
use tracing_opentelemetry::OpenTelemetryLayer;
510
use tracing_subscriber::{filter::EnvFilter, layer::SubscriberExt, registry::LookupSpan, Layer};
611

7-
use crate::otlp::OtelGuard;
8-
use crate::Error;
12+
use crate::{
13+
init_propagator, //stdio,
14+
otlp,
15+
otlp::OtelGuard,
16+
resource::DetectResource,
17+
Error,
18+
};
919

1020
#[cfg(not(feature = "logfmt"))]
1121
#[must_use]
@@ -81,16 +91,35 @@ pub fn build_level_filter_layer(log_directives: &str) -> Result<EnvFilter, Error
8191
.add_directive(directive_to_allow_otel_trace))
8292
}
8393

84-
pub fn build_otel_layer<S>() -> Result<(OpenTelemetryLayer<S, Tracer>, SdkTracerProvider), Error>
94+
pub fn regiter_otel_layers<S>(
95+
subscriber: S,
96+
) -> Result<(impl Subscriber + for<'span> LookupSpan<'span>, OtelGuard), Error>
8597
where
8698
S: Subscriber + for<'a> LookupSpan<'a>,
8799
{
88-
use crate::{
89-
init_propagator, //stdio,
90-
otlp,
91-
resource::DetectResource,
92-
};
93-
use opentelemetry::global;
100+
let (trace_layer, tracer_provider) = build_tracer_layer()?;
101+
let subscriber = subscriber.with(trace_layer);
102+
103+
#[cfg(feature = "metrics")]
104+
{
105+
let (metrics_layer, meter_provider) = build_metrics_layer()?;
106+
let subscriber = subscriber.with(metrics_layer);
107+
Ok((
108+
subscriber,
109+
OtelGuard {
110+
meter_provider,
111+
tracer_provider,
112+
},
113+
))
114+
}
115+
#[cfg(not(feature = "metrics"))]
116+
Ok((subscriber, OtelGuard { tracer_provider }))
117+
}
118+
119+
pub fn build_tracer_layer<S>() -> Result<(OpenTelemetryLayer<S, Tracer>, SdkTracerProvider), Error>
120+
where
121+
S: Subscriber + for<'span> LookupSpan<'span>,
122+
{
94123
let otel_rsrc = DetectResource::default()
95124
//.with_fallback_service_name(env!("CARGO_PKG_NAME"))
96125
//.with_fallback_service_version(env!("CARGO_PKG_VERSION"))
@@ -113,6 +142,18 @@ where
113142
Ok((layer, tracer_provider))
114143
}
115144

145+
#[cfg(feature = "metrics")]
146+
pub fn build_metrics_layer<S>() -> Result<(MetricsLayer<S>, SdkMeterProvider), Error>
147+
where
148+
S: Subscriber + for<'a> LookupSpan<'a>,
149+
{
150+
let otel_rsrc = DetectResource::default().build();
151+
let meter_provider = otlp::metrics::init_meterprovider(otel_rsrc, otlp::metrics::identity)?;
152+
global::set_meter_provider(meter_provider.clone());
153+
let layer = MetricsLayer::new(meter_provider.clone());
154+
Ok((layer, meter_provider))
155+
}
156+
116157
pub fn init_subscribers() -> Result<OtelGuard, Error> {
117158
init_subscribers_and_loglevel("")
118159
}
@@ -126,30 +167,11 @@ pub fn init_subscribers_and_loglevel(log_directives: &str) -> Result<OtelGuard,
126167
let _guard = tracing::subscriber::set_default(subscriber);
127168
info!("init logging & tracing");
128169

129-
let (trace_layer, tracer_provider) = build_otel_layer()?;
130-
131-
#[cfg(not(feature = "metrics"))]
132-
{
133-
let subscriber = tracing_subscriber::registry()
134-
.with(trace_layer)
135-
.with(build_level_filter_layer(log_directives)?)
136-
.with(build_logger_text());
137-
tracing::subscriber::set_global_default(subscriber)?;
138-
Ok(OtelGuard { tracer_provider })
139-
}
140-
#[cfg(feature = "metrics")]
141-
{
142-
let (metrics_layer, meter_provider) = crate::otlp::metrics::build_metrics_layer()?;
143-
info!("init metrics");
144-
let subscriber = tracing_subscriber::registry()
145-
.with(metrics_layer)
146-
.with(trace_layer)
147-
.with(build_level_filter_layer(log_directives)?)
148-
.with(build_logger_text());
149-
tracing::subscriber::set_global_default(subscriber)?;
150-
Ok(OtelGuard {
151-
meter_provider,
152-
tracer_provider,
153-
})
154-
}
170+
let subscriber = tracing_subscriber::registry();
171+
let (subscriber, otel_guard) = regiter_otel_layers(subscriber)?;
172+
let subscriber = subscriber
173+
.with(build_level_filter_layer(log_directives)?)
174+
.with(build_logger_text());
175+
tracing::subscriber::set_global_default(subscriber)?;
176+
Ok(otel_guard)
155177
}

0 commit comments

Comments
 (0)