This repository has been archived by the owner on Aug 23, 2023. It is now read-only.
/
gauge32.go
65 lines (53 loc) · 1.13 KB
/
gauge32.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
package stats
import (
"sync/atomic"
"time"
)
type Gauge32 struct {
val uint32
name []byte
tags []byte
}
func NewGauge32(name string) *Gauge32 {
return NewGauge32WithTags(name, "")
}
func NewGauge32WithTags(name, tags string) *Gauge32 {
return registry.getOrAdd(name+tags, &Gauge32{
name: []byte(name),
tags: []byte(tags),
}).(*Gauge32)
}
func (g *Gauge32) Inc() {
atomic.AddUint32(&g.val, 1)
}
func (g *Gauge32) Dec() {
atomic.AddUint32(&g.val, ^uint32(0))
}
func (g *Gauge32) AddUint32(val uint32) {
atomic.AddUint32(&g.val, val)
}
func (g *Gauge32) DecUint32(val uint32) {
atomic.AddUint32(&g.val, ^uint32(val-1))
}
func (g *Gauge32) Add(val int) {
if val == 0 {
return
}
if val > 0 {
g.AddUint32(uint32(val))
return
}
// < 0
g.DecUint32(uint32(-1 * val))
}
func (g *Gauge32) Set(val int) {
atomic.StoreUint32(&g.val, uint32(val))
}
func (g *Gauge32) SetUint32(val uint32) {
atomic.StoreUint32(&g.val, val)
}
func (g *Gauge32) WriteGraphiteLine(buf, prefix []byte, now time.Time) []byte {
val := atomic.LoadUint32(&g.val)
buf = WriteUint32(buf, prefix, g.name, []byte(".gauge32"), g.tags, val, now)
return buf
}