freeleaps-service-hub/apps/metrics/webapi/routes/starrocks_metrics/metrics_query.py
2025-10-23 13:48:35 +08:00

81 lines
3.2 KiB
Python

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: Optional[str] = Field(None, 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[Optional[str], Optional[str]] = Field([None, None], description="Start and end date of the query")
class MetricQueryRequest(BaseModel):
"""Request model for metric query by time range."""
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")
step: Optional[str] = Field(None, description="Aggregation step, e.g., 1d or 1m")
start_date: Optional[str] = Field(None, description="Start date in YYYY-MM-DD HH:MM:SS format")
end_date: Optional[str] = Field(None, 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,
step=request.step,
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 if request.start_date else None,
"end": request.end_date if request.end_date else None
}
)
await module_logger.log_info(
f"Successfully queried metric '{request.metric_name}' with {len(data_points)} data points")
return response