서비스 간 호출 관계를 자동으로 도식화하여 병목/오류 구간을 한눈에 파악합니다.
트레이싱(APM)
분산 시스템의 요청 흐름을 Trace/Span 단위로 추적해 병목 지점과 오류 원인을 빠르게 찾습니다. OpenTelemetry 기반 자동/수동 계측, 동적 샘플링, 로그·메트릭과의 상관분석을 지원합니다. 요금은 별도문의로 안내합니다.
p95/p99 지연, 슬로우 스팬, 외부 의존성(DB/캐시/HTTP) 시간을 분해해서 표시합니다.
헤드/테일/동적 샘플링으로 비용을 제어하면서 인사이트를 유지합니다.
Trace ID로 로그·메트릭과 연결해 원인 파악 시간을 단축합니다.
트레이스 구성요소
| 항목 | 설명 | 예 |
|---|---|---|
| Trace | 요청 전체의 단일 추적 단위 | 주문 API 전체 호출 |
| Span | Trace를 구성하는 세부 작업 | DB 쿼리, 외부 HTTP 호출 |
| Attributes | 키/값 메타데이터 | db.system=mysql, http.method=GET |
| Events | 스팬 타임라인의 순간 이벤트 | 리트라이, 타임아웃 발생 |
| Links | 다중 부모/비동기 상호 참조 | 큐 기반 비동기 워크플로 |
| Status | 성공/오류 코드 | STATUS_ERROR + 예외 메시지 |
| Resource | 서비스/환경 정보 | service.name, deployment.env |
인스트루멘테이션(OpenTelemetry)
자동 계측 — 프레임워크/라이브러리(HTTP, gRPC, DB, 메시징) 자동 스팬 생성.
수동 계측 — 커스텀 코드에 스팬/이벤트/속성 추가.
컨텍스트 전파 — W3C
traceparent, baggage 헤더 사용.리소스 태그 —
service.name, deployment.environment, service.version.샘플링 전략
| 유형 | 특징 | 권장 활용 |
|---|---|---|
| 헤드 기반 | 요청 진입 시 확률로 결정 | 트래픽이 많은 서비스의 기본 |
| 테일 기반 | 종료 시 지연/오류 기준으로 보존 | 에러/슬로우 중심의 가성비 운영 |
| 동적 샘플링 | 엔드포인트/상태/사용자 등 조건별 가중 | 핵심 경로 상시 보존 + 일반 경로 샘플 |
수집/전송
Agent/Collector 아키텍처를 권장합니다. 애플리케이션은 OTLP로 로컬/사내 Collector에 전송하고, Collector가 배치/필터링/마스킹/리밋 후 백엔드(APM 스토어)로 전달합니다.
애플리케이션 → Collector
# 공통 환경변수(OTLP/HTTP 예시) OTEL_SERVICE_NAME=orders-api OTEL_RESOURCE_ATTRIBUTES=deployment.environment=prod,service.version=1.4.2 OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 OTEL_TRACES_SAMPLER=parentbased_traceidratio OTEL_TRACES_SAMPLER_ARG=0.1
Collector 파이프라인 예시
receivers:
otlp:
protocols:
http:
exporters:
logging: {}
otlphttp:
endpoint: https://apm-backend.example.com
processors:
batch: {}
memory_limiter:
check_interval: 5s
limit_mib: 512
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [logging, otlphttp]
시각화/분석 기능
| 기능 | 설명 |
|---|---|
| 타임라인/Flamegraph | 스팬 중첩·병렬 구간 시각화, 병목 지점 강조 |
| 에러 분석 | 예외/상태코드 기준 필터, 최근 회귀 감지 |
| 서비스 맵 | 서비스 간 호출 그래프, 실패율/지연 오버레이 |
| 슬로우 쿼리 | DB 유형별 상위 N 쿼리, 바인딩 파라미터 마스킹 |
| SLO/경보 | 지연 p95, 오류율, 트레이스 수 급증/급감 알림 |
상관분석 — Logs · Metrics · Traces
로그 상관 — 애플리케이션 로그에
trace_id, span_id를 주입하여 트레이스 ↔ 로그를 상호 이동.메트릭 상관 — 요청/오류율, 레이턴시 메트릭에서 이상 감지 시 관련 트레이스로 드릴다운.
컨텍스트 주입 — W3C 헤더를 역방향 프록시/게이트웨이에서도 보존.
Node.js (Express) — 최소 예시
// 1) 패키지: npm i @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http express
import express from 'express';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({ url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT + '/v1/traces' }),
instrumentations: [getNodeAutoInstrumentations()],
});
await sdk.start();
const app = express();
app.get('/hello', async (_req, res) => { res.json({ ok: true }); });
app.listen(3000, () => console.log('up on :3000'));
Python (FastAPI) — 최소 예시
# pip install fastapi uvicorn opentelemetry-sdk opentelemetry-exporter-otlp opentelemetry-instrumentation-fastapi
from fastapi import FastAPI
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
resource = Resource.create({"service.name": "checkout-api", "deployment.environment": "prod"})
provider = TracerProvider(resource=resource)
provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint="http://otel-collector:4318/v1/traces")))
trace.set_tracer_provider(provider)
app = FastAPI()
FastAPIInstrumentor.instrument_app(app)
@app.get('/health')
async def health():
return {"ok": True}
요금 안내
요금: 별도문의
에이전트 수, 초당 스팬 수, 보관기간, 데이터 전송량 및 분석 옵션에 따라 산정됩니다.
분산 트레이싱으로 장애 시간을 줄이세요
OpenTelemetry 기반으로 손쉽게 시작할 수 있도록 계측/수집/시각화를 도와드립니다.