Fix issues

This commit is contained in:
Urtzi Alfaro
2025-07-18 11:51:43 +02:00
parent 9391368b83
commit 592a810762
35 changed files with 3806 additions and 122 deletions

View File

@@ -9,6 +9,7 @@ from typing import Dict, Any, List # Added List import
from prometheus_client import Counter, Histogram, Gauge, start_http_server
from functools import wraps
from prometheus_client import generate_latest # Moved this import here for consistency
from fastapi import Request
logger = logging.getLogger(__name__)
@@ -175,4 +176,118 @@ def metrics_middleware(metrics_collector: MetricsCollector):
return response
return middleware
return middleware
def setup_metrics(app):
"""
Setup metrics collection for FastAPI app
Args:
app: FastAPI application instance
Returns:
MetricsCollector: Configured metrics collector
"""
# Get service name from app title or default
service_name = getattr(app, 'title', 'unknown-service').lower().replace(' ', '-')
# Create metrics collector for this service
metrics_collector = MetricsCollector(service_name)
# Add metrics middleware to collect HTTP request metrics
@app.middleware("http")
async def collect_metrics_middleware(request: Request, call_next):
start_time = time.time()
# Process the request
response = await call_next(request)
# Calculate duration
duration = time.time() - start_time
# Record metrics
metrics_collector.record_request(
method=request.method,
endpoint=request.url.path,
status_code=response.status_code,
duration=duration
)
return response
# Add metrics endpoint if it doesn't exist
@app.get("/metrics")
async def prometheus_metrics():
"""Prometheus metrics endpoint"""
from prometheus_client import generate_latest
return Response(
content=generate_latest(),
media_type="text/plain; version=0.0.4; charset=utf-8"
)
# Store metrics collector in app state for later access
app.state.metrics_collector = metrics_collector
logger.info(f"Metrics collection setup completed for service: {service_name}")
return metrics_collector
# Alternative simplified setup function for services that don't need complex metrics
def setup_basic_metrics(app, service_name: str = None):
"""
Setup basic metrics collection without complex dependencies
Args:
app: FastAPI application instance
service_name: Optional service name override
Returns:
Simple metrics dict
"""
if service_name is None:
service_name = getattr(app, 'title', 'unknown-service').lower().replace(' ', '-')
# Simple in-memory metrics
metrics_data = {
"requests_total": 0,
"requests_by_method": {},
"requests_by_status": {},
"service_name": service_name,
"start_time": time.time()
}
@app.middleware("http")
async def simple_metrics_middleware(request: Request, call_next):
# Increment total requests
metrics_data["requests_total"] += 1
# Track by method
method = request.method
metrics_data["requests_by_method"][method] = metrics_data["requests_by_method"].get(method, 0) + 1
# Process request
response = await call_next(request)
# Track by status code
status = str(response.status_code)
metrics_data["requests_by_status"][status] = metrics_data["requests_by_status"].get(status, 0) + 1
return response
@app.get("/metrics")
async def simple_metrics():
"""Simple metrics endpoint"""
uptime = time.time() - metrics_data["start_time"]
return {
**metrics_data,
"uptime_seconds": round(uptime, 2)
}
app.state.simple_metrics = metrics_data
logger.info(f"Basic metrics setup completed for service: {service_name}")
return metrics_data