Skip to content

Commit 9b43a84

Browse files
committed
feat(runtime): expose otel tracing layer under otel-exporter flag
1 parent b1ddb0c commit 9b43a84

File tree

4 files changed

+53
-33
lines changed

4 files changed

+53
-33
lines changed

runtime/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ setup-tracing = [
6262
"tracing-subscriber/std",
6363
"tracing-subscriber/tracing-log",
6464
]
65-
setup-otel-exporter = [
65+
otel-exporter = [
6666
"setup-tracing",
6767
"dep:log",
6868
"dep:opentelemetry",
@@ -78,3 +78,4 @@ setup-otel-exporter = [
7878
"tracing-subscriber/tracing",
7979
"tracing-subscriber/tracing-serde",
8080
]
81+
setup-otel-exporter = ["otel-exporter"]

runtime/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ mod plugins;
1010
mod rt;
1111
mod start;
1212

13-
#[cfg(feature = "setup-otel-exporter")]
14-
mod telemetry;
13+
#[cfg(feature = "otel-exporter")]
14+
pub mod telemetry;
1515

1616
// Public API
1717
// Useful re-exports

runtime/src/start.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,25 @@ pub async fn start(
6161
}
6262

6363
#[cfg(feature = "setup-otel-exporter")]
64-
let _guard = crate::telemetry::init_tracing_subscriber(crate_name, package_version);
64+
let _guard = {
65+
use tracing_subscriber::{fmt, prelude::*, registry, EnvFilter};
66+
let (layers, guard) =
67+
crate::telemetry::otel_tracing_subscriber(crate_name, package_version);
68+
69+
registry()
70+
.with(layers)
71+
.with(fmt::layer().without_time())
72+
.with(
73+
// let user override RUST_LOG in local run if they want to
74+
EnvFilter::try_from_default_env().unwrap_or_else(|_| {
75+
// otherwise use our default
76+
format!("info,{}=debug", crate_name).into()
77+
}),
78+
)
79+
.init();
80+
81+
guard
82+
};
6583

6684
#[cfg(any(feature = "setup-tracing", feature = "setup-otel-exporter"))]
6785
tracing::warn!("Default tracing subscriber initialized (https://docs.shuttle.dev/docs/logs)");

runtime/src/telemetry.rs

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use opentelemetry_sdk::{
1818
propagation::TraceContextPropagator,
1919
resource::{Resource, ResourceDetector, TelemetryResourceDetector},
2020
runtime,
21-
trace::TracerProvider,
21+
trace::{Tracer, TracerProvider},
2222
};
2323
use opentelemetry_semantic_conventions::{
2424
attribute::{CODE_FILEPATH, CODE_LINENO, SERVICE_NAME, SERVICE_VERSION},
@@ -32,10 +32,9 @@ use tracing_core::{
3232
use tracing_log::AsLog;
3333
use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer, OtelData};
3434
use tracing_subscriber::{
35-
layer::{Context, SubscriberExt},
35+
layer::{Context, Layered},
3636
registry::LookupSpan,
37-
util::SubscriberInitExt,
38-
EnvFilter, Layer,
37+
Layer, Registry,
3938
};
4039

4140
#[derive(Clone, Debug)]
@@ -361,7 +360,7 @@ pub(crate) fn log_level_as_severity(level: log::Level) -> Severity {
361360
}
362361

363362
// Create a Resource that captures information about the entity for which telemetry is recorded.
364-
pub fn resource(crate_name: &'static str, package_version: &'static str) -> Resource {
363+
fn resource(crate_name: &'static str, package_version: &'static str) -> Resource {
365364
let project_name = std::env::var("SHUTTLE_PROJECT_NAME").ok();
366365

367366
// `TelemetryResourceDetector::detect()` automatically provides:
@@ -395,7 +394,7 @@ pub fn resource(crate_name: &'static str, package_version: &'static str) -> Reso
395394
)))
396395
}
397396

398-
pub fn init_log_subscriber(endpoint: &Option<String>, resource: Resource) -> LoggerProvider {
397+
fn init_log_subscriber(endpoint: &Option<String>, resource: Resource) -> LoggerProvider {
399398
let mut builder = LoggerProvider::builder().with_resource(resource);
400399

401400
if let Some(endpoint) = endpoint {
@@ -412,7 +411,7 @@ pub fn init_log_subscriber(endpoint: &Option<String>, resource: Resource) -> Log
412411
}
413412

414413
// Construct MeterProvider for MetricsLayer
415-
pub fn init_meter_provider(endpoint: &Option<String>, resource: Resource) -> SdkMeterProvider {
414+
fn init_meter_provider(endpoint: &Option<String>, resource: Resource) -> SdkMeterProvider {
416415
let mut builder = MeterProviderBuilder::default().with_resource(resource);
417416

418417
if let Some(endpoint) = endpoint {
@@ -438,7 +437,7 @@ pub fn init_meter_provider(endpoint: &Option<String>, resource: Resource) -> Sdk
438437
}
439438

440439
// Construct TracerProvider for OpenTelemetryLayer
441-
pub fn init_tracer_provider(endpoint: &Option<String>, resource: Resource) -> TracerProvider {
440+
fn init_tracer_provider(endpoint: &Option<String>, resource: Resource) -> TracerProvider {
442441
// TODO(the-wondersmith): make trace sample rate & strategy configurable
443442
// let sampler = opentelemetry_sdk::trace::Sampler::ParentBased(Box::new(
444443
// opentelemetry_sdk::trace::Sampler::TraceIdRatioBased(1.0),
@@ -465,11 +464,18 @@ pub fn init_tracer_provider(endpoint: &Option<String>, resource: Resource) -> Tr
465464
provider
466465
}
467466

468-
// Initialize tracing-subscriber and return ExporterGuard for opentelemetry-related termination processing
469-
pub fn init_tracing_subscriber(
467+
// Construct tracing-subscriber layers and return ExporterGuard for opentelemetry-related termination processing
468+
pub fn otel_tracing_subscriber(
470469
crate_name: &'static str,
471470
package_version: &'static str,
472-
) -> ProviderGuard {
471+
) -> (
472+
Layered<
473+
LogCourier<Registry>,
474+
Layered<OpenTelemetryLayer<Registry, Tracer>, MetricsLayer<Registry>, Registry>,
475+
Registry,
476+
>,
477+
ProviderGuard,
478+
) {
473479
global::set_text_map_propagator(TraceContextPropagator::new());
474480

475481
let resource = resource(crate_name, package_version);
@@ -481,22 +487,14 @@ pub fn init_tracing_subscriber(
481487
let meter = init_meter_provider(&endpoint, resource.clone());
482488
let logger = init_log_subscriber(&endpoint, resource);
483489

484-
let level_filter =
485-
std::env::var("RUST_LOG").unwrap_or_else(|_| format!("info,{}=debug", crate_name));
486-
487-
let layers = EnvFilter::from(&level_filter)
488-
.and_then(MetricsLayer::new(meter.clone()))
490+
let layers: Layered<
491+
LogCourier<Registry>,
492+
Layered<OpenTelemetryLayer<Registry, Tracer>, MetricsLayer<Registry>, Registry>,
493+
Registry,
494+
> = MetricsLayer::new(meter.clone())
489495
.and_then(OpenTelemetryLayer::new(tracer.tracer("shuttle-telemetry")))
490-
.and_then(
491-
tracing_subscriber::fmt::layer()
492-
.compact()
493-
.with_level(true)
494-
.with_target(true),
495-
)
496496
.and_then(LogCourier::new(logger.logger("shuttle-telemetry")));
497497

498-
tracing_subscriber::registry().with(layers).init();
499-
500498
if endpoint.is_none() {
501499
tracing::warn!(
502500
"No value set for `{}` env var, \
@@ -505,9 +503,12 @@ pub fn init_tracing_subscriber(
505503
);
506504
}
507505

508-
ProviderGuard {
509-
logger,
510-
tracer,
511-
meter,
512-
}
506+
(
507+
layers,
508+
ProviderGuard {
509+
logger,
510+
tracer,
511+
meter,
512+
},
513+
)
513514
}

0 commit comments

Comments
 (0)