package Ġno . nav . hel se . sp oring Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . features .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . content .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . response .* Ċ import Ġio . prometheus . client . Counter Ċ import Ġio . prometheus . client . Histogram Ċ import Ġorg . slf 4 j . Logger Ċ Ċ private Ġval Ġignored Paths Ġ= ĠlistOf ("/ metrics ", Ġ"/ is alive ", Ġ"/ is ready ") Ċ Ċ internal Ġfun ĠApplication . request Response Tracing ( logger : ĠLogger ) Ġ{ ĊĠĠĠ Ġval ĠhttpRequest Counter Ġ= ĠCounter . build ( ĊĠĠĠĠĠĠĠ Ġ" http _ requests _ total ", ĊĠĠĠĠĠĠĠ Ġ" Counts Ġthe Ġhttp Ġrequests " ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. label Names (" method ", Ġ" code ") ĊĠĠĠĠĠĠĠ Ġ. register () ĊĊĠĠĠ Ġval ĠhttpRequest Duration Ġ= ĠHistogram . build ( ĊĠĠĠĠĠĠĠ Ġ" http _ request _ duration _ seconds ", ĊĠĠĠĠĠĠĠ Ġ" Distribution Ġof Ġhttp Ġrequest Ġduration " ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. register () ĊĊĠĠĠ Ġintercept ( Application Call Pipeline . Monitoring ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . request . uri Ġin Ġignored Paths ) Ġreturn @ intercept Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" incoming Ġcall Id =${ call . call Id } Ġmethod =${ call . request . http Method . value } Ġuri =${ call . request . uri }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpRequest Duration . start Timer (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" exception Ġthrown Ġduring Ġprocessing : Ġ${ err . message } Ġcall Id =${ call . call Id } Ġ", Ġerr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġerr ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsend Pipeline . intercept ( Application Send Pipeline . After ) Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġcall . response . status () Ġ?: Ġ( when Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOut going Content Ġ-> Ġmessage . status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttpStatusCode Ġ-> Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠHttpStatusCode . OK ). also Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . response . status ( status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( call . request . uri Ġin Ġignored Paths ) Ġreturn @ intercept ĊĠĠĠĠĠĠĠ Ġlogger . info (" respon ding Ġwith Ġstatus =${ status . value } Ġcall Id =${ call . call Id } Ġ") ĊĠĠĠĠĠĠĠ ĠhttpRequest Counter . labels ( call . request . http Method . value , Ġ"${ status . value } "). inc () ĊĠĠĠ Ġ} Ċ }