Configurar o X-Ray SDK para Ruby - AWS X-Ray

Configurar o X-Ray SDK para Ruby

O X-Ray SDK para Ruby tem uma classe chamada XRay.recorder, que fornece o gravador global. Você pode configurar o gravador global para personalizar o middleware que cria segmentos para chamadas HTTP de entrada.

Plug-ins de serviço

Use plugins para registrar informações sobre o serviço que hospeda a aplicação.

Plug-ins
  • Amazon EC2: o ec2 adiciona o ID de instância e a zona de disponibilidade.

  • Elastic Beanstalk: o elastic_beanstalk adiciona o nome do ambiente, o rótulo da versão e o ID de implantação.

  • Amazon ECS: o ecs adiciona o ID do contêiner.

Segment - Scorekeep overview showing Elastic Beanstalk and EC2 deployment details.

Para usar plug-ins, você deve especificá-los no objeto de configuração que passa ao gravador.

exemplo main.rb: configuração do plug-in
my_plugins = %I[ec2 elastic_beanstalk] config = { plugins: my_plugins, name: 'my app', } XRay.recorder.configure(config)

Você também pode usar variáveis de ambiente, que têm precedência sobre valores definidos no código, para configurar o gravador.

O SDK também usa as configurações do plug-in para definir o campo origin no segmento. Isso indica o tipo de recurso da AWS que executa a aplicação. Quando você utiliza vários plug-ins, o SDK usa a seguinte ordem de resolução para determinar a origem: ElasticBeanstalk > EKS > ECS > EC2.

Regras de amostragem

O SDK usa as regras de amostragem que você define no console do X-Ray para determinar quais solicitações serão registradas. A regra padrão rastreia a primeira solicitação a cada segundo e 5% de todas as solicitações adicionais em todos os serviços que enviam rastreamentos ao X-Ray. Crie regras adicionais no console do X-Ray para personalizar a quantidade de dados registrados para cada uma das aplicações.

O SDK aplica regras personalizadas na ordem em que elas estão definidas. Se uma solicitação corresponder a várias regras personalizadas, o SDK aplicará somente a primeira regra.

nota

Se o SDK não conseguir acessar o X-Ray para obter regras de amostragem, ele reverterá para uma regra local padrão da primeira solicitação a cada segundo e 5% de todas as solicitações adicionais por host. Isso pode ocorrer se o host não tiver permissão para chamar APIs de amostragem ou não conseguir se conectar ao daemon do X-Ray, que atua como um proxy de TCP para chamadas de API feitas pelo SDK.

Você também pode configurar o SDK para carregar regras de amostragem de um documento JSON. O SDK pode usar regras locais como backup para casos em que a amostragem do X-Ray não está disponível ou usar exclusivamente regras locais.

exemplo sampling-rules.json
{ "version": 2, "rules": [ { "description": "Player moves.", "host": "*", "http_method": "*", "url_path": "/api/move/*", "fixed_target": 0, "rate": 0.05 } ], "default": { "fixed_target": 1, "rate": 0.1 } }

Este exemplo define uma regra personalizada e uma regra padrão. A regra personalizada aplica uma taxa de amostragem de 5% sem um número mínimo de solicitações para rastrear os caminhos em /api/move/. A regra padrão rastreia a primeira solicitação a cada segundo e 10% das solicitações adicionais.

A desvantagem de definir regras localmente é que o destino fixo é aplicado por instância do gravador de forma independente, em vez de ser gerenciado pelo serviço X-Ray. À medida que você implanta mais hosts, a taxa fixa é multiplicada, dificultando o controle da quantidade de dados registrados.

Para configurar regras de backup, defina um hash para o documento no objeto de configuração que você passa para o gravador.

exemplo main.rb: configuração da regra de backup
require 'aws-xray-sdk' my_sampling_rules = { version: 1, default: { fixed_target: 1, rate: 0.1 } } config = { sampling_rules: my_sampling_rules, name: 'my app', } XRay.recorder.configure(config)

Para armazenar as regras de amostragem de forma independente, defina o hash em um arquivo separado e exija que o arquivo o inclua em seu aplicativo.

exemplo config/sampling-rules.rb
my_sampling_rules = { version: 1, default: { fixed_target: 1, rate: 0.1 } }
exemplo main.rb: regra de amostragem de um arquivo
require 'aws-xray-sdk' require 'config/sampling-rules.rb' config = { sampling_rules: my_sampling_rules, name: 'my app', } XRay.recorder.configure(config)

Para usar apenas regras locais, exija as regras de amostragem e configure o LocalSampler.

exemplo main.rb: amostragem de regra local
require 'aws-xray-sdk' require 'aws-xray-sdk/sampling/local/sampler' config = { sampler: LocalSampler.new, name: 'my app', } XRay.recorder.configure(config)

Você também pode configurar o gravador global para desabilitar a amostragem e instrumentar todas as solicitações de entrada.

exemplo main.rb: desabilitar a amostragem
require 'aws-xray-sdk' config = { sampling: false, name: 'my app', } XRay.recorder.configure(config)

Registro em log

Por padrão, o gravador encaminha os eventos informativos para $stdout. Você pode personalizar o registro em log definindo um registrador no objeto de configuração que você passa para o gravador.

exemplo main.rb: registrar em log
require 'aws-xray-sdk' config = { logger: my_logger, name: 'my app', } XRay.recorder.configure(config)

Use logs de depuração para identificar problemas como subsegmentos não fechados ao gerar subsegmentos manualmente.

Configuração do gravador no código

Configurações adicionais estão disponíveis no método configure no XRay.recorder.

  • context_missing: defina como LOG_ERROR para evitar o lançamento de exceções, caso o código instrumentado tente registrar dados quando nenhum segmento estiver aberto.

  • daemon_address: defina o host e a porta do receptor do daemon do X-Ray.

  • name: defina um nome de serviço para o SDK usar para segmentos.

  • naming_pattern: defina um nome de domínio padrão para usar a nomeação dinâmica.

  • plugins: registre informações sobre os recursos da AWS de sua aplicação com plug-ins.

  • sampling: defina como false para desabilitar a amostragem.

  • sampling_rules: defina o hash que contém suas regras de amostragem.

exemplo main.rb: desabilitar exceções de contexto ausente
require 'aws-xray-sdk' config = { context_missing: 'LOG_ERROR' } XRay.recorder.configure(config)

Configuração do gravador com o rails

Se você usa a estrutura do Rails, pode configurar as opções do gravador global em um arquivo Ruby em app_root/initializers. O X-Ray SDK aceita uma chave de configuração adicional para usar com o Rails.

  • active_record: defina como true para registrar os subsegmentos das transações de banco de dados de registros ativos.

Defina as configurações disponíveis em um objeto de configuração denominado Rails.application.config.xray.

exemplo config/initializers/aws_xray.rb
Rails.application.config.xray = { name: 'my app', patch: %I[net_http aws_sdk], active_record: true }

Variáveis de ambiente

É possível usar variáveis de ambiente para configurar o X-Ray SDK para Ruby. O SDK é compatível com as seguintes variáveis:

  • AWS_XRAY_TRACING_NAME: defina um nome de serviço para o SDK usar para segmentos. Sobrepõe o nome do serviço que você definiu na estratégia de nomeação de segmentos do filtro do servlet.

  • AWS_XRAY_DAEMON_ADDRESS: defina o host e a porta do receptor do daemon do X-Ray. Por padrão, o SDK envia dados de rastreamento para 127.0.0.1:2000. Use essa variável se você tiver configurado o daemon para escutar em uma porta diferente ou se ele estiver sendo executado em um host diferente.

  • AWS_XRAY_CONTEXT_MISSING: defina como RUNTIME_ERROR para lançar exceções, caso o código instrumentado tente registrar dados quando nenhum segmento estiver aberto.

    Valores válidos
    • RUNTIME_ERROR: lance uma exceção de tempo de execução.

    • LOG_ERROR: registre um erro e continue (padrão).

    • IGNORE_ERROR: ignore o erro e continue.

    Erros relativos a segmentos ou subsegmentos ausentes poderão ocorrer quando você tentar usar um cliente instrumentado no código de inicialização que é executado quando nenhuma solicitação estiver aberta ou em um código que gere um novo thread.

As variáveis de ambiente substituem os valores definidos no código.