/* Ċ Ġ* ĠðŁ ¥ Ģ Ġh ana : ĠAPI Ġto Ġproxy Ġdifferent ĠAPIs Ġlike ĠGitHub ĠSp onsors , Ġsource Ġcode Ġfor Ġapi . flo of y . dev Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 - 2 0 2 2 ĠNo el Ġ< cut ie @ flo of y . dev > Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġg ay . flo of . h ana . core . plugins Ċ Ċ import Ġg ay . flo of . h ana . core . H ana Ċ import Ġg ay . flo of . h ana . core . extensions . inject Ċ import Ġg ay . flo of . h ana . core . metrics . Metrics Handler Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . server . application .* Ċ import Ġio . ktor . server . application . hooks .* Ċ import Ġio . ktor . server . request .* Ċ import Ġio . ktor . util .* Ċ import Ġio . prometheus . client . Histogram Ċ import Ġorg . apache . commons . lang 3 . time . Stop Watch Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . slf 4 j . M DC Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ val ĠK tor Logging Plugin Ġ= Ġcreate Application Plugin (" H ana Logging ") Ġ{ ĊĠĠĠ Ġval Ġprometheus Observer Ġ= ĠAttribute Key < Histogram . Timer >(" Pro metheus Observer ") ĊĠĠĠ Ġval Ġstop watch Key Ġ= ĠAttribute Key < Stop Watch >(" Stop watch ") ĊĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger (" g ay . flo of . h ana . core . plugins . K tor Logging Plugin Kt ") ĊĠĠĠ Ġval Ġmetrics Ġby Ġinject < Metrics Handler >() ĊĊĠĠĠ Ġenvironment ?. monitor ?. subscribe ( Application Started ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Started ĠAPI Ġin Ġ${ H ana . boot Time . getTime ( TimeUnit . SECONDS )} Ġseconds !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenvironment ?. monitor ?. subscribe ( Application Stopped ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . warn (" HTTP Ġservice Ġhas Ġdi ed Ġ: (" ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġon ( Call Setup ) Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠ ĠM DC . put (" user _ agent ", Ġcall . request . userAgent ()) ĊĊĠĠĠĠĠĠĠ Ġcall . attributes . put ( stop watch Key , ĠStop Watch . create Started ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( metrics . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . attributes . put ( prometheus Observer , Ġmetrics . request Latency !!. start Timer ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġon ( Response Sent ) Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠ ĠM DC . remove (" user _ agent ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall . request . http Method ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġcall . request . http Version ĊĠĠĠĠĠĠĠ Ġval Ġendpoint Ġ= Ġcall . request . uri ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġcall . response . status () Ġ?: ĠHttpStatusCode (- 1 , Ġ" Unknown ĠHTTP ĠMethod ") ĊĠĠĠĠĠĠĠ Ġval Ġstop watch Ġ= Ġcall . attributes [ stop watch Key ] ĊĠĠĠĠĠĠĠ Ġval Ġuser Agent Ġ= Ġcall . request . userAgent () ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġcall . attributes . get OrNull ( prometheus Observer ) ĊĊĠĠĠĠĠĠĠ Ġstop watch . stop () ĊĠĠĠĠĠĠĠ Ġobserver ?. observe Duration () ĊĊĠĠĠĠĠĠĠ Ġlog . info ("${ method . value } Ġ$ version Ġ$ endpoint Ġ[$ userAgent ] Ġ:: Ġ${ status . value } Ġ${ status . description } Ġ[ ${ stop watch . getTime ( TimeUnit . MILLISECONDS )} ms ]") ĊĠĠĠ Ġ} Ċ } Ċ