기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
OpenTelemetry Node.js로 마이그레이션
이 섹션에서는 Node.js 애플리케이션을 X-Ray SDK에서 OpenTelemetry로 마이그레이션하는 방법을 설명합니다. 자동 및 수동 계측 접근 방식을 모두 다루며 일반적인 사용 사례에 대한 구체적인 예를 제공합니다.
X-Ray Node.js SDK를 사용하면 추적을 위해 Node.js 애플리케이션을 수동으로 계측할 수 있습니다. 이 섹션에서는 X-Ray에서 OpenTelemetry 계측으로 마이그레이션하기 위한 코드 예제를 제공합니다.
Sections
제로 코드 자동 계측 솔루션
Node.js용 X-Ray SDK를 사용하여 요청을 추적하려면 애플리케이션 코드를 수정해야 합니다. OpenTelemetry를 사용하면 제로 코드 자동 계측 솔루션을 사용하여 요청을 추적할 수 있습니다.
OpenTelemetry 기반 자동 계측을 사용한 제로 코드 자동 계측.
-
Node.js용 AWS Distro for OpenTelemetry(ADOT) 자동 계측 사용 - Node.js 애플리케이션에 대한 자동 계측은 AWS Distro for OpenTelemetry JavaScript 자동 계측을 사용한 추적 및 지표를 참조하세요
. (선택 사항) ADOT JavaScript 자동 계측 AWS 을 사용하여에서 애플리케이션을 자동으로 계측할 때 CloudWatch Application Signals를 활성화하여 현재 애플리케이션 상태를 모니터링하고 비즈니스 목표에 따라 장기 애플리케이션 성능을 추적할 수도 있습니다. Application Signals는 애플리케이션, 서비스 및 종속성에 대한 통합 애플리케이션 중심 보기를 제공하고 애플리케이션 상태를 모니터링하고 분류하는 데 도움이 됩니다. 자세한 내용은 Application Signals를 참조하세요.
-
OpenTelemetry JavaScript 제로 코드 자동 계측 사용 - OpenTelemetry JavaScript를 사용한 자동 계측은 JavaScript 제로 코드 계측을 참조하세요
.
수동 계측 솔루션
- Tracing setup with X-Ray SDK
-
Node.js용 X-Ray SDK를 사용할 때 SDK를 사용하여 코드를 계측하기 전에
aws-xray-sdk
패키지가 서비스 플러그인 또는 로컬 샘플링 규칙으로 X-Ray SDK를 구성해야 했습니다.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
참고
AWS X-Ray 원격 샘플링은 현재 OpenTelemetry JS에 대해 구성할 수 없습니다. 그러나 X-Ray 원격 샘플링에 대한 지원은 현재 Node.js용 ADOT 자동 계측을 통해 제공됩니다.
아래 코드 예제의 경우 다음 종속성이 필요합니다.
npm install --save \ @opentelemetry/api \ @opentelemetry/sdk-node \ @opentelemetry/exporter-trace-otlp-proto \ @opentelemetry/propagator-aws-xray \ @opentelemetry/resource-detector-aws
애플리케이션 코드를 실행하기 전에 OpenTelemetry SDK를 설정하고 구성해야 합니다. 이 작업은 --require
플래그를 사용하여 수행할 수 있습니다. OpenTelemetry 계측 구성 및 설정이 포함된 instrumentation.js라는 파일을 생성합니다. 다음 구성 요소를 구성하는 것이 좋습니다.
-
OTLPTraceExporter - CloudWatch 에이전트/OpenTelemetry Collector로 트레이스를 내보내는 데 필요합니다.
-
AWSXRayPropagator - 추적 컨텍스트를 X-Ray와 통합된 AWS 서비스에 전파하는 데 필요합니다.
-
Resource Detectors(예: Amazon EC2 Resource Detector) - 애플리케이션을 실행하는 호스트의 메타데이터를 감지합니다.
/*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();
그런 다음 다음과 같은 OpenTelemetry 설정을 사용하여 애플리케이션을 실행할 수 있습니다.
node --require ./instrumentation.js app.js
OpenTelemetry SDK 라이브러리 계측을 사용하여 AWS SDK와 같은 라이브러리에 대한 스팬을 자동으로 생성할 수 있습니다. 이를 활성화하면 AWS SDK for JavaScript v3와 같은 모듈에 대한 스팬이 자동으로 생성됩니다. OpenTelemetry는 모든 라이브러리 계측을 활성화하거나 활성화할 라이브러리 계측을 지정하는 옵션을 제공합니다.
모든 계측을 활성화하려면
@opentelemetry/auto-instrumentations-node
패키지를 설치합니다.npm install @opentelemetry/auto-instrumentations-node
그런 다음 아래와 같이 구성을 업데이트하여 모든 라이브러리 계측을 활성화합니다.
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
-
Node.js용 ADOT 자동 계측을 사용하여 Node.js 애플리케이션에 대해 OpenTelemetry를 자동으로 구성할 수 있습니다. ADOT Auto-Instrumentation을 사용하면 수신 요청을 추적하거나 AWS SDK 또는 HTTP 클라이언트와 같은 라이브러리를 추적하기 위해 수동으로 코드를 변경할 필요가 없습니다. 자세한 내용은 AWS Distro for OpenTelemetry JavaScript Auto-Instrumentation을 사용한 추적 및 지표
를 참조하세요. Node.js용 ADOT 자동 계측은 다음을 지원합니다.
-
환경 변수를 통한 X-Ray 원격 샘플링 -
export OTEL_TRACES_SAMPLER=xray
-
X-Ray 추적 컨텍스트 전파(기본적으로 활성화됨)
-
리소스 감지(Amazon EC2, Amazon ECS 및 Amazon EKS 환경에 대한 리소스 감지는 기본적으로 활성화되어 있음)
-
OTEL_NODE_ENABLED_INSTRUMENTATIONS
및OTEL_NODE_DISABLED_INSTRUMENTATIONS
환경 변수를 통해 선택적으로 비활성화/활성화할 수 있는 지원되는 모든 OpenTelemetry 계측에 대한 자동 라이브러리 계측 -
스팬 수동 생성
-
수신 요청 추적
- With X-Ray SDK
-
Express.js
Express.js 애플리케이션에서 수신한 수신 HTTP 요청을 추적하기 위한 X-Ray SDK를 사용하면 두 미들웨어
AWSXRay.express.openSegment(<name>)
및AWSXRay.express.closeSegment()
가 이를 추적하기 위해 정의된 모든 경로를 래핑해야 했습니다.app.use(xrayExpress.openSegment('defaultName')); ... app.use(xrayExpress.closeSegment());
재지정
Restify
애플리케이션에서 수신한 HTTP 요청을 추적하기 위해 Restify 서버의aws-xray-sdk-restify
모듈에서 활성화를 실행하여 X-Ray SDK의 미들웨어를 사용했습니다.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
에 대한 수신 요청에 대한 추적 지원
Express.js
은 OpenTelemetry HTTP 계측및 OpenTelemetry Express 계측 을 통해 제공됩니다. 를 사용하여 npm
다음 종속성을 설치합니다.npm install --save @opentelemetry/instrumentation-http @opentelemetry/instrumentation-express
Express 모듈에 대한 계측을 활성화하도록 OpenTelemetry SDK 구성을 업데이트합니다.
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(), ], });
재지정
Restify 애플리케이션의 경우 OpenTelemetry Restify 계측이
필요합니다. 다음 종속성을 설치합니다. npm install --save @opentelemetry/instrumentation-restify
OpenTelemetry SDK 구성을 업데이트하여 재지정 모듈에 대한 계측을 활성화합니다.
const { RestifyInstrumentation } = require('@opentelemetry/instrumentation-restify'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... new RestifyInstrumentation(), ], });
AWS SDK JavaScript V3 계측
- With X-Ray SDK
-
AWS SDK의 발신 AWS 요청을 계측하기 위해 다음 예제와 같이 클라이언트를 계측했습니다.
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
DynamoDB, Amazon S3 등에 대한 다운스트림 AWS SDK 호출에 대한 추적 지원은 OpenTelemetry AWS SDK 계측을 통해 제공됩니다. 를 사용하여
npm
다음 종속성을 설치합니다.npm install --save @opentelemetry/instrumentation-aws-sdk
SDK 계측을 사용하여 OpenTelemetry AWS SDK 구성을 업데이트합니다.
import { AwsInstrumentation } from '@opentelemetry/instrumentation-aws-sdk'; ... const sdk = new NodeSDK({ ... instrumentations: [ ... new AwsInstrumentation() ], });
발신 HTTP 호출 구성
- With X-Ray SDK
-
X-Ray를 사용하여 발신 HTTP 요청을 계측하려면 클라이언트를 계측해야 했습니다. 예를 들어 아래를 참조하세요.
개별 HTTP 클라이언트
var AWSXRay = require('aws-xray-sdk'); var http = AWSXRay.captureHTTPs(require('http'));
모든 HTTP 클라이언트(글로벌)
var AWSXRay = require('aws-xray-sdk'); AWSXRay.captureHTTPsGlobal(require('http')); var http = require('http');
- With OpenTelemetry SDK
-
Node.js HTTP 클라이언트에 대한 추적 지원은 OpenTelemetry HTTP Instrumentation에서 제공합니다. 를 사용하여
npm
다음 종속성을 설치합니다.npm install --save @opentelemetry/instrumentation-http
다음과 같이 OpenTelemetry SDK 구성을 업데이트합니다.
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... new HttpInstrumentation(), ], });
다른 라이브러리에 대한 계측 지원
OpenTelemetry JavaScript에 대해 지원되는 라이브러리 계측의 전체 목록은 지원되는 계측에서 확인할 수 있습니다
또는 OpenTelemetry 레지스트리를 검색하여 OpenTelemetry가 레지스트리
추적 데이터 수동 생성
- With X-Ray SDK
-
X-Ray를 사용하면 세그먼트와 하위 하위 세그먼트를 수동으로 생성하여 애플리케이션을 추적하는 데
aws-xray-sdk
패키지 코드가 필요했습니다.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
-
사용자 지정 스팬을 생성하고 사용하여 계측 라이브러리로 캡처되지 않은 내부 활동의 성능을 모니터링할 수 있습니다. 참고로 서버는 X-Ray 세그먼트로 변환되고 다른 모든 스팬은 X-Ray 하위 세그먼트로 변환됩니다. 자세한 내용은 세그먼트를 참조하세요.
추적 설정에서 OpenTelemetry SDK를 구성하여 스팬을 생성한 후에는 추적기 인스턴스가 필요합니다. 필요한 만큼 Tracer 인스턴스를 생성할 수 있지만 전체 애플리케이션에 대해 하나의 Tracer를 사용하는 것이 일반적입니다.
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(); });
OpenTelemetry SDK를 사용하여 트레이스에 주석 및 메타데이터 추가
사용자 지정 키-값 페어를 스팬의 속성으로 추가할 수도 있습니다. 기본적으로 이러한 모든 스팬 속성은 X-Ray 원시 데이터의 메타데이터로 변환됩니다. 속성이 메타데이터가 아닌 주석으로 변환되도록 하려면 속성 목록에
aws.xray.annotations
속성의 키를 추가합니다. 자세한 내용은 사용자 지정 X-Ray 주석 활성화를 참조하세요. 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(); });
Lambda 계측
- With X-Ray SDK
-
Lambda 함수에 대해 활성 추적을 활성화한 후 추가 구성 없이 X-Ray SDK가 필요했습니다. Lambda는 Lambda 핸들러 호출을 나타내는 세그먼트를 생성하고 추가 구성 없이 X-Ray SDK를 사용하여 하위 세그먼트 또는 계측 라이브러리를 생성했습니다.
- With OpenTelemetry SDK
-
AWS 벤딩된 Lambda 계층으로 Lambda를 자동으로 계측할 수 있습니다. 두 가지 해결 방법이 있습니다.
-
(권장) CloudWatch Application Signals lambda 계층
참고
이 Lambda 계층에는 CloudWatch Application Signals가 기본적으로 활성화되어 있으므로 지표와 트레이스를 모두 수집하여 Lambda 애플리케이션에 대한 성능 및 상태 모니터링을 사용할 수 있습니다. 추적만 원하는 경우 Lambda 환경 변수를 설정해야 합니다
OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false
. 자세한 내용은 Lambda에서 애플리케이션 활성화를 참조하세요. -
AWS ADOT JS용 관리형 Lambda 계층입니다. 자세한 내용은 AWS JavaScript에 대한 OpenTelemetry Lambda 지원을 위한 배포를 참조하세요
.
Lambda 계측을 사용하여 수동으로 스팬 생성
ADOT JavaScript Lambda 계층은 Lambda 함수에 대한 자동 계측을 제공하지만, 예를 들어 사용자 지정 데이터를 제공하거나 라이브러리 계측에서 다루지 않는 Lambda 함수 자체 내의 코드를 계측하기 위해 Lambda에서 수동 계측을 수행해야 할 수 있습니다.
자동 계측과 함께 수동 계측을 수행하려면를 종속성
@opentelemetry/api
으로 추가해야 합니다. 이 종속성의 버전은 ADOT JavaScript SDK에서 사용하는 것과 동일한 종속성의 버전인 것이 좋습니다. OpenTelemetry API를 사용하여 Lambda 함수에서 스팬을 수동으로 생성할 수 있습니다.NPM을 사용하여
@opentelemetry/api
종속성을 추가하려면:npm install @opentelemetry/api
-