전통적인 웹 마이크로서비스를 모니터링하는 것은 간단합니다.
HTTP 상태 코드, 요청 지연 시간(latency), CPU 사용량, 데이터베이스 쿼리 지속 시간을 추적할 수 있습니다. 스팬(Spans)은 작고, 메트릭(metrics)은 단순한 카운터나 게이지이며, 로그는 짧은 문자열입니다.
하지만 생성형 AI(Generative AI) 애플리케이션은 이 모델을 완전히 깨뜨립니다.
단일 에이전트 상호작용만으로도 수십 개의 복잡하고 상세한 이벤트가 발생할 수 있습니다:
- 다단계 추론 체인(Multi-step reasoning chains), 중간 반성(intermediate reflections), 계획 사고 과정(planning thoughts).
- 완전한 프롬프트 텍스트, 시스템 메시지, 그리고 생성된 완료 내용(generated completions).
- 도구 호출 입력 및 수 메가바이트 크기의 JSON 출력.
- 세분화된 토큰 카운트: 프롬프트 토큰, 캐시된 프롬프트 토큰, 추론 토큰, 그리고 완료 토큰.
- 테넌트(tenant), 비즈니스 단위(business unit), 프로젝트별로 세분화된 재무 비용 할당.
기업 플랫폼을 수백 또는 수천 개의 에이전트로 확장할 경우, 이는 매일 100 GB에서 1 TB에 달하는 상세하고 반정형화된 원격 측정 데이터를 생성합니다.
만약 이 모든 데이터를 주(primary) 애플리케이션 성능 모니터링(APM) 도구에 직접 덤프한다면, 월간 관측 가능성(observability) 비용이 AI 컴퓨팅 비용과 맞먹게 될 것입니다.
이를 해결하기 위해, 저희는 "Measure Once, Distribute Everywhere" 원격 측정 아키텍처를 설계했습니다.
아이디어: 원격 측정 포크 (The Telemetry Fork)
개발자, 재무팀, 운영 엔지니어링 팀을 위해 별도의 로깅 파이프라인을 구축하는 대신, 저희는 **OpenTelemetry (OTEL)**을 사용하여 단일하고 통합된 원격 측정 스트림을 캡처합니다.
저희의 컬렉터(collector) 파이프라인은 각 이벤트를 한 번 수집하여 스키마를 검증한 다음, 세 가지 목적에 맞게
- 실시간 운영 APM (Operational APM): 서비스 상태, 가동 시간 및 알림에 전념합니다. 컬렉터는 대용량 프롬프트와 응답 본문을 제거하고, 오직 운영 지표(operational metrics)만 전달합니다: 첫 토큰까지 걸리는 시간 (Time To First Token, TTFT), 출력 토큰당 시간 (Time Per Output Token, TPOT), 오류 코드 및 지연율 백분위수.
- 불변 금융 원장 (Immutable Financial Ledger): 엄격하고 추가 전용(append-only) 이벤트 형식으로 구성됩니다. 내부 청구 상계(chargebacks)를 조정하기 위해 정확한 토큰 소비량과 비용 센터 할당을 기록하며, 고유 이벤트 ID로 중복 제거됩니다.
- 컬럼형 OLAP 데이터 저장소 (Columnar OLAP Data Store, ClickHouse): 깊이 있는 프롬프트 검사, 전체 추론 체인(full reasoning chains), 그리고 역사적 지연 분석에 전념합니다. 장기적인 감사 가능성(auditability)을 위해 완전한 반정형 페이로드(semi-structured payloads)를 높은 압축률로 저장합니다.
잘 작동했던 방식 (How It Worked Well)
- 대규모 APM 비용 절감: 무거운 텍스트 페이로드를 실시간 APM 도구로 전송하기 전에 제거함으로써, 운영 모니터링 수집량(ingestion volume)을 85% 이상 줄였지만, 장애 및 지연 급증에 대한 즉각적인 알림 기능은 유지했습니다.
- 서브초급 다중 기가바이트 분석: ClickHouse와 같은 컬럼형 데이터베이스를 사용함으로써, 사전에 집계하거나 세부 정보를 잃지 않으면서 수억 건의 일일 행(daily rows)에 걸쳐 빠르고 정확한 집계 및 백분위수 계산을 수행할 수 있었습니다.
- 클라이언트 측 추적 재조립 (Client-Side Trace Reassembly): 다단계 에이전트 실행을 평탄화된 추적 모델(flattened trace model)로 저장함으로써, 개발자는 단일 추적 식별자(trace identifier)로 쿼리하여 전체 계층적 추론 트리(root prompt, subagents, tool calls 및 최종 합성)를 디버깅 UI에서 즉시 재구성할 수 있습니다.
- 투명한 비용 할당 (Transparent Cost Attribution): 재무팀과 플랫폼 팀은 서로 다른 비즈니스 부서 전반에 걸친 토큰 소비량에 대한 자동화되고 세분화된 가시성을 확보하여, 정확한 청구 상계 회계(chargeback accounting)를 수행할 수 있게 되었습니다.
주의할 점 (What to Watch Out For)
- 개인 식별 정보(PII) 유출: GenAI 프롬프트에 민감한 사용자 정보가 포함될 수 있으므로, 컬럼형 데이터 웨어하우스에 저장되는 로그는 반드시 정제되어야 합니다. 크리덴셜, 개인 식별 번호, 결제 세부 정보 등을 장기 저장소로 데이터가 도달하기 전에 스크럽(scrub)하는 자동화된 마스킹 필터(redaction filters)를 컬렉터 엣지에서 실행하세요.
- 고카디널리티 인덱싱의 함정: 컬럼형 데이터베이스에서는 고카디널리티 컬럼(예: 고유 사용자 ID 또는 트레이스 ID)으로 정렬하거나 파티셔닝하는 것이 성능을 저하시킬 수 있습니다. 데이터를 시간 범위별로 파티션하고, 테넌트와 날짜를 우선적으로 정렬하며, 희소 기본 키(sparse primary keys)를 사용하여 쿼리를 빠르고 메모리 사용량을 낮게 유지하세요.
- 계층형 클러스터 원격 측정: 대규모 Kubernetes 환경에서 휘발성 CI/CD 러너나 배치 워커 파드 내부에 완전 기능의 APM 트레이싱 에이전트를 실행하는 것은 관측 가능성(observability) 라이선스를 낭비합니다. 완전한 APM 에이전트는 고객에게 노출되는 워크로드 클러스터에만 제한하고, 휘발성 배치 러너는 기본 클라우드 로그로 라우팅하세요.
- 컬렉터 버퍼 포화: 대규모 급증(burst) 워크로드 동안 컬렉터 파이프라인은 내부 메모리 버퍼가 가득 차면 이벤트를 누락할 수 있습니다. 데이터 손실을 보장하기 위해 애플리케이션과 원격 측정 컬렉터 사이에 영구 파일 기반 버퍼링 또는 큐 기반 버퍼를 구성하세요.