datadog

대규모 환경에서 데이터 완전성을 측정하는 방법 (새 탭에서 열림)

고객의 대시보드·알림·AI 에이전트가 올바르게 작동하려면 Datadog에 유입된 모든 텔레메트리 데이터가 완전하게 전달되어야 한다. Datadog은 수백 개의 분산 파이프라인과 고객별 경로를 실시간으로 추적하기 위해 파이프라인을 세그먼트로 나누고, 각 payload의 생성과 확인(acknowledgment)을 비교한다. 이 방식은 중복·순서 뒤바뀜·지연 데이터가 존재하는 환경에서도 세그먼트별 문제 위치와 전체 파이프라인의 완전성을 계산하도록 설계되었다.

Datadog에서 데이터 완전성의 의미

  • 완전한 데이터란 Datadog에 들어온 모든 payload가 고객에게 제공되는 상태다.
  • 대상 payload에는 다음과 같은 텔레메트리 데이터가 포함된다.
    • 메트릭 데이터 포인트
    • 로그
    • 트레이스
    • 기타 수집 데이터
  • 완전성은 전역 단위가 아니라 고객별로 판단해야 한다.
    • 고객마다 파티셔닝, 격리 전략, 트래픽 패턴이 다르다.
    • 따라서 동일한 리전에서도 데이터가 통과하는 경로가 매우 다양하다.
  • 시스템은 데이터가 누락되었는지뿐 아니라 다음도 즉시 설명해야 한다.
    • 어느 구간에서 문제가 발생했는가
    • 어떤 서비스가 비정상인가
    • 문제가 고객에게 영향을 주었는가
  • 진단 결과는 운영자가 수 초 안에 대응하거나 자동화된 시스템이 조치하는 데 사용된다.

워터마크 방식의 한계

  • 초기에는 Flink 같은 스트리밍 시스템의 워터마크 방식을 고려했다.
    • 데이터가 일정 시간 안에 도착한다고 가정하고 워터마크를 전진시킨다.
    • 특정 임계점을 넘으면 해당 시점까지 데이터가 완전하다고 판단한다.
  • 그러나 Datadog 환경에서는 고객이 임의로 지연된 데이터를 보낼 수 있다.
  • 또한 다음과 같은 특수 상황이 워터마크를 신뢰하기 어렵게 만든다.
    • 파이프라인 내부의 루프
    • 트래픽 재생
    • 예측하기 어려운 데이터 지연
  • 따라서 데이터 도착 시점만으로 전체 파이프라인의 완전성을 판단하는 방식은 필요한 보장을 제공하지 못했다.

파이프라인을 세그먼트로 분할

  • Datadog은 전체 파이프라인을 여러 개의 작은 세그먼트로 나누어 추적한다.
  • 예를 들어 다음과 같은 흐름이 있을 수 있다.
    • intake → Kafka → processing → Kafka → router
  • 각 서비스 내부와 서비스 간 연결을 별도의 세그먼트로 정의한다.
    • intake-in → intake-out
    • intake-out → processing-in
  • 각 세그먼트에서 다음을 독립적으로 측정한다.
    • 세그먼트에 들어온 payload 수
    • 세그먼트에서 나간 payload 수
  • 이 구조의 장점은 다음과 같다.
    • 누락이 발생한 위치를 구체적으로 찾을 수 있다.
    • 개별 세그먼트 결과를 합쳐 end-to-end 완전성을 계산할 수 있다.
    • 파이프라인에 분기 경로가 추가되거나 제거되어도 전체 시스템을 재정의할 필요가 적다.

생성 이벤트와 확인 이벤트로 payload 추적

  • payload가 세그먼트에 들어오면 create 이벤트를 기록한다.
  • payload가 세그먼트를 빠져나오면 동일한 식별자에 대한 acknowledgment 이벤트를 기록한다.
  • 두 이벤트의 수를 비교해 세그먼트에서 데이터가 유실되었는지 판단한다.
  • 재시도와 중복 처리를 위해 모든 payload에 고유 식별자를 부여한다.

시간 버킷을 이용한 멱등성

  • 분산 시스템에서는 이벤트가 중복되거나 순서가 뒤바뀐 채 도착할 수 있다.
  • 이를 처리하기 위해 완전성을 payload가 Datadog에 처음 들어온 시점의 시간 버킷 단위로 계산한다.
  • 고객 시스템의 시계가 아니라 Datadog이 관리하는 타임스탬프를 사용한다.
  • 각 버킷에서 payload의 세그먼트별 상태를 관리한다.
    • 생성됨
    • 확인됨
    • 생성 이벤트보다 확인 이벤트가 먼저 도착함
  • 같은 버킷에서 동일한 식별자의 create 또는 acknowledgment가 반복되면 기존 상태를 확인하고 중복 이벤트를 무시한다.
  • 이 방식은 별도의 분산 조정 없이도 카운트를 멱등적으로 유지한다.

세그먼트 비율로 전체 완전성 계산

  • 각 세그먼트의 완전성은 다음 비율로 정의된다.

    세그먼트 완전성 = 세그먼트를 빠져나간 payload 수 ÷ 세그먼트에 들어온 payload 수

  • 순차적으로 연결된 파이프라인에서는 각 세그먼트의 완전성 비율을 곱한다.

  • 예를 들어 두 세그먼트의 완전성이 각각 98%, 96%라면 전체 완전성은 다음과 같다.

    98% × 96% = 94%

병렬 분기 처리

  • 병렬 분기를 단순히 하나의 파이프라인으로 취급하면 문제가 생긴다.
  • 예를 들어 APM 트레이스가 다음 두 서비스로 동시에 전달될 수 있다.
    • 오류율·요청 수를 계산하는 서비스
    • 지연 시간 분포를 계산하는 서비스
  • 한 분기가 늦게 처리되면 다른 분기에서 이미 사용 가능한 데이터까지 전체적으로 불완전한 것처럼 보일 수 있다.
  • Datadog은 병렬 분기를 데이터 처리량에 비례한 가중 평균으로 결합한다.
    • 각 분기의 기여도를 해당 분기가 처리하는 payload 양에 따라 산정한다.
    • 데이터가 많은 분기는 전체 결과에 더 큰 영향을 준다.
  • 예시에서는 한 분기가 98%와 96%의 두 세그먼트를 거쳐 94% 완전성을 보이고, 다른 분기는 100%를 처리한다.
  • 이후 각 분기의 처리량을 기준으로 가중치를 적용해 전체 파이프라인 완전성을 계산한다.

실용적인 결론

대규모 분산 수집 시스템에서는 전체 파이프라인을 한 번에 관찰하기보다, payload의 이동을 세그먼트별로 계측하는 편이 문제 위치와 고객 영향을 더 정확히 파악할 수 있다. 특히 고유 식별자, 시간 버킷, 멱등적인 상태 추적을 함께 사용하면 재시도와 지연 데이터가 많은 환경에서도 실시간 완전성 검증이 가능하다.