forked from quipo/statsd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.go
131 lines (113 loc) · 3.34 KB
/
client.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package statsd
import (
"fmt"
"net"
"os"
"strings"
"time"
"github.com/quipo/statsd/event"
)
var hostname string
func init() {
host, err := os.Hostname()
if nil == err {
hostname = host
}
}
// StatsdClient is a client library to send events to StatsD
type StatsdClient struct {
conn net.Conn
addr string
prefix string
}
// NewStatsdClient - Factory
func NewStatsdClient(addr string, prefix string) *StatsdClient {
return &StatsdClient{
addr: addr,
prefix: prefix,
}
}
// String returns the StatsD server address
func (c *StatsdClient) String() string {
return c.addr
}
// CreateSocket creates a UDP connection to a StatsD server
func (c *StatsdClient) CreateSocket() error {
conn, err := net.DialTimeout("udp", c.addr, time.Second)
if err != nil {
return err
}
c.conn = conn
return nil
}
// Close the UDP connection
func (c *StatsdClient) Close() error {
if nil == c.conn {
return nil
}
return c.conn.Close()
}
// See statsd data types here: http://statsd.readthedocs.org/en/latest/types.html
// Incr - Increment a counter metric. Often used to note a particular event
func (c *StatsdClient) Incr(stat string, count int64) error {
if 0 != count {
return c.send(stat, "%d|c", count)
}
return nil
}
// Decr - Decrement a counter metric. Often used to note a particular event
func (c *StatsdClient) Decr(stat string, count int64) error {
if 0 != count {
return c.send(stat, "%d|c", -count)
}
return nil
}
// Timing - Track a duration event
func (c *StatsdClient) Timing(stat string, delta int64) error {
return c.send(stat, "%d|ms", delta)
}
// Gauge - Gauges are a constant data type. They are not subject to averaging,
// and they don’t change unless you change them. That is, once you set a gauge value,
// it will be a flat line on the graph until you change it again. If you specify
// delta to be true, that specifies that the gauge should be updated, not set. Due to the
// underlying protocol, you can't explicitly set a gauge to a negative number without
// first setting it to zero.
func (c *StatsdClient) Gauge(stat string, value int64, delta bool) error {
if delta == false || value < 0 {
return c.send(stat, "%d|g", value)
}
return c.send(stat, "+%d|g", value)
}
// Absolute - Send absolute-valued metric (not averaged/aggregated)
func (c *StatsdClient) Absolute(stat string, value int64) error {
return c.send(stat, "%d|a", value)
}
// Total - Send a metric that is continously increasing, e.g. read operations since boot
func (c *StatsdClient) Total(stat string, value int64) error {
return c.send(stat, "%d|t", value)
}
// write a UDP packet with the statsd event
func (c *StatsdClient) send(stat string, format string, value int64) error {
if c.conn == nil {
return fmt.Errorf("not connected")
}
stat = strings.Replace(stat, "%HOST%", hostname, 1)
format = fmt.Sprintf("%s%s:%s", c.prefix, stat, format)
//fmt.Printf("SENDING %s%s:%s\n", c.prefix, stat, format)
_, err := fmt.Fprintf(c.conn, format, value)
return err
}
// SendEvent - Sends stats from an event object
func (c *StatsdClient) SendEvent(e event.Event) error {
if c.conn == nil {
return fmt.Errorf("cannot send stats, not connected to StatsD server")
}
for _, stat := range e.Stats() {
//fmt.Printf("SENDING EVENT %s%s\n", c.prefix, stat)
_, err := fmt.Fprintf(c.conn, "%s%s", c.prefix, stat)
if nil != err {
return err
}
}
return nil
}