-
Notifications
You must be signed in to change notification settings - Fork 32
/
setup.go
131 lines (117 loc) · 2.53 KB
/
setup.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 stats
import (
"sync"
"time"
"github.com/mholt/caddy/caddy/setup"
"github.com/mholt/caddy/middleware"
"github.com/rcrowley/go-metrics"
)
type metricsModule struct {
next middleware.Handler
uiPath string
serverName string
paths []pathMatch
}
type pathMatch struct {
path string
name string
methods []string
}
var interval = 15 * time.Second
var once sync.Once
// start all collectors and gatherers
func start() error {
metrics.RegisterRuntimeMemStats(metrics.DefaultRegistry)
go metrics.CaptureRuntimeMemStats(metrics.DefaultRegistry, interval)
time.Sleep(time.Second)
go func() {
for {
time.Sleep(interval)
snapshot()
}
}()
return nil
}
func Setup(c *setup.Controller) (middleware.Middleware, error) {
once.Do(func() {
c.Startup = append(c.Startup, start)
})
module, err := parse(c)
if err != nil {
return nil, err
}
if module.serverName == "" {
module.serverName = c.Address()
}
return func(next middleware.Handler) middleware.Handler {
module.next = next
return module
}, nil
}
func parse(c *setup.Controller) (*metricsModule, error) {
var module *metricsModule
var err error
for c.Next() {
if module != nil {
return nil, c.Err("Can only create one stats module per server")
}
module = &metricsModule{}
args := c.RemainingArgs()
switch len(args) {
case 0:
case 1:
module.uiPath = args[0]
default:
return nil, c.ArgErr()
}
for c.NextBlock() {
switch c.Val() {
case "path":
//path /foo
args = c.RemainingArgs()
if len(args) < 2 {
return nil, c.ArgErr()
}
pth := pathMatch{
path: args[0],
name: args[1],
}
for _, meth := range args[2:] {
pth.methods = append(pth.methods, meth)
}
module.paths = append(module.paths, pth)
case "server":
args = c.RemainingArgs()
if len(args) != 1 {
return nil, c.ArgErr()
}
module.serverName = args[0]
case "send":
// send dbtype args
args = c.RemainingArgs()
l := len(args)
if l < 1 {
return nil, c.ArgErr()
}
switch args[0] {
case "influx":
// influx server db uname password
if l != 3 && l != 5 {
return nil, c.ArgErr()
}
pub := &influxPublisher{url: args[1], database: args[2]}
if l == 5 {
pub.username = args[3]
pub.password = args[4]
}
publishers["influx-"+args[1]] = pub
default:
return nil, c.Errf("Unknown send db: %s", args[0])
}
default:
return nil, c.Errf("Unknown stats config item: %s", c.Val())
}
}
}
return module, err
}