lambda_otel_utils/
resource.rsuse opentelemetry::KeyValue;
use opentelemetry_aws::detector::LambdaResourceDetector;
use opentelemetry_sdk::{resource::ResourceDetector, Resource};
use opentelemetry_semantic_conventions as semconv;
use std::env;
use std::time::Duration;
pub fn get_lambda_resource() -> Resource {
let service_name =
match env::var("OTEL_SERVICE_NAME").or_else(|_| env::var("AWS_LAMBDA_FUNCTION_NAME")) {
Ok(name) => name,
Err(_) => "unknown-service".to_string(),
};
Resource::default()
.merge(&LambdaResourceDetector.detect(Duration::default()))
.merge(&Resource::new(vec![
KeyValue::new(semconv::resource::SERVICE_NAME, service_name),
KeyValue::new(semconv::resource::PROCESS_RUNTIME_NAME, "rust"),
KeyValue::new(
semconv::resource::PROCESS_RUNTIME_VERSION,
rustc_version_runtime::version().to_string(),
),
]))
}
#[cfg(test)]
mod tests {
use super::*;
use sealed_test::prelude::*;
#[sealed_test(env = [
("OTEL_SERVICE_NAME", "test-service"),
("AWS_LAMBDA_FUNCTION_NAME", "test-function"),
])]
fn test_get_lambda_resource_with_otel_service_name() {
let resource = get_lambda_resource();
assert_eq!(
resource.get(opentelemetry_semantic_conventions::resource::SERVICE_NAME.into()),
Some("test-service".into())
);
}
#[sealed_test(env = [
("AWS_LAMBDA_FUNCTION_NAME", "test-function"),
])]
fn test_get_lambda_resource_with_aws_lambda_function_name() {
let resource = get_lambda_resource();
assert_eq!(
resource.get(opentelemetry_semantic_conventions::resource::SERVICE_NAME.into()),
Some("test-function".into())
);
}
#[sealed_test]
fn test_get_lambda_resource_without_env_vars() {
let resource = get_lambda_resource();
assert_eq!(
resource.get(opentelemetry_semantic_conventions::resource::SERVICE_NAME.into()),
Some("unknown-service".into())
);
}
#[test]
fn test_runtime_attributes() {
let resource = get_lambda_resource();
assert_eq!(
resource.get(opentelemetry_semantic_conventions::resource::PROCESS_RUNTIME_NAME.into()),
Some("rust".into())
);
let version = resource
.get(opentelemetry_semantic_conventions::resource::PROCESS_RUNTIME_VERSION.into())
.expect("Runtime version should be present");
assert!(
version.to_string().contains('.'),
"Version should be in semver format"
);
}
}