forked from savaki/cloudmetrics
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
128 lines (110 loc) · 3.29 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
package cloudmetrics
// Copyright 2022 @weareyolo
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License
import (
"context"
"time"
"github.com/sirupsen/logrus"
)
type settings struct {
Context context.Context
Client CloudWatch
Interval time.Duration
Logger logrus.FieldLogger
Units map[string]string
Dimensions map[string]string
Percentiles []float64
StorageResolution int64
DatumBuilder DatumBuilder
}
// Option is a type made to override default values for Publisher
type Option func(s *settings)
// WithContext allows a context to be specified. When <-ctx.Done() returns; the Publisher will
// stop any internal go routines and return
func WithContext(ctx context.Context) Option {
return func(s *settings) {
s.Context = ctx
}
}
// WithClient allows for user provided *cloudwatch.Cloudwatch instance
func WithClient(client CloudWatch) Option {
return func(s *settings) {
s.Client = client
}
}
// WithInterval allows for a custom posting interval; by default, the interval is every 1 minute
func WithInterval(interval time.Duration) Option {
return func(s *settings) {
s.Interval = interval
}
}
// WithLogger allows to use custom logger
func WithLogger(logger logrus.FieldLogger) Option {
return func(s *settings) {
s.Logger = logger
}
}
// WithUnits specifies the AWS StandardUnits to use for given metrics
func WithUnits(units map[string]string) Option {
return func(s *settings) {
for k, v := range units {
s.Units[k] = v
}
}
}
// WithDimensions allows for user specified dimensions to be added to the post
func WithDimensions(dimensions map[string]string) Option {
return func(s *settings) {
s.Dimensions = dimensions
}
}
// WithPercentiles allows the reported percentiles for Histogram and Timer metrics to be customized
func WithPercentiles(percentiles []float64) Option {
return func(s *settings) {
s.Percentiles = percentiles
}
}
// WithStorageResolution specifies the Storage Resolution to use in seconds, default to 60
func WithStorageResolution(storageResolution int64) Option {
return func(s *settings) {
s.StorageResolution = storageResolution
}
}
// WithBuilder specifies the DatumBuilder to use
func WithBuilder(b DatumBuilder) Option {
return func(s *settings) {
s.DatumBuilder = b
}
}
func getSettings(opts []Option) *settings {
s := &settings{
Context: context.Background(),
Interval: 1 * time.Minute,
Units: map[string]string{},
Dimensions: map[string]string{},
Percentiles: []float64{.5, .75, .95, .99},
StorageResolution: 60,
}
for _, o := range opts {
o(s)
}
return s
}
func newLogger() logrus.FieldLogger {
l := logrus.New()
l.SetReportCaller(true)
l.SetFormatter(new(logrus.JSONFormatter))
l.SetLevel(logrus.ErrorLevel)
return l
}