Panopticon_userside
Frontend (Next.js 14)
- React 18 기반 홈쇼핑 UI
- 포트: 3001
- OTel SDK로 브라우저 traces 수집
Backend (NestJS 10)
- REST API (상품, 주문, 장바구니)
- OTel SDK로 traces & metrics 수집
- OpenTelemetry 자동 계측
- Winston/Pino로 structured logging
구조
- frontend/: Next.js 14 + React 18
- backend/: NestJS 10 + Express
- load-generator/: 트래픽 자동 생성
- k8s/: Kubernetes 배포 (tenant-a, tenant-b로 멀티테넌트 구성)
전체 시스템 구조 정리
┌─────────────────────────────────────────────────────────────────┐
│ Kubernetes 클러스터 │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Tenant-A (하나의 유저 서비스) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ 1. Application Pods (유저의 실제 서비스) │ │ │
│ │ │ │ │ │
│ │ │ • Backend (NestJS) │ │ │
│ │ │ └─ otel-config.ts 설치 ✅ │ │ │
│ │ │ └─ OTLP_ENDPOINT=http://localhost:4318 │ │ │
│ │ │ │ │ │
│ │ │ • Frontend (Next.js) │ │ │
│ │ │ └─ instrumentation.ts 설치 ✅ │ │ │
│ │ │ └─ OTLP_ENDPOINT=http://localhost:4318 │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ │ traces/metrics (OTLP) │ │
│ │ ↓ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ 2. OTel Collector (DaemonSet) │ │ │
│ │ │ - 각 노드에 하나씩 실행 │ │ │
│ │ │ - 같은 Pod의 App에서 localhost:4318로 받음 │ │ │
│ │ │ - Host metrics도 수집 │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ │ HTTP POST │ │
│ │ ↓ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ 3. Fluent Bit (DaemonSet) │ │ │
│ │ │ - 각 노드의 컨테이너 로그 수집 │ │ │
│ │ │ - /var/log/containers/*.log 읽음 │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ └───────────┼───────────────────────────────────────────────┘ │
│ │ │
│ │ 모두 여기로 전송 │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 4. Ingest Server (Deployment) : 수집서버 역할 │ │
│ │ - Service: ingest-server.default.svc:4318 │ │
│ │ - POST /v1/traces │ │
│ │ - POST /v1/metrics │ │
│ │ - POST /fluent-bit/logs │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
└──────────────┼───────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────┐
│ Panopticon Backend │
│ (Kafka → ...) │
└─────────────────────────────────┘
Markdown
복사
설치 페이지 분석
Collections 부분을 보면 매우 많은 섹션들이 존재함을 확인할 수 있음. 각 세션을 나눈 이유가 뭘까?
섹션 분리 분석 (왜 섹션을 다 나눌까)
1.
Application Monitoring
목적 : Traces + Metrics 수집
설치 위치 : 애플리케이션 코드 내부에
각 언어의 실행 방식이 다르기 때문에, 언어마다 내용이 다름
2.
Logging
목적 : Logs 수집
•
Fluentbit: 범용 로그 수집기 (모든 환경)
•
Node.js: 코드에서 직접 로그 전송
•
Vercel: Vercel 플랫폼 전용 연동
•
CloudFront: AWS 전용 연동
로그를 생성하고 수집하는 방식이 다름
3.
Browser
목적 : 프론트엔드 Traces (사용자 브라우저에서)
프론트엔드 프레임워크 구조가 달라서, 프레임워크마다 설정하는 방식이 다름
4.
Kubernetes
목적 : 인프라 레벨 수집
•
Kubernetes: YAML 매니페스트로 배포
•
Docker: docker-compose.yml로 배포
•
AKS: Azure 전용 연동
배포 방식이 다름
에이전트 설치 분석(우리 userside 앱 기준)
1단계 : 애플리케이션 레벨(코드 수준)
•
NestJS: OTel SDK 설치 + 설정 코드 추가
◦
backend/package.json에 OpenTelemetry 패키지 추가
◦
backend/otel-config.ts 설정 파일 생성
•
Next.js: OTel SDK 설치 + 설정 코드 추가
◦
frontend/instrumentation.ts 파일 생성
2단계 : 인프라 레벨(kubernetes)
•
OTel Collector DaemonSet: 애플리케이션이 생성한 traces/metrics를 수집
•
Fluent Bit DaemonSet: 컨테이너 로그를 수집
[NestJS/Next.js App]
└─ OTel SDK 설치 (코드) → traces/metrics 생성
↓
[Kubernetes Pod]
└─ OTel Collector (DaemonSet) → traces/metrics 수집 → Panopticon으로
전송
└─ Fluent Bit (DaemonSet) → 로그 수집 → Panopticon으로 전송
결론 : 프론트엔드에서 구현할(안내할) 내용
1.
언어/프레임워크별 가이드 (코드 레벨)
- NestJS용 OTel SDK 설치 가이드
- Next.js용 OTel SDK 설치 가이드
- (추가로 Go, Python 등)
2.
Kubernetes 에이전트 배포 가이드 (인프라 레벨)
- OTel Collector DaemonSet 배포
- Fluent Bit DaemonSet 배포
추가 질문 정리
쿠버네티스 환경이 아니라면, nest & next에 설치하는 SDK 말고 인프라 레벨에서 내용이 달라지는건가?
Observability(관찰 가능성)
설치 가이드 페이지 만들 때 알아야할 것
OpenTelemetry? OpenTelemetry Collector?


