Step 10: 데이터 분석 및 통계 시스템 구현

주요 기능:
- Statistics Service 마이크로서비스 구축
- 실시간 메트릭 수집 시스템 (Kafka 연동)
- 시계열 데이터베이스 인터페이스 구현
- 데이터 집계 및 분석 엔진
- 사용자/시스템/이벤트 분석 API
- WebSocket 기반 실시간 대시보드
- 알림 규칙 및 임계값 설정
- CSV 데이터 내보내기

구현된 컴포넌트:
- MetricsCollector: Kafka 이벤트 메트릭 수집
- DataAggregator: 시간별/일별 데이터 집계
- TimeSeriesDB: 시계열 데이터 저장 인터페이스
- WebSocketManager: 실시간 데이터 스트리밍
- Analytics APIs: 다양한 분석 엔드포인트

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
jungwoo choi
2025-09-11 15:01:15 +09:00
parent 1ca9ca1b5d
commit fad4bffdd9
9 changed files with 1670 additions and 0 deletions

View File

@ -0,0 +1,159 @@
"""
Data models for Statistics Service
"""
from pydantic import BaseModel, Field
from datetime import datetime
from typing import Optional, List, Dict, Any, Literal
from enum import Enum
class MetricType(str, Enum):
"""Types of metrics"""
COUNTER = "counter"
GAUGE = "gauge"
HISTOGRAM = "histogram"
SUMMARY = "summary"
class AggregationType(str, Enum):
"""Types of aggregation"""
AVG = "avg"
SUM = "sum"
MIN = "min"
MAX = "max"
COUNT = "count"
PERCENTILE = "percentile"
class Granularity(str, Enum):
"""Time granularity for aggregation"""
MINUTE = "minute"
HOUR = "hour"
DAY = "day"
WEEK = "week"
MONTH = "month"
class Metric(BaseModel):
"""Single metric data point"""
id: Optional[str] = Field(None, description="Unique metric ID")
name: str = Field(..., description="Metric name")
type: MetricType = Field(..., description="Metric type")
value: float = Field(..., description="Metric value")
tags: Dict[str, str] = Field(default_factory=dict, description="Metric tags")
timestamp: datetime = Field(default_factory=datetime.now, description="Metric timestamp")
service: str = Field(..., description="Source service")
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
class AggregatedMetric(BaseModel):
"""Aggregated metric result"""
metric_name: str
aggregation_type: AggregationType
value: float
start_time: datetime
end_time: datetime
granularity: Optional[Granularity] = None
group_by: Optional[str] = None
count: int = Field(..., description="Number of data points aggregated")
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
class TimeSeriesData(BaseModel):
"""Time series data response"""
metric_name: str
start_time: datetime
end_time: datetime
interval: str
data: List[Dict[str, Any]]
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
class DashboardConfig(BaseModel):
"""Dashboard configuration"""
id: str
name: str
description: Optional[str] = None
widgets: List[Dict[str, Any]]
refresh_interval: int = Field(60, description="Refresh interval in seconds")
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
class AlertRule(BaseModel):
"""Alert rule configuration"""
id: Optional[str] = None
name: str
metric_name: str
condition: Literal["gt", "lt", "gte", "lte", "eq", "neq"]
threshold: float
duration: int = Field(..., description="Duration in seconds")
severity: Literal["low", "medium", "high", "critical"]
enabled: bool = True
notification_channels: List[str] = Field(default_factory=list)
created_at: datetime = Field(default_factory=datetime.now)
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
class Alert(BaseModel):
"""Active alert"""
id: str
rule_id: str
rule_name: str
metric_name: str
current_value: float
threshold: float
severity: str
triggered_at: datetime
resolved_at: Optional[datetime] = None
status: Literal["active", "resolved", "acknowledged"]
class Config:
json_encoders = {
datetime: lambda v: v.isoformat()
}
class UserAnalytics(BaseModel):
"""User analytics data"""
total_users: int
active_users: int
new_users: int
user_growth_rate: float
average_session_duration: float
top_actions: List[Dict[str, Any]]
user_distribution: Dict[str, int]
period: str
class SystemAnalytics(BaseModel):
"""System performance analytics"""
uptime_percentage: float
average_response_time: float
error_rate: float
throughput: float
cpu_usage: float
memory_usage: float
disk_usage: float
active_connections: int
services_health: Dict[str, str]
class EventAnalytics(BaseModel):
"""Event analytics data"""
total_events: int
events_per_second: float
event_types: Dict[str, int]
top_events: List[Dict[str, Any]]
error_events: int
success_rate: float
processing_time: Dict[str, float]