freeleaps-service-hub/apps/metrics/webapi/bootstrap/application.py
weicao 44f08eee68 Add metrics service with user registration API endpoints
- Add complete metrics microservice structure
- Implement StarRocks database integration
- Add user registration data query APIs:
  - Daily registered users by date range
  - Recent N days registration data
  - Registration data by start date and days
  - Registration summary statistics
- Add comprehensive error handling and logging
- Include test scripts and documentation
2025-09-11 17:35:20 +08:00

70 lines
1.9 KiB
Python

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from prometheus_fastapi_instrumentator import Instrumentator
from webapi.config.site_settings import site_settings
from loguru import logger
import os
def create_app() -> FastAPI:
"""
Create and configure the FastAPI application
"""
app = FastAPI(
title="Metrics Service API",
description="Metrics Service for Freeleaps Platform",
version="1.0.0",
docs_url="/docs",
redoc_url="/redoc"
)
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Setup logging
setup_logging()
# Setup Prometheus metrics
Instrumentator().instrument(app).expose(app)
# Include routers
# from webapi.routes import health, api
# app.include_router(health.router, prefix="/health", tags=["health"])
# app.include_router(api.router, prefix="/api/metrics", tags=["metrics"])
# Note: Registration router is included in main.py
return app
def setup_logging():
"""
Setup logging configuration
"""
# Create log directory if it doesn't exist
log_dir = site_settings.LOG_BASE_PATH
os.makedirs(log_dir, exist_ok=True)
# Configure loguru
logger.add(
f"{log_dir}/{site_settings.BACKEND_LOG_FILE_NAME}.log",
rotation="1 day",
retention="30 days",
level="INFO",
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name}:{function}:{line} | {message}"
)
logger.add(
f"{log_dir}/{site_settings.APPLICATION_ACTIVITY_LOG}.log",
rotation="1 day",
retention="30 days",
level="INFO",
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name}:{function}:{line} | {message}",
filter=lambda record: record["level"].name == "INFO"
)