Closed
Description
I'm trying the layering of runtime feature
Below code failed with "_X_AMZN_TRACE_ID not set"
error. It seems the environment variable is unset here. How can I create a span using OpenTelemetry SDK (not tracing crate) whose trace id is retrieved from _X_AMZN_TRACE_ID
environment variable?
fn init_observability() -> Result<TracerProvider, Error> {
let export_config = ExportConfig {
endpoint: "http://0.0.0.0:4317".to_string(),
timeout: std::time::Duration::from_secs(3),
protocol: Protocol::Grpc,
};
let exporter = opentelemetry_otlp::new_exporter()
.tonic()
.with_export_config(export_config)
.build_span_exporter()
.expect("building exporter failed");
let tracer_provider = TracerProvider::builder()
.with_batch_exporter(exporter, opentelemetry_sdk::runtime::Tokio)
.with_config(
trace::config()
.with_resource(Resource::new(vec![KeyValue::new("service.name", "lambda")])),
)
.build();
let fmt_layer = fmt::layer().event_format(format().json());
let filter_layer = EnvFilter::from_default_env();
let telemetry_layer =
tracing_opentelemetry::OpenTelemetryLayer::new(tracer_provider.tracer("my-app"));
tracing_subscriber::registry()
.with(filter_layer)
.with(fmt_layer)
.with(telemetry_layer)
.init();
Ok(tracer_provider)
}
fn get_span_context_from_environment_var() -> Result<SpanContext, &'static str> {
let xray_trace_id =
std::env::var("_X_AMZN_TRACE_ID").map_err(|_| "_X_AMZN_TRACE_ID not set")?;
span_context_from_str(&xray_trace_id).ok_or("Invalid _X_AMZN_TRACE_ID")
}
#[tokio::main]
async fn main() -> Result<(), Error> {
let tracer_provider = init_observability()?;
let func = service_fn(handler);
// Initialize the Lambda runtime and add OpenTelemetry tracing
let runtime = Runtime::new(func).layer(OpenTelemetryLayer::new(|| {
// Make sure that the trace is exported before the Lambda runtime is frozen
tracer_provider.force_flush();
}));
runtime.run().await?;
Ok(())
}
async fn handler(event: LambdaEvent<S3Event>) -> Result<Value, Error> {
info!("Handler is called");
let parent_context = match get_span_context_from_environment_var() {
Ok(context) => context,
Err(e) => {
error!(
"get_span_context_from_environment_var raised error: {:?}",
e
);
return Err(e.into());
}
};
// ...
let labels = detect_labels(client, argument)
.with_context(Context::new().with_remote_span_context(parent_context))
.await?;
Ok(json!({ "message": format!("Labels is {:?}!", labels) }))
}
Metadata
Metadata
Assignees
Labels
No labels