Skip to content

Working example of lambda_http with Opentelemetry and shared client #947

@guillaumefont

Description

@guillaumefont

Hi,

I'm trying to use the new opentelemtry feature with a shared dynamodb client :

use aws_config::BehaviorVersion;

use lambda_http::lambda_runtime::layers::{OpenTelemetryFaasTrigger, OpenTelemetryLayer};
use lambda_http::tower::ServiceBuilder;
use lambda_http::Request;
use lambdas::api::routes::users::get::api_user_list;

use lambdas::utils::telemetry::init_tracer;

#[tokio::main]
async fn main() -> Result<(), lambda_http::Error> {
    let _guard = init_tracer();

    let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
    let db_client = aws_sdk_dynamodb::Client::new(&config);

    // Create a service from the layer and the handler
    let service = ServiceBuilder::new()
        .layer(
            OpenTelemetryLayer::new(|| {
                _guard.tracer_provider.force_flush();
            })
            .with_trigger(OpenTelemetryFaasTrigger::Http),
        )
        .service_fn(|event: Request| async { api_user_list(event, &db_client).await });

    lambda_http::run(service).await?;

    Ok(())
}

And I'm getting the following error :

error[E0277]: the trait bound `layers::otel::OpenTelemetryService<ServiceFn<{closure@packages/lambdas/src/bin/api_user_list.rs:25:21: 25:37}>, {closure@packages/lambdas/src/bin/api_user_list.rs:20:37: 20:39}>: Service<lambda_http::http::Request<lambda_http::Body>>` is not satisfied
   --> packages/lambdas/src/bin/api_user_list.rs:27:5
    |
27  |     lambda_http::run(service).await?;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Service<lambda_http::http::Request<lambda_http::Body>>` is not implemented for `OpenTelemetryService<ServiceFn<{closure@api_user_list.rs:25:21}>, {closure@api_user_list.rs:20:37}>`
    |
    = help: the trait `Service<LambdaInvocation>` is implemented for `layers::otel::OpenTelemetryService<S, F>`
note: required by a bound in `lambda_http::run`
   --> /Users/guillaume/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lambda_http-0.13.0/src/lib.rs:194:8

I can't find a working example of this setup, is it the right way to do it ?

Thanks

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions