81 lines
3.2 KiB
Python
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 |