OpenTelemetry와 SpanTrace로 서비스 간 로그 연결 및 지연시간 추적하기(Node.js)

Donghun Ha·2024년 7월 11일
0
post-custom-banner

안녕하세요! 오늘은 OpenTelemetry를 이용해서 서비스 간 로그를 연결하고 지연시간을 추적하는 법을 알아보려고 합니다. 생각보다 간단하게 따라 할 수 있으니, 한 번 읽어보세요. 😊

혹시 "OpenTelemetry"라는 용어가 낯설다면 간단히 설명해드릴게요. OpenTelemetry는 분산 추적과 메트릭 수집을 위한 오픈 소스 표준입니다. 복잡한 마이크로서비스 아키텍처에서 성능 문제를 찾고자 할 때 매우 유용해요!

목차

  1. 왜 OpenTelemetry인가?
  2. SpanTrace의 역할과 중요성
  3. 코드 예제와 설명
  4. 서비스 간 연결하기

왜 OpenTelemetry를 사용해야 할까요?

마이크로서비스 아키텍처는 각기 다양한 서비스가 상호작용하며, 유저 요청을 처리합니다. 이런 환경에서는 문제의 원인을 찾는 것이 쉽지 않습니다. OpenTelemetry를 사용하면 서비스 간의 로그를 일관되게 추적하고, 지연 시간을 파악하는 데 큰 도움이 됩니다.

SpanTrace의 역할과 중요성

SpanTrace는 여러 분산 시스템 내의 작업을 추적하면서 특정 서비스 지연 시간을 파악하는 데 유용합니다. 이를 통해 성능 문제를 즉각적으로 파악하고, 이를 해결할 수 있습니다.

코드 예제와 설명

다음은 SpanTrace를 어떻게 설정하고 활용하는지에 대한 코드 예제입니다. 예제는 OpenTelemetry 라이브러리를 설정하고, 특정 핸들러에서 span을 생성하며 시작하는 방법을 보여줍니다.

먼저 package.json에 필요한 OpenTelemetry 라이브러리를 추가했습니다.

{
  "dependencies": {
    "@opentelemetry/api": "^1.8.0",
    "@opentelemetry/auto-instrumentations-node": "^0.46.0",
    "@opentelemetry/sdk-metrics": "^1.24.0",
    "@opentelemetry/sdk-node": "^0.51.0",
    "@opentelemetry/sdk-trace-node": "^1.24.0"
  }
}

서비스 간 로깅 및 추적

이제 본격적으로 Span을 시작해보도록 하겠습니다. 앵귤러나 리액트와 같은 프레임워크에서 서비스 로직을 트레이싱하는 방법도 비슷하지만, 여기서는 Node.js 예제를 다루겠습니다.

OpenTelemetry 초기 설정

const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { Resource } = require('@opentelemetry/resources');
const { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');

const provider = new NodeTracerProvider({
  resource: new Resource({
    'service.name': 'example-service',
  }),
});

const exporter = new OTLPTraceExporter();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();

console.log('OpenTelemetry initialized');

먼저, OpenTelemetry를 초기화합니다. 간단하게 TracerProvider와 SpanProcessor를 설정하고, 이를 OpenTelemetry에 등록합니다.

Span 생성과 사용

const { trace, context } = require('@opentelemetry/api');

const tracer = trace.getTracer('example-tracer');

function middleware(req, res, next) {
  const span = tracer.startSpan('http_request');
  req.span = span;
  const ctx = trace.setSpan(context.active(), span);

  res.on('finish', () => {
    span.end();
  });

  next();
}

HTTP 요청이 들어올 때마다 새로운 Span을 생성하고 요청 객체에 이를 저장합니다. 응답이 완료될 때 Span을 종료합니다. 이를 통해 하나의 HTTP 요청에 대해 전반적인 실행 시간을 측정할 수 있습니다.

서비스 간 연결

const { Metadata } = require('@grpc/grpc-js');

function callAnotherService(span) {
  const metadata = new Metadata();
  const traceparent = `00-${span.spanContext().traceId}-${span.spanContext().spanId}-${span.spanContext().traceFlags.toString(16).padStart(2, '0')}`;
  metadata.set('traceparent', traceparent);

  // gRPC 호출 시 metadata를 전달하여 트레이싱 연결
  grpcClient.callWithMetadata(metadata);
}

다른 서비스와 상호작용할 때, 생성된 Span을 메타데이터로 설정하여 전파합니다. 이를 통해 서비스 간 연결된 추적 데이터를 수집할 수 있습니다.

맺음말

OpenTelemetry와 SpanTrace는 복잡한 마이크로서비스 구조에서 주요 병목 현상을 파악하고 서비스의 지연 시간을 추적하는 데 굉장히 유용합니다. 이 글을 통해 OpenTelemetry를 실무에 어떻게 적용하는지 감을 잡으셨기를 바랍니다. 이상으로, 서비스 간의 로그 연결 및 지연 시간 추적하기에 대한 내용이었습니다. 궁금한 점이 있으면 댓글로 남겨주세요. 감사합니다! 😊

profile
Corca Backend Engineer, dha
post-custom-banner

0개의 댓글