APM
Application Performance Monitoring
애플리케이션 성능 모니터링. 응답 시간, 에러율, 트랜잭션 추적. Datadog, New Relic.
Application Performance Monitoring
애플리케이션 성능 모니터링. 응답 시간, 에러율, 트랜잭션 추적. Datadog, New Relic.
APM(Application Performance Monitoring)은 실시간으로 애플리케이션의 성능을 추적하고 분석하는 도구입니다. 단순한 서버 모니터링을 넘어 개별 요청이 DB 쿼리부터 외부 API 호출까지 어디서 얼마나 시간을 소비하는지 추적합니다. 장애가 발생하면 "어디가 느린지"를 정확히 파악할 수 있어 MTTR(Mean Time To Recovery)을 크게 단축시킵니다.
핵심 기능은 분산 추적(Distributed Tracing), 메트릭 수집, 에러 트래킹 3가지입니다. 분산 추적은 마이크로서비스 환경에서 하나의 요청이 여러 서비스를 거치는 흐름을 시각화합니다. Trace ID를 통해 "이 요청이 A 서비스 -> B 서비스 -> C 서비스를 거치며 총 2.3초가 걸렸고, B에서 1.8초를 소비했다"는 것을 알 수 있습니다.
대표적인 APM 도구로는 상용 서비스인 Datadog APM, New Relic, Dynatrace가 있고, 오픈소스로는 Jaeger, Zipkin, Elastic APM이 있습니다. 클라우드 환경에서는 AWS X-Ray, GCP Cloud Trace 같은 네이티브 서비스도 많이 사용됩니다. 선택 기준은 에이전트 오버헤드, 샘플링 정책, 비용, 기존 모니터링 스택과의 통합 여부입니다.
실무에서 APM을 도입하면 "느리다"는 막연한 불만 대신 "P99 응답시간이 2초를 초과했고, 원인은 Redis 커넥션 풀 고갈"처럼 데이터 기반의 논의가 가능해집니다. SLO(Service Level Objective) 설정과 알림 연동까지 구성하면 사용자가 불편을 느끼기 전에 선제적으로 대응할 수 있습니다.
# OpenTelemetry로 APM 트레이싱 구현 (Python/FastAPI)
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor
from fastapi import FastAPI
import requests
# 트레이서 설정
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://otel-collector:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
app = FastAPI()
# FastAPI 자동 계측
FastAPIInstrumentor.instrument_app(app)
RequestsInstrumentor().instrument()
@app.get("/api/orders/{order_id}")
async def get_order(order_id: str):
# 커스텀 스팬으로 세부 구간 측정
with tracer.start_as_current_span("fetch_order_details") as span:
span.set_attribute("order.id", order_id)
# DB 조회 (자동 계측됨)
order = await fetch_from_db(order_id)
# 외부 API 호출 추적
with tracer.start_as_current_span("call_payment_service"):
payment = requests.get(f"http://payment-svc/orders/{order_id}")
span.set_attribute("order.total", order["total"])
return {"order": order, "payment": payment.json()}
시니어: "어제 밤에 P99 레이턴시 스파이크 났는데 APM 트레이스 확인해봤어요?"
주니어: "네, 확인했는데 payment 서비스에서 DB 커넥션 타임아웃이 집중적으로 발생했더라고요."
시니어: "그럼 샘플링 레이트 올려서 해당 시간대 트레이스 더 뽑아보고, 슬로우 쿼리 로그랑 같이 비교해봐요."
면접관: "마이크로서비스 환경에서 성능 이슈를 어떻게 디버깅하시나요?"
지원자: "APM의 분산 추적 기능을 활용합니다. Trace ID로 요청 전체 흐름을 따라가면서 어느 서비스의 어느 구간에서 지연이 발생하는지 워터폴 차트로 확인합니다. 특히 P99 같은 꼬리 지연 분석에 효과적이었습니다."
리뷰어: "이 외부 API 호출 부분에 커스텀 스팬 추가해주세요. 나중에 이 구간 성능 추적하려면 APM에서 별도로 보여야 합니다."
작성자: "넵, 스팬 추가하고 vendor, endpoint 같은 attribute도 붙여서 필터링 가능하게 하겠습니다."