안녕하세요! 오늘은 OpenTelemetry를 이용해서 서비스 간 로그를 연결하고 지연시간을 추적하는 법을 알아보려고 합니다. 생각보다 간단하게 따라 할 수 있으니, 한 번 읽어보세요. 😊
혹시 "OpenTelemetry"라는 용어가 낯설다면 간단히 설명해드릴게요. OpenTelemetry는 분산 추적과 메트릭 수집을 위한 오픈 소스 표준입니다. 복잡한 마이크로서비스 아키텍처에서 성능 문제를 찾고자 할 때 매우 유용해요!
마이크로서비스 아키텍처는 각기 다양한 서비스가 상호작용하며, 유저 요청을 처리합니다. 이런 환경에서는 문제의 원인을 찾는 것이 쉽지 않습니다. OpenTelemetry를 사용하면 서비스 간의 로그를 일관되게 추적하고, 지연 시간을 파악하는 데 큰 도움이 됩니다.
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 예제를 다루겠습니다.
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에 등록합니다.
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를 실무에 어떻게 적용하는지 감을 잡으셨기를 바랍니다. 이상으로, 서비스 간의 로그 연결 및 지연 시간 추적하기에 대한 내용이었습니다. 궁금한 점이 있으면 댓글로 남겨주세요. 감사합니다! 😊