From 35fbda6954e0a13f7f9d1f09ab7c458e49b068f0 Mon Sep 17 00:00:00 2001 From: weicao Date: Mon, 15 Sep 2025 16:31:20 +0800 Subject: [PATCH] Refactor metrics service: rename files for better readability - Rename starrocks_client.py -> database_client.py - Rename daily_registered_users.py -> user_registration_models.py - Rename daily_registration_service.py -> registration_analytics_service.py - Rename daily_registration.py -> registration_metrics.py - Rename site_settings.py -> app_settings.py - Rename application.py -> app_factory.py - Update all import statements and references - Update README.md with new file structure --- apps/metrics/README.md | 299 ++++++------------ ...starrocks_client.py => database_client.py} | 2 +- ...d_users.py => user_registration_models.py} | 0 ...e.py => registration_analytics_service.py} | 4 +- .../{application.py => app_factory.py} | 2 +- .../{site_settings.py => app_settings.py} | 0 apps/metrics/webapi/main.py | 8 +- ...egistration.py => registration_metrics.py} | 4 +- 8 files changed, 108 insertions(+), 211 deletions(-) rename apps/metrics/backend/infra/{starrocks_client.py => database_client.py} (98%) rename apps/metrics/backend/models/{registered_users.py => user_registration_models.py} (100%) rename apps/metrics/backend/services/{registration_service.py => registration_analytics_service.py} (96%) rename apps/metrics/webapi/bootstrap/{application.py => app_factory.py} (97%) rename apps/metrics/webapi/config/{site_settings.py => app_settings.py} (100%) rename apps/metrics/webapi/routes/{registration.py => registration_metrics.py} (97%) diff --git a/apps/metrics/README.md b/apps/metrics/README.md index ac893d0..54d367d 100644 --- a/apps/metrics/README.md +++ b/apps/metrics/README.md @@ -1,10 +1,12 @@ -# Metrics Service +# ๐Ÿ“Š Metrics Service -A FastAPI microservice for user registration statistics and data analytics in the Freeleaps platform. +> A lightweight FastAPI microservice for user registration analytics and statistics -## ๐Ÿš€ Overview +[![Python](https://img.shields.io/badge/Python-3.12+-blue.svg)](https://python.org) +[![FastAPI](https://img.shields.io/badge/FastAPI-0.114+-green.svg)](https://fastapi.tiangolo.com) +[![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://docker.com) -The Metrics service provides comprehensive APIs for querying and analyzing user registration data from the StarRocks database. It offers flexible querying options and statistical summaries for better insights into user growth patterns. +The Metrics service provides real-time APIs for querying user registration data from StarRocks database, offering flexible analytics and insights into user growth patterns. ## โœจ Features @@ -32,125 +34,84 @@ The Metrics service provides comprehensive APIs for querying and analyzing user ## ๐Ÿ“ Project Structure ``` -apps/metrics/ -โ”œโ”€โ”€ backend/ -โ”‚ โ”œโ”€โ”€ infra/starrocks_client.py # StarRocks database client -โ”‚ โ”œโ”€โ”€ models/registered_users.py # Data model definitions -โ”‚ โ””โ”€โ”€ services/registration_service.py # Business logic service -โ”œโ”€โ”€ webapi/ -โ”‚ โ”œโ”€โ”€ routes/registration.py # API route definitions -โ”‚ โ”œโ”€โ”€ config/site_settings.py # Configuration management -โ”‚ โ”œโ”€โ”€ bootstrap/application.py # Application initialization -โ”‚ โ””โ”€โ”€ main.py # FastAPI main application -โ”œโ”€โ”€ common/ # Shared utilities -โ”œโ”€โ”€ tests/ # Test files -โ”œโ”€โ”€ requirements.txt # Python dependencies -โ”œโ”€โ”€ Dockerfile # Simplified Docker configuration (Python 3.12-slim) -โ”œโ”€โ”€ start_fastapi.sh # Startup script -โ”œโ”€โ”€ test_registration_api.py # API test script -โ”œโ”€โ”€ .env # Environment configuration -โ””โ”€โ”€ README.md # This file +metrics/ +โ”œโ”€โ”€ backend/ # Business logic layer +โ”‚ โ”œโ”€โ”€ infra/ # Infrastructure components +โ”‚ โ”‚ โ””โ”€โ”€ database_client.py +โ”‚ โ”œโ”€โ”€ models/ # Data models +โ”‚ โ”‚ โ””โ”€โ”€ user_registration_models.py +โ”‚ โ””โ”€โ”€ services/ # Business services +โ”‚ โ””โ”€โ”€ registration_analytics_service.py +โ”œโ”€โ”€ webapi/ # API layer +โ”‚ โ”œโ”€โ”€ routes/ # API endpoints +โ”‚ โ”‚ โ””โ”€โ”€ registration_metrics.py +โ”‚ โ”œโ”€โ”€ config/ # Configuration +โ”‚ โ”‚ โ””โ”€โ”€ app_settings.py +โ”‚ โ”œโ”€โ”€ bootstrap/ # App initialization +โ”‚ โ”‚ โ””โ”€โ”€ app_factory.py +โ”‚ โ””โ”€โ”€ main.py # FastAPI app entry point +โ”œโ”€โ”€ common/ # Shared utilities +โ”œโ”€โ”€ requirements.txt # Dependencies +โ”œโ”€โ”€ Dockerfile # Container config +โ”œโ”€โ”€ local.env # Environment variables +โ””โ”€โ”€ README.md # Documentation ``` ## ๐Ÿš€ Quick Start ### Prerequisites -- Python 3.12+ +- Python 3.12+ or Docker - Access to StarRocks database -- pip package manager -### Installation +### ๐Ÿ Python Setup -1. **Clone the repository** - ```bash - git clone - cd freeleaps-service-hub/apps/metrics - ``` +```bash +# 1. Install dependencies +pip install -r requirements.txt -2. **Install dependencies** - ```bash - pip install -r requirements.txt - ``` +# 2. Start the service +python3 -m uvicorn webapi.main:app --host 0.0.0.0 --port 8009 --reload +``` -3. **Configure environment** - ```bash - cp .env.example .env # If available - # Edit .env with your configuration - ``` +### ๐Ÿณ Docker Setup -4. **Start the service** - - **Option A: Direct Python execution** - ```bash - python3 -m uvicorn webapi.main:app --host 0.0.0.0 --port 8009 --reload - ``` - - **Option B: Using Docker** - ```bash - # Build Docker image - docker build -t metrics:latest . - - # Run container - docker run --rm -p 8009:8009 metrics:latest - ``` +```bash +# 1. Build image +docker build -t metrics:latest . -5. **Access API documentation** - ``` - http://localhost:8009/docs - ``` +# 2. Run container +docker run --rm -p 8009:8009 metrics:latest +``` + +### ๐Ÿ“– Access Documentation +Visit `http://localhost:8009/docs` for interactive API documentation. ## ๐Ÿ“Š API Endpoints -### 1. Daily Registered Users (Date Range) -```http -GET /api/metrics/daily-registered-users?start_date=2024-09-10&end_date=2024-09-20&product_id=freeleaps +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/api/metrics/daily-registered-users` | GET/POST | Query registration data by date range | +| `/api/metrics/recent-registered-users` | GET | Get recent N days data | +| `/api/metrics/registered-users-by-days` | GET | Query N days from start date | +| `/api/metrics/registration-summary` | GET | Get statistical summary | + +### Example Requests + +```bash +# Get last 7 days +curl "http://localhost:8009/api/metrics/recent-registered-users?days=7" + +# Get date range +curl "http://localhost:8009/api/metrics/daily-registered-users?start_date=2024-09-10&end_date=2024-09-20" + +# Get summary statistics +curl "http://localhost:8009/api/metrics/registration-summary?start_date=2024-09-10&end_date=2024-09-20" ``` -**Parameters:** -- `start_date` (required): Start date in YYYY-MM-DD format -- `end_date` (required): End date in YYYY-MM-DD format -- `product_id` (optional): Product identifier (default: "freeleaps") - -### 2. Recent Registered Users -```http -GET /api/metrics/recent-registered-users?days=7&product_id=freeleaps -``` - -**Parameters:** -- `days` (optional): Number of recent days (default: 7, max: 365) -- `product_id` (optional): Product identifier (default: "freeleaps") - -### 3. Registered Users by Days -```http -GET /api/metrics/registered-users-by-days?start_date=2024-09-01&days=5&product_id=freeleaps -``` - -**Parameters:** -- `start_date` (required): Start date in YYYY-MM-DD format -- `days` (required): Number of days from start date (max: 365) -- `product_id` (optional): Product identifier (default: "freeleaps") - -### 4. Registration Summary -```http -GET /api/metrics/registration-summary?start_date=2024-09-10&end_date=2024-09-20&product_id=freeleaps -``` - -**Parameters:** -- `start_date` (required): Start date in YYYY-MM-DD format -- `end_date` (required): End date in YYYY-MM-DD format -- `product_id` (optional): Product identifier (default: "freeleaps") - -### 5. Daily Registered Users (POST) -```http -POST /api/metrics/daily-registered-users -Content-Type: application/json - -{ - "start_date": "2024-09-10", - "end_date": "2024-09-20", - "product_id": "freeleaps" -} -``` +### Parameters +- `start_date` / `end_date`: Date in `YYYY-MM-DD` format +- `days`: Number of days (max: 365) +- `product_id`: Product identifier (default: "freeleaps") ## ๐Ÿ“ˆ Response Format @@ -178,158 +139,94 @@ Content-Type: application/json ## ๐Ÿงช Testing -### Run API Tests +### Quick Test ```bash -python test_registration_api.py -``` +# Health check +curl http://localhost:8009/ -### Manual Testing Examples -```bash -# Test recent 7 days +# Test recent registrations curl "http://localhost:8009/api/metrics/recent-registered-users?days=7" - -# Test date range -curl "http://localhost:8009/api/metrics/daily-registered-users?start_date=2024-09-10&end_date=2024-09-20" - -# Test summary -curl "http://localhost:8009/api/metrics/registration-summary?start_date=2024-09-10&end_date=2024-09-20" ``` +### Interactive Testing +Visit `http://localhost:8009/docs` for the Swagger UI interface where you can test all endpoints directly. + ## โš™๏ธ Configuration ### Environment Variables ```bash -# Server settings +# Server Configuration SERVICE_API_ACCESS_HOST=0.0.0.0 SERVICE_API_ACCESS_PORT=8009 -# Database settings -MONGODB_URI=mongodb://localhost:27017/ -MONGODB_NAME=freeleaps2 - -# StarRocks settings +# StarRocks Database STARROCKS_HOST=freeleaps-starrocks-cluster-fe-service.freeleaps-data-platform.svc STARROCKS_PORT=9030 STARROCKS_USER=root STARROCKS_PASSWORD= STARROCKS_DATABASE=freeleaps -# Log settings +# Logging LOG_BASE_PATH=./logs BACKEND_LOG_FILE_NAME=metrics APPLICATION_ACTIVITY_LOG=metrics-activity ``` -### Docker Deployment +> ๐Ÿ’ก **Tip**: Copy `local.env` to `.env` and modify as needed for your environment. -**Prerequisites:** -- Docker installed and running -- Local Python 3.12+ image available +### ๐Ÿณ Docker Deployment -**Build and Run:** ```bash -# Build image (using local Python 3.12-slim image) +# Build and run docker build -t metrics:latest . - -# Run container with port mapping docker run --rm -p 8009:8009 metrics:latest -# Run with environment file (if available) -docker run --rm -p 8009:8009 --env-file .env metrics:latest +# Run with custom environment +docker run --rm -p 8009:8009 --env-file local.env metrics:latest # Run in background docker run -d --name metrics-service -p 8009:8009 metrics:latest ``` -**Docker Image Details:** -- Base Image: `swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/python:3.12-slim` +**Image Details:** +- Base: Python 3.12-slim - Port: 8009 -- Working Directory: `/app` -- Auto-reload: Disabled (production mode) +- Working Dir: `/app` ## ๐Ÿ”ง Development -### Project Setup ```bash -# Create virtual environment +# Setup development environment python -m venv venv -source venv/bin/activate # On Windows: venv\Scripts\activate - -# Install dependencies +source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt # Run with auto-reload python -m uvicorn webapi.main:app --reload ``` -### Code Structure -- **Backend**: Business logic and data access layer -- **WebAPI**: FastAPI routes and application setup -- **Models**: Pydantic data models for validation -- **Services**: Business logic services -- **Infra**: Database clients and infrastructure code - ## ๐Ÿ“ API Documentation -Once the service is running, you can access the interactive API documentation at: - **Swagger UI**: `http://localhost:8009/docs` - **ReDoc**: `http://localhost:8009/redoc` - **OpenAPI JSON**: `http://localhost:8009/openapi.json` ## โš ๏ธ Important Notes -- All APIs support `product_id` parameter (defaults to "freeleaps") -- Date format must be `YYYY-MM-DD` -- Query range is limited to 365 days maximum -- Service requires network access to StarRocks cluster -- Logs are written to `./logs/` directory +- Date format: `YYYY-MM-DD` +- Max query range: 365 days +- Default `product_id`: "freeleaps" +- Requires StarRocks database access ## ๐Ÿ› Troubleshooting -### Common Issues - -1. **Database Connection Failed** - - Verify StarRocks cluster accessibility - - Check network connectivity - - Validate database credentials - -2. **Import Errors** - - Ensure all dependencies are installed - - Check Python path configuration - - Verify virtual environment activation - -3. **Port Already in Use** - - Change port in configuration - - Stop existing service on port 8009 - - For Docker: `docker stop $(docker ps -q --filter ancestor=metrics:latest)` - -4. **Docker Build Issues** - - Ensure local Python image is available: `docker images | grep python` - - Check Docker daemon is running: `docker ps` - - Verify Dockerfile syntax and paths - -5. **Docker Container Issues** - - Check container logs: `docker logs ` - - Verify port mapping: `docker ps` - - Check container status: `docker ps -a` - -### Logs -Check application logs in the `./logs/` directory for detailed error information. - -## ๐Ÿ“ž Support - -For issues and questions: -- Check the API documentation at `/docs` -- Review logs for error details -- Contact the development team +| Issue | Solution | +|-------|----------| +| Port in use | `docker stop $(docker ps -q --filter ancestor=metrics:latest)` | +| Import errors | Check dependencies: `pip install -r requirements.txt` | +| DB connection | Verify StarRocks cluster accessibility | +| Container issues | Check logs: `docker logs ` | ## ๐Ÿ“„ License -This project is part of the Freeleaps platform. - - - - - - - +Part of the Freeleaps platform. \ No newline at end of file diff --git a/apps/metrics/backend/infra/starrocks_client.py b/apps/metrics/backend/infra/database_client.py similarity index 98% rename from apps/metrics/backend/infra/starrocks_client.py rename to apps/metrics/backend/infra/database_client.py index db58f97..b55119d 100644 --- a/apps/metrics/backend/infra/starrocks_client.py +++ b/apps/metrics/backend/infra/database_client.py @@ -2,7 +2,7 @@ import pymysql from typing import List, Dict, Any, Optional from datetime import date from loguru import logger -from webapi.config.site_settings import site_settings +from webapi.config.app_settings import site_settings class StarRocksClient: diff --git a/apps/metrics/backend/models/registered_users.py b/apps/metrics/backend/models/user_registration_models.py similarity index 100% rename from apps/metrics/backend/models/registered_users.py rename to apps/metrics/backend/models/user_registration_models.py diff --git a/apps/metrics/backend/services/registration_service.py b/apps/metrics/backend/services/registration_analytics_service.py similarity index 96% rename from apps/metrics/backend/services/registration_service.py rename to apps/metrics/backend/services/registration_analytics_service.py index 8d786e9..1579286 100644 --- a/apps/metrics/backend/services/registration_service.py +++ b/apps/metrics/backend/services/registration_analytics_service.py @@ -1,8 +1,8 @@ from typing import List, Dict, Any from datetime import date, timedelta from loguru import logger -from backend.infra.starrocks_client import StarRocksClient -from backend.models.registered_users import UserRegistrationResponse, DailyRegisteredUsers +from backend.infra.database_client import StarRocksClient +from backend.models.user_registration_models import UserRegistrationResponse, DailyRegisteredUsers class RegistrationService: diff --git a/apps/metrics/webapi/bootstrap/application.py b/apps/metrics/webapi/bootstrap/app_factory.py similarity index 97% rename from apps/metrics/webapi/bootstrap/application.py rename to apps/metrics/webapi/bootstrap/app_factory.py index bfe3e11..4e9e805 100644 --- a/apps/metrics/webapi/bootstrap/application.py +++ b/apps/metrics/webapi/bootstrap/app_factory.py @@ -1,7 +1,7 @@ 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 webapi.config.app_settings import site_settings from loguru import logger import os diff --git a/apps/metrics/webapi/config/site_settings.py b/apps/metrics/webapi/config/app_settings.py similarity index 100% rename from apps/metrics/webapi/config/site_settings.py rename to apps/metrics/webapi/config/app_settings.py diff --git a/apps/metrics/webapi/main.py b/apps/metrics/webapi/main.py index fb977b6..10467a3 100644 --- a/apps/metrics/webapi/main.py +++ b/apps/metrics/webapi/main.py @@ -1,15 +1,15 @@ -from webapi.bootstrap.application import create_app -from webapi.config.site_settings import site_settings +from webapi.bootstrap.app_factory import create_app +from webapi.config.app_settings import site_settings from fastapi.responses import RedirectResponse import uvicorn from typing import Any -from webapi.routes import registration +from webapi.routes import registration_metrics app = create_app() # Include routers -app.include_router(registration.router) +app.include_router(registration_metrics.router) @app.get("/", status_code=301) diff --git a/apps/metrics/webapi/routes/registration.py b/apps/metrics/webapi/routes/registration_metrics.py similarity index 97% rename from apps/metrics/webapi/routes/registration.py rename to apps/metrics/webapi/routes/registration_metrics.py index 327067d..1c430de 100644 --- a/apps/metrics/webapi/routes/registration.py +++ b/apps/metrics/webapi/routes/registration_metrics.py @@ -2,8 +2,8 @@ from fastapi import APIRouter, HTTPException, Query from datetime import date, datetime, timedelta from typing import Optional from loguru import logger -from backend.services.registration_service import RegistrationService -from backend.models.registered_users import UserRegistrationResponse, UserRegistrationQuery +from backend.services.registration_analytics_service import RegistrationService +from backend.models.user_registration_models import UserRegistrationResponse, UserRegistrationQuery router = APIRouter(prefix="/api/metrics", tags=["registration"])