package Ġio . pro venance . invoice . config . web Ċ Ċ import Ġio . pro venance . invoice . config . logging . M DC Keys Ċ import Ġio . pro venance . invoice . util . extension . to Offset DateTime OrNull I Ċ import Ġmu . K Logging Ċ import Ġorg . slf 4 j . M DC Ċ import Ġorg . springframework . web . servlet . Handler Interceptor Ċ import Ġjava . lang . Exception Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util . UUID Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ class ĠWeb Request Logging Interceptor Ġ: ĠHandler Interceptor Ġ{ ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ: ĠK Logging () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG GED _ HEADERS : ĠSet < String > Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" x - address ", ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpre Handle ( request : ĠHttpServletRequest , Ġresponse : ĠHttpServletResponse , Ġhandler : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġpre Handle Ġgets Ġcalled Ġmultiple Ġtimes Ġ- Ġonly Ġtag Ġonce ĊĠĠĠĠĠĠĠ Ġif Ġ( M DC . get ( M DC Keys . REQUEST _ STARTED . key ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTag Ġeach Ġrequest Ġwith Ġa ĠUUID Ġfor Ġeasy Ġtracing Ġin Ġdebugging ĊĠĠĠĠĠĠĠ ĠM DC . put ( M DC Keys . REQUEST _ UUID . key , ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ Ġ// ĠTake Ġnote Ġof Ġwhen Ġeach Ġrequest Ġstarted Ġto Ġtrace Ġlong - running Ġrequests Ġback Ġto Ġthe Ġsource ĊĠĠĠĠĠĠĠ ĠM DC . put ( M DC Keys . REQUEST _ STARTED . key , ĠOffset DateTime . now (). toString ()) ĊĠĠĠĠĠĠĠ Ġ// ĠAppend Ġall Ġrelevant Ġheaders Ġto ĠM DC Ġwhen Ġfound ĊĠĠĠĠĠĠĠ Ġrequest . header Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . lowercase () Ġin ĠLOG GED _ HEADERS Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġheader Ġ-> ĠM DC . put ( header , Ġrequest . getHeaders ( header ). toList (). join ToString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" START Ġrequest Ġ[ ${ request . request URL }] ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter Completion ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠHttpServletRequest , ĊĠĠĠĠĠĠĠ Ġresponse : ĠHttpServletResponse , ĊĠĠĠĠĠĠĠ Ġhandler : ĠAny , ĊĠĠĠĠĠĠĠ Ġex : ĠException ?, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf ĠM DC Ġrequest Ġtime Ġexists Ġon Ġan Ġexecuted Ġrequest , Ġlog Ġthe Ġamount Ġof Ġtime Ġthe Ġroute Ġtook ĊĠĠĠĠĠĠĠ ĠM DC . get ( M DC Keys . REQUEST _ STARTED . key )?. to Offset DateTime OrNull I ()?. to Instant ()?. to Epoch Milli ()?. let Ġ{ ĠstartTime Millis Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" END Ġrequest Ġ[ ${ request . request URL }] Ġ| ĠT ook Ġ${ Offset DateTime . now (). to Instant (). to Epoch Milli () Ġ- ĠstartTime Millis } ms ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ