88from typing import Dict , List , Optional
99
1010import sentry_sdk
11- import uvicorn # type: ignore
1211from fastapi import Body , Depends , FastAPI , Request
1312from fastapi .encoders import jsonable_encoder
1413from fastapi .responses import HTMLResponse
1817
1918from src .app import configuration
2019from src .app .environment import get_settings
21- from src .app .log import configure_logging
2220from src .app .monitor import api_router as monitor_router
2321from src .jbi .bugzilla import BugzillaWebhookRequest
2422from src .jbi .models import Actions
3129
3230settings = get_settings ()
3331
34- configure_logging ()
35-
3632app = FastAPI (
3733 title = "Jira Bugzilla Integration (JBI)" ,
3834 description = "JBI v2 Platform" ,
3935 version = "3.0.3" ,
36+ debug = settings .app_debug ,
4037)
4138
4239app .include_router (monitor_router )
4845app .add_middleware (SentryAsgiMiddleware )
4946
5047
48+ def format_log_fields (request : Request , request_time : float , status_code : int ) -> Dict :
49+ """Prepare Fields for Mozlog request summary"""
50+
51+ current_time = time .time ()
52+ fields = {
53+ "agent" : request .headers .get ("User-Agent" ),
54+ "path" : request .url .path ,
55+ "method" : request .method ,
56+ "lang" : request .headers .get ("Accept-Language" ),
57+ "querystring" : dict (request .query_params ),
58+ "errno" : 0 ,
59+ "t" : int ((current_time - request_time ) * 1000.0 ),
60+ "time" : datetime .fromtimestamp (current_time ).isoformat (),
61+ "status_code" : status_code ,
62+ }
63+ return fields
64+
65+
66+ @app .middleware ("http" )
67+ async def request_summary (request : Request , call_next ):
68+ """Middleware to log request info"""
69+ summary_logger = logging .getLogger ("request.summary" )
70+ request_time = time .time ()
71+ try :
72+ response = await call_next (request )
73+ log_fields = format_log_fields (
74+ request , request_time , status_code = response .status_code
75+ )
76+ summary_logger .info ("" , extra = log_fields )
77+ return response
78+ except Exception as exc :
79+ log_fields = format_log_fields (request , request_time , status_code = 500 )
80+ summary_logger .info (exc , extra = log_fields )
81+ raise
82+
83+
5184@app .get ("/" , include_in_schema = False )
5285def root ():
5386 """Expose key configuration"""
@@ -63,33 +96,6 @@ def root():
6396 }
6497
6598
66- @app .middleware ("http" )
67- async def request_summary (request : Request , call_next ):
68- """Middleware to log request info"""
69- summary_logger = logging .getLogger ("request.summary" )
70- previous_time = time .time ()
71-
72- infos = {
73- "agent" : request .headers .get ("User-Agent" ),
74- "path" : request .url .path ,
75- "method" : request .method ,
76- "lang" : request .headers .get ("Accept-Language" ),
77- "querystring" : dict (request .query_params ),
78- "errno" : 0 ,
79- }
80-
81- response = await call_next (request )
82-
83- current = time .time ()
84- duration = int ((current - previous_time ) * 1000.0 )
85- isotimestamp = datetime .fromtimestamp (current ).isoformat ()
86- infos = {"time" : isotimestamp , "code" : response .status_code , "t" : duration , ** infos }
87-
88- summary_logger .info ("" , extra = infos )
89-
90- return response
91-
92-
9399@app .post ("/bugzilla_webhook" )
94100def bugzilla_webhook (
95101 request : BugzillaWebhookRequest = Body (..., embed = False ),
@@ -135,13 +141,3 @@ def powered_by_jbi(
135141 "enable_query" : enabled ,
136142 }
137143 return templates .TemplateResponse ("powered_by_template.html" , context )
138-
139-
140- if __name__ == "__main__" :
141- uvicorn .run (
142- "src.app.api:app" ,
143- host = settings .host ,
144- port = settings .port ,
145- reload = settings .app_reload ,
146- log_level = settings .log_level ,
147- )
0 commit comments