159 lines
4.3 KiB
Python
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] |