Files
site11/services/statistics/backend/models.py
jungwoo choi fad4bffdd9 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>
2025-09-11 15:01:15 +09:00

159 lines
4.3 KiB
Python

"""
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]