/* Ċ Ġ* ĠCopyright ĠThe ĠOpen Telemetry ĠAuthors Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ package Ġio . op entelemetry . kotlin . sdk . metrics . internal . ag gregator Ċ Ċ import Ġio . op entelemetry . kotlin . Supplier Ċ import Ġio . op entelemetry . kotlin . api . common . Attributes Ċ import Ġio . op entelemetry . kotlin . sdk . common . Instrumentation Library Info Ċ import Ġio . op entelemetry . kotlin . sdk . metrics . data . Aggregation Temp or ality Ċ import Ġio . op entelemetry . kotlin . sdk . metrics . data . Double Histogram Data Ċ import Ġio . op entelemetry . kotlin . sdk . metrics . data . Ex emp lar Data Ċ import Ġio . op entelemetry . kotlin . sdk . metrics . data . Metric Data Ċ import Ġio . op entelemetry . kotlin . sdk . metrics . ex emp lar . Ex emp lar Reser voir Ċ import Ġio . op entelemetry . kotlin . sdk . metrics . internal . descriptor . Metric Descriptor Ċ import Ġio . op entelemetry . kotlin . sdk . resources . Resource Ċ import Ġkotlinx . atomic fu . Atomic Ref Ċ import Ġkotlinx . atomic fu . atomic Ċ import Ġkotlinx . atomic fu . locks . re entrant Lock Ċ Ċ /** Ċ Ġ* ĠAg gregator Ġthat Ġgenerates Ġh istograms . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġis Ġinternal Ġand Ġis Ġhence Ġnot Ġfor Ġpublic Ġuse . ĠIts ĠAPIs Ġare Ġun stable Ġand Ġcan Ġchange Ġat Ċ Ġ* Ġany Ġtime . Ċ Ġ*/ Ċ class ĠDouble Histogram Aggregator ( ĊĠĠĠ Ġprivate Ġval Ġboundaries : ĠDouble Array , ĊĠĠĠ Ġprivate Ġval Ġre servo ir Supplier : ĠSupplier < Ex emp lar Reser voir > Ċ ) Ġ: ĠAg gregator < Histogram Accum ulation > Ġ{ ĊĠĠĠ Ġ// Ġa Ġcache Ġfor Ġconverting Ġto ĠMetric Data ĊĠĠĠ Ġprivate Ġval Ġboundary List : ĠList < Double > Ġ= Ġboundaries . toList () ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Handle (): ĠAg gregator Handle < Histogram Accum ulation > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHandle ( bound aries , Ġre servo ir Supplier . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġresult Ġof Ġthe Ġmerge Ġof Ġtwo Ġhistogram Ġacc umul ations . ĠAs Ġlong Ġas Ġone ĠAg gregator ĊĠĠĠĠ Ġ* Ġinstance Ġproduces Ġall ĠAcc umul ations Ġwith Ġconstant Ġboundaries Ġwe Ġdon 't Ġneed Ġto Ġworry Ġabout ĊĠĠĠĠ Ġ* Ġmerging Ġacc umul ations Ġwith Ġdifferent Ġboundaries . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġmerge ( ĊĠĠĠĠĠĠĠ Ġprevious : ĠHistogram Accum ulation , ĊĠĠĠĠĠĠĠ Ġcurrent : ĠHistogram Accum ulation ĊĠĠĠ Ġ): ĠHistogram Accum ulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Counts : ĠLong Array Ġ= Ġprevious . counts ĊĠĠĠĠĠĠĠ Ġval Ġmerged Counts Ġ= ĠLong Array ( previous Counts . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġprevious Counts . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Counts [ i ] Ġ= Ġprevious Counts [ i ] Ġ+ Ġcurrent . counts . get ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠHistogram Accum ulation . Companion . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious . sum Ġ+ Ġcurrent . sum , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Counts , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . ex emp lar s ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdiff ( ĊĠĠĠĠĠĠĠ Ġprevious : ĠHistogram Accum ulation , ĊĠĠĠĠĠĠĠ Ġcurrent : ĠHistogram Accum ulation ĊĠĠĠ Ġ): ĠHistogram Accum ulation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Counts : ĠLong Array Ġ= Ġprevious . counts ĊĠĠĠĠĠĠĠ Ġval Ġdiff ed Counts Ġ= ĠLong Array ( previous Counts . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġprevious Counts . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff ed Counts [ i ] Ġ= Ġcurrent . counts . get ( i ) Ġ- Ġprevious Counts [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠHistogram Accum ulation . Companion . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . sum Ġ- Ġprevious . sum , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff ed Counts , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . ex emp lar s ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Metric Data ( ĊĠĠĠĠĠĠĠ Ġresource : ĠResource , ĊĠĠĠĠĠĠĠ Ġinstrument ation Library Info : ĠInstrument ation Library Info , ĊĠĠĠĠĠĠĠ Ġmetric Descriptor : ĠMetric Descriptor , ĊĠĠĠĠĠĠĠ Ġaccum ulation By Labels : ĠMap < Attributes , ĠHistogram Accum ulation >, ĊĠĠĠĠĠĠĠ Ġtempor ality : ĠAg gregation Temp or ality , ĊĠĠĠĠĠĠĠ Ġstart Epoch Nan os : ĠLong , ĊĠĠĠĠĠĠĠ Ġlast Collection Epoch : ĠLong , ĊĠĠĠĠĠĠĠ Ġepoch Nan os : ĠLong ĊĠĠĠ Ġ): ĠMetric Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMetric Data . create Double Histogram ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ation Library Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetric Descriptor . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetric Descriptor . description , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetric Descriptor . unit , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Histogram Data . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtempor ality , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMetric Data Utils . toDouble Histogram Point List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccum ulation By Labels , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp or ality Ġ=== ĠAg gregation Temp or ality . C UM UL ATIVE ) Ġstart Epoch Nan os ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlast Collection Epoch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepoch Nan os , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠHandle ( Ġ// Ġread - only ĊĠĠĠ Ġprivate Ġval Ġboundaries : ĠDouble Array , Ġre servo ir : ĠEx emp lar Reser voir ) Ġ: ĊĠĠĠĠĠĠĠ ĠAg gregator Handle < Histogram Accum ulation >( re servo ir ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsum Ġ= Ġatomic ( 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcounts : ĠAtomic Ref < Long Array > Ġ= Ġatomic ( Long Array ( bound aries . size Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlock Ġ= Ġre entrant Lock () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Accum ulate Then Reset ( ex emp lar s : ĠList < Ex emp lar Data >): ĠHistogram Accum ulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacc : ĠHistogram Accum ulation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHistogram Accum ulation . create ( sum . value , Ġcounts . value . copyOf (), Ġexemp lar s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum . value Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounts . value . fill ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Record Double ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Index : ĠInt Ġ= ĠExplicit Bucket Histogram Utils . find Bucket Index ( bound aries , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġsum . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum . lazy Set ( oldValue Ġ+ Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounts . value [ bucket Index ] ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Record Long ( value : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Record Double ( value . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġdata Ġclass ĠSum Wrapper ( val Ġsum : ĠDouble Ġ= Ġ 0 . 0 ) ĊĠĠĠ Ġ} Ċ } Ċ