Registro em log da função do Lambda no Rust - AWS Lambda

Registro em log da função do Lambda no Rust

nota

O cliente runtime do Rust é um pacote experimental. Ele está sujeito a alterações, e é destinado apenas a fins de avaliação.

AWS Lambdamonitora automaticamente as funções do Lambda em seu nome e envia registros para a Amazon. CloudWatch Sua função Lambda vem com um grupo de CloudWatch registros de registros e um fluxo de registros para cada instância de sua função. O ambiente do runtime do Lambda envia detalhes sobre cada invocação à transmissão de logs e transmite os logs e outras saídas do código de sua função. Para ter mais informações, consulte Usar logs do Amazon CloudWatch com o AWS Lambda. Esta página descreve como produzir a saída de logs usando o código de sua função do Lambda.

Criação de uma função que grava logs

Para gerar os logs do código da sua função, é possível usar qualquer função de log que grave em o stdout ou stderr, como a macro println!. O exemplo a seguir usa println! para imprimir uma mensagem quando o manipulador da função é iniciado e antes de ele terminar.

use lambda_runtime::{service_fn, LambdaEvent, Error}; use serde_json::{json, Value}; async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> { println!("Rust function invoked"); let payload = event.payload; let first_name = payload["firstName"].as_str().unwrap_or("world"); println!("Rust function responds to {}", &first_name); Ok(json!({ "message": format!("Hello, {first_name}!") })) } #[tokio::main] async fn main() -> Result<(), Error> { lambda_runtime::run(service_fn(handler)).await }

Registro em log avançado com a caixa Tracing

O Tracing é uma estrutura para instrumentar programas do Rust para coletar informações de diagnóstico estruturadas e baseadas em eventos. Essa estrutura fornece utilitários para personalizar os níveis e formatos de saída de registro, como a criação de mensagens de log JSON estruturadas. Para usar essa estrutura, é necessário inicializar um subscriber antes de implementar o manipulador de funções. Em seguida, é possível usar macros de rastreamento como debug, info e error para especificar o nível de log desejado para cada cenário.

exemplo — Uso da caixa Tracing

Observe o seguinte:

  • tracing_subscriber::fmt().json(): quando esta opção é incluída, os registros são formatados em JSON. Para usar esta opção, é necessário incluir o recurso json na dependência tracing-subscriber (por exemplo, tracing-subscriber = { version = "0.3.11", features = ["json"] }).

  • #[tracing::instrument(skip(event), fields(req_id = %event.context.request_id))]: esta anotação gera um intervalo toda vez que o manipulador é invocado. O intervalo adiciona o ID da solicitação a cada linha do log.

  • { %first_name }: esta estrutura adiciona o campo first_name à linha do log em que ele é usado. O valor desse campo corresponde à variável com o mesmo nome.

use lambda_runtime::{service_fn, Error, LambdaEvent}; use serde_json::{json, Value}; #[tracing::instrument(skip(event), fields(req_id = %event.context.request_id))] async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> { tracing::info!("Rust function invoked"); let payload = event.payload; let first_name = payload["firstName"].as_str().unwrap_or("world"); tracing::info!({ %first_name }, "Rust function responds to event"); Ok(json!({ "message": format!("Hello, {first_name}!") })) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt().json() .with_max_level(tracing::Level::INFO) // this needs to be set to remove duplicated information in the log. .with_current_span(false) // this needs to be set to false, otherwise ANSI color codes will // show up in a confusing manner in CloudWatch logs. .with_ansi(false) // disabling time is handy because CloudWatch will add the ingestion time. .without_time() // remove the name of the function from every log entry .with_target(false) .init(); lambda_runtime::run(service_fn(handler)).await }

Quando essa função do Rust é invocada, ela imprime duas linhas de log semelhantes às seguintes:

{"level":"INFO","fields":{"message":"Rust function invoked"},"spans":[{"req_id":"45daaaa7-1a72-470c-9a62-e79860044bb5","name":"handler"}]} {"level":"INFO","fields":{"message":"Rust function responds to event","first_name":"David"},"spans":[{"req_id":"45daaaa7-1a72-470c-9a62-e79860044bb5","name":"handler"}]}