Skip to content

Commit 9b88cea

Browse files
authored
feat(otel): allow to configure the faas.trigger attribute of the span (#903)
* feat(otel): allow to configure the faas.trigger attribute of the span * fix: update opentelemetry-tracing example * fix: use datasource as default faas.trigger + introduce enum OpenTelemetryFaasTrigger
1 parent f8cc32d commit 9b88cea

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

examples/opentelemetry-tracing/src/main.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use lambda_runtime::{layers::OpenTelemetryLayer as OtelLayer, LambdaEvent, Runtime};
1+
use lambda_runtime::{
2+
layers::{OpenTelemetryFaasTrigger, OpenTelemetryLayer as OtelLayer},
3+
LambdaEvent, Runtime,
4+
};
25
use opentelemetry::trace::TracerProvider;
36
use opentelemetry_sdk::{runtime, trace};
47
use tower::{service_fn, BoxError};
@@ -24,10 +27,15 @@ async fn main() -> Result<(), BoxError> {
2427
.init();
2528

2629
// Initialize the Lambda runtime and add OpenTelemetry tracing
27-
let runtime = Runtime::new(service_fn(echo)).layer(OtelLayer::new(|| {
28-
// Make sure that the trace is exported before the Lambda runtime is frozen
29-
tracer_provider.force_flush();
30-
}));
30+
let runtime = Runtime::new(service_fn(echo)).layer(
31+
// Create a tracing span for each Lambda invocation
32+
OtelLayer::new(|| {
33+
// Make sure that the trace is exported before the Lambda runtime is frozen
34+
tracer_provider.force_flush();
35+
})
36+
// Set the "faas.trigger" attribute of the span to "pubsub"
37+
.with_trigger(OpenTelemetryFaasTrigger::PubSub),
38+
);
3139
runtime.run().await?;
3240
Ok(())
3341
}

lambda-runtime/src/layers/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ pub use trace::TracingLayer;
1414
#[cfg(feature = "opentelemetry")]
1515
mod otel;
1616
#[cfg(feature = "opentelemetry")]
17-
pub use otel::OpenTelemetryLayer;
17+
pub use otel::{OpenTelemetryFaasTrigger, OpenTelemetryLayer};

lambda-runtime/src/layers/otel.rs

+47-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{future::Future, pin::Pin, task};
1+
use std::{fmt::Display, future::Future, pin::Pin, task};
22

33
use crate::LambdaInvocation;
44
use opentelemetry_semantic_conventions::trace as traceconv;
@@ -10,6 +10,7 @@ use tracing::{instrument::Instrumented, Instrument};
1010
/// a function to flush OpenTelemetry after the end of the invocation.
1111
pub struct OpenTelemetryLayer<F> {
1212
flush_fn: F,
13+
otel_attribute_trigger: OpenTelemetryFaasTrigger,
1314
}
1415

1516
impl<F> OpenTelemetryLayer<F>
@@ -18,7 +19,18 @@ where
1819
{
1920
/// Create a new [OpenTelemetryLayer] with the provided flush function.
2021
pub fn new(flush_fn: F) -> Self {
21-
Self { flush_fn }
22+
Self {
23+
flush_fn,
24+
otel_attribute_trigger: Default::default(),
25+
}
26+
}
27+
28+
/// Configure the `faas.trigger` attribute of the OpenTelemetry span.
29+
pub fn with_trigger(self, trigger: OpenTelemetryFaasTrigger) -> Self {
30+
Self {
31+
otel_attribute_trigger: trigger,
32+
..self
33+
}
2234
}
2335
}
2436

@@ -33,6 +45,7 @@ where
3345
inner,
3446
flush_fn: self.flush_fn.clone(),
3547
coldstart: true,
48+
otel_attribute_trigger: self.otel_attribute_trigger.to_string(),
3649
}
3750
}
3851
}
@@ -42,6 +55,7 @@ pub struct OpenTelemetryService<S, F> {
4255
inner: S,
4356
flush_fn: F,
4457
coldstart: bool,
58+
otel_attribute_trigger: String,
4559
}
4660

4761
impl<S, F> Service<LambdaInvocation> for OpenTelemetryService<S, F>
@@ -61,7 +75,7 @@ where
6175
let span = tracing::info_span!(
6276
"Lambda function invocation",
6377
"otel.name" = req.context.env_config.function_name,
64-
{ traceconv::FAAS_TRIGGER } = "http",
78+
{ traceconv::FAAS_TRIGGER } = &self.otel_attribute_trigger,
6579
{ traceconv::FAAS_INVOCATION_ID } = req.context.request_id,
6680
{ traceconv::FAAS_COLDSTART } = self.coldstart
6781
);
@@ -114,3 +128,33 @@ where
114128
task::Poll::Ready(ready)
115129
}
116130
}
131+
132+
/// Represent the possible values for the OpenTelemetry `faas.trigger` attribute.
133+
/// See https://opentelemetry.io/docs/specs/semconv/attributes-registry/faas/ for more details.
134+
#[derive(Default, Clone, Copy)]
135+
#[non_exhaustive]
136+
pub enum OpenTelemetryFaasTrigger {
137+
/// A response to some data source operation such as a database or filesystem read/write
138+
#[default]
139+
Datasource,
140+
/// To provide an answer to an inbound HTTP request
141+
Http,
142+
/// A function is set to be executed when messages are sent to a messaging system
143+
PubSub,
144+
/// A function is scheduled to be executed regularly
145+
Timer,
146+
/// If none of the others apply
147+
Other,
148+
}
149+
150+
impl Display for OpenTelemetryFaasTrigger {
151+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
152+
match self {
153+
OpenTelemetryFaasTrigger::Datasource => write!(f, "datasource"),
154+
OpenTelemetryFaasTrigger::Http => write!(f, "http"),
155+
OpenTelemetryFaasTrigger::PubSub => write!(f, "pubsub"),
156+
OpenTelemetryFaasTrigger::Timer => write!(f, "timer"),
157+
OpenTelemetryFaasTrigger::Other => write!(f, "other"),
158+
}
159+
}
160+
}

0 commit comments

Comments
 (0)