Instrumentando AWS Lambda com Elven Observability
Guia para adicionar traces OpenTelemetry e logs em funções AWS Lambda usando as layers da Elven, sem depender do Serverless Framework.
Sumário
Quando usar este guia
Arquitetura
Pré-requisitos
Quick start
Passo 1 - Coletar dados da função
Passo 2 - Escolher as layers
Passo 3 - Aplicar as layers com segurança
Passo 4 - Configurar variáveis de ambiente
Passo 5 - Validar ponta a ponta
Referência de versões e ARNs
Referência de variáveis de ambiente
Scripts completos
Migração de funções antigas com variáveis LOKI
Boas práticas
Troubleshooting
FAQ
Quando usar este guia
Use este guia quando você quer instrumentar funções Lambda manualmente, por AWS CLI, Console AWS, Terraform, CloudFormation, SAM, CDK ou qualquer ferramenta que permita definir layers e variáveis de ambiente.
Se o projeto usa Serverless Framework, prefira o plugin da Elven. Ele injeta layers, versões e variáveis automaticamente:
Instrumentação Lambda com Serverless Framework e Elven Plugin
Este guia manual é útil para:
funções já existentes em produção;
ambientes que não usam Serverless Framework;
rollout controlado por função;
validações e troubleshooting;
IaC que precisa declarar explicitamente cada layer e variável.
Arquitetura
A instrumentação usa duas layers na Lambda:
OpenTelemetry Lambda Layer
Auto-instrumenta o runtime e gera traces, spans e, quando habilitado, métricas
Collector OTLP do cliente
Elven Lambda Log Extension
Captura stdout, stderr e logs de plataforma pela AWS Lambda Logs API
Collector OTLP do cliente
Fluxo completo:
Pontos importantes:
O Collector é do cliente, implantado na infraestrutura do cliente.
O endpoint usado na Lambda é
OTEL_EXPORTER_OTLP_ENDPOINT.Logs, traces e métricas seguem o mesmo caminho lógico: Lambda -> Collector do cliente -> backends.
Credenciais de Loki, Tempo ou Mimir ficam no Collector, não na Lambda.
O tenant é enviado como atributo de recurso (
tenant.id) para o Collector aplicar roteamento/política.
Pré-requisitos
Na máquina de quem vai aplicar:
AWS CLI v2 configurado para a conta da função.
jqinstalado.Permissão para ler e atualizar configuração de Lambda:
lambda:GetFunctionConfigurationlambda:UpdateFunctionConfigurationlambda:GetLayerVersion
Permissão para ler logs no CloudWatch durante validação:
logs:FilterLogEvents
Na infraestrutura do cliente:
Collector OpenTelemetry implantado e acessível pela Lambda.
Receiver OTLP HTTP habilitado, normalmente em
:4318.Pipeline
logshabilitado no Collector.Exporters server-side configurados para os backends da Elven.
Roteamento de tenant configurado no Collector, por endpoint dedicado ou por
tenant.id.
Na Lambda:
Função existente.
Runtime suportado pela layer OTel quando quiser traces automáticos:
Node.js
Python
Java
Ruby
Para logs, a Elven Lambda Log Extension é runtime-agnostic. Ela funciona também com Go, .NET,
provided.al2,provided.al2023e outros runtimes porque lê logs pela AWS Lambda Logs API.
Dados que você precisa saber:
Nome da função
orders-api-prod
Nome real da Lambda
Região AWS
us-east-1
Região onde a função está
Runtime lógico
nodejs
nodejs, python, javaagent, javawrapper ou ruby
Endpoint do Collector
http://otel-collector.internal:4318
Endpoint do Collector do cliente
Tenant Elven
cliente-a
Vai em tenant.id; não é segredo
Ambiente
production
Usado em OTEL_RESOURCE_ATTRIBUTES
Quick start
Para uma função Node.js em us-east-1, x86_64:
Adicione as duas layers:
Configure as variáveis principais:
Esse exemplo é propositalmente curto, mas ele substitui layers e variáveis existentes. Para produção, use os scripts seguros abaixo, que fazem merge e preservam configuração existente.
Passo 1 - Coletar dados da função
Leia a configuração atual antes de alterar qualquer coisa:
Confira especialmente:
Runtime: ajuda a escolher a layer OTel.Architectures:x86_64ouarm64.Layers: para evitar duplicar layer antiga.Environment.Variables: para preservar variáveis já existentes.Timeout: se estiver muito baixo, ajuste antes do rollout.
Passo 2 - Escolher as layers
Você precisa de:
Uma layer OTel oficial conforme o runtime.
Uma layer Elven Log Extension conforme arquitetura e região.
Runtime -> Layer OTel
Versões verificadas nas releases oficiais do projeto open-telemetry/opentelemetry-lambda em 2026-05-15. As releases mais recentes usadas aqui foram publicadas em 2026-05-08.
Node.js
Funções Node.js
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-nodejs-0_22_0:1
Python
Funções Python
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-python-0_20_0:1
Java Agent
Java com auto-instrumentação
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-javaagent-0_20_0:1
Java Wrapper
Java com wrapper/manual
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-javawrapper-0_20_0:1
Ruby
Funções Ruby
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-ruby-0_14_0:1
Fonte oficial: open-telemetry/opentelemetry-lambda releases.
Arquitetura e região -> Elven Log Extension
As versões abaixo foram publicadas pela Elven no account 911167927290 em 2026-05-15.
us-east-1
arn:aws:lambda:us-east-1:911167927290:layer:elven-lambda-log-extension:9
arn:aws:lambda:us-east-1:911167927290:layer:elven-lambda-log-extension-arm64:8
us-east-2
arn:aws:lambda:us-east-2:911167927290:layer:elven-lambda-log-extension:9
arn:aws:lambda:us-east-2:911167927290:layer:elven-lambda-log-extension-arm64:8
us-west-2
arn:aws:lambda:us-west-2:911167927290:layer:elven-lambda-log-extension:9
arn:aws:lambda:us-west-2:911167927290:layer:elven-lambda-log-extension-arm64:8
eu-west-1
arn:aws:lambda:eu-west-1:911167927290:layer:elven-lambda-log-extension:8
arn:aws:lambda:eu-west-1:911167927290:layer:elven-lambda-log-extension-arm64:8
sa-east-1
arn:aws:lambda:sa-east-1:911167927290:layer:elven-lambda-log-extension:8
arn:aws:lambda:sa-east-1:911167927290:layer:elven-lambda-log-extension-arm64:8
Para uma região que não esteja na tabela, confirme com a Elven antes de aplicar. A layer de logs precisa existir na mesma região da função Lambda.
Sobre a layer "collector" oficial
As releases oficiais também publicam:
No padrão Elven, não use essa layer por padrão.
O Collector da Elven para esse fluxo é um serviço de infraestrutura no ambiente do cliente, não um Collector rodando dentro de cada Lambda. Isso reduz overhead de cold start e mantém credenciais dos backends fora das funções.
Use a layer oficial de Collector apenas em cenários avançados e explicitamente desenhados para rodar Collector dentro da Lambda.
Passo 3 - Aplicar as layers com segurança
O parâmetro --layers da AWS CLI substitui a lista inteira de layers. O script abaixo:
preserva layers que não são da Elven/OpenTelemetry Lambda runtime;
remove versões antigas da Elven Log Extension;
remove versões antigas das layers OTel oficiais de runtime;
adiciona a versão correta para runtime, região e arquitetura.
Passo 4 - Configurar variáveis de ambiente
O parâmetro --environment também substitui todas as variáveis da função. Use merge seguro.
Variáveis principais
AWS_LAMBDA_EXEC_WRAPPER
/opt/otel-handler
Sim para traces automáticos
Inicializa a layer OTel antes do handler
OTEL_SERVICE_NAME
orders-api-prod
Sim
Nome do serviço em traces e logs
OTEL_EXPORTER_OTLP_ENDPOINT
http://otel-collector.internal:4318
Sim
Endpoint do Collector do cliente
OTEL_EXPORTER_OTLP_PROTOCOL
http/protobuf
Recomendado
Mantém o protocolo explícito
OTEL_RESOURCE_ATTRIBUTES
service.name=orders-api-prod,environment=prod,tenant.id=cliente-a
Sim
tenant.id é obrigatório no modo OTLP da Elven Log Extension
OTEL_TRACES_SAMPLER
always_on
Recomendado
Ajuste para traceidratio em alto volume
OTEL_PROPAGATORS
tracecontext,baggage,xray
Recomendado
Mantém compatibilidade com contexto AWS/X-Ray
OTEL_LAMBDA_TRACE_MODE
capture
Recomendado
Captura o contexto da invocação Lambda
EXPORTER_MODE
otlp
Sim para logs via Collector
Garante que logs vão para OTLP, não Loki direto
DEBUG
false
Não
Use true só em troubleshooting curto
O que não configurar mais na Lambda
Não configure estas variáveis em novas implantações:
Essas credenciais e headers pertencem ao Collector do cliente. A Lambda deve conhecer apenas:
endpoint OTLP do Collector;
identidade do serviço;
tenant.idcomo atributo de roteamento;opcionalmente um header de autenticação para falar com o Collector, se o cliente exigir.
Auth Lambda -> Collector
O padrão recomendado é Collector em rede privada/VPC-only, sem token na Lambda.
Se o cliente exigir autenticação entre Lambda e Collector, use:
Use headers apenas para autenticar no Collector do cliente. Não coloque token do Loki ou de backend final nessa variável.
Script seguro para aplicar envs
Passo 5 - Validar ponta a ponta
1. Confirme a configuração aplicada
Checklist local na configuração:
Existe uma layer OTel do runtime correto.
Existe uma layer
elven-lambda-log-extensioncompatível com a arquitetura.AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler.OTEL_EXPORTER_OTLP_ENDPOINTaponta para o Collector do cliente.OTEL_RESOURCE_ATTRIBUTEScontémtenant.id=<tenant>.EXPORTER_MODE=otlp.Não há
LOKI_AUTH_TOKENna Lambda.
2. Invoque a função
3. Verifique CloudWatch
Você deve ver a função executando normalmente e, em caso de erro de configuração, mensagens da extension.
4. Verifique o Collector do cliente
Do lado do Collector, procure por entrada OTLP:
traces em
/v1/traces;logs em
/v1/logs;tenant.idpresente nos resource attributes;erros de export para Loki/Tempo/Mimir.
Se o Collector usa Kubernetes:
Se usa VM/systemd:
5. Verifique na Elven Observability
No Grafana/Elven:
procure traces pelo
service.name;confirme que spans da Lambda aparecem;
procure logs pelo mesmo
service.nameou atributos equivalentes;confirme que o tenant correto vê os dados.
Com Loki OTLP nativo, os labels finais podem variar conforme a configuração do Collector/Loki. O padrão da Elven preserva os dados como resource attributes, como:
service.name;faas.name;function.name;cloud.region;tenant.id;aws.lambda.log.type.
Não dependa de labels antigos como function_name em novas consultas, a menos que o Collector tenha uma transformação explícita para isso.
Referência de versões e ARNs
OpenTelemetry Lambda Layers
Fonte: open-telemetry/opentelemetry-lambda releases.
Node.js
layer-nodejs/0.22.0
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-nodejs-0_22_0:1
Python
layer-python/0.20.0
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-python-0_20_0:1
Java Agent
layer-javaagent/0.20.0
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-javaagent-0_20_0:1
Java Wrapper
layer-javaagent/0.20.0
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-javawrapper-0_20_0:1
Ruby
layer-ruby/0.14.0
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-ruby-0_14_0:1
Collector, avançado
layer-collector/0.22.0
arn:aws:lambda:{REGION}:184161586896:layer:opentelemetry-collector-<amd64|arm64>-0_22_0:1
Elven Lambda Log Extension
us-east-1
x86_64
arn:aws:lambda:us-east-1:911167927290:layer:elven-lambda-log-extension:9
us-east-1
arm64
arn:aws:lambda:us-east-1:911167927290:layer:elven-lambda-log-extension-arm64:8
us-east-2
x86_64
arn:aws:lambda:us-east-2:911167927290:layer:elven-lambda-log-extension:9
us-east-2
arm64
arn:aws:lambda:us-east-2:911167927290:layer:elven-lambda-log-extension-arm64:8
us-west-2
x86_64
arn:aws:lambda:us-west-2:911167927290:layer:elven-lambda-log-extension:9
us-west-2
arm64
arn:aws:lambda:us-west-2:911167927290:layer:elven-lambda-log-extension-arm64:8
eu-west-1
x86_64
arn:aws:lambda:eu-west-1:911167927290:layer:elven-lambda-log-extension:8
eu-west-1
arm64
arn:aws:lambda:eu-west-1:911167927290:layer:elven-lambda-log-extension-arm64:8
sa-east-1
x86_64
arn:aws:lambda:sa-east-1:911167927290:layer:elven-lambda-log-extension:8
sa-east-1
arm64
arn:aws:lambda:sa-east-1:911167927290:layer:elven-lambda-log-extension-arm64:8
Referência de variáveis de ambiente
Obrigatórias no padrão Elven OTLP
AWS_LAMBDA_EXEC_WRAPPER
/opt/otel-handler
OTel layer
OTEL_SERVICE_NAME
projeto-stage-funcao
OTel layer e correlação
OTEL_EXPORTER_OTLP_ENDPOINT
endpoint do Collector do cliente
OTel layer e Elven Log Extension
OTEL_RESOURCE_ATTRIBUTES
service.name=...,environment=...,tenant.id=...
OTel resource e roteamento
EXPORTER_MODE
otlp
Elven Log Extension
Recomendadas
OTEL_EXPORTER_OTLP_PROTOCOL
http/protobuf
Protocolo OTLP explícito
OTEL_TRACES_SAMPLER
always_on
Captura todos os traces
OTEL_TRACES_SAMPLER_ARG
vazio
Use com traceidratio
OTEL_PROPAGATORS
tracecontext,baggage,xray
Propagação de contexto
OTEL_LAMBDA_TRACE_MODE
capture
Captura contexto Lambda
DEBUG
false
Debug da Elven Log Extension
Runtime-specific
Node.js
OTEL_NODE_ENABLED_INSTRUMENTATIONS
Lista de instrumentações habilitadas
Node.js
OTEL_NODE_DISABLED_INSTRUMENTATIONS
Lista de instrumentações desabilitadas
Python
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
Lista de instrumentações desabilitadas
Python
OTEL_PYTHON_LOG_CORRELATION
Correlaciona logs com trace IDs quando aplicável
Java
OTEL_INSTRUMENTATION_COMMON_DEFAULT_ENABLED
Habilita instrumentações por padrão
Java
OTEL_JAVAAGENT_DEBUG
Debug do Java agent
Ruby
OTEL_RUBY_DISABLED_INSTRUMENTATIONS
Lista de instrumentações desabilitadas
Elven Log Extension - tuning avançado
BUFFER_SIZE
automático por memória
Tamanho do buffer interno
BATCH_SIZE
automático por memória
Quantidade de logs por envio
BATCH_TIMEOUT
1s
Tempo máximo antes de enviar batch parcial
HTTP_TIMEOUT
10s
Timeout para envio OTLP
RETRY_MAX
2
Tentativas por batch
RETRY_BACKOFF
100ms
Backoff entre tentativas
CB_THRESHOLD
5
Threshold do circuit breaker legado
Defaults automáticos:
Memória da Lambda
BUFFER_SIZE
BATCH_SIZE
< 512 MB
1000
50
512-1023 MB
5000
500
>= 1024 MB
10000
500
Scripts completos
Script único para instrumentar uma função
Este script aplica layers e envs no padrão Elven OTLP.
Instrumentar múltiplas funções
Use este modelo quando várias funções compartilham runtime, região, tenant e Collector:
Salve o script anterior como instrument-one-lambda.sh e reutilize.
Remover instrumentação Elven
Remove as layers da Elven/OTel runtime e variáveis adicionadas por este guia, preservando o resto:
Migração de funções antigas com variáveis LOKI
Versões antigas da Elven Log Extension enviavam logs direto para Loki usando:
Esse modelo foi substituído pelo padrão OTLP:
Estratégia recomendada:
Atualize a layer para a versão nova.
Configure o Collector do cliente com pipeline
logs.Em uma função piloto, use
EXPORTER_MODE=bothtemporariamente.Compare volume e exemplos de logs por 24h.
Troque para
EXPORTER_MODE=otlp.Remova
LOKI_AUTH_TOKENda Lambda.Depois da janela de rollback, remova
LOKI_URLeLOKI_TENANT_ID.
Rollback imediato:
Use rollback apenas durante a migração. O estado desejado é não manter token de Loki na Lambda.
Boas práticas
Nome de serviço
Use nomes estáveis e fáceis de filtrar:
Exemplos:
Mantenha OTEL_SERVICE_NAME e service.name em OTEL_RESOURCE_ATTRIBUTES com o mesmo valor.
Tenant
tenant.id é obrigatório no padrão Elven OTLP:
Ele não é segredo. Ele serve para o Collector aplicar roteamento, isolamento e política de export.
Segurança
O Collector deve estar em endpoint privado sempre que possível.
Permita acesso apenas das subnets/security groups das Lambdas esperadas.
Não coloque token de Loki, Tempo ou Mimir na Lambda.
Se precisar autenticar Lambda -> Collector, use token específico do Collector em
OTEL_EXPORTER_OTLP_HEADERS.Não exponha o Collector publicamente sem autenticação e allowlist.
Sampling
Para funções críticas ou baixo volume:
Para alto volume:
0.1 significa 10% dos traces.
Cold start
Layers aumentam o tempo de init. Para reduzir impacto:
habilite só instrumentações necessárias;
evite debug permanente;
prefira Collector fora da Lambda;
aumente memória quando a função é muito limitada;
use provisioned concurrency em funções sensíveis.
Logs
Evite
console.logem loops muito intensos.Prefira logs estruturados JSON.
Não escreva segredos em logs.
Se aparecer
buffer full, reduza volume de logs ou aumente memória.
Troubleshooting
Função não inicia ou dá timeout no cold start
Verifique:
AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler.A layer OTel corresponde ao runtime.
A layer Elven Log Extension corresponde à arquitetura.
O timeout da função não está baixo demais.
Não há duas versões da mesma extension na lista de layers.
Comando útil:
Traces não aparecem
Verifique:
A layer OTel está presente.
AWS_LAMBDA_EXEC_WRAPPERestá correto.OTEL_EXPORTER_OTLP_ENDPOINTaponta para o Collector do cliente.A Lambda consegue acessar o Collector por rede.
O Collector tem receiver OTLP HTTP em
4318.O Collector tem pipeline de traces exportando para Tempo.
No Collector:
Logs não aparecem
Verifique:
A layer
elven-lambda-log-extensionestá presente.EXPORTER_MODE=otlp.OTEL_EXPORTER_OTLP_ENDPOINTestá definido.OTEL_RESOURCE_ATTRIBUTEScontémtenant.id.O Collector tem pipeline
logs.O Collector exporta logs para Loki via configuração server-side.
Não procure LOKI_AUTH_TOKEN na Lambda. No modelo novo, ele não deve estar lá.
Erro tenant.id is required
tenant.id is requiredA extension exige tenant.id em OTLP para evitar logs sem contexto de tenant.
Corrija:
Erro 401/403 ao exportar logs
No modelo novo, 401/403 normalmente acontece do Collector para o backend, não da Lambda para Loki.
Verifique no Collector:
header
X-Scope-OrgID;token server-side do Loki;
endpoint Loki OTLP;
roteamento por
tenant.id.
Se o erro for Lambda -> Collector, verifique OTEL_EXPORTER_OTLP_HEADERS e a política de rede/autenticação do Collector.
Logs aparecem em CloudWatch, mas não na Elven
CloudWatch sempre recebe logs da Lambda. A Elven Log Extension lê esses logs pela Lambda Logs API e envia para o Collector.
Se CloudWatch tem logs e a Elven não:
valide se a extension iniciou;
valide se
/logsda extension recebeu batches;valide se o Collector recebeu
/v1/logs;valide export do Collector para Loki.
Habilite debug por poucos minutos:
Depois da validação, volte DEBUG=false.
buffer full
buffer fullSintoma: CloudWatch mostra warning de log descartado por buffer cheio.
Causas comuns:
função escreve muitos logs em pouco tempo;
Collector está lento ou indisponível;
timeout/retry segurando o worker;
função com pouca memória.
Ações:
reduza volume de logs;
aumente memória da função;
reduza
BATCH_SIZEpara flush mais frequente;valide latência e disponibilidade do Collector;
mantenha
HTTP_TIMEOUTrazoável para não bloquear a Lambda por muito tempo.
Labels antigos no Loki não funcionam
Consultas antigas podem usar labels como:
No fluxo OTLP nativo, use os atributos padronizados:
ou filtros por metadata conforme a configuração do Loki/Collector.
Se uma query antiga precisa continuar funcionando, configure transformação no Collector com cuidado para evitar cardinalidade excessiva.
FAQ
A telemetria vai para um endpoint compartilhado da Elven?
Não. A Lambda envia OTLP para o Collector do cliente. Esse Collector fica na infraestrutura do cliente e encaminha para os backends configurados pela Elven.
Preciso colocar LOKI_AUTH_TOKEN na Lambda?
LOKI_AUTH_TOKEN na Lambda?Não no modelo atual. O token de Loki fica server-side no Collector.
Preciso da layer oficial opentelemetry-collector na Lambda?
opentelemetry-collector na Lambda?Não no padrão Elven. O Collector roda como componente de infraestrutura do cliente. A layer de Collector só é indicada para casos avançados.
A Elven Log Extension funciona com Go ou .NET?
Sim para logs. Ela captura logs pela Lambda Logs API e independe do runtime.
Para traces automáticos em Go/.NET, use instrumentação adequada ao runtime ou instrumentação manual. A tabela de layers OTel oficiais deste guia cobre Node.js, Python, Java e Ruby.
Posso usar com função em VPC?
Sim. Garanta rota privada ou NAT/security group para a Lambda alcançar o Collector do cliente.
Posso usar X-Ray junto?
Sim, mantendo xray em OTEL_PROPAGATORS. Em geral, evite habilitar export duplicado para dois sistemas sem necessidade.
Quando a versão mudar, atualize os ARNs da layer OTel no IaC ou scripts de rollout.
Last updated
Was this helpful?

