# OSOLIT Monitor

시스템 헬스체크 & 모니터링 대시보드 (Nuxt 3 + SQLite + SSE)

## 주요 기능

### 📊 실시간 대시보드 (웹소켓/SSE 기반)
- **네트워크 점검** 포틀릿 (단일, 핵심)
- Server-Sent Events (SSE)로 실시간 업데이트
- 점검 시간과 상태 즉시 반영
- 연결 상태 표시 (🟢 연결됨 / 🔴 연결 끊김)
- 향후 추가 포틀릿 확장 가능

### 🔄 적응형 스케줄러
- **정상 시**: 5분 간격 점검
- **장애 시**: 1분 간격 점검 (빠른 복구 감지)
- 자동으로 간격 조정
- DB 시간 기준으로 로그 저장

### 🌐 네트워크 점검
- World Time API를 통한 외부 네트워크 상태 확인
- 응답 시간 측정
- 에러 메시지 상세 표시

### 💾 데이터 저장
- **SQLite 파일 DB** (`database/health_logs.db`)
- 별도 DB 서버 설치 불필요
- 상태: UP(정상) / DOWN(장애)

## 설치 및 실행

### 1. 의존성 설치
```bash
npm install
```

### 2. 개발 서버 실행
```bash
npm run dev
```

서버 시작 시:
- DB 자동 초기화
- 즉시 첫 네트워크 점검 실행
- SSE 서버 시작
- 개발 서버: http://localhost:3000

### 3. 프로덕션 빌드
```bash
npm run build
npm run preview
```

## 화면 구성

### 홈 (실시간 대시보드)
**http://localhost:3000**

#### 네트워크 점검 포틀릿
```
┌─────────────────────────────────┐
│ 🌐 네트워크 점검           ✓    │  ← 상태 아이콘
├─────────────────────────────────┤
│         [ UP ]                  │  ← 상태 뱃지
│                                 │
│  점검 시간: 12/25 14:35:20     │  ← 마지막 점검 시간
│  응답 시간: 123ms              │  ← 응답 속도
├─────────────────────────────────┤
│  5분 전        ⏱️ 5분 간격     │  ← 상대시간 & 점검주기
└─────────────────────────────────┘
```

**실시간 업데이트:**
- 점검 완료 시 즉시 화면 반영
- 별도 새로고침 불필요
- SSE 연결 상태 표시

**향후 확장:**
- 데이터베이스 점검 포틀릿
- 서버 상태 포틀릿
- 디스크 용량 포틀릿
- 기타 모니터링 항목

### 로그 & 통계
**http://localhost:3000/logs**
- 전체 점검 이력
- 통계 정보

### 시스템 헬스체크
**http://localhost:3000/health**
- 실시간 상태 조회

### 글로벌 표준시
**http://localhost:3000/time**
- Time API 직접 테스트

## 프로젝트 구조

```
osolit-monitor/
├── frontend/
│   ├── index.vue         # 🏠 실시간 대시보드
│   ├── logs.vue          # 📊 로그 & 통계
│   ├── health.vue        # 🏥 헬스체크
│   └── time.vue          # 🌍 시간 API
├── backend/
│   ├── api/
│   │   ├── dashboard.get.ts  # 대시보드 초기 데이터
│   │   ├── stream.get.ts     # SSE 스트림 (실시간)
│   │   ├── logs.get.ts
│   │   └── stats.get.ts
│   ├── plugins/
│   │   └── scheduler.ts      # 적응형 스케줄러
│   └── utils/
│       ├── database.ts       # SQLite
│       └── timecheck.ts      # 네트워크 체크
├── database/
│   └── health_logs.db        # SQLite (자동 생성)
└── nuxt.config.ts
```

## 실시간 업데이트 (SSE)

### Server-Sent Events
```javascript
// 프론트엔드
const eventSource = new EventSource('/api/stream')

eventSource.onmessage = (event) => {
  const message = JSON.parse(event.data)
  
  if (message.type === 'health_update') {
    // 화면 즉시 업데이트
    networkStatus.value = message.data
  }
}
```

### 메시지 타입
- `health_update`: 헬스체크 결과
- `ping`: 연결 유지 (30초마다)

### 자동 재연결
연결 끊김 시 5초 후 자동 재연결 시도

## 적응형 스케줄링

### 동작 방식
1. **서버 시작**: 즉시 첫 점검
2. **정상(UP)**: 다음 점검 5분 후
3. **장애(DOWN)**: 다음 점검 1분 후 (빠른 복구 감지)
4. **상태 변경 시**: 자동으로 간격 조정

### 콘솔 로그
```
🚀 Initializing Health Check Scheduler...
✅ Database initialized
⏰ Running network health check...
   Result: UP (123ms)
✅ Health Check Scheduler started

[5분 후]
⏰ Running network health check...
   Result: DOWN (5001ms)
🔄 Interval changed: 1 minutes

[1분 후]
⏰ Running network health check...
   Result: UP (125ms)
🔄 Interval changed: 5 minutes
```

## API 엔드포인트

### GET /api/dashboard
초기 대시보드 데이터

**Response:**
```json
{
  "networkStatus": {
    "id": 123,
    "service_name": "Network",
    "status": "UP",
    "check_time": "2024-12-25T12:34:56.000Z",
    "response_time": 123,
    "error_message": null
  },
  "lastUpdate": "2024-12-25T12:34:56.789Z"
}
```

### GET /api/stream (SSE)
실시간 업데이트 스트림

**Event Stream:**
```
data: {"type":"health_update","data":{...}}

data: {"type":"ping","timestamp":"2024-12-25T12:34:56.789Z"}
```

### GET /api/logs
헬스체크 로그 조회

### GET /api/stats
통계 조회

## 데이터베이스 스키마

### health_check_log 테이블
```sql
CREATE TABLE health_check_log (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  check_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  service_name TEXT NOT NULL,          -- 'Network'
  status TEXT NOT NULL,                -- 'UP' or 'DOWN'
  response_time INTEGER,               -- 밀리초
  error_message TEXT,
  details TEXT
)
```

## 데이터 관리

### DB 백업
```bash
cp database/health_logs.db database/backup_$(date +%Y%m%d).db
```

### DB 조회
```bash
sqlite3 database/health_logs.db

# 최근 로그
SELECT * FROM health_check_log 
WHERE service_name = 'Network' 
ORDER BY check_time DESC LIMIT 20;

# 통계
SELECT 
  status, 
  COUNT(*) as count,
  AVG(response_time) as avg_ms
FROM health_check_log 
WHERE service_name = 'Network'
GROUP BY status;
```

## 브라우저 호환성

SSE 지원 브라우저:
- ✅ Chrome
- ✅ Firefox
- ✅ Safari
- ✅ Edge
- ❌ IE (미지원)

## 다음 단계

- [ ] 데이터베이스 점검 포틀릿 추가
- [ ] 서버 상태 점검 포틀릿 추가
- [ ] 디스크 용량 점검 포틀릿 추가
- [ ] Jenkins Job 통합
- [ ] 장애 알림 (이메일/Slack)
- [ ] 차트/그래프
- [ ] 오래된 로그 자동 삭제

## 기술 스택

- **Frontend**: Nuxt 3, Vue 3
- **Backend**: Nitro (Node.js)
- **Database**: SQLite (better-sqlite3)
- **Real-time**: Server-Sent Events (SSE)
- **Scheduler**: 적응형 (정상 5분, 장애 1분)
- **External API**: World Time API

## 특징

✅ **실시간 업데이트** - SSE로 즉시 반영  
✅ **적응형 스케줄링** - 장애 시 빠른 점검  
✅ **단순한 구조** - 네트워크 점검 중심  
✅ **확장 가능** - 포틀릿 추가 용이  
✅ **파일 DB** - 별도 서버 불필요
