For the complete documentation index, see llms.txt. This page is also available as Markdown.

Instrumentação Lambda com Serverless Framework e Elven Plugin

Guia completo para adicionar traces (OpenTelemetry) e logs (Loki) às suas funções Lambda automaticamente usando o plugin do Serverless Framework da Elven.


Sumário

  • Visão geral

  • Pré-requisitos

  • Instalação

  • Quick Start

  • Configuração do plugin

  • Referência de opções

  • Controle por função

  • Variáveis de ambiente injetadas

  • Layers aplicadas

  • Exemplos completos

  • Boas práticas

  • Troubleshooting

  • FAQ


Visão geral

O elven-instrumentation-serverless-plugin automatiza toda a instrumentação das suas funções Lambda. Com uma única configuração no serverless.yml, o plugin:

  1. Adiciona as layers de OpenTelemetry e Elven Log Extension em cada função

  2. Injeta todas as variáveis de ambiente necessárias para traces e logs

  3. Detecta a arquitetura (x86_64/arm64) e aplica as layers corretas

  4. Gera nomes de serviço padronizados automaticamente ({service}_{stage}_{function})

Componente
O que faz

Plugin Serverless

Injeta layers e variáveis de ambiente automaticamente no deploy

Layer OpenTelemetry

Instrumenta o runtime Node.js — gera traces e spans automaticamente

Layer Elven Log Extension

Captura logs da função via Lambda Logs API e envia para Loki


Pré-requisitos

  • Serverless Framework v3 ou v4 instalado

  • Node.js 18+

  • 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

    • API Token

    • Endpoint do seu Collector OTLP


Instalação

Adicione o plugin no serverless.yml:

Verificar instalação:


Quick Start

1. Configure o plugin no serverless.yml

2. Deploy normalmente

O plugin automaticamente:

  • Adiciona as layers de OTel e Log Extension na função

  • Injeta as variáveis de ambiente com nome de serviço minha-api_dev_hello

  • Configura o endpoint OTLP e Loki da Elven

Pronto! Ao invocar a função, traces e logs já aparecem na Elven Observability.

Output do plugin no deploy


Configuração do plugin

Todas as opções ficam dentro de custom.elvenLayerPlugin no serverless.yml:


Referência de opções

Opções obrigatórias

Opção
Descrição
Exemplo

tenant

Tenant ID na Elven Observability

"meu-tenant"

token

API Token de autenticação

"eyJhbGci..."

Opções opcionais

Opção
Default
Descrição

region

us-east-1

Região AWS das layers

collector_endpoint

— (obrigatório)

URL do seu coletor OTLP (ex: https://otel-collector.minha-infra.com:4318)

logs_endpoint

https://loki.elvenobservability.com

URL base do Loki (sem /loki/api/v1/push)

architecture

x86_64

Arquitetura padrão: x86_64 ou arm64

log_version

8

Versão da layer de logs para x86_64

log_version_arm64

7

Versão da layer de logs para arm64

enabled_instrumentations

todas

Instrumentações OTel habilitadas (separadas por vírgula)

disabled_instrumentations

nenhuma

Instrumentações OTel a desabilitar

layers

auto

Override completo da lista de layers (substitui as layers padrão)

Ordem de resolução da arquitetura

A arquitetura é resolvida nesta ordem de precedência:

  1. custom.elvenLayerPlugin.architecture

  2. Variável de ambiente LAMBDA_ARCHITECTURE

  3. provider.architecture do Serverless

  4. Default: x86_64

Para funções individuais, function.architecture tem prioridade sobre o valor global.


Controle por função

Desabilitar instrumentação em uma função específica

Adicione disableElven: true na função:

Output no deploy:

Sobrescrever variáveis por função

O plugin não sobrescreve variáveis de ambiente já definidas na função. Isso permite customizar por função:

Funções com arquiteturas diferentes

O plugin detecta a arquitetura por função e aplica as layers corretas:


Variáveis de ambiente injetadas

O plugin injeta as seguintes variáveis em cada função:

OpenTelemetry (Traces)

Variável
Valor
Descrição

AWS_LAMBDA_EXEC_WRAPPER

/opt/otel-handler

Ativa o wrapper OTel no runtime

OTEL_SERVICE_NAME

{service}_{stage}_{function}

Nome do serviço nos traces

OTEL_TRACES_SAMPLER

always_on

Estratégia de sampling

OTEL_LAMBDA_TRACE_MODE

capture

Modo de captura de traces

OTEL_PROPAGATORS

tracecontext,baggage,xray

Propagadores de contexto

OTEL_RESOURCE_ATTRIBUTES

service.name=...,environment=...

Atributos de recurso

OTEL_EXPORTER_OTLP_ENDPOINT

collector_endpoint

Endpoint OTLP

OTEL_NODE_ENABLED_INSTRUMENTATIONS

lista de instrumentações

Instrumentações habilitadas

OTEL_NODE_DISABLED_INSTRUMENTATIONS

(condicional)

Instrumentações desabilitadas

Elven Log Extension (Logs)

Variável
Valor
Descrição

LOKI_URL

logs_endpoint

URL base do Loki

LOKI_TENANT_ID

tenant

Tenant ID para o Loki

LOKI_AUTH_TOKEN

token

Token de autenticação

DEBUG

false

Debug da log extension

Nota sobre LOKI_URL: O plugin envia apenas a URL base (ex: https://loki.elvenobservability.com). A log extension appenda /loki/api/v1/push automaticamente.

Naming convention automática

O OTEL_SERVICE_NAME segue o padrão:

Exemplo: serviço ecommerce, stage prod, função checkoutecommerce_prod_checkout


Layers aplicadas

O plugin adiciona automaticamente duas layers:

x86_64

Layer
ARN

OpenTelemetry Node.js

arn:aws:lambda:{region}:184161586896:layer:opentelemetry-nodejs-0_20_0:1

Elven Log Extension

arn:aws:lambda:{region}:911167927290:layer:elven-lambda-log-extension:{version}

arm64

Layer
ARN

OpenTelemetry Node.js

arn:aws:lambda:{region}:184161586896:layer:opentelemetry-nodejs-0_20_0:1

Elven Log Extension

arn:aws:lambda:{region}:911167927290:layer:elven-lambda-log-extension-arm64:{version}

Override de layers

Para usar layers customizadas (ex: versão diferente ou layer própria):

Ao definir layers, a seleção automática por arquitetura é desabilitada. Certifique-se de usar as layers corretas para a arquitetura das suas funções.


Exemplos completos

Exemplo 1 — API REST simples

Exemplo 2 — Microserviço com múltiplas arquiteturas

Exemplo 3 — Instrumentações seletivas com funções excluídas

Exemplo 4 — Usando variáveis do Serverless para credenciais

Para não hardcodar credenciais no serverless.yml:

Deploy passando as variáveis:

Ou usando SSM Parameter Store:

Exemplo 5 — Customizar sampling por função


Boas práticas

Credenciais seguras

Nunca hardcode credenciais no serverless.yml. Use uma das opções:

Instrumentações seletivas

Habilite apenas as instrumentações que o projeto realmente usa. Menos instrumentações = cold start mais rápido:

Instrumentações 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

Timeout da função

As layers adicionam ~200-400ms de overhead no cold start. Certifique-se de que o timeout acomoda isso:

Para funções com múltiplas instrumentações, considere 30 segundos.

Memória

Mais memória = mais CPU = cold start mais rápido. Para funções instrumentadas, recomendamos pelo menos 256 MB:

Stages

O plugin usa o stage do Serverless para compor o nome do serviço e o atributo environment:


Troubleshooting

O deploy falha com erro de layer

Sintoma: Erro Layer version arn:aws:lambda:... does not exist.

Causas possíveis:

  1. Região incorreta — A layer não está disponível na região configurada. Verifique region no plugin

  2. Versão inexistente — Verifique se log_version / log_version_arm64 estão corretos

A função falha ao iniciar (timeout ou crash)

Sintoma: Runtime.ExitError ou timeout no cold start.

Verificações:

  1. Timeout muito baixo — Aumente para pelo menos 10 segundos

  2. Layer incompatível com a arquitetura — Verifique se a função arm64 está recebendo a layer arm64

  3. Wrapper incorreto — O plugin seta AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler. Se a layer OTel não estiver presente, isso causa crash

Traces não aparecem na Elven

Sintoma: Função executa normalmente, mas nenhum trace aparece.

Verificações:

  1. Confirme que collector_endpoint está correto

  2. Confirme que o token é válido

  3. Se sobrescreveu OTEL_TRACES_SAMPLER na função, verifique o valor

Logs não aparecem no Loki

Sintoma: Traces funcionam, mas logs não aparecem.

Verificações:

  1. logs_endpoint deve ser a URL base (sem /loki/api/v1/push). A extension adiciona o path automaticamente

    • Correto: https://loki.elvenobservability.com

    • Errado: https://loki.elvenobservability.com/loki/api/v1/push

  2. Confirme que tenant e token estão corretos

  3. Habilite debug temporariamente na função:

Depois invoque e verifique os logs no CloudWatch.

Plugin não aparece no output do deploy

Sintoma: Nenhuma mensagem [Elven] no deploy.

Verificações:

  1. O plugin está na seção plugins do serverless.yml

  2. O pacote está instalado: npm ls elven-instrumentation-serverless-plugin

  3. A seção custom.elvenLayerPlugin existe (mesmo que vazia, o plugin precisa ser listado em plugins)

Variáveis de ambiente não são injetadas

Sintoma: A função não tem as variáveis esperadas.

Causa: O plugin não sobrescreve variáveis já definidas na função. Se você definiu OTEL_SERVICE_NAME manualmente na função, o plugin não vai substituir.

Verificação:


FAQ

Preciso configurar algo em cada função? Não. O plugin instrumenta todas as funções automaticamente. A única configuração necessária é o bloco custom.elvenLayerPlugin com tenant e token.

Posso desabilitar em funções específicas? Sim. Adicione disableElven: true na definição da função.

Funciona com Serverless Framework v4? Sim. O plugin é compatível com v3 e v4 do Serverless Framework.

O plugin funciona com outros runtimes além de Node.js? As layers padrão do plugin são para Node.js. Para outros runtimes (Python, Java, Ruby), use a opção layers para especificar as layers corretas. Consulte a documentação de instrumentação Lambda manual para os ARNs de cada runtime.

O plugin sobrescreve minhas variáveis de ambiente? Não. O plugin só injeta variáveis que não existem na função. Se você definir uma variável manualmente, ela tem prioridade.

O plugin sobrescreve minhas layers? Não. O plugin adiciona as layers sem remover as existentes. Não há duplicação — se a layer já existe, não é adicionada novamente.

Como atualizar a versão das layers? Altere log_version e log_version_arm64 no custom.elvenLayerPlugin. Para a layer OTel, use a opção layers com os ARNs atualizados.

Posso usar com monorepo / múltiplos serverless.yml? Sim. Cada serverless.yml é independente. Use a mesma configuração elvenLayerPlugin em cada um, preferencialmente via variáveis de ambiente ou SSM para evitar duplicação.

Qual o impacto no tamanho do deployment? As layers não contam no limite de 50 MB do pacote de deploy (ZIP). Elas contam no limite total de 250 MB (código + layers descomprimidos).

Posso usar junto com outros plugins do Serverless? Sim. O plugin roda no hook before:package:initialize e não interfere com outros plugins. A ordem no plugins array geralmente não importa.

Como vejo quais variáveis o plugin injetou? Use npx serverless print para ver a configuração completa resolvida, ou verifique direto na AWS:

Last updated

Was this helpful?