Cloudflare 기반 모니터링 설계 (Serverless Observability)
목적: Hetzner에 Prometheus/Grafana를 두지 않고, Cloudflare Stack(Workers, D1, KV, Logpush, Analytics Engine) 으로 서비스 관측성을 구축하는 설계.
참조: api-control-plane-implementation-plan.md §16–§17, cloudflare-logpush-observability-plan.md.
1. 기존 기술 → Cloudflare 대체 매핑
| 기존 기술 | Cloudflare 대체 기술 | 역할 및 장점 |
|---|
| Prometheus DB | Cloudflare D1 / Analytics Engine | 시계열·집계 데이터 저장 및 SQL 기반 쿼리. Scrape 대기 없이 이벤트 발생 시 즉시 기록. |
| Grafana Dashboard | Cloudflare 대시보드 / Workers 기반 커스텀 UI | 기본 대시보드 또는 D1·Analytics Engine 쿼리로 Chart.js 등 활용한 SaaS 내장 대시보드. |
| Alertmanager | Workers + Cloudflare Notifications | 임계치 도달 시 이메일, Webhook, PagerDuty 알림. |
| Log Storage | Cloudflare R2 + Logpush | 장기 로그 보관·분석. 별도 로깅 서버 없이 에지 로그를 R2로 직접 전송. |
2. 아키텍처 개요 (Serverless Observability)
모든 지표를 Cloudflare 데이터 파이프라인에 태워 보내는 방식. Hetzner에서 메트릭을 Scrape하는 구조가 아님.
2.1 메트릭 수집: Cloudflare Workers Analytics Engine
| 항목 | 내용 |
|---|
| 방식 | Zuplo 또는 Control Plane Worker 내부에서 요청·이벤트 발생 시 env.ANALYTICS_ENGINE.writeDataPoint() 호출. |
| 이점 | 초당 수만 건 고성능 시계열 기록. Prometheus처럼 Scrape 주기를 기다릴 필요 없음. |
| 지표 예 | 테넌트별 API 요청 수, 4xx/5xx, 지연 시간, provisioning 성공/실패, queue depth. |
2.2 로그 수집: Cloudflare Logpush & R2
| 항목 | 내용 |
|---|
| 방식 | Zuplo API 로그·Workers 로그를 Logpush로 R2 버킷에 전송. |
| 이점 | 별도 로깅 서버 없이 테넌트 활동 로그 영구 보존. logpush-setup.md와 연계. |
2.3 데이터 시각화: Workers + D1 (커스텀 대시보드)
| 항목 | 내용 |
|---|
| 방식 | D1에 저장된 테넌트·job 상태와 Analytics Engine 데이터를 쿼리해, 관리자 페이지 또는 전용 Worker에서 Chart.js 등으로 차트 렌더링. |
| 이점 | Grafana 별도 운영 없이 SaaS 제품 내부 대시보드에 자연스럽게 통합. 테넌트별 사용량·과금 연동(SQL Join) 용이. |
2.4 알림: Workers + Cloudflare Notifications
| 항목 | 내용 |
|---|
| 방식 | Cron Worker 또는 이벤트 핸들러에서 D1·Analytics Engine 집계 결과를 주기적으로 검사. 임계치 초과 시 Webhook·이메일·PagerDuty 등 호출. |
| 이점 | Alertmanager 인프라 없이 Serverless 알림 파이프라인 구축. |
3. 장단점 및 Hybrid 권장
3.1 장점
- Zero Infrastructure: Hetzner에 Prometheus/Grafana OS·디스크·메모리 관리 불필요.
- 테넌트별 과금 연동: D1에서 테넌트 정보와 사용량을 SQL로 Join하기 쉬워 사용량 기반 과금 구현에 유리.
- Global Scalability: 전 세계 어디서 접속해도 Cloudflare Edge에서 처리되어 응답이 빠름.
3.2 트레이드오프
- 세밀한 서버 메트릭: CPU 온도, 디스크 I/O 등 Hetzner 서버 내부 하드웨어 지표는 Cloudflare만으로는 수집 한계. 별도 에이전트(Worker 배포 또는 경량 스크립트) 필요.
- 쿼리 언어: PromQL 대신 SQL(D1)·Cloudflare Analytics API 사용. 기존 Grafana/PromQL 지식과는 다른 학습 필요.
3.3 Hybrid Observability (권장)
| 영역 | 권장 방식 |
|---|
| 애플리케이션/비즈니스 지표 | Cloudflare Analytics Engine + D1. 테넌트별 API 사용량, 에러율, 프로비저닝 성공률 등. |
| 인프라/하드웨어 지표 | Hetzner 서버 상태는 Cloudflare Tunnel 경유 주기적 헬스체크 또는 초소형 스크립트가 D1에 상태 업데이트. 필요 시 기존 Node Exporter + 단일 Prometheus 인스턴스는 최소 구성으로만 유지 가능. |
4. 구현 단계 제안
- Analytics Engine 연동: Workers/Zuplo에서
writeDataPoint()로 테넌트별 API 사용량·에러 추적.
구현: cloudflare-analytics-engine-implementation.md. Control Plane Worker에 ANALYTICS_ENGINE 바인딩·src/analytics.ts·라우트별 호출 적용됨.
- D1 기반 커스텀 대시보드: D1 + Analytics Engine 쿼리로 SaaS 전용 대시보드 UI (Chart.js 등).
구현: cloudflare-dashboard-implementation.md. Control Plane GET /internal/metrics/summary (D1 집계 JSON) 제공. UI는 정적 페이지·Chart.js 또는 관리자 앱에서 해당 API 소비.
- Hetzner 보완(Hybrid): CPU/메모리/디스크를 D1에 쏘아주는 경량 스크립트.
구현: Control Plane POST /internal/server-metrics (Bearer INTERNAL_API_KEY), D1 server_metrics 테이블(migration 0007). 노드에서 cron + curl 또는 server-metrics-collection.md 스크립트로 푸시. 대시보드 GET /internal/metrics/summary·/internal/dashboard에 Node health(server_metrics) 테이블 포함.
5. 관련 문서