feat: add health check endpoint and suppress health check logs
Added a /health endpoint for application health monitoring Implemented logging filter to suppress health check requests from logs Updated Dockerfile and Kubernetes deployment to use the new health check endpoint Incremented production image tag version
This commit is contained in:
@@ -42,7 +42,7 @@ EXPOSE 8000
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:8000/ || exit 1
|
||||
CMD curl -f http://localhost:8000/health || exit 1
|
||||
|
||||
# Run the application
|
||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||
29
app/main.py
29
app/main.py
@@ -14,6 +14,17 @@ from fastapi.templating import Jinja2Templates
|
||||
from pydantic import BaseModel
|
||||
from fpdf import FPDF
|
||||
|
||||
import logging
|
||||
|
||||
# Custom filter to exclude health check logs
|
||||
class HealthCheckFilter(logging.Filter):
|
||||
def filter(self, record: logging.LogRecord) -> bool:
|
||||
# Exclude health check requests from logs
|
||||
return "GET /health " not in record.getMessage()
|
||||
|
||||
# Apply the filter to Uvicorn's access logger
|
||||
logging.getLogger("uvicorn.access").addFilter(HealthCheckFilter())
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
# S3 Configuration
|
||||
@@ -433,7 +444,7 @@ async def bulk_download(filenames: str = Form(...)):
|
||||
try:
|
||||
# Parse the JSON string to get the list of filenames
|
||||
filename_list = json.loads(filenames)
|
||||
|
||||
|
||||
# Create a temporary zip file
|
||||
with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as tmp_zip:
|
||||
with zipfile.ZipFile(tmp_zip.name, "w") as zipf:
|
||||
@@ -441,16 +452,16 @@ async def bulk_download(filenames: str = Form(...)):
|
||||
file_data = download_from_s3(S3_BUCKET_NAME, filename)
|
||||
if file_data:
|
||||
zipf.writestr(filename, file_data)
|
||||
|
||||
|
||||
# Read the zip file
|
||||
with open(tmp_zip.name, "rb") as f:
|
||||
zip_data = f.read()
|
||||
|
||||
|
||||
# Clean up temporary file
|
||||
import os
|
||||
|
||||
|
||||
os.unlink(tmp_zip.name)
|
||||
|
||||
|
||||
# Return streaming response with zip data
|
||||
zip_filename = f"math_exercises_{len(filename_list)}_files.zip"
|
||||
return StreamingResponse(
|
||||
@@ -464,7 +475,13 @@ async def bulk_download(filenames: str = Form(...)):
|
||||
return {"error": f"Error downloading files: {str(e)}"}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
async def health_check():
|
||||
"""Health check endpoint that returns the status of the application"""
|
||||
return {"status": "healthy"}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
|
||||
|
||||
uvicorn.run(app, host="0.0.0.0", port=8000)
|
||||
|
||||
@@ -46,7 +46,7 @@ spec:
|
||||
# Liveness probe
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
path: /health
|
||||
port: 8000
|
||||
initialDelaySeconds: 90
|
||||
periodSeconds: 10
|
||||
@@ -55,7 +55,7 @@ spec:
|
||||
# Readiness probe
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
path: /health
|
||||
port: 8000
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
||||
|
||||
@@ -13,7 +13,7 @@ resources:
|
||||
images:
|
||||
- name: math-exercises
|
||||
newName: harbor.cl1.parano.ch/library/math-exercice
|
||||
newTag: 1.0.5
|
||||
newTag: 1.0.7
|
||||
|
||||
# Production-specific labels
|
||||
|
||||
|
||||
Reference in New Issue
Block a user