from fastapi import APIRouter from typing import Optional, List, Dict, Any, Union from pydantic import BaseModel, Field from datetime import date, datetime from common.log.module_logger import ModuleLogger from backend.services.starrocks_metrics_service import StarRocksMetricsService class MetricDataPoint(BaseModel): """Single data point in metric time series.""" date: str = Field(..., description="Date in YYYY-MM-DD format") value: Union[int, float] = Field(..., description="Metric value") labels: Dict[str, Any] = Field(default_factory=dict, description="Metric labels") class MetricTimeSeriesResponse(BaseModel): """Response model for metric time series data.""" metric_name: str = Field(..., description="Name of the queried metric") data_points: List[MetricDataPoint] = Field(..., description="List of data points") total_points: int = Field(..., description="Total number of data points") time_range: Dict[str, str] = Field(..., description="Start and end date of the query") class MetricQueryRequest(BaseModel): """Request model for metric query.""" product_id: str = Field(..., description="Product ID to identify which product's data to query") metric_name: str = Field(..., description="Name of the metric to query") start_date: str = Field(..., description="Start date in YYYY-MM-DD HH:MM:SS format") end_date: str = Field(..., description="End date in YYYY-MM-DD HH:MM:SS format") router = APIRouter() # Initialize service and logger starrocks_service = StarRocksMetricsService() module_logger = ModuleLogger(__file__) @router.post("/starrocks/metrics_query", response_model=MetricTimeSeriesResponse) async def metrics_query( request: MetricQueryRequest ): """ Query StarRocks metrics time series data. Returns XY curve data (time series) for the specified metric within the given date range. """ await module_logger.log_info( f"Querying metric '{request.metric_name}' from product '{request.product_id}' from {request.start_date} to {request.end_date}") # Query the metric data data_points = await starrocks_service.query_metric_by_time_range( product_id=request.product_id, metric_name=request.metric_name, start_date=request.start_date, end_date=request.end_date ) # Format response response = MetricTimeSeriesResponse( metric_name=request.metric_name, data_points=[ MetricDataPoint( date=point["date"], value=point["value"], labels=point["labels"] ) for point in data_points ], total_points=len(data_points), time_range={ "start": request.start_date, "end": request.end_date } ) await module_logger.log_info( f"Successfully queried metric '{request.metric_name}' with {len(data_points)} data points") return response