Cloud & Infraestrutura

O que Todo Dev Deve Saber sobre AWS X-Ray: Distributed Tracing em Aplicações Serverless e ECS

8 min de leitura

O que Todo Dev Deve Saber sobre AWS X-Ray: Distributed Tracing em Aplicações Serverless e ECS

AWS X-Ray: Entendendo Distributed Tracing Distributed tracing é a capacidade de seguir uma requisição através de múltiplos serviços distribuídos, visualizando latência, erros e gargalos em tempo real. O AWS X-Ray é a solução nativa da AWS para esse problema, permitindo mapear como suas aplicações serverless e containerizadas interagem entre si. Diferentemente de logs tradicionais, X-Ray cria um grafo de serviços mostrando exatamente onde o tempo é gasto. Isso é crítico em arquiteturas serverless, onde você não controla a infraestrutura subjacente e precisa entender comportamentos em "black boxes" como Lambda, DynamoDB e serviços gerenciados. Arquitetura e Componentes Principais Segmentos, Subsegmentos e Anotações No X-Ray, toda requisição gera um segmento (segment), que é o ponto de entrada. Dentro dele, há subsegmentos que representam chamadas a serviços externos (banco de dados, APIs, Lambda). Anotações são metadados-chave que você define para filtrar traces depois. O instrumenta automaticamente chamadas a boto3, requests, sqlalchemy e outras bibliotecas populares. Sem isso, você teria que instrumentar manualmente cada

<h2>AWS X-Ray: Entendendo Distributed Tracing</h2>

<p>Distributed tracing é a capacidade de seguir uma requisição através de múltiplos serviços distribuídos, visualizando latência, erros e gargalos em tempo real. O AWS X-Ray é a solução nativa da AWS para esse problema, permitindo mapear como suas aplicações serverless e containerizadas interagem entre si.</p>

<p>Diferentemente de logs tradicionais, X-Ray cria um grafo de serviços mostrando exatamente onde o tempo é gasto. Isso é crítico em arquiteturas serverless, onde você não controla a infraestrutura subjacente e precisa entender comportamentos em &quot;black boxes&quot; como Lambda, DynamoDB e serviços gerenciados.</p>

<h2>Arquitetura e Componentes Principais</h2>

<h3>Segmentos, Subsegmentos e Anotações</h3>

<p>No X-Ray, toda requisição gera um <strong>segmento</strong> (segment), que é o ponto de entrada. Dentro dele, há <strong>subsegmentos</strong> que representam chamadas a serviços externos (banco de dados, APIs, Lambda). <strong>Anotações</strong> são metadados-chave que você define para filtrar traces depois.</p>

<pre><code class="language-python">from aws_xray_sdk.core import xray_recorder

from aws_xray_sdk.core import patch_all

patch_all() # Instrumenta automaticamente bibliotecas comuns

@xray_recorder.capture(&#039;ProcessarPedido&#039;)

def processar_pedido(pedido_id):

xray_recorder.put_annotation(&#039;pedido_id&#039;, pedido_id)

xray_recorder.put_metadata(&#039;detalhes&#039;, {&#039;status&#039;: &#039;processando&#039;})

Sua lógica aqui

resultado = chamar_servico_externo()

return resultado

def chamar_servico_externo():

import boto3

Boto3 já é instrumentado via patch_all()

dynamodb = boto3.resource(&#039;dynamodb&#039;)

table = dynamodb.Table(&#039;Pedidos&#039;)

return table.get_item(Key={&#039;id&#039;: &#039;123&#039;})</code></pre>

<p>O <code>patch_all()</code> instrumenta automaticamente chamadas a boto3, requests, sqlalchemy e outras bibliotecas populares. Sem isso, você teria que instrumentar manualmente cada chamada.</p>

<h3>Sampling e Políticas de Amostragem</h3>

<p>Registrar cada requisição é custoso. X-Ray usa <strong>sampling rules</strong> para decidir quais traces enviar. Por padrão, envia 1 requisição por segundo + 5% das requisições adicionais.</p>

<pre><code class="language-python"># Configurar regra de sampling customizada

from aws_xray_sdk.core import xray_recorder

from aws_xray_sdk.ext.flask.middleware import XRayMiddleware

from flask import Flask

app = Flask(__name__)

Aplicar X-Ray middleware

XRayMiddleware(app, xray_recorder)

A configuração de sampling acontece via console AWS ou arquivo JSON

Mas você pode criar regras programaticamente via boto3

import boto3

xray_client = boto3.client(&#039;xray&#039;)

xray_client.create_sampling_rule(

SamplingRule={

&#039;ruleName&#039;: &#039;HighTrafficAPI&#039;,

&#039;priority&#039;: 100,

&#039;version&#039;: 1,

&#039;fixedTarget&#039;: 1, # 1 trace por segundo

&#039;rate&#039;: 0.05, # 5% das requisições adicionais

&#039;serviceName&#039;: &#039;*&#039;,

&#039;host&#039;: &#039;*&#039;,

&#039;HTTPMethod&#039;: &#039;*&#039;,

&#039;URLPath&#039;: &#039;/api/*&#039;,

&#039;resourceARN&#039;: &#039;*&#039;

}

)</code></pre>

<p>Isso economiza custos enquanto mantém visibilidade em padrões. APIs de alto tráfego podem usar taxa menor, enquanto endpoints críticos usam 100%.</p>

<h2>Integração com Lambda e ECS</h2>

<h3>Lambda: Instrumentação Simples</h3>

<p>Lambdas já têm X-Ray pré-configurado na conta AWS. Você só precisa habilitar no console ou via IaC.</p>

<pre><code class="language-python"># handler.py - Aplicação Lambda

import json

from aws_xray_sdk.core import xray_recorder

from aws_xray_sdk.core import patch_all

import boto3

patch_all()

def lambda_handler(event, context):

xray_recorder.put_annotation(&#039;requestId&#039;, context.request_id)

Qualquer chamada boto3 aqui será rastreada automaticamente

s3 = boto3.client(&#039;s3&#039;)

resposta = s3.get_object(Bucket=&#039;meu-bucket&#039;, Key=&#039;arquivo.json&#039;)

return {

&#039;statusCode&#039;: 200,

&#039;body&#039;: json.dumps({&#039;mensagem&#039;: &#039;Sucesso&#039;})

}</code></pre>

<pre><code class="language-yaml"># template.yml - SAM para habilitar X-Ray

AWSTemplateFormatVersion: &#039;2010-09-09&#039;

Transform: AWS::Serverless-2016-10-31

Resources:

MinhaFuncao:

Type: AWS::Serverless::Function

Properties:

Handler: handler.lambda_handler

Runtime: python3.11

Tracing: Active # Habilita X-Ray

Policies:

  • AWSXRayDaemonWriteAccess # Permissão necessária</code></pre>

<h3>ECS: Daemon e Configuração de Rede</h3>

<p>Em ECS, você precisa executar o <strong>X-Ray daemon</strong> como um serviço separado. O daemon coleta dados dos containers e envia para AWS.</p>

<pre><code class="language-json">{

&quot;family&quot;: &quot;minha-aplicacao&quot;,

&quot;containerDefinitions&quot;: [

{

&quot;name&quot;: &quot;app&quot;,

&quot;image&quot;: &quot;minha-app:latest&quot;,

&quot;environment&quot;: [

{

&quot;name&quot;: &quot;_X_AMZN_TRACE_ID&quot;,

&quot;value&quot;: &quot;Root=1-5e6722a7-cc2xmpl46db7ae98d0da47ae&quot;

}

],

&quot;links&quot;: [&quot;xray-daemon&quot;]

},

{

&quot;name&quot;: &quot;xray-daemon&quot;,

&quot;image&quot;: &quot;public.ecr.aws/xray/aws-xray-daemon:latest&quot;,

&quot;portMappings&quot;: [

{

&quot;containerPort&quot;: 2000,

&quot;protocol&quot;: &quot;udp&quot;

}

],

&quot;memory&quot;: 256

}

]

}</code></pre>

<p>O container da aplicação comunica com o daemon via UDP na porta 2000. O daemon acumula dados e envia em lotes para X-Ray.</p>

<h2>Análise, Troubleshooting e Boas Práticas</h2>

<h3>Service Map e Análise de Performance</h3>

<p>O <strong>Service Map</strong> no console X-Ray mostra graficamente como seus serviços se conectam, latências médias e taxa de erros. Use-o para identificar gargalos rapidamente.</p>

<p>Filtre por anotações: <code>pedido_id = &quot;12345&quot;</code> mostra todos os traces de um pedido específico através de Lambda → DynamoDB → SQS → SNS. Isso é impossível com logs tradicionais.</p>

<h3>Boas Práticas Essenciais</h3>

<p><strong>1. Use anotações para contexto de negócio:</strong> <code>user_id</code>, <code>tenant_id</code>, <code>campaign_id</code>. Não use dados sensíveis.</p>

<p><strong>2. Defina sampling estratégico:</strong> APIs críticas precisam de sampling alto. Endpoints de health-check podem ter sampling próximo a zero para economizar.</p>

<p><strong>3. Configure alarmes:</strong> Use CloudWatch para alertar quando latência de um subsegmento ultrapassa 500ms ou taxa de erro excede 1%.</p>

<pre><code class="language-python"># Capturar subsegmento personalizado

from aws_xray_sdk.core import xray_recorder

with xray_recorder.capture(&#039;OperacaoBancoDados&#039;):

Tempo dentro deste bloco será rastreado

resultado = executar_query_complexa()

xray_recorder.put_annotation(&#039;resultado_linhas&#039;, len(resultado))</code></pre>

<p><strong>4. Use grupos de traces:</strong> Crie grupos para isolar traces de testes, produção e diferentes clientes. Isso facilita análise e reduz ruído.</p>

<h2>Conclusão</h2>

<p>AWS X-Ray resolve um problema real: visibilidade em arquiteturas distribuídas serverless e containerizadas. Diferentemente de logs agregados, X-Ray mapeia fluxo de requisições completo, mostrando latência por serviço e identificando verdadeiros culpados por lentidão.</p>

<p>O investimento inicial é mínimo: adicione <code>Tracing: Active</code> em Lambda, configure o daemon em ECS e use <code>patch_all()</code> em Python. Os benefícios em troubleshooting justificam rapidamente. Comece com sampling padrão, depois otimize conforme aprende os padrões de sua aplicação.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/xray/latest/devguide/" target="_blank" rel="noopener noreferrer">AWS X-Ray Documentation</a></li>

<li><a href="https://github.com/aws/aws-xray-sdk-python" target="_blank" rel="noopener noreferrer">AWS X-Ray SDK for Python</a></li>

<li><a href="https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html" target="_blank" rel="noopener noreferrer">Instrumenting AWS Lambda with X-Ray</a></li>

<li><a href="https://docs.aws.amazon.com/xray/latest/devguide/xray-daemon-ecs.html" target="_blank" rel="noopener noreferrer">Running the X-Ray Daemon in ECS</a></li>

<li><a href="https://docs.aws.amazon.com/xray/latest/devguide/xray-console-sampling.html" target="_blank" rel="noopener noreferrer">Sampling Rules in AWS X-Ray</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

Como Usar SQS em Profundidade: Standard, FIFO, DLQ e Visibility Timeout em Produção
Como Usar SQS em Profundidade: Standard, FIFO, DLQ e Visibility Timeout em Produção

SQS: Arquitetura e Diferenças Fundamentais AWS SQS (Simple Queue Service) é o...

Como Usar DynamoDB: Data Modeling, GSIs, LSIs e Capacity Modes em Produção
Como Usar DynamoDB: Data Modeling, GSIs, LSIs e Capacity Modes em Produção

Data Modeling no DynamoDB O DynamoDB é um banco de dados NoSQL totalmente ger...

Serverless Framework e AWS SAM: Deploy de Funções Lambda: Do Básico ao Avançado
Serverless Framework e AWS SAM: Deploy de Funções Lambda: Do Básico ao Avançado

Entendendo Serverless Framework vs AWS SAM Serverless Framework e AWS SAM (Se...