github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/rcrowley/go-metrics/timer.go (about)

     1  package metrics
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  )
     7  
     8  // Timers capture the duration and rate of events.
     9  type Timer interface {
    10  	Count() int64
    11  	Max() int64
    12  	Mean() float64
    13  	Min() int64
    14  	Percentile(float64) float64
    15  	Percentiles([]float64) []float64
    16  	Rate1() float64
    17  	Rate5() float64
    18  	Rate15() float64
    19  	RateMean() float64
    20  	Snapshot() Timer
    21  	StdDev() float64
    22  	Sum() int64
    23  	Time(func())
    24  	Update(time.Duration)
    25  	UpdateSince(time.Time)
    26  	Variance() float64
    27  }
    28  
    29  // GetOrRegisterTimer returns an existing Timer or constructs and registers a
    30  // new StandardTimer.
    31  func GetOrRegisterTimer(name string, r Registry) Timer {
    32  	if nil == r {
    33  		r = DefaultRegistry
    34  	}
    35  	return r.GetOrRegister(name, NewTimer).(Timer)
    36  }
    37  
    38  // NewCustomTimer constructs a new StandardTimer from a Histogram and a Meter.
    39  func NewCustomTimer(h Histogram, m Meter) Timer {
    40  	if UseNilMetrics {
    41  		return NilTimer{}
    42  	}
    43  	return &StandardTimer{
    44  		histogram: h,
    45  		meter:     m,
    46  	}
    47  }
    48  
    49  // NewRegisteredTimer constructs and registers a new StandardTimer.
    50  func NewRegisteredTimer(name string, r Registry) Timer {
    51  	c := NewTimer()
    52  	if nil == r {
    53  		r = DefaultRegistry
    54  	}
    55  	r.Register(name, c)
    56  	return c
    57  }
    58  
    59  // NewTimer constructs a new StandardTimer using an exponentially-decaying
    60  // sample with the same reservoir size and alpha as UNIX load averages.
    61  func NewTimer() Timer {
    62  	if UseNilMetrics {
    63  		return NilTimer{}
    64  	}
    65  	return &StandardTimer{
    66  		histogram: NewHistogram(NewExpDecaySample(1028, 0.015)),
    67  		meter:     NewMeter(),
    68  	}
    69  }
    70  
    71  // NilTimer is a no-op Timer.
    72  type NilTimer struct {
    73  	h Histogram
    74  	m Meter
    75  }
    76  
    77  // Count is a no-op.
    78  func (NilTimer) Count() int64 { return 0 }
    79  
    80  // Max is a no-op.
    81  func (NilTimer) Max() int64 { return 0 }
    82  
    83  // Mean is a no-op.
    84  func (NilTimer) Mean() float64 { return 0.0 }
    85  
    86  // Min is a no-op.
    87  func (NilTimer) Min() int64 { return 0 }
    88  
    89  // Percentile is a no-op.
    90  func (NilTimer) Percentile(p float64) float64 { return 0.0 }
    91  
    92  // Percentiles is a no-op.
    93  func (NilTimer) Percentiles(ps []float64) []float64 {
    94  	return make([]float64, len(ps))
    95  }
    96  
    97  // Rate1 is a no-op.
    98  func (NilTimer) Rate1() float64 { return 0.0 }
    99  
   100  // Rate5 is a no-op.
   101  func (NilTimer) Rate5() float64 { return 0.0 }
   102  
   103  // Rate15 is a no-op.
   104  func (NilTimer) Rate15() float64 { return 0.0 }
   105  
   106  // RateMean is a no-op.
   107  func (NilTimer) RateMean() float64 { return 0.0 }
   108  
   109  // Snapshot is a no-op.
   110  func (NilTimer) Snapshot() Timer { return NilTimer{} }
   111  
   112  // StdDev is a no-op.
   113  func (NilTimer) StdDev() float64 { return 0.0 }
   114  
   115  // Sum is a no-op.
   116  func (NilTimer) Sum() int64 { return 0 }
   117  
   118  // Time is a no-op.
   119  func (NilTimer) Time(func()) {}
   120  
   121  // Update is a no-op.
   122  func (NilTimer) Update(time.Duration) {}
   123  
   124  // UpdateSince is a no-op.
   125  func (NilTimer) UpdateSince(time.Time) {}
   126  
   127  // Variance is a no-op.
   128  func (NilTimer) Variance() float64 { return 0.0 }
   129  
   130  // StandardTimer is the standard implementation of a Timer and uses a Histogram
   131  // and Meter.
   132  type StandardTimer struct {
   133  	histogram Histogram
   134  	meter     Meter
   135  	mutex     sync.Mutex
   136  }
   137  
   138  // Count returns the number of events recorded.
   139  func (t *StandardTimer) Count() int64 {
   140  	return t.histogram.Count()
   141  }
   142  
   143  // Max returns the maximum value in the sample.
   144  func (t *StandardTimer) Max() int64 {
   145  	return t.histogram.Max()
   146  }
   147  
   148  // Mean returns the mean of the values in the sample.
   149  func (t *StandardTimer) Mean() float64 {
   150  	return t.histogram.Mean()
   151  }
   152  
   153  // Min returns the minimum value in the sample.
   154  func (t *StandardTimer) Min() int64 {
   155  	return t.histogram.Min()
   156  }
   157  
   158  // Percentile returns an arbitrary percentile of the values in the sample.
   159  func (t *StandardTimer) Percentile(p float64) float64 {
   160  	return t.histogram.Percentile(p)
   161  }
   162  
   163  // Percentiles returns a slice of arbitrary percentiles of the values in the
   164  // sample.
   165  func (t *StandardTimer) Percentiles(ps []float64) []float64 {
   166  	return t.histogram.Percentiles(ps)
   167  }
   168  
   169  // Rate1 returns the one-minute moving average rate of events per second.
   170  func (t *StandardTimer) Rate1() float64 {
   171  	return t.meter.Rate1()
   172  }
   173  
   174  // Rate5 returns the five-minute moving average rate of events per second.
   175  func (t *StandardTimer) Rate5() float64 {
   176  	return t.meter.Rate5()
   177  }
   178  
   179  // Rate15 returns the fifteen-minute moving average rate of events per second.
   180  func (t *StandardTimer) Rate15() float64 {
   181  	return t.meter.Rate15()
   182  }
   183  
   184  // RateMean returns the meter's mean rate of events per second.
   185  func (t *StandardTimer) RateMean() float64 {
   186  	return t.meter.RateMean()
   187  }
   188  
   189  // Snapshot returns a read-only copy of the timer.
   190  func (t *StandardTimer) Snapshot() Timer {
   191  	t.mutex.Lock()
   192  	defer t.mutex.Unlock()
   193  	return &TimerSnapshot{
   194  		histogram: t.histogram.Snapshot().(*HistogramSnapshot),
   195  		meter:     t.meter.Snapshot().(*MeterSnapshot),
   196  	}
   197  }
   198  
   199  // StdDev returns the standard deviation of the values in the sample.
   200  func (t *StandardTimer) StdDev() float64 {
   201  	return t.histogram.StdDev()
   202  }
   203  
   204  // Sum returns the sum in the sample.
   205  func (t *StandardTimer) Sum() int64 {
   206  	return t.histogram.Sum()
   207  }
   208  
   209  // Record the duration of the execution of the given function.
   210  func (t *StandardTimer) Time(f func()) {
   211  	ts := time.Now()
   212  	f()
   213  	t.Update(time.Since(ts))
   214  }
   215  
   216  // Record the duration of an event.
   217  func (t *StandardTimer) Update(d time.Duration) {
   218  	t.mutex.Lock()
   219  	defer t.mutex.Unlock()
   220  	t.histogram.Update(int64(d))
   221  	t.meter.Mark(1)
   222  }
   223  
   224  // Record the duration of an event that started at a time and ends now.
   225  func (t *StandardTimer) UpdateSince(ts time.Time) {
   226  	t.mutex.Lock()
   227  	defer t.mutex.Unlock()
   228  	t.histogram.Update(int64(time.Since(ts)))
   229  	t.meter.Mark(1)
   230  }
   231  
   232  // Variance returns the variance of the values in the sample.
   233  func (t *StandardTimer) Variance() float64 {
   234  	return t.histogram.Variance()
   235  }
   236  
   237  // TimerSnapshot is a read-only copy of another Timer.
   238  type TimerSnapshot struct {
   239  	histogram *HistogramSnapshot
   240  	meter     *MeterSnapshot
   241  }
   242  
   243  // Count returns the number of events recorded at the time the snapshot was
   244  // taken.
   245  func (t *TimerSnapshot) Count() int64 { return t.histogram.Count() }
   246  
   247  // Max returns the maximum value at the time the snapshot was taken.
   248  func (t *TimerSnapshot) Max() int64 { return t.histogram.Max() }
   249  
   250  // Mean returns the mean value at the time the snapshot was taken.
   251  func (t *TimerSnapshot) Mean() float64 { return t.histogram.Mean() }
   252  
   253  // Min returns the minimum value at the time the snapshot was taken.
   254  func (t *TimerSnapshot) Min() int64 { return t.histogram.Min() }
   255  
   256  // Percentile returns an arbitrary percentile of sampled values at the time the
   257  // snapshot was taken.
   258  func (t *TimerSnapshot) Percentile(p float64) float64 {
   259  	return t.histogram.Percentile(p)
   260  }
   261  
   262  // Percentiles returns a slice of arbitrary percentiles of sampled values at
   263  // the time the snapshot was taken.
   264  func (t *TimerSnapshot) Percentiles(ps []float64) []float64 {
   265  	return t.histogram.Percentiles(ps)
   266  }
   267  
   268  // Rate1 returns the one-minute moving average rate of events per second at the
   269  // time the snapshot was taken.
   270  func (t *TimerSnapshot) Rate1() float64 { return t.meter.Rate1() }
   271  
   272  // Rate5 returns the five-minute moving average rate of events per second at
   273  // the time the snapshot was taken.
   274  func (t *TimerSnapshot) Rate5() float64 { return t.meter.Rate5() }
   275  
   276  // Rate15 returns the fifteen-minute moving average rate of events per second
   277  // at the time the snapshot was taken.
   278  func (t *TimerSnapshot) Rate15() float64 { return t.meter.Rate15() }
   279  
   280  // RateMean returns the meter's mean rate of events per second at the time the
   281  // snapshot was taken.
   282  func (t *TimerSnapshot) RateMean() float64 { return t.meter.RateMean() }
   283  
   284  // Snapshot returns the snapshot.
   285  func (t *TimerSnapshot) Snapshot() Timer { return t }
   286  
   287  // StdDev returns the standard deviation of the values at the time the snapshot
   288  // was taken.
   289  func (t *TimerSnapshot) StdDev() float64 { return t.histogram.StdDev() }
   290  
   291  // Sum returns the sum at the time the snapshot was taken.
   292  func (t *TimerSnapshot) Sum() int64 { return t.histogram.Sum() }
   293  
   294  // Time panics.
   295  func (*TimerSnapshot) Time(func()) {
   296  	panic("Time called on a TimerSnapshot")
   297  }
   298  
   299  // Update panics.
   300  func (*TimerSnapshot) Update(time.Duration) {
   301  	panic("Update called on a TimerSnapshot")
   302  }
   303  
   304  // UpdateSince panics.
   305  func (*TimerSnapshot) UpdateSince(time.Time) {
   306  	panic("UpdateSince called on a TimerSnapshot")
   307  }
   308  
   309  // Variance returns the variance of the values at the time the snapshot was
   310  // taken.
   311  func (t *TimerSnapshot) Variance() float64 { return t.histogram.Variance() }