- ClickHouse의 내부 LogHouse는 1년 만에 19PiB·약 40조 행에서 100PB 이상 비압축 로그와 거의 500조 행을 저장하는 규모로 커짐
- 기존 OpenTelemetry 중심 수집 경로는 JSON, OTel 포맷, ClickHouse Native 포맷을 오가며 CPU 비용과 로그 드롭 위험을 키웠음
- ClickHouse는 SysEx(System Tables Exporter)로 시스템 테이블을 LogHouse에 바이트 단위 복사해 37M logs/s를 70 CPU 코어로 처리함
- OTel은 stdout·stderr 기반 장애 로그와 벤더 중립 표준 포맷에 계속 유용하지만, 핵심 ClickHouse 텔레메트리는 SysEx와 wide events 중심으로 이동함
- HyperDX 도입 이후 ClickHouse 네이티브 UI, Lucene 문법 검색, SQL 분석, 스키마 비의존 탐색을 결합해 Grafana 기반 커스텀 UI의 일부 역할을 대체하고 있음
LogHouse가 100PB와 500조 행 규모로 커짐
- LogHouse는 ClickHouse Cloud 모니터링을 위해 만든 내부 로깅 플랫폼이며, 이전에는 커지는 Datadog 비용을 대체하는 역할도 했음
- 1년 전에는 19PiB 비압축 데이터와 37조 행을 처리했고, 현재는 100PB 이상 비압축 데이터와 거의 500조 행을 저장함
- 현재 저장 데이터의 주요 구성은 다음과 같음
- SysEx: 93.6PB, 431조 행
- OTel: 14.5PB, 16.7조 행
- 이전에는 모든 텔레메트리가 OpenTelemetry를 통과했지만, 지금은 대부분의 데이터가 ClickHouse가 만든 목적 특화 exporter인 SysEx에서 들어옴
OpenTelemetry 파이프라인의 한계
- OpenTelemetry는 Kubernetes 환경의 모든 Pod 로그를 ClickHouse로 보내는 초기 표준 파이프라인으로 적합했음
- ClickHouse의 stdout 텍스트 로그만으로는 운영 분석에 충분하지 않았고, 실제 분석에는
system테이블의 구조화 로그, 메트릭, 실행 세부 정보, 디스크 I/O, 백그라운드 작업 상태가 필요했음 - 기존 OTel 로그 경로는 여러 변환 단계를 거쳤음
- 고객 ClickHouse 인스턴스가 로그를 JSON으로 stdout에 기록함
- kubelet이
/var/log/…에 로그를 저장함 - OTel collector가 디스크에서 로그를 읽고 JSON을 파싱해 메모리 표현으로 변환함
- collector가 이를 OTel 로그 포맷으로 다시 변환함
- ClickHouse Go client가 ClickHouse Native 포맷으로 재변환해 LogHouse에 삽입함
- 실제 OTel 파이프라인에는 edge collector, OTLP 전송, gateway collector, 추가 처리까지 포함되어 각 단계가 오버헤드·지연·복잡성을 늘림
- 규모가 커지면서 두 문제가 두드러짐
- ClickHouse Native 타입이 JSON과 OTel 포맷을 거치며 CPU를 낭비하고 데이터 충실도가 낮아짐
- Kubernetes 노드의 OTel agent가 CPU·메모리 제한에 걸려 트래픽 급증 시 로그 라인을 드롭함
- OTel 기반으로 20M rows/s를 손실 없이 처리하려면 agent와 collector 전체에 약 8,000 CPU 코어가 필요할 것으로 추정됨
SysEx: ClickHouse-to-ClickHouse 전송에 특화한 수집기
- ClickHouse는 System Tables Exporter(SysEx) 를 만들어 고객 Pod의 ClickHouse 시스템 테이블에서 LogHouse 테이블로 데이터를 직접 전송함
- SysEx는 소스와 목적지 사이에서 바이트 단위 복사를 수행해 ClickHouse Native 타입을 보존하고 중간 변환을 제거함
- 이 구조 덕분에 엔지니어가 live instance 디버깅에 쓰던 쿼리를 LogHouse의 전체 플릿 과거 데이터 쿼리로 쉽게 바꿀 수 있음
- 테이블 스키마가 동일하고, Pod 이름·ClickHouse 버전 같은 enrichment 컬럼만 추가됨
- 아키텍처는 SysEx scraper 풀과 hash ring으로 구성됨
- hash ring이 고객 Pod를 특정 scraper replica에 배정해 부하를 분산함
- scraper는 소스 Pod의 system table에
SELECT를 실행하고 데이터를 LogHouse로 스트리밍함 - scraper는 역직렬화 없이 소스와 목적지 사이의 바이트 전달을 조율함
- 시스템 테이블의 버퍼 flush 누락을 피하기 위해 SysEx는 슬라이딩 시간 창을 쓰며, 일반적으로 실시간보다 5분 늦게 쿼리함
- Go ClickHouse client의 기본 동작은 데이터를 Go native type으로 변환하므로, ClickHouse는 내부 marshalling을 우회하는 기능을 clickhouse-go에 기여함
- SysEx는 pull 기반 모델이라 OTel처럼 무거운 버퍼링이 필요 없고, LogHouse가 일시적으로 사용할 수 없거나 소스 텔레메트리가 급증해도 과거 window를 다시 scrape해 백필할 수 있음
동적 스키마와 상태 스냅샷
- SysEx는 소스와 타깃 스키마가 일치해야 하지만, ClickHouse system table 스키마는 새 메트릭과 컬럼 추가로 자주 바뀜
- 이를 처리하기 위해 SysEx는 system table을 만나면 스키마를 검사하고 hash한 뒤 LogHouse에 같은 스키마 테이블이 있는지 확인함
- 있으면 기존 테이블에 삽입함
- 없으면
text_log_6같은 새 스키마 버전을 생성함
- 쿼리 시점에는 ClickHouse의 Merge table engine을 사용해 여러 스키마 반복을 하나의 논리 뷰로 묶음
- Merge table engine은 호환 컬럼만 선택하거나 요청 컬럼이 있는 테이블로 쿼리를 제한해 스키마 변화에도 수동 관리 없이 조회할 수 있게 함
- ClickHouse는
system.processes같은 인메모리 system table도 주기적으로 스냅샷으로 캡처해 LogHouse에 저장함 - 이 스냅샷은 특정 시점의 클러스터 상태, 테이블 스키마, 클러스터 설정을 과거 기준으로 분석하는 데 쓰임
전체 플릿 분석과 효율 수치
- SysEx 덕분에 고객이 개별 ClickHouse 인스턴스 모니터링에 쓰는 Advanced Dashboard queries를 전체 고객 인스턴스 플릿에 동시에 실행할 수 있음
- 릴리스 분석에서는 배포 전후에 진단 쿼리를 실행해 쿼리 성능 패턴, 리소스 사용 추세, 오류율 변화를 플릿 규모에서 실시간으로 확인함
- 지원 대시보드는 Advanced Dashboard 쿼리와 함께 네트워크 로그, Kubernetes 이벤트, data plane·control plane 이벤트를 같은 인터페이스에서 상관분석함
- LogHouse 기준 효율 비교는 다음과 같음
- OTel Collectors: 800 CPU 코어 이상으로 2M logs/s 전송
- LogHouse Scrapers(SysEx): 70 CPU 코어로 37M logs/s 전송
- SysEx는 가장 중요한 데이터 소스에서 이벤트 볼륨을 20배 늘리면서 CPU footprint를 기존의 10% 미만으로 줄였고, edge에서 이벤트를 드롭하지 않게 됨
OpenTelemetry가 여전히 필요한 영역
- OpenTelemetry는 표준화된 벤더 중립 포맷과 신규 사용자 온보딩 경험을 제공하므로 ClickStack의 기본 선택지로 남아 있음
- SysEx는 ClickHouse 내부와 강하게 결합되어 있고 live system table을 쿼리하는 pull 기반 구조라, 서비스가 crash loop 중이거나 down 상태이면 데이터를 scrape할 수 없음
- OpenTelemetry는 stdout과 stderr에 emit된 로그를 passive하게 캡처하므로 서비스가 완전히 healthy 상태가 아니어도 장애 중 로그를 수집할 수 있음
- ClickHouse는 모든 ClickHouse 서비스에서 OpenTelemetry를 계속 실행하되 수집 범위를 바꿈
- 이전에는 trace-level 로그까지 모두 ingest함
- 현재는 info-level 이상만 수집함
- 이 변경 이후 OTel collector와 gateway는 훨씬 적은 리소스로 동작하며, 앞서 언급한 2M log lines/s 규모의 더 작은 파이프라인으로 유지됨
HyperDX와 ClickHouse 네이티브 탐색 경험
- LogHouse의 첫 UI는 Grafana 위에 구축한 커스텀 옵저버빌리티 경험이었지만, SysEx와 wide-column 텔레메트리가 늘면서 ClickHouse에 더 깊게 통합된 UI가 필요해짐
- HyperDX는 ClickHouse 네이티브 UI로 로그·트레이스 탐색, 상관분석, 대규모 분석을 지원함
- Lucene 문법으로 쿼리할 수 있어 데이터 탐색이 단순해지고, 복잡한 이벤트 분석에는 SQL을 계속 사용할 수 있음
- HyperDX v2.0의 스키마 비의존 접근은 단일 고정 로그 테이블 구조를 요구하지 않음
- OpenTelemetry 파이프라인의 표준화되지만 변화하는 데이터 포맷을 처리함
- SysEx와 다른 custom exporter의 specialized wide-column table도 사전 스키마 지식이나 복잡한 grok pattern 없이 처리함
- Grafana도 여전히 LogHouse에서 역할이 있음
- 내부 Grafana 기반 앱은 namespace를 지정하게 해 서비스별 데이터 위치를 알고 적절한 ClickHouse 인스턴스로 쿼리를 라우팅함
- Prometheus 메트릭 기반의 기존 대시보드와 알림은 여전히 Grafana에 남아 있음
- kube_state_metrics 같은 고수준 메트릭은 deep investigation에는 적합하지 않아도 alerting에는 적합함
Wide events와 고카디널리티 옵저버빌리티
- SysEx 도입은 stdout 로그 중심 수집에서 system table 기반 wide events와 고카디널리티 데이터 중심 모델로 전환하게 함
- ClickHouse는 이를 Observability 2.0 대신 LogHouse와 ClickStack의 결합으로 부름
- 이 모델은 전통적인 세 기둥 모델 대신 중앙 warehouse에 여러 소스의 고카디널리티 텔레메트리를 저장함
- 각 row는 query identifier, Pod 이름, version metadata, network detail 같은 풍부한 context를 포함하며, metric store 제한에 맞추기 위해 dimension을 사전 집계하거나 버리지 않음
- ingest 시점에 요약하지 않고 원본 그대로 저장한 뒤 집계는 query time으로 미룸
- Prometheus와의 차이는 모든 data point를 저장한다는 점임
insertDuration같은 필드를 사전 집계하지 않고 각 값을 관련 dimension과 함께 보존함- Prometheus에서 모든 label 조합의 timeseries를 저장하면 카디널리티 폭증이 생김
- histogram 사전 집계는 리소스 사용을 제어하지만, 특정 spike가 어떤 instance, table, time window의 insert인지 묻기 어렵게 함
- Elasticsearch도 wide events와 유연한 document 구조를 장려했지만, ClickHouse의 columnar design은 고카디널리티·고볼륨 이벤트 데이터를 대규모로 효율 저장하고 쿼리할 수 있게 함
데이터 과학 도구와 SQL 분석
- wide event 하나에서 여러 특성을 시각화할 수 있고, 차트의 특정 지점에서 raw log로 되돌아갈 수 있음
- ClickHouse는 데이터 시각화 통합과 언어 클라이언트를 제공하므로 Plotly, Jupyter notebook, Hex, Bokeh, Evidence 같은 SQL 기반 도구를 사용할 수 있음
- HyperDX의 Lucene 문법 검색은 빠른 조회와 필터링에 적합하지만, 복잡한 질문에는 SQL이 필요함
- ClickHouse SQL은 join, 시간 기반 연산, 변환을 표현할 수 있음
- 예시는 Kubernetes event stream에서 같은 container의
Killing이벤트와Created이벤트를ASOF JOIN으로 맞춰 종료 후 재시작까지 걸린 시간을 계산함 - 예시 쿼리는 17.78M rows와 581.49MB를 처리했고 0.099초가 걸렸으며 peak memory는 272.88MiB였음
- 예시는 Kubernetes event stream에서 같은 container의
- 필요한 메트릭을 미리 component로 만들어 배포하지 않고, wide events warehouse에서 query time에 도출할 수 있음
LogHouse에 추가된 데이터 소스
- LogHouse는 엔지니어링·지원 팀 요청에 따라 더 많은 wide event 기반 데이터 sink를 추가함
- kubenetmon: Kubernetes 네트워킹 모니터링용 오픈소스 도구이며 Linux conntrack을 사용해 L3/L4 connection data와 byte·packet count를 캡처함
- forensics, workload·pod attribution, cross-region egress 같은 비용 추적 metering을 제공함
- 프로젝트: https://github.com/ClickHouse/kubenetmon
- Kubernetes Event Exporter: 인기 exporter를 fork하고 ClickHouse native sink를 추가해 Kubernetes API 이벤트를 대규모로 분석함
- fork: ClickHouse/kubernetes-event-exporter
- 앞으로 이벤트뿐 아니라 전체 Kubernetes object model을 LogHouse에 ingest하고, 모든 변경 시점의 snapshot을 저장하는 계획을 진행 중임
- Control Plane Data: LogHouse에 아직 온보딩되지 않았던 Control Plane 부서의 운영 데이터를 수집함
- Real User Monitoring(RUM): 진행 중인 프로젝트로, 사용자 브라우저의 frontend performance metric을 public gateway를 통해 OTel 파이프라인으로 보냄
- Istio Access Log: Istio service mesh의 HTTP-level traffic data를 ingest해 request·response pattern, latency, routing decision을 캡처함
system.query_log, kubenetmon network flow와 결합해 SQL query, HTTP request, packet flow를 교차 분석함
다음 단계: zero-impact scraping과 JSON
- SysEx scrape query는 strict memory limit로 제한되어 있지만, 고객이 로그와 메트릭에서 이를 볼 때 우려가 생길 수 있음
- ClickHouse는 live system에 쿼리를 실행하지 않는 zero-impact scraping을 탐색 중임
- ClickHouse가 service log를 이미 쓰는 S3의 plain rewritable disk를 활용하는 방향이 유망함
- SysEx worker pool이 disk 기반 log table을 직접 mount하면 실행 중인 ClickHouse instance 쿼리를 우회할 수 있음
- 이 접근이 성공하면 native format, high fidelity, 최소 변환이라는 현재 장점을 유지하면서 운영 영향에 대한 인식까지 줄일 수 있음
- ClickHouse의 JSON 타입은 25.3에서 GA에 도달했고, 새 필드 등장 시 적절한 타입의 컬럼을 동적으로 만들며 여러 타입 필드와 schema explosion도 처리함
- LogHouse는 JSON이 대규모 옵저버빌리티 접근 패턴에 얼마나 맞는지 평가 중임
- JSON blob 전체에서 문자열을 찾으면 수천 개 컬럼을 스캔할 수 있음
- 구조화 데이터와 함께 raw string JSON을 저장하는 우회책이 있음
- 대부분의 log·resource attribute는 작고 안정적이어서 Map type도 여전히 적합함
- HyperDX는 map access를 JSONExtract 함수로 자동 변환함