Fix issues
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user