imbibe-telemetry 0.0.1

contains helper methods for open-telemetry support for imbibe
Documentation
mod error;

pub use self::error::TelemetryError;

use core::time::Duration;

use std::borrow::Cow;

use opentelemetry::trace::TracerProvider;
use opentelemetry_otlp::{SpanExporter, WithExportConfig};
use opentelemetry_sdk::trace::SdkTracerProvider;
use tracing::{Subscriber, subscriber};
use tracing_subscriber::{EnvFilter, Registry, fmt::format::FmtSpan, layer::SubscriberExt};

use self::error::Result;

pub fn init_subscriber<S>(s: S) -> Result<()>
where
	S: Subscriber + Send + Sync,
{
	subscriber::set_global_default(s).map_err(From::from)
}

pub fn make_tracing_subscriber<N, U>(
	name: N,
	exporter_endpoint: U,
	timeout: Duration,
	env_filter: EnvFilter,
) -> Result<impl Subscriber + Send + Sync>
where
	Cow<'static, str>: From<N>,
	String: From<U>,
{
	let exporter = SpanExporter::builder()
		.with_tonic()
		.with_endpoint(exporter_endpoint)
		.with_timeout(timeout)
		.build()?;

	let tracer = SdkTracerProvider::builder().with_batch_exporter(exporter).build().tracer(name);

	let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);

	let subscriber = Registry::default()
		.with(telemetry)
		.with(
			tracing_subscriber::fmt::layer()
				.with_target(false)
				.with_line_number(true)
				.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE),
		)
		.with(env_filter);

	Ok(subscriber)
}