package Ġcz . v ut br . fit . k not . entic ing . management . management service . service Ċ Ċ import Ġcz . v ut br . fit . k not . entic ing . log . ComponentType Ċ import Ġcz . v ut br . fit . k not . entic ing . log . LoggerFactory Ċ import Ġcz . v ut br . fit . k not . entic ing . log . Perf Dto Ċ import Ġcz . v ut br . fit . k not . entic ing . log . logger Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . dto . General Operation Statistics Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . entity . Perf Entity Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . entity . to Dto Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . entity . to Entity Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . repository . Component Repository Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . repository . Perf Repository Ċ import Ġcz . v ut br . fit . k not . entic ing . management . management service . repository . findBy Full Address Ċ import Ġorg . springframework . data . domain . Page Ċ import Ġorg . springframework . data . domain . Page able Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . transaction . annotation . Transactional Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . sqrt Ċ Ċ @ Transactional Ċ @ Service Ċ class ĠManagement Perf Service ( ĊĠĠĠĠĠĠĠ Ġval Ġperf Repository : ĠPer f Repository , ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Repository : ĠComponent Repository , ĊĠĠĠĠĠĠĠ Ġlogger Factory : ĠLoggerFactory Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger Factory . logger Ġ{ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( perf : ĠPer f Dto ): ĠPer f Dto ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Repository . findBy Full Address ( perf . component Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( component Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Received Ġlog Ġfrom Ġan Ġunknown Ġcomponent Ġat Ġ${ perf . component Address }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġperf Repository . save ( perf . to Entity ( component )). to Dto () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Perf Logs ( operation Id : ĠString ?, Ġcomponent Type : ĠComponent Type ?, Ġpage able : ĠPage able ): ĠPage < Perf Dto > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentities Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Id Ġ!= Ġnull Ġ&& Ġcomponent Type Ġ!= Ġnull Ġ-> Ġperf Repository . findBy Operation Id And ComponentType ( operation Id , Ġcomponent Type , Ġpage able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Id Ġ!= Ġnull Ġ-> Ġperf Repository . findBy Operation Id ( operation Id , Ġpage able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Type Ġ!= Ġnull Ġ-> Ġperf Repository . findBy ComponentType ( component Type , Ġpage able ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġperf Repository . findAll ( page able ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . map Ġ{ Ġit . to Dto () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Operation Stats (): ĠMap < String , ĠGeneral Operation Statistics > Ġ= Ġperf Repository . findAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . operation Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( operation Id , Ġoperations ) Ġ-> Ġcompute Single Operation Stats ( operation Id , Ġoperations ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate By Ġ{ Ġit . operation Id Ġ} ĊĊĠĠĠ Ġfun Ġget Single Operation Stats ( operation Id : ĠString ): ĠGeneral Operation Statistics Ġ= Ġcompute Single Operation Stats ( operation Id , Ġperf Repository . findBy Operation Id ( operation Id )) ĊĊĠĠĠ Ġinternal Ġfun Ġcompute Single Operation Stats ( operation Id : ĠString , Ġoperations : ĠList < Perf Entity >): ĠGeneral Operation Statistics Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠGeneral Operation Statistics ( operation Id ) ĊĠĠĠĠĠĠĠ Ġstats . invocation Count Ġ= Ġoperations . size ĊĠĠĠĠĠĠĠ Ġval Ġduration Sum Ġ= Ġoperations . fold ( 0 L ) Ġ{ Ġacc , Ġperf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stats . min Duration Ġ== Ġ 0 L Ġ|| Ġstats . min Duration Ġ> Ġperf . duration ) Ġstats . min Duration Ġ= Ġperf . duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stats . max Duration Ġ== Ġ 0 L Ġ|| Ġstats . max Duration Ġ< Ġperf . duration ) Ġstats . max Duration Ġ= Ġperf . duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġperf . duration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstats . average Duration Ġ= Ġduration Sum . toDouble () Ġ/ Ġoperations . size ĊĠĠĠĠĠĠĠ Ġstats . average Duration De viation Ġ= Ġsqrt ( operations . fold ( 0 . 0 ) Ġ{ Ġacc , Ġperf Ġ-> Ġacc Ġ+ Ġabs ( perf . duration Ġ- Ġstats . average Duration ) Ġ} Ġ/ Ġoperations . size ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstats ĊĠĠĠ Ġ} Ċ }