/
counter_rate.go
76 lines (66 loc) · 1.96 KB
/
counter_rate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright 2015 The Cockroach Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
package metric
import (
"sync"
"time"
"github.com/vearch/vearch/util/metrics"
)
var _ metrics.Metric = &CounterRate{}
// CounterRate is a wrapper around a counter.
type CounterRate struct {
Counter
mu sync.Mutex
lastCount int64
lastTime time.Time
}
// NewCounterRate creates a CounterRate.
func NewCounterRate(metadata metrics.Metadata) *CounterRate {
return &CounterRate{
Counter: Counter{Metadata: metadata, count: 0},
lastTime: time.Now(),
}
}
// GetType returns the type enum for this metric.
func (c *CounterRate) GetType() metrics.MetricType {
return metrics.MetricType_COUNTERRATE
}
// Clear sets the counter to zero.
func (c *CounterRate) Clear() {
c.mu.Lock()
c.lastCount = 0
c.lastTime = time.Now()
c.Counter.Clear()
c.mu.Unlock()
}
// ExportMetric returns a filled-in metric data of the right type for the given metric.
func (c *CounterRate) ExportMetric() *metrics.MetricData {
c.mu.Lock()
cur := c.Counter.Count()
win := cur - c.lastCount
now := time.Now()
avg := float64(0)
if c.lastTime.Before(now) {
avg = float64(win) / now.Sub(c.lastTime).Seconds()
}
c.lastCount = cur
c.lastTime = now
c.mu.Unlock()
return &metrics.MetricData{
CounterRate: &metrics.CounterRateData{TotalValue: float64(cur), WindowValue: float64(win), AvgValue: float64(avg)},
Labels: c.Labels[:],
Unit: c.Unit,
TimestampNs: time.Now().UnixNano(),
}
}