Rastrear solicitações de entrada com o middleware do X-Ray SDK para Python - AWS X-Ray

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Rastrear solicitações de entrada com o middleware do X-Ray SDK para Python

Quando você adiciona o middleware à aplicação e configura o nome do segmento, o X-Ray SDK para Python cria um segmento para cada solicitação amostrada. Este segmento inclui tempo, método e disposição da solicitação HTTP. Instrumentação adicional cria subsegmentos sobre esse segmento.

O X-Ray SDK para Python é compatível com o seguinte middleware para instrumentar as solicitações HTTP de entrada:

  • Django

  • Flask

  • Bottle

nota

Para funções do AWS Lambda, o Lambda cria um segmento para cada solicitação amostrada. Consulte AWS Lambda e AWS X-Ray para obter mais informações.

Consulte Operador para ver um exemplo de função do Python instrumentada no Lambda.

Para scripts ou aplicativos Python em outras estruturas, você pode criar segmentos manualmente.

Cada segmento tem um nome que identifica a aplicação no mapa de serviços. O segmento pode ser nomeado estaticamente ou você pode configurar o SDK para nomeá-lo dinamicamente com base no cabeçalho do host na solicitação de entrada. A nomeação dinâmica permite agrupar rastreamentos com base no nome de domínio na solicitação e aplicar um nome padrão se o nome não corresponder ao padrão esperado (por exemplo, se o cabeçalho do host for falsificado).

Solicitações encaminhadas

Se um balanceador de carga ou outro intermediário encaminhar uma solicitação para a aplicação, o X-Ray obterá o IP do cliente do cabeçalho X-Forwarded-For na solicitação em vez do IP de origem no pacote IP. O IP do cliente registrado para uma solicitação encaminhada pode ser falsificado; portanto, não é digno de confiança.

Quando uma solicitação é encaminhada, o SDK define um campo adicional no segmento para indicar isso. Se o segmento tiver o campo x_forwarded_for definido como true, isso significa que o IP do cliente foi obtido no cabeçalho X-Forwarded-For na solicitação HTTP.

O middleware cria um segmento para cada solicitação de entrada com um bloco http contendo as seguintes informações:

  • Método HTTP: GET, POST, PUT, DELETE etc.

  • Endereço do cliente: o endereço IP do cliente que enviou a solicitação.

  • Código de resposta: o código de resposta HTTP da solicitação concluída.

  • Horário: a hora de início (quando a solicitação foi recebida) e a hora de término (quando a resposta foi enviada).

  • Agente do usuário: o user-agent da solicitação.

  • Tamanho do conteúdo: o content-length da resposta.

Adicionar o middleware a seu aplicativo (Django)

Adicione o middleware à lista de MIDDLEWARE em seu arquivo settings.py. O middleware do X-Ray deve ser a primeira linha em seu arquivo settings.py para garantir que as solicitações com falha em outro middleware sejam gravadas.

exemplo settings.py: middleware do X-Ray SDK para Python
MIDDLEWARE = [ 'aws_xray_sdk.ext.django.middleware.XRayMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware' ]

Adicione a aplicação Django do X-Ray SDK à lista INSTALLED_APPS em seu arquivo settings.py. Isso permitirá que o gravador do X-Ray seja configurado durante a inicialização da aplicação.

exemplo settings.py: aplicação Django do X-Ray SDK para Python
INSTALLED_APPS = [ 'aws_xray_sdk.ext.django', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]

Configure um nome de segmento em seu arquivo settings.py.

exemplo settings.py: nome do segmento
XRAY_RECORDER = { 'AWS_XRAY_TRACING_NAME': 'My application', 'PLUGINS': ('EC2Plugin',), }

Isso instrui o gravador do X-Ray a rastrear solicitações atendidas pela aplicação Django com a taxa de amostragem padrão. Você pode configurar o gravador com seu arquivo de configurações do Django para aplicar regras de amostragem personalizadas ou alterar outras configurações.

nota

Como os plugins são passados como uma tupla, inclua uma , à direita ao especificar um único plug-in. Por exemplo, plugins = ('EC2Plugin',)

Adicionar o middleware a seu aplicativo (Flask)

Para instrumentar seu aplicativo Flask, primeiro configure um nome de segmento no xray_recorder. Em seguida, use a função XRayMiddleware para corrigir seu aplicativo Flask no código.

exemplo app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.flask.middleware import XRayMiddleware app = Flask(__name__) xray_recorder.configure(service='My application') XRayMiddleware(app, xray_recorder)

Isso instrui o gravador do X-Ray a rastrear solicitações atendidas pela aplicação Flask com a taxa de amostragem padrão. Você pode configurar o gravador em código para aplicar regras de amostragem personalizadas ou alterar outras configurações.

Adicionar o middleware a seu aplicativo (Bottle)

Para instrumentar seu aplicativo Bottle, primeiro configure um nome de segmento no xray_recorder. Depois, use a função XRayMiddleware para corrigir seu aplicativo Bottle no código.

exemplo app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.bottle.middleware import XRayMiddleware app = Bottle() xray_recorder.configure(service='fallback_name', dynamic_naming='My application') app.install(XRayMiddleware(xray_recorder))

Isso instrui o gravador do X-Ray a rastrear solicitações atendidas pela aplicação Bottle com a taxa de amostragem padrão. Você pode configurar o gravador em código para aplicar regras de amostragem personalizadas ou alterar outras configurações.

Instrumentar código Python manualmente

Se você não usar o Django ou o Flask, pode criar segmentos manualmente. Você pode criar um segmento para cada solicitação de entrada ou criar segmentos para clientes HTTP ou do SDK da AWS corrigidos a fim de fornecer contexto para o gravador adicionar subsegmentos.

exemplo main.py: instrumentação manual
from aws_xray_sdk.core import xray_recorder # Start a segment segment = xray_recorder.begin_segment('segment_name') # Start a subsegment subsegment = xray_recorder.begin_subsegment('subsegment_name') # Add metadata and annotations segment.put_metadata('key', dict, 'namespace') subsegment.put_annotation('key', 'value') # Close the subsegment and segment xray_recorder.end_subsegment() xray_recorder.end_segment()

Configurar uma estratégia de nomeação de segmentos

O AWS X-Ray usa um nome de serviço para identificar a aplicação e diferenciá-la de outras aplicações, bancos de dados, APIs externas e recursos da AWS que a aplicação usa. Quando o X-Ray SDK gera segmentos para solicitações recebidas, ele registra o nome do serviço da aplicação no campo de nome do segmento.

O X-Ray SDK pode nomear segmentos com o nome do host no cabeçalho da solicitação HTTP. No entanto, esse cabeçalho pode ser falsificado, o que pode resultar em nós inesperados no mapa de serviço. Para evitar que o SDK nomeie segmentos incorretamente devido a solicitações com cabeçalhos de host falsificados, você deve especificar um nome padrão para as solicitações recebidas.

Se a aplicação atende a solicitações para vários domínios, você pode configurar o SDK para usar uma estratégia de nomeação dinâmica para refletir isso nos nomes dos segmentos. Uma estratégia de nomeação dinâmica permite que o SDK use o nome do host para solicitações que correspondam a um padrão esperado e aplique o nome padrão às solicitações que não correspondem.

Por exemplo, você pode ter uma única aplicação para atender a solicitações para três subdomínios: www.example.com, api.example.com e static.example.com Você pode usar uma estratégia de nomeação dinâmica com o padrão *.example.com a fim de identificar segmentos para cada subdomínio com um nome diferente, o que resulta em três nós de serviço no mapa de serviços. Se a aplicação receber solicitações com um nome de host que não corresponda ao padrão, você verá um quarto nó no mapa de serviços com um nome alternativo especificado por você.

Para usar o mesmo nome para todos os segmentos de solicitação, especifique o nome da aplicação ao configurar o gravador, conforme mostrado nas seções anteriores.

Uma estratégia de nomeação dinâmica define um padrão com o qual os nomes de host devem corresponder e um nome padrão a ser usado se o nome do host na solicitação HTTP não corresponder ao padrão. Para nomear segmentos dinamicamente no Django, adicione a configuração DYNAMIC_NAMING a seu arquivo settings.py.

exemplo settings.py: nomeação dinâmica
XRAY_RECORDER = { 'AUTO_INSTRUMENT': True, 'AWS_XRAY_TRACING_NAME': 'My application', 'DYNAMIC_NAMING': '*.example.com', 'PLUGINS': ('ElasticBeanstalkPlugin', 'EC2Plugin') }

Você pode usar '*' no padrão para fazer a correspondência com qualquer string ou '?' para um caractere único. Para o Flask, configure o gravador no código.

exemplo main.py: nome do segmento
from aws_xray_sdk.core import xray_recorder xray_recorder.configure(service='My application') xray_recorder.configure(dynamic_naming='*.example.com')
nota

Você pode sobrepor o nome do serviço padrão que definiu no código com a variável de ambiente AWS_XRAY_TRACING_NAME.