Skip to content

Commit 5d9f1ff

Browse files
committed
Update tracing middleware
1 parent 91298b0 commit 5d9f1ff

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

engine/src/main.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,17 @@ async fn main() {
5555

5656
global::set_tracer_provider(trace_provider.clone());
5757

58-
let tracer = trace_provider.tracer("edgeserver");
58+
// let tracer = trace_provider.tracer("edgeserver");
5959

60-
let telemetry_layer = tracing_opentelemetry::layer().with_tracer(tracer.clone());
60+
// let telemetry_layer = tracing_opentelemetry::layer().with_tracer(tracer.clone());
61+
62+
// let fmt_layer = tracing_subscriber::fmt::layer().with_filter(EnvFilter::from_default_env());
63+
// tracing_subscriber::registry()
64+
// .with(fmt_layer)
65+
// .with(telemetry_layer)
66+
// .init();
67+
tracing_subscriber::fmt::init();
6168

62-
let fmt_layer = tracing_subscriber::fmt::layer().with_filter(EnvFilter::from_default_env());
63-
tracing_subscriber::registry()
64-
.with(fmt_layer)
65-
.with(telemetry_layer)
66-
.init();
6769
} else {
6870
info!("Starting Edgerouter without OTLP tracing, provide OTLP_ENDPOINT to enable tracing");
6971
tracing_subscriber::fmt::init();

engine/src/middlewares/tracing.rs

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::sync::Arc;
2+
13
use color_eyre::SectionExt;
24
use opentelemetry::{
35
global,
@@ -7,34 +9,58 @@ use opentelemetry::{
79
use opentelemetry_http::HeaderExtractor;
810
use opentelemetry_semantic_conventions::{attribute, resource};
911
use poem::{
10-
http::HeaderValue, middleware::Middleware, web::{
12+
http::HeaderValue,
13+
middleware::Middleware,
14+
web::{
1115
headers::{self, HeaderMapExt},
1216
RealIp,
13-
}, Endpoint, FromRequest, IntoResponse, PathPattern, Request, Response, Result
17+
},
18+
Endpoint, FromRequest, IntoResponse, PathPattern, Request, Response, Result,
1419
};
1520

1621
/// Middleware that injects the OpenTelemetry trace ID into the response headers.
1722
#[derive(Default)]
18-
pub struct TraceId;
23+
pub struct TraceId<T> {
24+
tracer: Arc<T>,
25+
}
1926

20-
impl<E: Endpoint> Middleware<E> for TraceId {
21-
type Output = TraceIdEndpoint<E>;
27+
impl<T> TraceId<T> {
28+
pub fn new(tracer: Arc<T>) -> Self {
29+
Self { tracer }
30+
}
31+
}
32+
33+
impl<T, E> Middleware<E> for TraceId<T>
34+
where
35+
E: Endpoint,
36+
T: Tracer + Send + Sync,
37+
T::Span: Send + Sync + 'static,
38+
{
39+
type Output = TraceIdEndpoint<T, E>;
2240

2341
fn transform(&self, ep: E) -> Self::Output {
24-
TraceIdEndpoint { inner: ep }
42+
TraceIdEndpoint {
43+
inner: ep,
44+
tracer: self.tracer.clone(),
45+
}
2546
}
2647
}
2748

2849
/// The endpoint wrapper produced by the TraceId middleware.
29-
pub struct TraceIdEndpoint<E> {
50+
pub struct TraceIdEndpoint<T, E> {
3051
inner: E,
52+
tracer: Arc<T>,
3153
}
3254

33-
impl<E: Endpoint> Endpoint for TraceIdEndpoint<E> {
55+
impl<T, E> Endpoint for TraceIdEndpoint<T, E>
56+
where
57+
E: Endpoint,
58+
T: Tracer + Send + Sync,
59+
T::Span: Send + Sync + 'static,
60+
{
3461
type Output = Response;
3562

3663
async fn call(&self, req: Request) -> Result<Self::Output> {
37-
let tracer = global::tracer("edgeserver");
3864
// // Execute the inner endpoint.
3965
// let response = self.inner.call(req).await?;
4066

@@ -56,6 +82,8 @@ impl<E: Endpoint> Endpoint for TraceIdEndpoint<E> {
5682

5783
// Ok(response)
5884

85+
let tracer = self.tracer.clone();
86+
5987
let remote_addr = RealIp::from_request_without_body(&req)
6088
.await
6189
.ok()
@@ -96,7 +124,7 @@ impl<E: Endpoint> Endpoint for TraceIdEndpoint<E> {
96124
.span_builder(format!("{} {}", method, req.uri()))
97125
.with_kind(SpanKind::Server)
98126
.with_attributes(attributes)
99-
.start_with_context(&tracer, &parent_cx);
127+
.start_with_context(&*tracer, &parent_cx);
100128

101129
span.add_event("request.started".to_string(), vec![]);
102130

engine/src/routes/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::sync::Arc;
33
use async_std::path::Path;
44
use auth::AuthApi;
55
use invite::InviteApi;
6+
use opentelemetry::global;
67
use poem::{
78
endpoint::StaticFilesEndpoint, get, handler, listener::TcpListener, middleware::{Cors, OpenTelemetryTracing},
89
web::Html, EndpointExt, Route, Server,
@@ -62,7 +63,7 @@ pub async fn serve(state: AppState) {
6263
.at("/docs", get(get_openapi_docs))
6364
.nest("/", file_endpoint)
6465
.with(Cors::new())
65-
.with(TraceId)
66+
.with(TraceId::new(Arc::new(global::tracer("edgeserver"))))
6667
.data(state);
6768

6869
let listener = TcpListener::bind("0.0.0.0:3000");

0 commit comments

Comments
 (0)