-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtracer.rs
More file actions
56 lines (50 loc) · 1.92 KB
/
tracer.rs
File metadata and controls
56 lines (50 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//! Trace and layer builders to export traces to the Datadog agent.
//!
//! This module contains a function that builds a tracer with an exporter
//! to send traces to the Datadog agent in batches over gRPC.
//!
//! It also contains a convenience function to build a layer with the tracer.
use crate::error::Error;
use opentelemetry::trace::TracerProvider;
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::trace::{RandomIdGenerator, Sampler, SdkTracerProvider, Tracer};
use opentelemetry_sdk::Resource;
use std::time::Duration;
use tracing::Subscriber;
use tracing_opentelemetry::{OpenTelemetryLayer, PreSampledTracer};
use tracing_subscriber::registry::LookupSpan;
pub struct ProviderGuard {
tracer_provider: SdkTracerProvider,
}
impl Drop for ProviderGuard {
fn drop(&mut self) {
let _ = self.tracer_provider.force_flush();
let _ = self.tracer_provider.shutdown();
}
}
pub fn build_tracer_provider(service_name: String) -> Result<SdkTracerProvider, Error> {
let exporter = opentelemetry_otlp::SpanExporter::builder()
.with_tonic()
.with_timeout(Duration::from_secs(3))
.build()?;
let resource = Resource::builder().with_service_name(service_name).build();
let provider = SdkTracerProvider::builder()
.with_sampler(Sampler::AlwaysOn)
.with_resource(resource)
.with_id_generator(RandomIdGenerator::default())
.with_batch_exporter(exporter)
.build();
Ok(provider)
}
pub fn build_layer<S>(
service_name: String,
) -> Result<(OpenTelemetryLayer<S, Tracer>, ProviderGuard), Error>
where
Tracer: opentelemetry::trace::Tracer + PreSampledTracer + 'static,
S: Subscriber + for<'span> LookupSpan<'span>,
{
let tracer_provider = build_tracer_provider(service_name)?;
let layer = tracing_opentelemetry::layer().with_tracer(tracer_provider.tracer(""));
let guard = ProviderGuard { tracer_provider };
Ok((layer, guard))
}