Migrar para o Node.js OpenTelemetry - 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á.

Migrar para o Node.js OpenTelemetry

Esta seção explica como migrar seus aplicativos Node.js do X-Ray SDK para o. OpenTelemetry Ele abrange abordagens de instrumentação automática e manual e fornece exemplos específicos para casos de uso comuns.

O X-Ray Node.js SDK ajuda você a instrumentar manualmente seus aplicativos Node.js para rastreamento. Esta seção fornece exemplos de código para migrar do X-Ray para a OpenTelemetry instrumentação.

Soluções de instrumentação automática de código zero

Para rastrear solicitações com o X-Ray SDK para Node.js, você deve modificar o código do aplicativo. Com OpenTelemetry, você pode usar soluções de instrumentação automática de código zero para rastrear solicitações.

Instrumentação automática de código zero com instrumentações automáticas OpenTelemetry baseadas.

  1. Usando a AWS distro para instrumentação automática OpenTelemetry (ADOT) para Node.js — Para instrumentação automática para o aplicativo Node.js, consulte Rastreamento e métricas com a distribuição para instrumentação automática. AWS OpenTelemetry JavaScript

    (Opcional) Você também pode ativar o CloudWatch Application Signals ao instrumentar automaticamente seus aplicativos AWS com a JavaScript instrumentação automática ADOT para monitorar a integridade atual do aplicativo e acompanhar o desempenho de longo prazo do aplicativo em relação aos seus objetivos de negócios. O Application Signals fornece uma visualização unificada e centrada em aplicações para aplicações, serviços e dependências, além de ajudar você a monitorar e realizar a triagem da integridade da aplicação. Para obter mais informações, consulte Application Signals.

  2. Usando a instrumentação automática de OpenTelemetry JavaScript código zero — Para instrumentação automática com o, consulte instrumentação de código zero. OpenTelemetry JavaScript JavaScript

Soluções de instrumentação manual

Tracing setup with X-Ray SDK

Quando o X-Ray SDK para Node.js foi usado, o aws-xray-sdk pacote precisou configurar o X-Ray SDK com plug-ins de serviço ou regras de amostragem locais antes de usar o SDK para instrumentar seu código.

var AWSXRay = require('aws-xray-sdk'); AWSXRay.config([AWSXRay.plugins.EC2Plugin,AWSXRay.plugins.ElasticBeanstalkPlugin]); AWSXRay.middleware.setSamplingRules(<path to file>);
Tracing setup with OpenTelemetry SDK
nota

AWS No momento, o X-Ray Remote Sampling não está disponível para configuração para OpenTelemetry JS. No entanto, o suporte para X-Ray Remote Sampling está atualmente disponível por meio do ADOT Auto-Instrumentation for Node.js.

Para o exemplo de código abaixo, você precisará das seguintes dependências:

npm install --save \ @opentelemetry/api \ @opentelemetry/sdk-node \ @opentelemetry/exporter-trace-otlp-proto \ @opentelemetry/propagator-aws-xray \ @opentelemetry/resource-detector-aws

Você deve instalar e configurar o OpenTelemetry SDK antes de executar o código do aplicativo. Isso pode ser feito usando o sinalizador —-require. Crie um arquivo chamado instrumentation.js, que conterá sua configuração e configuração OpenTelemetry de instrumentação.

É recomendável que você configure os seguintes componentes:

  • OTLPTraceExportador — Obrigatório para exportar traços para o Agente/Coletor CloudWatch OpenTelemetry

  • AWSXRayPropagator — Necessário para propagar o Trace Context para AWS serviços integrados ao X-Ray

  • Detectores de recursos (por exemplo, Amazon EC2 Resource Detector) - Para detectar metadados do host que executa seu aplicativo

/*instrumentation.js*/ // Require dependencies const { NodeSDK } = require('@opentelemetry/sdk-node'); const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto'); const { AWSXRayPropagator } = require("@opentelemetry/propagator-aws-xray"); const { detectResources } = require('@opentelemetry/resources'); const { awsEc2Detector } = require('@opentelemetry/resource-detector-aws'); const resource = detectResources({ detectors: [awsEc2Detector], }); const _traceExporter = new OTLPTraceExporter({ url: 'http://localhost:4318/v1/traces' }); const sdk = new NodeSDK({ resource: resource, textMapPropagator: new AWSXRayPropagator(), traceExporter: _traceExporter }); sdk.start();

Em seguida, você pode executar seu aplicativo com sua OpenTelemetry configuração, como:

node --require ./instrumentation.js app.js

Você pode usar as instrumentações da biblioteca do OpenTelemetry SDK para criar automaticamente extensões para bibliotecas como o SDK. AWS Habilitá-los criará automaticamente extensões para módulos, como o AWS SDK para JavaScript v3. OpenTelemetry fornece a opção de ativar todas as instrumentações da biblioteca ou especificar quais instrumentações da biblioteca devem ser ativadas.

Para habilitar todas as instrumentações, instale o @opentelemetry/auto-instrumentations-node pacote:

npm install @opentelemetry/auto-instrumentations-node

Em seguida, atualize a configuração para habilitar todas as instrumentações da biblioteca, conforme mostrado abaixo.

const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); ... const sdk = new NodeSDK({ resource: resource, instrumentations: [getNodeAutoInstrumentations()], textMapPropagator: new AWSXRayPropagator(), traceExporter: _traceExporter });
Tracing setup with ADOT auto-instrumentation for Node.js

Você pode usar a instrumentação automática ADOT para Node.js OpenTelemetry para configurar automaticamente seus aplicativos Node.js. Ao usar o ADOT Auto-Instrumentation, você não precisa fazer alterações manuais no código para rastrear solicitações recebidas ou rastrear bibliotecas, como os AWS clientes SDK ou HTTP. Para obter mais informações, consulte Rastreamento e métricas com a AWS distribuição para OpenTelemetry JavaScript instrumentação automática.

A instrumentação automática ADOT para Node.js suporta:

  • Amostragem remota de raio-X por meio de variável de ambiente — export OTEL_TRACES_SAMPLER=xray

  • Propagação do contexto de rastreamento do X-Ray (ativada por padrão)

  • Detecção de recursos (a detecção de recursos para ambientes Amazon EC2, Amazon ECS e Amazon EKS é ativada por padrão)

  • Instrumentações de biblioteca automática para todas as OpenTelemetry instrumentações suportadas, que podem ser disabled/enabled seletivamente por meio de variáveis de ambiente OTEL_NODE_ENABLED_INSTRUMENTATIONS OTEL_NODE_DISABLED_INSTRUMENTATIONS

  • Criação manual de vãos

Rastreando solicitações recebidas

With X-Ray SDK

Express.js

Com o X-Ray SDK para rastrear solicitações HTTP recebidas pelos aplicativos Express.js, os dois middlewares AWSXRay.express.openSegment(<name>) AWSXRay.express.closeSegment() precisavam agrupar todas as rotas definidas para rastreá-las.

app.use(xrayExpress.openSegment('defaultName')); ... app.use(xrayExpress.closeSegment());

Restificar

Para rastrear as solicitações HTTP recebidas pelos Restify aplicativos, o middleware do X-Ray SDK foi usado executando enable a partir do aws-xray-sdk-restify módulo no servidor Restify:

var AWSXRay = require('aws-xray-sdk'); var AWSXRayRestify = require('aws-xray-sdk-restify'); var restify = require('restify'); var server = restify.createServer(); AWSXRayRestify.enable(server, 'MyApp'));
With OpenTelemetry SDK

Express.js

O suporte de rastreamento para solicitações recebidas Express.js é fornecido pela instrumentação OpenTelemetry HTTP e pela instrumentação expressa. OpenTelemetry Instale as seguintes dependências comnpm:

npm install --save @opentelemetry/instrumentation-http @opentelemetry/instrumentation-express

Atualize a configuração do OpenTelemetry SDK para habilitar a instrumentação para o módulo expresso:

const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... // Express instrumentation requires HTTP instrumentation new HttpInstrumentation(), new ExpressInstrumentation(), ], });

Restificar

Para aplicativos Restify, você precisará da instrumentação OpenTelemetry Restify. Instale a seguinte dependência:

npm install --save @opentelemetry/instrumentation-restify

Atualize a configuração do OpenTelemetry SDK para habilitar a instrumentação para o módulo restify:

const { RestifyInstrumentation } = require('@opentelemetry/instrumentation-restify'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... new RestifyInstrumentation(), ], });

AWS Instrumentação do SDK JavaScript V3

With X-Ray SDK

Para instrumentar as AWS solicitações de saída do AWS SDK, você instrumentou clientes como no exemplo a seguir:

import { S3, PutObjectCommand } from '@aws-sdk/client-s3'; const s3 = AWSXRay.captureAWSv3Client(new S3({})); await s3.send(new PutObjectCommand({ Bucket: bucketName, Key: keyName, Body: 'Hello!', }));
With OpenTelemetry SDK

O suporte de rastreamento para chamadas downstream do AWS SDK para o DynamoDB, o Amazon S3 e outros é fornecido pela instrumentação do SDK. OpenTelemetry AWS Instale a seguinte dependência comnpm:

npm install --save @opentelemetry/instrumentation-aws-sdk

Atualize a configuração do OpenTelemetry SDK com a instrumentação do AWS SDK.

import { AwsInstrumentation } from '@opentelemetry/instrumentation-aws-sdk'; ... const sdk = new NodeSDK({ ... instrumentations: [ ... new AwsInstrumentation() ], });

Instrumentar chamadas HTTP de saída

With X-Ray SDK

Para instrumentar as solicitações HTTP de saída com o X-Ray, era necessário instrumentar os clientes. Por exemplo, veja abaixo.

Clientes HTTP individuais

var AWSXRay = require('aws-xray-sdk'); var http = AWSXRay.captureHTTPs(require('http'));

Todos os clientes HTTP (globais)

var AWSXRay = require('aws-xray-sdk'); AWSXRay.captureHTTPsGlobal(require('http')); var http = require('http');
With OpenTelemetry SDK

O suporte de rastreamento para clientes HTTP Node.js é fornecido pela Instrumentação OpenTelemetry HTTP. Instale a seguinte dependência comnpm:

npm install --save @opentelemetry/instrumentation-http

Atualize a configuração do OpenTelemetry SDK da seguinte forma:

const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... new HttpInstrumentation(), ], });

Suporte de instrumentação para outras bibliotecas

Você pode encontrar a lista completa de instrumentações de biblioteca suportadas OpenTelemetry JavaScript em Instrumentações suportadas.

Como alternativa, você pode pesquisar no OpenTelemetry registro para descobrir se OpenTelemetry suporta instrumentação para sua biblioteca em Registro.

Criação manual de dados de rastreamento

With X-Ray SDK

Usando o X-Ray, o código do aws-xray-sdk pacote foi necessário para criar manualmente segmentos e seus subsegmentos secundários para rastrear seu aplicativo.

var AWSXRay = require('aws-xray-sdk'); AWSXRay.enableManualMode(); var segment = new AWSXRay.Segment('myApplication'); captureFunc('1', function(subsegment1) { captureFunc('2', function(subsegment2) { }, subsegment1); }, segment); segment.close(); segment.flush();
With OpenTelemetry SDK

Você pode criar e usar extensões personalizadas para monitorar o desempenho de atividades internas que não são capturadas pelas bibliotecas de instrumentação. Observe que somente extensões do tipo Server são convertidas em segmentos de X-Ray, todas as outras extensões são convertidas em subsegmentos de X-Ray. Para mais informações, leia Segmentos.

Você precisará de uma instância do Tracer depois de configurar o OpenTelemetry SDK na Configuração de rastreamento para criar Spans. Você pode criar quantas instâncias do Tracer forem necessárias, mas é comum ter um Tracer para um aplicativo inteiro.

const { trace, SpanKind } = require('@opentelemetry/api'); // Get a tracer instance const tracer = trace.getTracer('your-tracer-name'); ... // This span will appear as a segment in X-Ray tracer.startActiveSpan('server', { kind: SpanKind.SERVER }, span => { // Do work here // This span will appear as a subsegment in X-Ray tracer.startActiveSpan('operation2', { kind: SpanKind.INTERNAL }, innerSpan => { // Do more work here innerSpan.end(); }); span.end(); });

Adicionar anotações e metadados aos rastreamentos com o SDK OpenTelemetry

Você também pode adicionar pares de valores-chave personalizados como atributos em seus intervalos. Observe que, por padrão, todos esses atributos de amplitude serão convertidos em metadados nos dados brutos do X-Ray. Para garantir que um atributo seja convertido em uma anotação e não em metadados, adicione a chave do atributo à lista do atributo. aws.xray.annotations Para obter mais informações, consulte Enable The Customized X-Ray Annotations.

tracer.startActiveSpan('server', { kind: SpanKind.SERVER }, span => { span.setAttribute('metadataKey', 'metadataValue'); span.setAttribute('annotationKey', 'annotationValue'); // The following ensures that "annotationKey: annotationValue" is an annotation in X-Ray raw data. span.setAttribute('aws.xray.annotations', ['annotationKey']); // Do work here span.end(); });

Instrumentação Lambda

With X-Ray SDK

Depois de habilitar o Active Tracing para sua função Lambda, o X-Ray SDK foi necessário sem configuração adicional. O Lambda cria um segmento representando a invocação do manipulador Lambda, e você criou subsegmentos ou bibliotecas de instrumentos usando o X-Ray SDK sem nenhuma configuração adicional.

With OpenTelemetry SDK

Você pode instrumentar automaticamente seu Lambda com camadas personalizadas do AWS Lambda. Há duas soluções:

  • Camada lambda (recomendada) CloudWatch do Application Signals

    nota

    Essa camada Lambda tem sinais de CloudWatch aplicativo ativados por padrão, o que permite o monitoramento de desempenho e integridade de seu aplicativo Lambda por meio da coleta de métricas e rastreamentos. Se você quiser apenas o rastreamento, defina a variável de ambiente Lambda. OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false Para obter mais informações, consulte Habilitar seus aplicativos no Lambda.

  • AWS camada Lambda gerenciada para ADOT JS. Para obter mais informações, consulte AWS Distro for OpenTelemetry Lambda Support JavaScript For.

Criação manual de vãos com instrumentação Lambda

Embora o ADOT JavaScript Lambda Layer forneça instrumentação automática para sua função Lambda, você pode achar necessário realizar instrumentação manual em seu Lambda, por exemplo, para fornecer dados personalizados ou instrumentar código dentro da própria função Lambda que não seja coberto pelas instrumentações da biblioteca.

Para realizar a instrumentação manual junto com a instrumentação automática, você precisará adicionar @opentelemetry/api como uma dependência. Recomenda-se que a versão dessa dependência seja a mesma versão da mesma dependência usada pelo SDK JavaScript ADOT. Você pode usar a OpenTelemetry API para criar extensões manualmente em sua função Lambda.

Para adicionar a @opentelemetry/api dependência usando o NPM:

npm install @opentelemetry/api