-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.go
87 lines (81 loc) · 2.04 KB
/
types.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
package promnatscaddy
import (
"strings"
"time"
"github.com/kmpm/promnats.go"
"github.com/nats-io/nats.go"
"go.uber.org/zap"
"golang.org/x/net/context"
)
type PromNats struct {
ContextName string
ServerURL string
Subject string
Interval time.Duration
logger *zap.Logger
nc *nats.Conn
routes map[string][]byte
}
func (m *PromNats) refresh() {
ticker := time.NewTicker(time.Minute)
quit := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
m.logger.Info("tick")
err := m.request()
if err != nil {
m.logger.Error("error requesting data", zap.Error(err))
}
case <-quit:
m.logger.Info("stop")
ticker.Stop()
return
}
}
}()
}
func (m *PromNats) request() error {
ctx := context.TODO()
msgs, err := doReq(ctx, nil, "metrics", 0, m.nc)
if err != nil {
return err
}
keys := []string{}
routes := map[string][]byte{}
folders := map[string][]string{}
for _, msg := range msgs {
id := strings.Trim(msg.Header.Get(promnats.HeaderPnID), ". ")
if id == "" {
m.logger.Warn("response without header", zap.Any("header", msg.Header), zap.Int("length", len(msg.Data)))
continue
}
// TODO: make something out of it,
// sort by id, split by dot and make available by path
// also add some kind of index page to ease discovery
parts := strings.Split(id, ".")
if len(parts) < 3 {
m.logger.Warn("id must have at least 3 parts", zap.String("id", id))
continue
}
p := "/" + strings.Join(parts, "/")
routes[p] = msg.Data
keys = append(keys, p)
for i := 0; i < len(parts); i++ {
p = "/" + strings.Join(parts[:i], "/")
if v, ok := folders[p]; ok {
folders[p] = append(v, parts[i])
} else {
folders[p] = []string{parts[i]}
}
}
}
for k, v := range folders {
routes[k] = []byte(strings.Join(v, ","))
keys = append(keys, k)
}
m.routes = routes
m.logger.Info("routes", zap.Strings("routes", keys), zap.Any("folders", folders))
return nil
}