Skip to content

Commit d1fc482

Browse files
committed
Add request summary in MozLog format
1 parent 5e42999 commit d1fc482

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

src/app/api.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import logging
2+
import sys
3+
import time
4+
from datetime import datetime
5+
16
import uvicorn # type: ignore
27
from fastapi import FastAPI, Request
38
from fastapi.responses import RedirectResponse
@@ -6,6 +11,31 @@
611
from src.app.monitor import api_router as monitor_router
712
from src.jbi.router import api_router as jbi_router
813

14+
settings = get_settings()
15+
16+
logging_config = {
17+
"version": 1,
18+
"formatters": {
19+
"json": {
20+
"()": "dockerflow.logging.JsonLogFormatter",
21+
"logger_name": "jbi",
22+
},
23+
},
24+
"handlers": {
25+
"console": {
26+
"level": settings.log_level.upper(),
27+
"class": "logging.StreamHandler",
28+
"formatter": "json",
29+
"stream": sys.stdout,
30+
}
31+
},
32+
"loggers": {
33+
"request.summary": {"handlers": ["console"], "level": "INFO"},
34+
},
35+
}
36+
37+
logging.config.dictConfig(logging_config)
38+
939
app = FastAPI(
1040
title="Jira Bugzilla Integration (JBI)",
1141
description="JBI v2 Platform",
@@ -15,6 +45,7 @@
1545
app.include_router(monitor_router)
1646
app.include_router(jbi_router)
1747

48+
summary_logger = logging.getLogger("request.summary")
1849

1950
@app.get("/", include_in_schema=False)
2051
def root(request: Request):
@@ -26,8 +57,32 @@ def root(request: Request):
2657
return RedirectResponse(url="./docs")
2758

2859

60+
@app.middleware("http")
61+
async def request_summary(request: Request, call_next):
62+
previous_time = time.time()
63+
64+
infos = {
65+
"agent": request.headers.get("User-Agent"),
66+
"path": request.url.path,
67+
"method": request.method,
68+
"lang": request.headers.get("Accept-Language"),
69+
"querystring": dict(request.query_params),
70+
"errno": 0,
71+
}
72+
73+
response = await call_next(request)
74+
75+
current = time.time()
76+
duration = int((current - previous_time) * 1000.0)
77+
isotimestamp = datetime.fromtimestamp(current).isoformat()
78+
infos = {"time": isotimestamp, "code": response.status_code, "t": duration, **infos}
79+
80+
summary_logger.info("", extra=infos)
81+
82+
return response
83+
84+
2985
if __name__ == "__main__":
30-
settings = get_settings()
3186
uvicorn.run(
3287
"app:app", host="0.0.0.0", port=settings.port, reload=settings.app_reload
3388
)

src/app/environment.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
class Settings(BaseSettings):
9+
host: str = "0.0.0.0"
910
port: str = "80"
1011
app_reload: bool = True
1112

@@ -20,6 +21,9 @@ class Settings(BaseSettings):
2021
jira_password: str
2122
bugzilla_api_key: str
2223

24+
# Logging
25+
log_level: str = "info"
26+
2327

2428
@lru_cache()
2529
def get_settings() -> Settings:

0 commit comments

Comments
 (0)