-
Notifications
You must be signed in to change notification settings - Fork 139
/
config.go
144 lines (122 loc) · 5.3 KB
/
config.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
132
133
134
135
136
137
138
139
140
141
142
143
144
package config
import (
"time"
"github.com/barkimedes/go-deepcopy"
"go.uber.org/zap"
"github.com/go-graphite/carbonapi/zipper/types"
)
// Config is a structure that contains zipper-related configuration bits
type Config struct {
SumBuckets bool `mapstructure:"sumBuckets"`
Buckets int `mapstructure:"buckets"`
BucketsWidth []int64 `mapstructure:"bucketsWidth"`
BucketsLabels []string `mapstructure:"bucketsLabels"`
ExtendedStat bool `mapstructure:"extendedStat"` // extended stat metrics
SlowLogThreshold time.Duration `mapstructure:"slowLogThreshold"`
ConcurrencyLimitPerServer int `mapstructure:"concurrencyLimitPerServer"`
MaxIdleConnsPerHost int `mapstructure:"maxIdleConnsPerHost"`
Backends []string `mapstructure:"backends"`
BackendsV2 types.BackendsV2 `mapstructure:"backendsv2"`
MaxBatchSize *int `mapstructure:"maxBatchSize"`
FallbackMaxBatchSize int `mapstructure:"-"`
MaxTries int `mapstructure:"maxTries"`
DoMultipleRequestsIfSplit bool `mapstructure:"doMultipleRequestsIfSplit"`
RequireSuccessAll bool `mapstructure:"requireSuccessAll"` // require full success for upstreams queries (for multi-target query)
ExpireDelaySec int32
TLDCacheDisabled bool `mapstructure:"tldCacheDisabled"`
InternalRoutingCache time.Duration
Timeouts types.Timeouts
KeepAliveInterval time.Duration `mapstructure:"keepAliveInterval"`
// ScaleToCommonStep controls if metrics in one target should be aggregated to common step
ScaleToCommonStep bool `mapstructure:"scaleToCommonStep"`
isSanitized bool
}
func (cfg *Config) IsSanitized() bool {
return cfg.isSanitized
}
var defaultTimeouts = types.Timeouts{
Render: 10000 * time.Second,
Find: 100 * time.Second,
Connect: 200 * time.Millisecond,
}
func sanitizeTimeouts(timeouts, defaultTimeouts types.Timeouts) types.Timeouts {
if timeouts.Render == 0 {
timeouts.Render = defaultTimeouts.Render
}
if timeouts.Find == 0 {
timeouts.Find = defaultTimeouts.Find
}
if timeouts.Connect == 0 {
timeouts.Connect = defaultTimeouts.Connect
}
return timeouts
}
// SanitizeConfig perform old kind of checks and conversions for zipper's configuration
func SanitizeConfig(logger *zap.Logger, oldConfig Config) *Config {
// create a full copy of old config
newConfigPtr, err := deepcopy.Anything(oldConfig)
if err != nil {
logger.Fatal("failed to copy old config", zap.Error(err))
}
newConfig := newConfigPtr.(Config)
if len(newConfig.BucketsWidth) > 0 {
newConfig.Buckets = 0
}
if newConfig.MaxBatchSize == nil {
newConfig.MaxBatchSize = &newConfig.FallbackMaxBatchSize
}
newConfig.Timeouts = sanitizeTimeouts(newConfig.Timeouts, defaultTimeouts)
if newConfig.InternalRoutingCache.Seconds() < 30 {
logger.Warn("internalRoutingCache is too low",
zap.String("reason", "this variable is used for internal routing cache, minimum allowed is 30s"),
zap.String("recommendation", "it's usually good idea to set it to something like 600s"),
)
newConfig.InternalRoutingCache = 30 * time.Second
}
// Convert old config format to new one
defaultIdleConnTimeout := 3600 * time.Second
if newConfig.Backends != nil && len(newConfig.Backends) != 0 {
newConfig.BackendsV2 = types.BackendsV2{
Backends: []types.BackendV2{
{
GroupName: "backends",
Protocol: "carbonapi_v2_pb",
LBMethod: "broadcast",
Servers: newConfig.Backends,
Timeouts: &newConfig.Timeouts,
ConcurrencyLimit: &newConfig.ConcurrencyLimitPerServer,
DoMultipleRequestsIfSplit: true,
KeepAliveInterval: &newConfig.KeepAliveInterval,
MaxIdleConnsPerHost: &newConfig.MaxIdleConnsPerHost,
MaxTries: &newConfig.MaxTries,
MaxBatchSize: newConfig.MaxBatchSize,
IdleConnectionTimeout: &defaultIdleConnTimeout,
},
},
MaxIdleConnsPerHost: newConfig.MaxIdleConnsPerHost,
ConcurrencyLimitPerServer: newConfig.ConcurrencyLimitPerServer,
Timeouts: newConfig.Timeouts,
KeepAliveInterval: newConfig.KeepAliveInterval,
MaxTries: newConfig.MaxTries,
MaxBatchSize: newConfig.MaxBatchSize,
}
newConfig.DoMultipleRequestsIfSplit = true
}
newConfig.BackendsV2.Timeouts = sanitizeTimeouts(newConfig.BackendsV2.Timeouts, newConfig.Timeouts)
for i := range newConfig.BackendsV2.Backends {
if newConfig.BackendsV2.Backends[i].Timeouts == nil {
timeouts := newConfig.BackendsV2.Timeouts
newConfig.BackendsV2.Backends[i].Timeouts = &timeouts
}
timeouts := sanitizeTimeouts(*(newConfig.BackendsV2.Backends[i].Timeouts), newConfig.BackendsV2.Timeouts)
newConfig.BackendsV2.Backends[i].Timeouts = &timeouts
if newConfig.BackendsV2.Backends[i].IdleConnectionTimeout == nil {
newConfig.BackendsV2.Backends[i].IdleConnectionTimeout = &defaultIdleConnTimeout
}
}
if newConfig.BackendsV2.MaxBatchSize == nil {
newConfig.BackendsV2.MaxBatchSize = newConfig.MaxBatchSize
}
newConfig.isSanitized = true
return &newConfig
}