/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġcom . stu for bes Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . stu for bes . kap acity . recorder . http Ċ Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ import Ġkotlin . math . ceil Ċ Ċ /** Ċ Ġ* ĠResults Ġobject Ġto Ġprint Ġthe Ġdur ations Ġof Ġresponses Ċ Ġ*/ Ċ class ĠHttp Results Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResponse Ġresult Ġobject , Ġcontaining Ġthe ĠHttpResponse Ġstatus Ġcode , Ġand Ġthe Ġduration Ġof Ġthe Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġstatus ĠThe ĠHttp ĠStatus ĠCode ĊĠĠĠĠ Ġ* Ġ@ param Ġtime ĠThe Ġduration Ġof Ġthe Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠResponse ( val Ġstatus : ĠInt , Ġval Ġtime : ĠLong ) ĊĊĠĠĠ Ġprivate Ġval Ġresponses Ġ= Ġmutable ListOf < Response >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRecord Ġan ĠHttp ĠResponse Ġstatus Ġcode Ġand Ġrequest Ġduration ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Response ( statusCode : ĠInt , Ġtime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponses . add ( Response ( statusCode , Ġtime )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġ| Results : ĊĠĠĠĠĠĠĠ Ġ| ======== ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠNumber Ġof Ġresponses : ĠĠĠ Ġ${ responses . size } ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠMean Ġresponse Ġtime : ĠĠĠĠ Ġ${ responses . mean Response Time ()} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠMax Ġresponse Ġtime : ĠĠĠĠĠ Ġ${ responses . percentile Time ( 1 0 0 )} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠMed ian : ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ responses . percentile Time ( 5 0 )} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ 7 5 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ responses . percentile Time ( 7 5 )} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ 9 0 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ responses . percentile Time ( 9 0 )} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ 9 5 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ responses . percentile Time ( 9 5 )} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ 9 9 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ responses . percentile Time ( 9 9 )} Ġms ĊĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĊĠĠĠĠĠĠĠ Ġ| By ĠHTTP Ġstatus Ġcode : ĊĠĠĠĠĠĠĠ Ġ| ================ ==== ĊĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠ Ġ| ${ print Results By Status ()} ĊĠĠĠ Ġ| """. trim Margin () ĊĊĠĠĠ Ġprivate Ġfun Ġprint Results By Status (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse sBy Status Ġ= Ġresponse sBy Status () ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse sBy Status . keys . sorted (). join ToString ("\ n ") Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Responses Ġ= Ġresponse sBy Status [ status ] Ġ?: Ġerror (" Could Ġnot Ġfind Ġresponses Ġfor Ġstatus Ġ$ status ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| $ status : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ==== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ ĠNumber Ġof Ġresponses : ĠĠĠ Ġ${ status Responses . size } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ ĠPro portion : ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ ( status Responses . size . toDouble () Ġ/ Ġresponses . size . toDouble ()). as Percentage ()} % ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ ĠMean Ġresponse Ġtime : ĠĠĠĠ Ġ${ status Responses . mean Response Time ()} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ ĠMax Ġresponse Ġtime : ĠĠĠĠĠ Ġ${ status Responses . percentile Time ( 1 0 0 )} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ ĠMed ian : ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ status Responses . percentile Time ( 5 0 )} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ 7 5 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ status Responses . percentile Time ( 7 5 )} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ 9 0 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ status Responses . percentile Time ( 9 0 )} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ 9 5 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ status Responses . percentile Time ( 9 5 )} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ 9 9 th Ġpercent ile : ĠĠĠĠĠĠĠ Ġ${ status Responses . percentile Time ( 9 9 )} Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Response >. mean Response Time () Ġ= Ġto Times (). average Or Zero (). to 2 DP () ĊĠĠĠ Ġprivate Ġfun ĠList < Response >. percentile Time ( p : ĠInt ) Ġ= Ġto Times (). percentile ( p ) ĊĊĠĠĠ Ġprivate Ġfun Ġresponse sBy Status () Ġ= Ġresponses ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . status Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Long >. percentile ( p : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( responses . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġceil (( p . toDouble () Ġ/ Ġ 1 0 0 ) Ġ* Ġsorted . size ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsorted [ index Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠList < Response >. to Times () Ġ= Ġthis . map Ġ{ Ġit . time Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠList < Long >. average Or Zero () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty () Ġ-> Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġaverage () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠDouble . to 2 DP (): ĠDouble Ġ= ĠBigDecimal ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Scale ( 2 , ĠRound ingMode . HALF _ E VEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toDouble () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠDouble . as Percentage () Ġ= Ġ( this Ġ* Ġ 1 0 0 ). to 2 DP () ĊĠĠĠ Ġ} Ċ }