Codebase list golang-github-go-kit-kit / 9479528
upgrade aws sdk v2 Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com> Mark Sagi-Kazar 2 years ago
4 changed file(s) with 36 addition(s) and 42 deletion(s). Raw diff Collapse all Expand all
77 github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a
88 github.com/aws/aws-lambda-go v1.13.3
99 github.com/aws/aws-sdk-go v1.38.65
10 github.com/aws/aws-sdk-go-v2 v0.18.0
10 github.com/aws/aws-sdk-go-v2 v1.6.0
11 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.4.1
1112 github.com/casbin/casbin/v2 v2.1.2
1213 github.com/cenkalti/backoff v2.2.1+incompatible // indirect
1314 github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec // indirect
2424 github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
2525 github.com/aws/aws-sdk-go v1.38.65 h1:umGu5gjIOKxzhi34T0DIA1TWupUDjV2aAW5vK6154Gg=
2626 github.com/aws/aws-sdk-go v1.38.65/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
27 github.com/aws/aws-sdk-go-v2 v0.18.0 h1:qZ+woO4SamnH/eEbjM2IDLhRNwIwND/RQyVlBLp3Jqg=
28 github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
27 github.com/aws/aws-sdk-go-v2 v1.6.0 h1:r20hdhm8wZmKkClREfacXrKfX0Y7/s0aOoeraFbf/sY=
28 github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w=
29 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.4.1 h1:Mt2+LnGKQQyncULtRrx+oJkIwnrfy5XKb96Rvsml30U=
30 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.4.1/go.mod h1:dWC4cWmhO3NI8sDqWSPU587mlTLhxCFdS/o3ym/QgMU=
31 github.com/aws/smithy-go v1.4.0 h1:3rsQpgRe+OoQgJhEwGNpIkosl0fJLdmQqF4gSFRjg+4=
32 github.com/aws/smithy-go v1.4.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
2933 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
3034 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
3135 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
8286 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
8387 github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
8488 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
85 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
8689 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
8790 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
8891 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
170173 github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
171174 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA=
172175 github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
173 github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
174176 github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
175177 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
176178 github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
432434 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
433435 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
434436 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
435 google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
436437 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
437438 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
438439 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
99
1010 "github.com/aws/aws-sdk-go-v2/aws"
1111 "github.com/aws/aws-sdk-go-v2/service/cloudwatch"
12 "github.com/aws/aws-sdk-go-v2/service/cloudwatch/cloudwatchiface"
12 "github.com/aws/aws-sdk-go-v2/service/cloudwatch/types"
1313 "golang.org/x/sync/errgroup"
1414
1515 "github.com/go-kit/kit/log"
2121 const (
2222 maxConcurrentRequests = 20
2323 )
24
25 // CloudWatchAPI is an interface that defines the set of Amazon CloudWatch API operations required by CloudWatch.
26 type CloudWatchAPI interface {
27 PutMetricData(ctx context.Context, params *cloudwatch.PutMetricDataInput, optFns ...func(*cloudwatch.Options)) (*cloudwatch.PutMetricDataOutput, error)
28 }
2429
2530 // CloudWatch receives metrics observations and forwards them to CloudWatch.
2631 // Create a CloudWatch object, use it to create metrics, and pass those metrics as
3136 mtx sync.RWMutex
3237 sem chan struct{}
3338 namespace string
34 svc cloudwatchiface.ClientAPI
39 svc CloudWatchAPI
3540 counters *lv.Space
3641 logger log.Logger
3742 numConcurrentRequests int
6570 // Namespace is applied to all created metrics and maps to the CloudWatch namespace.
6671 // Callers must ensure that regular calls to Send are performed, either
6772 // manually or with one of the helper methods.
68 func New(namespace string, svc cloudwatchiface.ClientAPI, options ...Option) *CloudWatch {
73 func New(namespace string, svc CloudWatchAPI, options ...Option) *CloudWatch {
6974 cw := &CloudWatch{
7075 namespace: namespace,
7176 svc: svc,
130135 defer cw.mtx.RUnlock()
131136 now := time.Now()
132137
133 var datums []cloudwatch.MetricDatum
138 var datums []types.MetricDatum
134139
135140 cw.counters.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool {
136 datums = append(datums, cloudwatch.MetricDatum{
141 datums = append(datums, types.MetricDatum{
137142 MetricName: aws.String(name),
138143 Dimensions: makeDimensions(lvs...),
139144 StatisticValues: stats(values),
142147 return true
143148 })
144149
145 var batches [][]cloudwatch.MetricDatum
150 var batches [][]types.MetricDatum
146151 for len(datums) > 0 {
147 var batch []cloudwatch.MetricDatum
152 var batch []types.MetricDatum
148153 lim := len(datums)
149154 if lim > maxConcurrentRequests {
150155 lim = maxConcurrentRequests
161166 defer func() {
162167 <-cw.sem
163168 }()
164 req := cw.svc.PutMetricDataRequest(&cloudwatch.PutMetricDataInput{
169 _, err := cw.svc.PutMetricData(context.TODO(), &cloudwatch.PutMetricDataInput{
165170 Namespace: aws.String(cw.namespace),
166171 MetricData: batch,
167172 })
168 _, err := req.Send(context.TODO())
169173 return err
170174 })
171175 }
176180
177181 // Just build this once to reduce construction costs whenever
178182 // someone does a Send with no aggregated values.
179 var zeros = cloudwatch.StatisticSet{
183 var zeros = types.StatisticSet{
180184 Maximum: &zero,
181185 Minimum: &zero,
182186 Sum: &zero,
183187 SampleCount: &zero,
184188 }
185189
186 func stats(a []float64) *cloudwatch.StatisticSet {
190 func stats(a []float64) *types.StatisticSet {
187191 count := float64(len(a))
188192 if count == 0 {
189193 return &zeros
202206 }
203207 }
204208
205 return &cloudwatch.StatisticSet{
209 return &types.StatisticSet{
206210 Maximum: &max,
207211 Minimum: &min,
208212 Sum: &sum,
210214 }
211215 }
212216
213 func makeDimensions(labelValues ...string) []cloudwatch.Dimension {
214 dimensions := make([]cloudwatch.Dimension, len(labelValues)/2)
217 func makeDimensions(labelValues ...string) []types.Dimension {
218 dimensions := make([]types.Dimension, len(labelValues)/2)
215219 for i, j := 0, 0; i < len(labelValues); i, j = i+2, j+1 {
216 dimensions[j] = cloudwatch.Dimension{
220 dimensions[j] = types.Dimension{
217221 Name: aws.String(labelValues[i]),
218222 Value: aws.String(labelValues[i+1]),
219223 }
00 package cloudwatch2
11
22 import (
3 "net/http"
3 "context"
44 "strings"
55 "testing"
66
7 "github.com/aws/aws-sdk-go-v2/aws"
87 "github.com/aws/aws-sdk-go-v2/service/cloudwatch"
9 "github.com/aws/aws-sdk-go-v2/service/cloudwatch/cloudwatchiface"
8 "github.com/aws/aws-sdk-go-v2/service/cloudwatch/types"
109 )
1110
1211 func TestStats(t *testing.T) {
7271 }
7372
7473 type mockCloudWatch struct {
75 cloudwatchiface.ClientAPI
74 CloudWatchAPI
7675 latestName string
77 latestData []cloudwatch.MetricDatum
76 latestData []types.MetricDatum
7877 }
7978
80 func (mcw *mockCloudWatch) PutMetricDataRequest(in *cloudwatch.PutMetricDataInput) cloudwatch.PutMetricDataRequest {
81 mcw.latestName = *in.Namespace
82 mcw.latestData = in.MetricData
83 return cloudwatch.PutMetricDataRequest{
84 // To mock the V2 API, most of the functions spit
85 // out structs that you need to call Send() on.
86 // The non-intuitive thing is that to get the Send() to avoid actually
87 // going across the wire, you just create a dumb aws.Request with either
88 // aws.Request.Data defined (for succes) or with aws.Request.Error
89 // to simulate an Error.
90 Request: &aws.Request{
91 HTTPRequest: &http.Request{Method: "PUT"},
92 Data: &cloudwatch.PutMetricDataOutput{},
93 },
94 Input: in,
95 }
79 func (mcw *mockCloudWatch) PutMetricData(ctx context.Context, params *cloudwatch.PutMetricDataInput, optFns ...func(*cloudwatch.Options)) (*cloudwatch.PutMetricDataOutput, error) {
80 mcw.latestName = *params.Namespace
81 mcw.latestData = params.MetricData
82
83 return nil, nil
9684 }
9785
9886 func TestSend(t *testing.T) {