AWS Lambda com Elven Observability
Guia completo para adicionar traces (OpenTelemetry) e logs (Loki) às suas funções Lambda usando as layers da Elven — sem necessidade do Serverless Framework.
Sumário
Pré-requisitos
Visão geral da arquitetura
Passo 1 — Identificar a arquitetura da função
Passo 2 — Adicionar as layers
Passo 3 — Configurar as variáveis de ambiente
Passo 4 — Validar a instrumentação
Referência de variáveis de ambiente
Referência de ARNs das layers
Exemplos completos via CLI
Boas práticas
Troubleshooting
Pré-requisitos
AWS CLI v2 instalado e configurado (
aws configure)jq instalado (para manipulação segura de JSON)
Coletor OpenTelemetry (OTLP) implantado na sua infraestrutura (a Elven realiza o deploy do collector no seu ambiente — não é um endpoint compartilhado)
Credenciais da Elven Observability:
TENANT_ID(identificador do seu tenant)API_TOKEN(token de autenticação)
Função Lambda existente com um dos runtimes suportados:
Node.js (18.x, 20.x, 22.x)
Python (3.9, 3.10, 3.11, 3.12)
Java (11, 17, 21)
Ruby (3.2, 3.3)
Visão geral da arquitetura
A instrumentação utiliza duas Lambda Layers que funcionam de forma complementar:
OpenTelemetry SDK
Traces e metrics
Intercepta chamadas HTTP, DB, etc. e envia spans via OTLP. Disponível para Node.js, Python, Java e Ruby
Elven Log Extension
Logs
Captura logs da função via Lambda Logs API e envia para Loki. Funciona com qualquer runtime
Passo 1 — Identificar a arquitetura da função
Antes de começar, verifique a arquitetura da sua função Lambda. Os ARNs das layers variam entre x86_64 e arm64.
Se o retorno for vazio ou
x86_64, use as layers x86_64. Se o retorno forarm64, use as layers arm64.
Passo 2 — Adicionar as layers
ARNs das layers
Substitua {REGIAO} pela região da sua função (ex: us-east-1).
Layer de OpenTelemetry (escolha conforme seu runtime)
Node.js
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-nodejs-0_20_0:1
Python
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-python-0_18_0:2
Java (Agent)
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-javaagent-0_18_0:1
Java (Wrapper)
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-javawrapper-0_18_0:1
Ruby
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-ruby-0_12_0:1
Collector (x86_64)
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-collector-amd64-0_20_0:1
Collector (arm64)
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-collector-arm64-0_20_0:1
Nota: As versões acima são as mais recentes no momento da escrita. Consulte as releases oficiais para verificar se há atualizações.
Java: Use
javaagentpara auto-instrumentação (recomendado) oujavawrapperse preferir instrumentação manual. Não use ambos ao mesmo tempo.
Layer de Logs (Elven Log Extension)
x86_64
arn:aws:lambda:{REGIAO}:911167927290:layer:elven-lambda-log-extension:8
arm64
arn:aws:lambda:{REGIAO}:911167927290:layer:elven-lambda-log-extension-arm64:7
Exemplo combinado
Para uma função Node.js em x86_64:
Para uma função Python em arm64:
Adicionar layers preservando as existentes
Atenção: O comando
--layersda AWS CLI substitui todas as layers da função. O script abaixo preserva as layers já configuradas.
Passo 3 — Configurar as variáveis de ambiente
Atenção: O parâmetro
--environmentda AWS CLI substitui todas as variáveis de ambiente. O script abaixo faz o merge com as existentes para não perder nenhuma configuração.
Script seguro para configurar as variáveis
Descrição das variáveis
Variáveis comuns (todos os runtimes)
AWS_LAMBDA_EXEC_WRAPPER
/opt/otel-handler
Ativa o wrapper OTel que instrumenta o runtime automaticamente
OTEL_SERVICE_NAME
nome-do-servico
Nome do serviço que aparece nos traces
OTEL_TRACES_SAMPLER
always_on
Estratégia de sampling (ver Boas práticas)
OTEL_PROPAGATORS
tracecontext,baggage,xray
Propagadores de contexto habilitados
OTEL_RESOURCE_ATTRIBUTES
service.name=...,environment=...
Atributos de recurso OTel para correlação
OTEL_EXPORTER_OTLP_ENDPOINT
https://otel-collector.sua-infra.com:4318
URL do seu coletor OTLP (implantado na sua infraestrutura)
LOKI_URL
https://loki.elvenobservability.com
URL base do Loki (sem o path /loki/api/v1/push)
LOKI_TENANT_ID
seu-tenant-id
Identificador do tenant no Loki
LOKI_AUTH_TOKEN
seu-api-token
Token de autenticação para o Loki
DEBUG
false
Habilita logs de debug da extension (true ou false)
Variáveis específicas por runtime
Node.js:
OTEL_NODE_ENABLED_INSTRUMENTATIONS
Instrumentações a habilitar, separadas por vírgula (ex: http,express,pg)
OTEL_NODE_DISABLED_INSTRUMENTATIONS
Instrumentações a desabilitar (tem prioridade sobre enabled)
Python:
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
Instrumentações a desabilitar, separadas por vírgula
OTEL_PYTHON_LOG_CORRELATION
true para correlacionar logs com trace IDs
Java:
OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED
true para habilitar todas as instrumentações por padrão
OTEL_JAVAAGENT_DEBUG
true para logs de debug do agent
JAVA_TOOL_OPTIONS
Definido automaticamente pela layer. Não sobrescreva a menos que precise adicionar flags extras
Ruby:
OTEL_RUBY_DISABLED_INSTRUMENTATIONS
Instrumentações a desabilitar, separadas por vírgula
Passo 4 — Validar a instrumentação
4.1. Invocar a função
4.2. Verificar nos logs do CloudWatch
A extension da Elven escreve logs de diagnóstico no CloudWatch. Procure por mensagens com prefixo elven-lambda-log-extension:
4.3. Checklist de validação
Referência de variáveis de ambiente
Variáveis obrigatórias
AWS_LAMBDA_EXEC_WRAPPER
OTel Layer
/opt/otel-handler
OTEL_SERVICE_NAME
OTel Layer
meu-servico-prod
OTEL_EXPORTER_OTLP_ENDPOINT
OTel Layer
https://otel-collector.sua-infra.com:4318
LOKI_URL
Log Extension
https://loki.elvenobservability.com
LOKI_TENANT_ID
Log Extension
meu-tenant
LOKI_AUTH_TOKEN
Log Extension
token-aqui
Variáveis opcionais — OpenTelemetry (todos os runtimes)
OTEL_TRACES_SAMPLER
parentbased_always_on
Estratégia de sampling. Use always_on para capturar tudo ou traceidratio com OTEL_TRACES_SAMPLER_ARG para amostragem
OTEL_TRACES_SAMPLER_ARG
—
Argumento do sampler (ex: 0.1 para 10% com traceidratio)
OTEL_PROPAGATORS
tracecontext,baggage
Propagadores de contexto. Adicione xray se usar X-Ray
OTEL_RESOURCE_ATTRIBUTES
—
Atributos adicionais (ex: service.name=x,environment=prod)
Variáveis opcionais — OpenTelemetry (específicas por runtime)
OTEL_NODE_ENABLED_INSTRUMENTATIONS
Node.js
todas
Instrumentações a habilitar (separadas por vírgula)
OTEL_NODE_DISABLED_INSTRUMENTATIONS
Node.js
—
Instrumentações a desabilitar (prioridade sobre enabled)
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
Python
—
Instrumentações a desabilitar (separadas por vírgula)
OTEL_PYTHON_LOG_CORRELATION
Python
false
Correlacionar logs com trace IDs
OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED
Java
true
Habilitar todas as instrumentações por padrão
OTEL_JAVAAGENT_DEBUG
Java
false
Logs de debug do Java agent
OTEL_RUBY_DISABLED_INSTRUMENTATIONS
Ruby
—
Instrumentações a desabilitar (separadas por vírgula)
Variáveis opcionais — Log Extension
DEBUG
false
Logs de debug da extension no CloudWatch
BUFFER_SIZE
Auto (baseado na memória)
Tamanho do buffer interno de logs
BATCH_SIZE
Auto (baseado na memória)
Quantidade de logs por batch enviado ao Loki
BATCH_TIMEOUT
1s
Tempo máximo antes de enviar um batch parcial
HTTP_TIMEOUT
10s
Timeout das requisições HTTP para o Loki
RETRY_MAX
2
Número de retentativas em caso de falha
RETRY_BACKOFF
100ms
Backoff entre retentativas
Defaults automáticos de buffer/batch: Os valores de
BUFFER_SIZEeBATCH_SIZEsão calculados automaticamente com base na memória da função. Geralmente não é necessário alterar.
< 512 MB
1.000
50
512–1023 MB
5.000
500
>= 1024 MB
10.000
500
Referência de ARNs das layers
Substitua
{REGIAO}pela região da sua função. As layers estão disponíveis em todas as regiões comerciais da AWS. Consulte as releases oficiais para versões atualizadas.
OpenTelemetry — por runtime
Node.js
opentelemetry-nodejs
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-nodejs-0_20_0:1
Python
opentelemetry-python
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-python-0_18_0:2
Java (Agent)
opentelemetry-javaagent
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-javaagent-0_18_0:1
Java (Wrapper)
opentelemetry-javawrapper
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-javawrapper-0_18_0:1
Ruby
opentelemetry-ruby
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-ruby-0_12_0:1
Collector (x86_64)
opentelemetry-collector-amd64
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-collector-amd64-0_20_0:1
Collector (arm64)
opentelemetry-collector-arm64
arn:aws:lambda:{REGIAO}:184161586896:layer:opentelemetry-collector-arm64-0_20_0:1
Quando usar o Collector? O Collector é uma alternativa para cenários avançados onde você precisa de processamento, filtragem ou roteamento de telemetria antes de enviar ao backend. Para a maioria dos casos, as layers de runtime (Node.js, Python, etc.) são suficientes.
Elven Log Extension
x86_64
arn:aws:lambda:{REGIAO}:911167927290:layer:elven-lambda-log-extension:8
arm64
arn:aws:lambda:{REGIAO}:911167927290:layer:elven-lambda-log-extension-arm64:7
Exemplos completos via CLI
Exemplo 1 — Função simples
Script completo copy-paste. Substitua as 5 variáveis no topo:
Exemplo 2 — Instrumentar múltiplas funções de uma vez
Exemplo 3 — Remover instrumentação
Para remover a instrumentação de uma função, é necessário remover as layers e as variáveis de ambiente da Elven:
Boas práticas
Naming convention para OTEL_SERVICE_NAME
OTEL_SERVICE_NAMEUse um padrão consistente que facilite filtrar no painel:
Exemplos: ecommerce_prod_checkout, notifications_staging_sender.
Sampling em produção
Para funções com alto volume de invocações, considere usar amostragem para reduzir custos:
Para funções críticas ou com baixo volume, mantenha always_on.
Instrumentações habilitadas
Habilite apenas as instrumentações que a função realmente utiliza. Isso reduz o overhead de cold start.
Node.js — use OTEL_NODE_ENABLED_INSTRUMENTATIONS:
Instrumentações Node.js disponíveis: http, express, graphql, grpc, hapi, ioredis, koa, mongodb, mysql, net, pg, redis, memcached, mongoose, amqplib, bunyan, cassandra-driver, connect, kafkajs, knex, mysql2, nestjs-core, pino, restify, socket.io, undici, winston
Python — use OTEL_PYTHON_DISABLED_INSTRUMENTATIONS para desabilitar o que não precisa:
Java — o agent instrumenta automaticamente. Para desabilitar algo específico:
Ruby — use OTEL_RUBY_DISABLED_INSTRUMENTATIONS:
Timeout da função
As layers adicionam um overhead no cold start (~200-400ms). Certifique-se de que o timeout da função acomoda esse overhead. Recomendação mínima: 10 segundos para funções leves, 30 segundos para funções com múltiplas instrumentações.
Memória
A log extension usa um buffer em memória proporcional à configuração da função. Para funções com 128 MB, o buffer é conservador. Se você observar mensagens de "buffer full" nos logs do CloudWatch, considere:
Aumentar a memória da função
Ou definir
BATCH_SIZEmenor para flush mais frequente
Troubleshooting
A função falha ao iniciar (erro de timeout ou crash)
Sintoma: A função retorna timeout no cold start ou erro Runtime.ExitError.
Causas possíveis:
AWS_LAMBDA_EXEC_WRAPPERincorreto — Deve ser exatamente/opt/otel-handler. Verifique se a layer OTel está adicionada.Layer incompatível com a arquitetura — Verifique se a layer corresponde à arquitetura da função (x86_64 vs arm64).
Timeout muito baixo — Aumente o timeout da função para pelo menos 10 segundos.
Traces não aparecem na Elven
Sintoma: A função executa normalmente, mas nenhum trace aparece.
Verificações:
Confirme que
AWS_LAMBDA_EXEC_WRAPPERestá definido como/opt/otel-handlerConfirme que
OTEL_EXPORTER_OTLP_ENDPOINTestá apontando para o seu coletor OTLPVerifique se
OTEL_SERVICE_NAMEnão está vazioConfirme que a layer OpenTelemetry está na lista de layers
Logs não aparecem no Loki
Sintoma: Traces funcionam, mas os logs não aparecem.
Verificações:
LOKI_URLdeve ser a URL base (sem/loki/api/v1/push). A extension adiciona o path automaticamente.Correto:
https://loki.elvenobservability.comErrado:
https://loki.elvenobservability.com/loki/api/v1/push
Confirme que
LOKI_TENANT_IDeLOKI_AUTH_TOKENestão preenchidosHabilite
DEBUG=truee verifique os logs da extension no CloudWatch
Logs com mensagem "buffer full"
Sintoma: Nos logs do CloudWatch aparecem warnings com "buffer full".
Causa: A função produz logs mais rápido do que a extension consegue enviar. Isso acontece geralmente em funções com pouca memória (128 MB) e logging intenso.
Soluções:
Aumentar a memória da função (melhora buffer e batch defaults)
Ou ajustar manualmente:
BUFFER_SIZE=5000eBATCH_SIZE=200Reduzir o volume de logs na função (evitar
console.logem loops)
Cold start muito lento
Sintoma: O cold start aumentou mais de 1 segundo após adicionar as layers.
Soluções:
Reduzir as instrumentações habilitadas (
OTEL_NODE_ENABLED_INSTRUMENTATIONS)Aumentar a memória da função (mais CPU = init mais rápido)
Usar Provisioned Concurrency para funções críticas
Erro 401/403 no Loki
Sintoma: Debug mode mostra server error 401 ou server error 403.
Causa: Token de autenticação inválido ou tenant incorreto.
Verificações:
Confirme o valor de
LOKI_AUTH_TOKENno painel da ElvenConfirme o valor de
LOKI_TENANT_IDVerifique se o token não expirou
FAQ
Quais runtimes são suportados? A Elven suporta Node.js, Python, Java e Ruby com as layers oficiais do OpenTelemetry. A layer de logs (Elven Log Extension) funciona com qualquer runtime, incluindo Go e .NET, pois captura logs via Lambda Logs API independente da linguagem.
Posso usar com funções em VPC? Sim. Certifique-se de que a VPC tem acesso à internet (NAT Gateway) ou VPC Endpoints para que as layers consigam enviar dados para os endpoints da Elven.
Qual o impacto no custo da Lambda? As layers adicionam ~10-30ms de overhead por invocação (warm) e ~200-400ms no cold start. O tamanho combinado das layers é de aproximadamente 15-20 MB, que conta no limite de 250 MB de deployment.
Posso usar junto com o AWS X-Ray? Sim. Mantenha xray na lista de OTEL_PROPAGATORS para que os traces sejam correlacionados. No entanto, recomendamos desabilitar o X-Ray Tracing nativo da Lambda para evitar duplicação de dados.
Last updated
Was this helpful?

