Skip to content

Commit f484569

Browse files
authored
Add OpenTelemetry layer as optional (#898)
Signed-off-by: David Calavera <[email protected]>
1 parent cc239ea commit f484569

File tree

6 files changed

+29
-33
lines changed

6 files changed

+29
-33
lines changed

examples/opentelemetry-tracing/Cargo.toml

+9-27
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,15 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
# Library dependencies
8-
lambda_runtime = { path = "../../lambda-runtime" }
9-
pin-project = "1"
7+
lambda_runtime = { path = "../../lambda-runtime", features = ["opentelemetry"] }
108
opentelemetry-semantic-conventions = "0.14"
9+
opentelemetry = "0.22"
10+
opentelemetry_sdk = { version = "0.22", features = ["rt-tokio"] }
11+
opentelemetry-stdout = { version = "0.3", features = ["trace"] }
12+
pin-project = "1"
13+
serde_json = "1.0"
14+
tokio = "1"
1115
tower = "0.4"
1216
tracing = "0.1"
13-
14-
# Binary dependencies
15-
opentelemetry = { version = "0.22", optional = true }
16-
opentelemetry_sdk = { version = "0.22", features = ["rt-tokio"], optional = true }
17-
opentelemetry-stdout = { version = "0.3", features = ["trace"], optional = true }
18-
serde_json = { version = "1.0", optional = true }
19-
tokio = { version = "1", optional = true }
20-
tracing-opentelemetry = { version = "0.23", optional = true }
21-
tracing-subscriber = { version = "0.3", optional = true }
22-
23-
[features]
24-
build-binary = [
25-
"opentelemetry",
26-
"opentelemetry_sdk",
27-
"opentelemetry-stdout",
28-
"serde_json",
29-
"tokio",
30-
"tracing-opentelemetry",
31-
"tracing-subscriber",
32-
]
33-
34-
[[bin]]
35-
name = "opentelemetry-tracing"
36-
required-features = ["build-binary"]
17+
tracing-opentelemetry = "0.23"
18+
tracing-subscriber = "0.3"

examples/opentelemetry-tracing/src/main.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use lambda_runtime::{LambdaEvent, Runtime};
1+
use lambda_runtime::{layers::OpenTelemetryLayer as OtelLayer, LambdaEvent, Runtime};
22
use opentelemetry::trace::TracerProvider;
33
use opentelemetry_sdk::{runtime, trace};
4-
use opentelemetry_tracing::OpenTelemetryLayer;
54
use tower::{service_fn, BoxError};
65
use tracing_subscriber::prelude::*;
76

@@ -25,7 +24,7 @@ async fn main() -> Result<(), BoxError> {
2524
.init();
2625

2726
// Initialize the Lambda runtime and add OpenTelemetry tracing
28-
let runtime = Runtime::new(service_fn(echo)).layer(OpenTelemetryLayer::new(|| {
27+
let runtime = Runtime::new(service_fn(echo)).layer(OtelLayer::new(|| {
2928
// Make sure that the trace is exported before the Lambda runtime is frozen
3029
tracer_provider.force_flush();
3130
}));

lambda-runtime/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ readme = "../README.md"
1616
[features]
1717
default = ["tracing"]
1818
tracing = ["lambda_runtime_api_client/tracing"]
19+
opentelemetry = ["opentelemetry-semantic-conventions"]
1920

2021
[dependencies]
2122
async-stream = "0.3"
@@ -34,6 +35,7 @@ hyper-util = { workspace = true, features = [
3435
"tokio",
3536
] }
3637
lambda_runtime_api_client = { version = "0.11.1", path = "../lambda-runtime-api-client", default-features = false }
38+
opentelemetry-semantic-conventions = { version = "0.14", optional = true }
3739
pin-project = "1"
3840
serde = { version = "1", features = ["derive", "rc"] }
3941
serde_json = "^1"

lambda-runtime/src/layers/mod.rs

+5
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ pub(crate) use api_client::RuntimeApiClientService;
1010
pub(crate) use api_response::RuntimeApiResponseService;
1111
pub(crate) use panic::CatchPanicService;
1212
pub use trace::TracingLayer;
13+
14+
#[cfg(feature = "opentelemetry")]
15+
mod otel;
16+
#[cfg(feature = "opentelemetry")]
17+
pub use otel::OpenTelemetryLayer;

examples/opentelemetry-tracing/src/lib.rs renamed to lambda-runtime/src/layers/otel.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::future::Future;
22
use std::pin::Pin;
33
use std::task;
44

5-
use lambda_runtime::LambdaInvocation;
5+
use crate::LambdaInvocation;
66
use opentelemetry_semantic_conventions::trace as traceconv;
77
use pin_project::pin_project;
88
use tower::{Layer, Service};
@@ -19,6 +19,7 @@ impl<F> OpenTelemetryLayer<F>
1919
where
2020
F: Fn() + Clone,
2121
{
22+
/// Create a new [OpenTelemetryLayer] with the provided flush function.
2223
pub fn new(flush_fn: F) -> Self {
2324
Self { flush_fn }
2425
}
@@ -71,9 +72,14 @@ where
7172
// After the first execution, we can set 'coldstart' to false
7273
self.coldstart = false;
7374

74-
let fut = self.inner.call(req).instrument(span);
75+
let future = {
76+
// Enter the span before calling the inner service
77+
// to ensure that it's assigned as parent of the inner spans.
78+
let _guard = span.enter();
79+
self.inner.call(req)
80+
};
7581
OpenTelemetryFuture {
76-
future: Some(fut),
82+
future: Some(future.instrument(span)),
7783
flush_fn: self.flush_fn.clone(),
7884
}
7985
}

lambda-runtime/src/layers/trace.rs

+2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ where
4444
fn call(&mut self, req: LambdaInvocation) -> Self::Future {
4545
let span = request_span(&req.context);
4646
let future = {
47+
// Enter the span before calling the inner service
48+
// to ensure that it's assigned as parent of the inner spans.
4749
let _guard = span.enter();
4850
self.inner.call(req)
4951
};

0 commit comments

Comments
 (0)