package Ġcom . or ip wk . micro meter . kotlin Ċ Ċ import Ġio . micro meter . core . instrument . Clock Ċ import Ġio . micro meter . core . instrument . Meter Registry Ċ import Ġio . micro meter . core . instrument . Tag Ċ import Ġio . micro meter . core . instrument . Timer Ċ import Ġio . micro meter . core . instrument . Timer . Builder Ċ import Ġio . micro meter . core . instrument . distribution . pause . Pause Detector Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ /** Ċ Ġ* ĠMe as ures Ġthe Ġtime Ġtaken Ġfor Ġshort Ġtasks Ġand Ġthe Ġcount Ġof Ġthese Ġtasks . Ċ Ġ* Ċ Ġ* Ġ@ param Ġname ĠThe Ġbase Ġmetric Ġname Ċ Ġ* Ġ@ param Ġtags ĠMUST Ġbe Ġan Ġeven Ġnumber Ġof Ġarguments Ġrepresenting Ġkey / value Ġpairs Ġof Ġtags . Ċ Ġ* Ġ@ return ĠA Ġnew Ġor Ġexisting Ġtimer . Ċ Ġ*/ Ċ fun ĠMeter Registry . co Timer ( name : ĠString , Ġvar arg Ġtags : ĠString ): ĠCor outine Timer Ġ= ĊĠĠĠĠĠĠĠ ĠCor outine Timer ( timer ( name , Ġ* Ġtags ), Ġthis . config (). clock ()) Ċ Ċ /** Ċ Ġ* ĠMe as ures Ġthe Ġtime Ġtaken Ġfor Ġshort Ġtasks Ġand Ġthe Ġcount Ġof Ġthese Ġtasks . Ċ Ġ* Ċ Ġ* Ġ@ param Ġname ĠThe Ġbase Ġmetric Ġname Ċ Ġ* Ġ@ param Ġtags ĠSequence Ġof Ġdimensions Ġfor Ġbreaking Ġdown Ġthe Ġname . Ċ Ġ* Ġ@ return ĠA Ġnew Ġor Ġexisting Ġtimer . Ċ Ġ*/ Ċ fun ĠMeter Registry . co Timer ( name : ĠString , Ġtags : ĠIterable < Tag >): ĠCor outine Timer Ġ= ĊĠĠĠĠĠĠĠ ĠCor outine Timer ( timer ( name , Ġtags ), Ġthis . config (). clock ()) Ċ Ċ /** Ċ Ġ* Ġ@ param Ġtags ĠTags Ġto Ġadd Ġto Ġthe Ġevent ual Ġtimer . Ċ Ġ* Ġ@ param Ġpublish Percent iles ĠPro duces Ġan Ġadditional Ġtime Ġseries Ġfor Ġeach Ġrequested Ġpercent ile . ĠThis Ġpercent ile Ċ Ġ* Ġis Ġcomputed Ġlocally , Ġand Ġso Ġcan 't Ġbe Ġaggregated Ġwith Ġpercent iles Ġcomputed Ġacross Ġother Ċ Ġ* Ġdimensions Ġ( e . g . Ġin Ġa Ġdifferent Ġinstance ). ĠUse Ġ[ publish Percent ile Histogram ] Ċ Ġ* Ġto Ġpublish Ġa Ġhistogram Ġthat Ġcan Ġbe Ġused Ġto Ġgenerate Ġaggreg able Ġpercent ile Ġapprox im ations . Ċ Ġ* Ġ@ param Ġpercent ile Precision ĠDetermines Ġthe Ġnumber Ġof Ġdigits Ġof Ġprecision Ġto Ġmaintain Ġon Ġthe Ġdynamic Ġrange Ġhistogram Ġused Ġto Ġcompute Ċ Ġ* Ġpercent ile Ġapprox im ations . ĠThe Ġhigher Ġthe Ġdegrees Ġof Ġprecision , Ġthe Ġmore Ġaccurate Ġthe Ġapproximation Ġis Ġat Ġthe Ċ Ġ* Ġcost Ġof Ġmore Ġmemory . Ċ Ġ* Ġ@ param Ġpublish Percent ile Histogram ĠAdds Ġhistogram Ġbuckets Ġused Ġto Ġgenerate Ġaggreg able Ġpercent ile Ġapprox im ations Ġin Ġmonitoring Ċ Ġ* Ġsystems Ġthat Ġhave Ġquery Ġfacilities Ġto Ġdo Ġso Ġ( e . g . ĠPrometheus ' Ġ` histogram _ quant ile `, Ċ Ġ* ĠAtlas ' Ġ` percent iles `. Ċ Ġ* Ġ@ param Ġs la ĠPublish Ġat Ġa Ġminimum Ġa Ġhistogram Ġcontaining Ġyour Ġdefined ĠS LA Ġboundaries . ĠWhen Ġused Ġin Ġconjunction Ġwith Ċ Ġ* Ġ[ publish Percent ile Histogram ], Ġthe Ġboundaries Ġdefined Ġhere Ġare Ġincluded Ġalong side Ċ Ġ* Ġother Ġbuckets Ġused Ġto Ġgenerate Ġaggreg able Ġpercent ile Ġapprox im ations . Ċ Ġ* Ġ@ param Ġminimum Expected Value ĠSets Ġthe Ġminimum Ġvalue Ġthat Ġthis Ġtimer Ġis Ġexpected Ġto Ġobserve . ĠSets Ġa Ġlower Ġbound Ċ Ġ* Ġon Ġhistogram Ġbuckets Ġthat Ġare Ġsh ipped Ġto Ġmonitoring Ġsystems Ġthat Ġsupport Ġaggreg able Ġpercent ile Ġapprox im ations . Ċ Ġ* Ġ@ param Ġmaximum Expected Value ĠSets Ġthe Ġmaximum Ġvalue Ġthat Ġthis Ġtimer Ġis Ġexpected Ġto Ġobserve . ĠSets Ġan Ġupper Ġbound Ċ Ġ* Ġon Ġhistogram Ġbuckets Ġthat Ġare Ġsh ipped Ġto Ġmonitoring Ġsystems Ġthat Ġsupport Ġaggreg able Ġpercent ile Ġapprox im ations . Ċ Ġ* Ġ@ param Ġdistribution Statistic Expiry ĠStatistics Ġem an ating Ġfrom Ġa Ġtimer Ġlike Ġmax , Ġpercent iles , Ġand Ġhistogram Ġcounts Ġdecay Ġover Ġtime Ġto Ċ Ġ* Ġgive Ġgreater Ġweight Ġto Ġrecent Ġsamples Ġ( exception : Ġhistogram Ġcounts Ġare Ġcumulative Ġfor Ġthose Ġsystems Ġthat Ġexpect Ġcumulative Ċ Ġ* Ġhistogram Ġbuckets ). ĠSamples Ġare Ġaccumulated Ġto Ġsuch Ġstatistics Ġin Ġring Ġbuffers Ġwhich Ġrotate Ġafter Ċ Ġ* Ġthis Ġexpiry , Ġwith Ġa Ġbuffer Ġlength Ġof Ġ[ distribution Statistic Buffer Length ] Ċ Ġ* Ġ@ param Ġdistribution Statistic Buffer Length ĠStatistics Ġem an ating Ġfrom Ġa Ġtimer Ġlike Ġmax , Ġpercent iles , Ġand Ġhistogram Ġcounts Ġdecay Ġover Ġtime Ġto Ċ Ġ* Ġgive Ġgreater Ġweight Ġto Ġrecent Ġsamples Ġ( exception : Ġhistogram Ġcounts Ġare Ġcumulative Ġfor Ġthose Ġsystems Ġthat Ġexpect Ġcumulative Ċ Ġ* Ġhistogram Ġbuckets ). ĠSamples Ġare Ġaccumulated Ġto Ġsuch Ġstatistics Ġin Ġring Ġbuffers Ġwhich Ġrotate Ġafter Ċ Ġ* Ġ[ distribution Statistic Expiry ], Ġwith Ġthis Ġbuffer Ġlength . Ċ Ġ* Ġ@ param Ġpause Detector ĠSets Ġthe Ġpause Ġdetector Ġimplementation Ġto Ġuse Ġfor Ġthis Ġtimer . ĠCan Ġalso Ġbe Ġconfigured Ġon Ġa Ġregistry - level Ġwith Ċ Ġ* Ġ[ Meter Registry . pause Detector ] Ċ Ġ* Ġ@ param Ġdescription ĠDescription Ġtext Ġof Ġthe Ġevent ual Ġtimer . Ċ Ġ*/ Ċ fun ĠBuilder . co Timer ( ĊĠĠĠ Ġmeter Registry : ĠMeter Registry , ĊĠĠĠ Ġtags : ĠList < Tag > Ġ= Ġempty List (), ĊĠĠĠ Ġpublish Percent iles : ĠList < Double >? Ġ= Ġnull , ĊĠĠĠ Ġpercent ile Precision : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġpublish Percent ile Histogram : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠ Ġs la : ĠList < Duration >? Ġ= Ġnull , ĊĠĠĠ Ġminimum Expected Value : ĠDuration ? Ġ= Ġnull , ĊĠĠĠ Ġmaximum Expected Value : ĠDuration ? Ġ= Ġnull , ĊĠĠĠ Ġdistribution Statistic Expiry : ĠDuration ? Ġ= Ġnull , ĊĠĠĠ Ġdistribution Statistic Buffer Length : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġpause Detector : ĠPause Detector ? Ġ= Ġnull , ĊĠĠĠ Ġdescription : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠCor outine Timer Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimer Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. tags ( tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġif Ġ( publish Percent iles Ġ!= Ġnull ) Ġit . publish Percent iles (* Ġpublish Percent iles . toDouble Array ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. percentile Precision ( percentile Precision ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. publish Percent ile Histogram ( publish Percent ile Histogram ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġif Ġ( sla Ġ!= Ġnull ) Ġit . sla (* Ġs la . to Typed Array ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. minimum Expected Value ( minimum Expected Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. maximum Expected Value ( maximum Expected Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distribution Statistic Expiry ( distribution Statistic Expiry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distribution Statistic Buffer Length ( distribution Statistic Buffer Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. pause Detector ( pause Detector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. description ( description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register ( meter Registry ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCor outine Timer ( timer , Ġmeter Registry . config (). clock ()) ĊĠĠĠ Ġ} Ċ Ċ class ĠCor outine Timer Ġinternal Ġconstructor ( timer : ĠTimer , Ġprivate Ġval Ġclock : ĠClock ) Ġ: ĠTimer Ġby Ġtimer Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġthe Ġsuspend Ġfunction Ġ[ f ] Ġand Ġrecords Ġthe Ġtime Ġtaken . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġf ĠS uspend Ġfunction Ġto Ġexecute Ġand Ġmeasure Ġthe Ġexecution Ġtime . ĊĠĠĠĠ Ġ* Ġ@ param ĠT ĠThe Ġreturn Ġtype Ġof Ġ[ f ] ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġreturn Ġvalue Ġof Ġ[ f ]. ĊĠĠĠĠ Ġ* Ġ@ throws ĠException ĠAny Ġexception Ġb ub bling Ġup Ġfrom Ġthe Ġcallable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġ< T > Ġrecord ( f : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġclock . mon otonic Time () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġclock . mon otonic Time () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord ( e Ġ- Ġs , ĠTimeUnit . NAN O SECONDS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap Ġa Ġsuspend Ġfunction Ġso Ġthat Ġit Ġis Ġtimed Ġwhen Ġinvoked . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġf ĠThe Ġsuspend Ġfunction Ġto Ġtime Ġwhen Ġit Ġis Ġinvoked . ĊĠĠĠĠ Ġ* Ġ@ param ĠT ĠThe Ġreturn Ġtype Ġof Ġ[ f ] ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġwrapped Ġsuspend Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġwrap ( f : Ġsuspend Ġ() Ġ-> ĠT ): Ġsuspend Ġ() Ġ-> ĠT Ġ= Ġ{ Ġrecord ( f ) Ġ} Ċ } ĊĊ