Playball Logo

Command Palette

Search for a command to run...

목차 열기

11. Observability · 감사 · ETL · ClickHouse

AI Defense는 런타임 판단의 재현성과 사후 분석을 위해 감사를 중심으로 관측 데이터를 남깁니다. 3중 저장 구조로 서로 다른 용도를 지원합니다.

3중 저장 구조

Runtime audit JSONL (실시간 기록, 한 줄씩 추가만 됨)
    ↓
S3 Archive (주기 rotate·upload, 영구 아카이브)
    ↓
ETL Worker (변환·적재)
    ↓
ClickHouse (raw fact + rollup view, 분석 대상)

왜 3중인가

저장소용도특성
구조화 로그 파일실시간 기록 + tail 모니터링 + 규제 준수append-only
장기 저장소 (S3)영구 아카이브 + 재처리 원천불변 (immutable)
분석 저장소 (ClickHouse)질의·집계 + 대시보드 소스SQL query

각 저장소가 서로 다른 용도를 가지며, 하나로 모두 커버 못합니다.

1. Runtime Audit Log

AuditEntry 구조

모든 Runtime 판단은 canonical JSONL row로 기록됩니다.

필드타입설명
ts_msinteger이벤트 발생 시각
session_idstring세션 식별자
event_typestring이벤트 종류
raw_payloadobject이벤트별 추가 정보
trace_idstring분산 추적 ID
request_idstring요청 ID
correlation_idstring상관 ID
challenge_idstring?챌린지 ID (해당 시)
flow_statestring현재 FlowState
risk_tierstring현재 Tier
actionstring결정된 Action
reason_codestring사유 코드
policy_versionstring적용된 정책 버전

Mandatory Event Types

이벤트의미
DEF_GUARD_SCOREDGuard가 riskScore 계산 완료
DEF_ANALYZER_EVIDENCE_UPDATEDAnalyzer가 counter/signal 갱신
DEF_PLAN_COMPUTEDPlanner가 action 선택
DEF_ORCH_EXECUTEDOrchestrator가 state transition·HTTP 응답 확정
DEF_THROTTLE_APPLIEDTHROTTLE 실제 적용
DEF_BLOCK_ENFORCEDBLOCK 실제 enforced
S3_CHALLENGE_RESULTVQA 결과 (PASS/FAIL)
TURNSTILE_VERIFIED외부 human score 수신

기록 특성

특성내용
append-only한 번 쓴 내용은 수정 없이 계속 쌓임
즉시 flush실행 도중 tail 모니터링 가능
스키마 검증event catalog 기반 검증
PII 금지 키 스캔개인정보 포함 방지

Local Warehouse Collector

JSONL을 tailing 또는 inline ingest하는 로컬 수집기. Compatibility·debug 용도로 유지되며 운영 raw fact 원천은 아님.

2. S3 Archive

동작

runtime audit JSONL (local file)
    ↓
주기적으로 atomic rename → rotation
    ↓
S3에 upload
    ├─ 성공 시 local rotated file 삭제
    └─ 실패 시 pending rotated file 유지 → 다음 주기 재시도

특성

특성내용
영구 아카이브삭제 안 함
Replay 원천문제 분석·재처리 시 원천 데이터
낮은 비용S3 표준 스토리지 (콜드 스토리지도 고려)

3. ETL Worker

동작

S3 object 선택 (신규 업로드된 .jsonl 파일)
    ↓
각 row를 canonical audit payload에서 ClickHouse insert row로 변환
    ↓
같은 object 내 dedup key 중복은 건너뜀
    ↓
batch size 도달 시 ClickHouse writer flush (retry policy 적용)
    ↓
성공한 object만 Redis processed-key ledger에 completed 기록

실패 처리

실패처리
일부 row 변환 실패ledger에 completed 기록 안 됨
Batch write 실패retry 후 실패 시 ledger 미기록
결과다음 run 또는 force replay로 재처리 가능

환경별 권장 설정

환경Archive IntervalBatch Size
Staging60초128
Production300초256

4. ClickHouse

Raw Fact Table — defense_audit_events

주요 컬럼:

컬럼의미
ts_ms이벤트 시각
session_id세션
event_type이벤트 종류
trace_id트레이스
challenge_id챌린지
flow_state상태
risk_tierTier
actionAction
reason_code사유
policy_version정책 버전
raw_payload_json전체 페이로드

Read Model Views (5분 고정 window)

defense_session_rollups

Session별 집계.

컬럼의미
session_id세션
window_start_ms윈도우 시작
event_count이벤트 수
unique_traces고유 트레이스 수
latest_flow_state최신 flow state
latest_action최신 action
latest_tier최신 tier
latest_reason최신 사유
latest_policy_version최신 정책 버전
throttle_countthrottle 횟수
block_countblock 횟수
challenge_count챌린지 횟수

defense_match_rollups

경기별 집계 (match_id는 path 또는 session_id shape에서 보수적으로 추출).

defense_post_review_candidates_v1

사후 검토 후보 세션 목록. block·challenge·throttle·non-none action이 있는 세션을 후보로.

운영 지표

ClickHouse Ingest 실패 복구

상황복구
ClickHouse ingest 실패S3 archive가 replay 원천이므로 복구 가능
원인 확인 필요key, flush_index, retry 설정, last_error 로그

에러 타입

에러의미복구
ETLIngestErrorObject-level 실패S3 object replay
CanonicalAuditMappingErrorSchema drift 가능성스키마 확인
ClickHouseBatchWriteErrorBatch write 실패network·auth·table·timeout 확인

Processed-key Ledger

역할

항목내용
목적중복 처리 방지
저장소Redis
TTL영구 ledger 아니라 운영 dedup cache

TTL이 지나면 이론상 재처리 가능하지만, 일반적으로 같은 object를 두 번 처리할 일은 없음.

재처리·Force Replay

언제 필요한가

상황대응
ClickHouse raw fact 손상S3 archive에서 재처리
특정 날짜 다시 처리 필요date 기반 force replay

명령

tm-ai-etl-worker --force-replay --from-date 2026-04-16

Read Model의 한계

Match ID 추출 모호성

문제설명
추출 방식path 또는 session_id shape 기반 보수적 추출
한계일부 세션은 match_id가 ambiguous 또는 missing
개선 방향백엔드 계약 기반으로 안정화

참조