diff --git a/go.mod b/go.mod index 344a721..319c58c 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,8 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a github.com/aws/aws-lambda-go v1.13.3 github.com/aws/aws-sdk-go v1.38.65 - github.com/aws/aws-sdk-go-v2 v0.18.0 + github.com/aws/aws-sdk-go-v2 v1.6.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.4.1 github.com/casbin/casbin/v2 v2.1.2 github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec // indirect diff --git a/go.sum b/go.sum index 35bc1ce..2cd8127 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,12 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.38.65 h1:umGu5gjIOKxzhi34T0DIA1TWupUDjV2aAW5vK6154Gg= github.com/aws/aws-sdk-go v1.38.65/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go-v2 v0.18.0 h1:qZ+woO4SamnH/eEbjM2IDLhRNwIwND/RQyVlBLp3Jqg= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.6.0 h1:r20hdhm8wZmKkClREfacXrKfX0Y7/s0aOoeraFbf/sY= +github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.4.1 h1:Mt2+LnGKQQyncULtRrx+oJkIwnrfy5XKb96Rvsml30U= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.4.1/go.mod h1:dWC4cWmhO3NI8sDqWSPU587mlTLhxCFdS/o3ym/QgMU= +github.com/aws/smithy-go v1.4.0 h1:3rsQpgRe+OoQgJhEwGNpIkosl0fJLdmQqF4gSFRjg+4= +github.com/aws/smithy-go v1.4.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -83,7 +87,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -171,7 +174,6 @@ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -433,7 +435,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= diff --git a/metrics/cloudwatch2/cloudwatch2.go b/metrics/cloudwatch2/cloudwatch2.go index a553977..eed6cd6 100644 --- a/metrics/cloudwatch2/cloudwatch2.go +++ b/metrics/cloudwatch2/cloudwatch2.go @@ -10,7 +10,7 @@ "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/cloudwatch" - "github.com/aws/aws-sdk-go-v2/service/cloudwatch/cloudwatchiface" + "github.com/aws/aws-sdk-go-v2/service/cloudwatch/types" "golang.org/x/sync/errgroup" "github.com/go-kit/kit/log" @@ -22,6 +22,11 @@ const ( maxConcurrentRequests = 20 ) + +// CloudWatchAPI is an interface that defines the set of Amazon CloudWatch API operations required by CloudWatch. +type CloudWatchAPI interface { + PutMetricData(ctx context.Context, params *cloudwatch.PutMetricDataInput, optFns ...func(*cloudwatch.Options)) (*cloudwatch.PutMetricDataOutput, error) +} // CloudWatch receives metrics observations and forwards them to CloudWatch. // Create a CloudWatch object, use it to create metrics, and pass those metrics as @@ -32,7 +37,7 @@ mtx sync.RWMutex sem chan struct{} namespace string - svc cloudwatchiface.ClientAPI + svc CloudWatchAPI counters *lv.Space logger log.Logger numConcurrentRequests int @@ -66,7 +71,7 @@ // Namespace is applied to all created metrics and maps to the CloudWatch namespace. // Callers must ensure that regular calls to Send are performed, either // manually or with one of the helper methods. -func New(namespace string, svc cloudwatchiface.ClientAPI, options ...Option) *CloudWatch { +func New(namespace string, svc CloudWatchAPI, options ...Option) *CloudWatch { cw := &CloudWatch{ namespace: namespace, svc: svc, @@ -131,10 +136,10 @@ defer cw.mtx.RUnlock() now := time.Now() - var datums []cloudwatch.MetricDatum + var datums []types.MetricDatum cw.counters.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - datums = append(datums, cloudwatch.MetricDatum{ + datums = append(datums, types.MetricDatum{ MetricName: aws.String(name), Dimensions: makeDimensions(lvs...), StatisticValues: stats(values), @@ -143,9 +148,9 @@ return true }) - var batches [][]cloudwatch.MetricDatum + var batches [][]types.MetricDatum for len(datums) > 0 { - var batch []cloudwatch.MetricDatum + var batch []types.MetricDatum lim := len(datums) if lim > maxConcurrentRequests { lim = maxConcurrentRequests @@ -162,11 +167,10 @@ defer func() { <-cw.sem }() - req := cw.svc.PutMetricDataRequest(&cloudwatch.PutMetricDataInput{ + _, err := cw.svc.PutMetricData(context.TODO(), &cloudwatch.PutMetricDataInput{ Namespace: aws.String(cw.namespace), MetricData: batch, }) - _, err := req.Send(context.TODO()) return err }) } @@ -177,14 +181,14 @@ // Just build this once to reduce construction costs whenever // someone does a Send with no aggregated values. -var zeros = cloudwatch.StatisticSet{ +var zeros = types.StatisticSet{ Maximum: &zero, Minimum: &zero, Sum: &zero, SampleCount: &zero, } -func stats(a []float64) *cloudwatch.StatisticSet { +func stats(a []float64) *types.StatisticSet { count := float64(len(a)) if count == 0 { return &zeros @@ -203,7 +207,7 @@ } } - return &cloudwatch.StatisticSet{ + return &types.StatisticSet{ Maximum: &max, Minimum: &min, Sum: &sum, @@ -211,10 +215,10 @@ } } -func makeDimensions(labelValues ...string) []cloudwatch.Dimension { - dimensions := make([]cloudwatch.Dimension, len(labelValues)/2) +func makeDimensions(labelValues ...string) []types.Dimension { + dimensions := make([]types.Dimension, len(labelValues)/2) for i, j := 0, 0; i < len(labelValues); i, j = i+2, j+1 { - dimensions[j] = cloudwatch.Dimension{ + dimensions[j] = types.Dimension{ Name: aws.String(labelValues[i]), Value: aws.String(labelValues[i+1]), } diff --git a/metrics/cloudwatch2/cloudwatch2_test.go b/metrics/cloudwatch2/cloudwatch2_test.go index aa88179..8418743 100644 --- a/metrics/cloudwatch2/cloudwatch2_test.go +++ b/metrics/cloudwatch2/cloudwatch2_test.go @@ -1,13 +1,12 @@ package cloudwatch2 import ( - "net/http" + "context" "strings" "testing" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/cloudwatch" - "github.com/aws/aws-sdk-go-v2/service/cloudwatch/cloudwatchiface" + "github.com/aws/aws-sdk-go-v2/service/cloudwatch/types" ) func TestStats(t *testing.T) { @@ -73,27 +72,16 @@ } type mockCloudWatch struct { - cloudwatchiface.ClientAPI + CloudWatchAPI latestName string - latestData []cloudwatch.MetricDatum + latestData []types.MetricDatum } -func (mcw *mockCloudWatch) PutMetricDataRequest(in *cloudwatch.PutMetricDataInput) cloudwatch.PutMetricDataRequest { - mcw.latestName = *in.Namespace - mcw.latestData = in.MetricData - return cloudwatch.PutMetricDataRequest{ - // To mock the V2 API, most of the functions spit - // out structs that you need to call Send() on. - // The non-intuitive thing is that to get the Send() to avoid actually - // going across the wire, you just create a dumb aws.Request with either - // aws.Request.Data defined (for succes) or with aws.Request.Error - // to simulate an Error. - Request: &aws.Request{ - HTTPRequest: &http.Request{Method: "PUT"}, - Data: &cloudwatch.PutMetricDataOutput{}, - }, - Input: in, - } +func (mcw *mockCloudWatch) PutMetricData(ctx context.Context, params *cloudwatch.PutMetricDataInput, optFns ...func(*cloudwatch.Options)) (*cloudwatch.PutMetricDataOutput, error) { + mcw.latestName = *params.Namespace + mcw.latestData = params.MetricData + + return nil, nil } func TestSend(t *testing.T) {