-
Notifications
You must be signed in to change notification settings - Fork 20
/
builder.go
81 lines (70 loc) · 2.1 KB
/
builder.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
package monitoring
import (
"container/list"
"log"
"github.com/go-masonry/mortar/interfaces/monitor"
)
type monitorConfig struct {
tags monitor.Tags
extractors []monitor.ContextExtractor
onError func(err error)
reporter monitor.BricksReporter
}
// WrapperBuilder is a helper builder to define internal Mortar monitoring wrapper
type WrapperBuilder interface {
// Build builds monitor.Reporter
Build(bricksBuilder monitor.Builder) monitor.Reporter
// DoOnError is a helper function to act when receiving an error during Metric creation
DoOnError(onError func(error)) WrapperBuilder
// AddExtractors adds ContextExtractors that might override tag values when calling metric functions
AddExtractors(extractors ...monitor.ContextExtractor) WrapperBuilder
// SetTags saves defaults tags, these tags will always be included in every metric
SetTags(tags monitor.Tags) WrapperBuilder
}
type wrapperBuilder struct {
ll *list.List
}
// Builder creates a WrapperBuilder
func Builder() WrapperBuilder {
return &wrapperBuilder{
ll: list.New(),
}
}
func (b *wrapperBuilder) SetTags(tags monitor.Tags) WrapperBuilder {
b.ll.PushBack(func(cfg *monitorConfig) {
if tags != nil {
cfg.tags = tags // make sure tags are always empty, not nil
}
})
return b
}
func (b *wrapperBuilder) AddExtractors(extractors ...monitor.ContextExtractor) WrapperBuilder {
b.ll.PushBack(func(cfg *monitorConfig) {
cfg.extractors = append(cfg.extractors, extractors...)
})
return b
}
func (b *wrapperBuilder) DoOnError(onError func(error)) WrapperBuilder {
b.ll.PushBack(func(cfg *monitorConfig) {
cfg.onError = onError
})
return b
}
func (b *wrapperBuilder) Build(bricksBuilder monitor.Builder) monitor.Reporter {
cfg := new(monitorConfig)
for e := b.ll.Front(); e != nil; e = e.Next() {
f := e.Value.(func(*monitorConfig))
f(cfg)
}
if cfg.onError == nil {
cfg.onError = func(err error) {
log.Printf("WARNING: monitoring error, %v", err)
}
}
if cfg.tags == nil {
cfg.tags = monitor.Tags{}
}
cfg.reporter = bricksBuilder.Build()
return newMortarReporter(cfg)
}
var _ WrapperBuilder = (*wrapperBuilder)(nil)