imbibe_telemetry/
lib.rs

1mod error;
2
3pub use self::error::TelemetryError;
4
5use core::time::Duration;
6
7use std::borrow::Cow;
8
9use opentelemetry::trace::TracerProvider;
10use opentelemetry_otlp::{SpanExporter, WithExportConfig};
11use opentelemetry_sdk::trace::SdkTracerProvider;
12use tracing::{Subscriber, subscriber};
13use tracing_subscriber::{EnvFilter, Registry, fmt::format::FmtSpan, layer::SubscriberExt};
14
15use self::error::Result;
16
17pub fn init_subscriber<S>(s: S) -> Result<()>
18where
19	S: Subscriber + Send + Sync,
20{
21	subscriber::set_global_default(s).map_err(From::from)
22}
23
24pub fn make_tracing_subscriber<N, U>(
25	name: N,
26	exporter_endpoint: U,
27	timeout: Duration,
28	env_filter: EnvFilter,
29) -> Result<impl Subscriber + Send + Sync>
30where
31	Cow<'static, str>: From<N>,
32	String: From<U>,
33{
34	let exporter = SpanExporter::builder()
35		.with_tonic()
36		.with_endpoint(exporter_endpoint)
37		.with_timeout(timeout)
38		.build()?;
39
40	let tracer = SdkTracerProvider::builder().with_batch_exporter(exporter).build().tracer(name);
41
42	let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
43
44	let subscriber = Registry::default()
45		.with(telemetry)
46		.with(
47			tracing_subscriber::fmt::layer()
48				.with_target(false)
49				.with_line_number(true)
50				.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE),
51		)
52		.with(env_filter);
53
54	Ok(subscriber)
55}