본문 바로가기
클라우드/opentelemetry

서버 터지기 전에 꼭 알아야 할 이것! 🤯 분산 시스템 문제, 대체 어디서부터 봐야 할까요?

by gasbugs 2025. 11. 10.

서비스가 갑자기 느려지거나, 원인 모를 에러가 발생할 때… 개발자라면 누구나 한 번쯤 겪어봤을 아찔한 순간입니다. 😩 로그 파일을 뒤져봐도, 서버 사양을 확인해봐도 명확한 원인이 보이지 않을 때가 많죠. CPU 문제일까요? 네트워크 지연? 아니면 특정 사용자의 이상한 행동 때문일까요?

 

이 모든 질문에 대한 답은 시스템이 보내는 다양한 신호, 즉 텔레메트리(Telemetry) 데이터를 종합적으로 살펴보는 데 있습니다. 하지만 이 데이터들은 종류도 너무 많고 제각각이라 어디서부터 봐야 할지 막막하기만 합니다.

 

오늘은 이 복잡하게 얽힌 데이터들을 명쾌하게 정리하고, OpenTelemetry(Otel) 라는 강력한 도구를 통해 어떻게 한 번에 꿰뚫어 볼 수 있는지 알아보겠습니다. 더 이상 추측에 의존한 디버깅은 그만! 🙅‍♂️ 데이터 기반으로 문제의 핵심을 파고들어 봅시다.

 


🗺️ 전체 그림 보기: 관측 가능성의 세 기둥

개별 데이터를 살펴보기 전에, 전체적인 맥락을 이해하는 것이 중요합니다. 현대적인 시스템 모니터링, 즉 관측 가능성(Observability) 의 세계에서는 모든 텔레메트리 데이터를 크게 3가지 핵심 유형으로 분류합니다. 바로 메트릭, 추적, 로그입니다.

1. 메트릭 (Metrics) 📊

  • 이것이 뭔가요?: 특정 시점의 시스템 상태를 나타내는 숫자 값입니다. 시간의 흐름에 따라 시스템이 어떻게 변하는지 한눈에 파악하게 해주는 지표죠. 자동차의 계기판(속도, RPM, 기름양)을 생각하면 쉽습니다.
  • 언제 사용하나요?: "CPU 사용률이 90%를 넘었네?", "지난 1시간 동안 요청량이 2배로 뛰었어!" 와 같이 시스템의 전반적인 건강 상태나 트렌드를 파악할 때 사용합니다.

2. 추적 (Traces) 🗺️

  • 이것이 뭔가요?: 사용자 요청 하나가 우리 시스템에 들어와서, 여러 마이크로서비스를 거쳐 응답으로 나가기까지의 전체 여정을 기록한 것입니다. 택배 배송 추적처럼, 요청이 어디서 시작해서 어떤 서비스를 거치고, 각 단계에서 시간이 얼마나 걸렸는지 보여줍니다.
  • 언제 사용하나요?: "A 서비스에서 B 서비스 호출할 때 유독 느리네?", "결제 요청이 어느 단계에서 실패하는 거지?" 와 같이 분산 환경에서 서비스 간의 의존성을 분석하고 병목 지점을 찾을 때 필수적입니다.

3. 로그 (Logs) 📝

  • 이것이 뭔가요?: 특정 이벤트가 발생했을 때 남기는 상세한 텍스트 기록입니다. 비행기의 블랙박스처럼, 무슨 일이 일어났는지 가장 구체적인 컨텍스트를 제공합니다.
  • 언제 사용하나요?: "XX 라인에서 NullPointerException이 발생했어!", "사용자 ID 'testuser'가 방금 로그인에 성공했군." 처럼 특정 에러의 원인을 분석하거나, 감사(Audit) 기록을 확인할 때 사용합니다.

이 세 가지는 서로 경쟁하는 관계가 아닙니다. 메트릭으로 이상 징후(ex. 에러율 급증)를 발견하고, 추적으로 어떤 서비스의 어떤 요청에서 문제가 생겼는지 범위를 좁힌 뒤, 로그로 해당 요청의 상세 내용을 파악해 버그를 잡는, 상호보완적인 관계입니다.


🤔 그래서 내 데이터는 어디에 속할까? (feat. OpenTelemetry)

자, 이제 우리가 흔히 마주하는 데이터들이 이 세 기둥 중 어디에 해당하는지, 그리고 OpenTelemetry가 이것들을 어떻게 수집하는지 알아볼까요?

결론부터 말하면, OpenTelemetry는 이 모든 데이터를 수집하고 표준화하기 위해 태어난 프로젝트입니다.

A. IT 인프라 텔레메트리 (CPU, 메모리, 디스크 등)

  • 주요 유형: 메트릭(Metrics) 📈
  • 설명: "서버 CPU 사용률 80%", "메모리 잔여량 500MB" 등은 시스템의 건강 상태를 나타내는 가장 대표적인 숫자 지표입니다. 따라서 이들은 명백히 메트릭에 속합니다.
  • OpenTelemetry에서는?: Otel Collector라는 데이터 수집 에이전트를 사용하면 간단히 해결됩니다. hostmetrics라는 수신기를 활성화하는 것만으로 OS 수준의 핵심 메트릭들을 자동으로 수집할 수 있습니다.수집된 Raw 데이터 예시 (Prometheus 형식)
  • system_cpu_utilization{state="idle"} 0.85 system_memory_usage{state="used"} 1283457024
  • # Otel Collector 설정 예시 receivers: hostmetrics: collection_interval: 1m scrapers: cpu: memory: disk: network:

B. 네트워크 텔레메트리 (요청/응답, 지연 시간 등)

  • 주요 유형: 메트릭(Metrics), 추적(Traces) 🌐
  • 설명: "API 평균 응답 시간 200ms", "5xx 에러 비율 5%" 같은 데이터는 메트릭입니다. 하지만 "A 서비스가 B 서비스를 호출하는 과정" 자체는 요청의 여정을 보여주므로 추적의 핵심 요소입니다.
    • 잘못된 접근: 네트워크 호출을 단순히 "호출 성공/실패" 로그로만 남기는 것은 전체 흐름을 놓치게 만듭니다. 이 호출이 전체 트랜잭션의 어느 부분인지 추적을 통해 봐야 병목 현상을 제대로 분석할 수 있습니다.
  • OpenTelemetry에서는?: 애플리케이션에 Otel SDK를 설치하면, 자주 사용하는 HTTP 클라이언트나 웹 프레임워크를 자동으로 계측(Auto-Instrumentation)합니다. 이를 통해 서비스 간 모든 네트워크 호출이 자동으로 Trace의 일부(Span)로 기록되고, 관련 Metric(지연 시간, 요청 크기 등)도 함께 생성됩니다.

C. 사용자 텔레메트리 (클릭, 페이지 뷰 등 사용자 행위)

  • 주요 유형: 로그(Logs), 추적(Traces) 내 이벤트(Events) 🧑‍💻
  • 설명: "사용자 A가 '구매' 버튼을 클릭했다"는 기록은 상세한 컨텍스트를 담은 로그로 볼 수 있습니다. 동시에, 이 클릭 이벤트는 "상품 조회 → 장바구니 담기 → 구매"로 이어지는 전체 사용자 여정(Trace)의 한 부분을 구성하는 중요한 이벤트가 됩니다.
  • OpenTelemetry에서는?: 브라우저나 모바일 앱을 위한 Otel SDK (Real User Monitoring, RUM 영역)를 사용해 사용자의 상호작용을 수집할 수 있습니다.

D. 애플리케이션 인프라 텔레메트리 (DB 쿼리, 함수 호출 등)

  • 주요 유형: 추적(Traces), 메트릭(Metrics), 로그(Logs) 💻
  • 설명: 이 영역은 위 세 가지를 모두 포함하는 가장 포괄적인 데이터입니다. 특정 함수가 얼마나 오래 걸렸는지(Trace의 Span), 캐시 적중률이 얼마인지(Metric), 그리고 함수 내부에서 어떤 에러가 발생했는지(Log) 모두 애플리케이션 텔레메트리에 해당합니다.
  • OpenTelemetry에서는?: Otel SDK의 수동 계측(Manual Instrumentation) 기능을 사용해 개발자가 코드의 특정 부분을 직접 추적할 수 있습니다.
    from opentelemetry import trace
    
    # 현재 Trace의 Context 가져오기
    tracer = trace.get_tracer(__name__)
    
    # "process_order" 라는 이름의 새로운 Span(작업 단위) 생성
    with tracer.start_as_current_span("process_order") as span:
        # 이 Span에 유용한 정보(Attribute) 추가
        span.set_attribute("order_id", "12345")
        
        # ... 주문 처리 로직 ...
        print("주문 처리 중...")
    
        # Span에 이벤트 추가
        span.add_event("재고 확인 완료")
    
        # ... 추가 로직 ...
    
  • 코드 예시 (Python 수동 계측)

✨ 결론: 흩어진 데이터를 하나의 이야기로

지금까지 살펴본 내용을 표로 정리하면 다음과 같습니다.

데이터 종류 핵심 텔레메트리 유형 OpenTelemetry 수집 방식
A. IT 인프라 Metrics Otel Collector (hostmetrics 수신기)
B. 네트워크 Metrics, Traces Otel SDK (자동 계측)
C. 사용자 행위 Logs, Traces (Events) Otel SDK for Web/Mobile (RUM)
D. 애플리케이션 Traces, Metrics, Logs Otel SDK (자동/수동 계측)

 

이제 처음의 질문으로 돌아가 봅시다. 원인 모를 장애가 발생했을 때, 우리는 더 이상 어둠 속에서 헤맬 필요가 없습니다.

OpenTelemetry라는 표준화된 창을 통해 시스템의 메트릭, 추적, 로그를 함께 들여다보면, 인프라의 작은 떨림부터 사용자 클릭 한 번까지 모든 데이터가 연결되어 하나의 거대한 이야기를 만들어냅니다.

 

흩어져 있던 점들이 선으로 이어지고, 문제의 진짜 원인이 모습을 드러내는 순간을 경험하게 될 것입니다. 🚀