-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathmetrics.go
More file actions
67 lines (62 loc) · 1.45 KB
/
metrics.go
File metadata and controls
67 lines (62 loc) · 1.45 KB
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
package main
import (
"fmt"
"net/http"
"sort"
"sync"
)
type metrics struct {
mu sync.Mutex
requests map[string]int64 // status -> count
accStatus map[string]map[string]int64 // account -> status -> count
}
func newMetrics() *metrics {
return &metrics{
requests: make(map[string]int64),
accStatus: make(map[string]map[string]int64),
}
}
func (m *metrics) inc(status string, account string) {
m.mu.Lock()
m.requests[status]++
if account != "" {
mp, ok := m.accStatus[account]
if !ok {
mp = make(map[string]int64)
m.accStatus[account] = mp
}
mp[status]++
}
m.mu.Unlock()
}
func (m *metrics) serve(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; version=0.0.4")
m.mu.Lock()
defer m.mu.Unlock()
// overall
statuses := make([]string, 0, len(m.requests))
for s := range m.requests {
statuses = append(statuses, s)
}
sort.Strings(statuses)
for _, s := range statuses {
fmt.Fprintf(w, "codexpool_requests_total{status=\"%s\"} %d\n", s, m.requests[s])
}
// per account
accs := make([]string, 0, len(m.accStatus))
for a := range m.accStatus {
accs = append(accs, a)
}
sort.Strings(accs)
for _, a := range accs {
st := m.accStatus[a]
sts := make([]string, 0, len(st))
for s := range st {
sts = append(sts, s)
}
sort.Strings(sts)
for _, s := range sts {
fmt.Fprintf(w, "codexpool_account_requests_total{account=\"%s\",status=\"%s\"} %d\n", a, s, st[s])
}
}
}