Add gauge instrument.
Cameron Stitt
7 years ago
17 | 17 | prefix string |
18 | 18 | svc *cloudwatch.CloudWatch |
19 | 19 | counters map[string]*Counter |
20 | gauges map[string]*Gauge | |
20 | 21 | logger log.Logger |
21 | 22 | } |
22 | 23 | |
26 | 27 | prefix: prefix, |
27 | 28 | svc: svc, |
28 | 29 | counters: map[string]*Counter{}, |
30 | gauges: map[string]*Gauge{}, | |
29 | 31 | logger: logger, |
30 | 32 | } |
31 | 33 | } |
32 | 34 | |
33 | 35 | func (cw *CloudWatch) NewCounter(name string) *Counter { |
34 | 36 | c := NewCounter(name) |
37 | cw.mtx.Lock() | |
38 | cw.counters[cw.prefix+name] = c | |
39 | cw.mtx.Unlock() | |
40 | return c | |
41 | } | |
42 | ||
43 | func (cw *CloudWatch) NewGauge(name string) *Gauge { | |
44 | c := NewGauge(name) | |
35 | 45 | cw.mtx.Lock() |
36 | 46 | cw.counters[cw.prefix+name] = c |
37 | 47 | cw.mtx.Unlock() |
56 | 66 | MetricName: aws.String(name), |
57 | 67 | Dimensions: makeDimensions(c.c.LabelValues()...), |
58 | 68 | Value: aws.Float64(c.c.Value()), |
69 | Timestamp: aws.Time(now), | |
70 | }, | |
71 | }, | |
72 | }) | |
73 | if err != nil { | |
74 | cw.logger.Log("during", "WriteLoop", "err", err) | |
75 | } | |
76 | } | |
77 | ||
78 | for name, g := range cw.gauges { | |
79 | _, err := cw.svc.PutMetricData(&cloudwatch.PutMetricDataInput{ | |
80 | Namespace: aws.String(cw.prefix), | |
81 | MetricData: []*cloudwatch.MetricDatum{ | |
82 | { | |
83 | MetricName: aws.String(name), | |
84 | Dimensions: makeDimensions(g.g.LabelValues()...), | |
85 | Value: aws.Float64(g.g.Value()), | |
59 | 86 | Timestamp: aws.Time(now), |
60 | 87 | }, |
61 | 88 | }, |
89 | 116 | c.c.Add(delta) |
90 | 117 | } |
91 | 118 | |
119 | // Gauge is a CloudWatch gauge metric. | |
120 | type Gauge struct { | |
121 | g *generic.Gauge | |
122 | } | |
123 | ||
124 | // NewGauge returns a new usable gauge metric | |
125 | func NewGauge(name string) *Gauge { | |
126 | return &Gauge{ | |
127 | g: generic.NewGauge(name), | |
128 | } | |
129 | } | |
130 | ||
131 | func (g *Gauge) With(labelValues ...string) metrics.Gauge { | |
132 | return &Gauge{ | |
133 | g: g.g.With(labelValues...), | |
134 | } | |
135 | } | |
136 | ||
137 | func (g *Gauge) Set(value float64) { | |
138 | g.g.Set(value) | |
139 | } | |
140 | ||
141 | func (g *Gauge) Add(delta float64) { | |
142 | g.g.Add(delta) | |
143 | } | |
144 | ||
92 | 145 | func makeDimensions(labelValues ...string) []*cloudwatch.Dimension { |
93 | 146 | dimensions := make([]*cloudwatch.Dimension, len(labelValues)/2) |
94 | 147 | for i, j := 0, 0; i < len(labelValues); i, j := i+2, j+1 { |