From ba6ee8b4450d322b4f01e80bf4d9c3e7f9f73c3e Mon Sep 17 00:00:00 2001 From: Rayhan Hossain Date: Mon, 21 Sep 2020 22:18:42 -0700 Subject: [PATCH 1/6] Add helper functions for metric conversion --- .../awsecscontainermetrics/constant.go | 37 +++++ .../awsecscontainermetrics/metrics_helper.go | 146 ++++++++++++++---- .../metrics_helper_test.go | 114 +++++++++++++- .../awsecscontainermetrics/translator.go | 121 +++++++++++++++ .../awsecscontainermetrics/translator_test.go | 96 ++++++++++++ .../awsecscontainermetrics/utils.go | 67 ++++++++ .../awsecscontainermetrics/utils_test.go | 52 +++++++ .../awsecscontainermetricsreceiver/go.mod | 2 + 8 files changed, 605 insertions(+), 30 deletions(-) create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils_test.go diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go index 03bdff7160440..3650975b13877 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go @@ -25,4 +25,41 @@ const ( ContainerMetricsLabelLen = 3 TaskMetricsLabelLen = 6 + + AttributeMemoryUsage = "memory.usage" + AttributeMemoryMaxUsage = "memory.usage.max" + AttributeMemoryLimit = "memory.usage.limit" + AttributeMemoryReserved = "memory.reserved" + AttributeMemoryUtilized = "memory.utilized" + + AttributeCPUTotalUsage = "cpu.usage.total" + AttributeCPUKernelModeUsage = "cpu.usage.kernelmode" + AttributeCPUUserModeUsage = "cpu.usage.usermode" + AttributeCPUSystemUsage = "cpu.usage.system" + AttributeCPUCores = "cpu.cores" + AttributeCPUOnlines = "cpu.onlines" + AttributeCPUReserved = "cpu.reserved" + AttributeCPUUtilized = "cpu.utilized" + + AttributeNetworkRateRx = "network.rate.rx" + AttributeNetworkRateTx = "network.rate.tx" + + AttributeNetworkRxBytes = "network.io.usage.rx_bytes" + AttributeNetworkRxPackets = "network.io.usage.rx_packets" + AttributeNetworkRxErrors = "network.io.usage.rx_errors" + AttributeNetworkRxDropped = "network.io.usage.rx_dropped" + AttributeNetworkTxBytes = "network.io.usage.tx_bytes" + AttributeNetworkTxPackets = "network.io.usage.tx_packets" + AttributeNetworkTxErrors = "network.io.usage.tx_errors" + AttributeNetworkTxDropped = "network.io.usage.tx_dropped" + + AttributeStorageRead = "storage.read_bytes" + AttributeStorageWrite = "storage.write_bytes" + + UnitBytes = "Bytes" + UnitMegaBytes = "MB" + UnitNanoSecond = "NS" + UnitBytesPerSec = "Bytes/Sec" + UnitCount = "Count" + UnitVCpu = "vCPU" ) diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go index 10263bddaf66a..8904e1b7f6763 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go @@ -14,34 +14,126 @@ package awsecscontainermetrics -import ( - "strconv" - "time" - - metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" - "go.opentelemetry.io/collector/consumer/consumerdata" - "go.opentelemetry.io/collector/testutil/metricstestutil" +const ( + // BytesInMiB is the number of bytes in a MebiByte. + BytesInMiB = 1024 * 1024 ) -// GenerateDummyMetrics generates some dummy metrics -func GenerateDummyMetrics() consumerdata.MetricsData { - md := consumerdata.MetricsData{} - ts := time.Now() - for i := 0; i < 5; i++ { - md.Metrics = append(md.Metrics, - metricstestutil.Gauge( - "test_"+strconv.Itoa(i), - []string{"k0", "k1"}, - metricstestutil.Timeseries( - time.Now(), - []string{"v0", "v1"}, - &metricspb.Point{ - Timestamp: metricstestutil.Timestamp(ts), - Value: &metricspb.Point_Int64Value{Int64Value: int64(i)}, - }, - ), - ), - ) +// getContainerMetrics generate ECS Container metrics from Container stats +func getContainerMetrics(stats ContainerStats) ECSMetrics { + memoryUtilizedInMb := (*stats.Memory.Usage - stats.Memory.Stats["cache"]) / BytesInMiB + + numOfCores := (uint64)(len(stats.CPU.CPUUsage.PerCPUUsage)) + + // TODO: match with ECS Agent calculation and modify if needed + cpuUtilized := (float64)(*stats.CPU.CPUUsage.TotalUsage / numOfCores / 1024) + + netStatArray := getNetworkStats(stats.Network) + + storageReadBytes, storageWriteBytes := extractStorageUsage(&stats.Disk) + + m := ECSMetrics{} + + m.MemoryUsage = *stats.Memory.Usage + m.MemoryMaxUsage = *stats.Memory.MaxUsage + m.MemoryLimit = *stats.Memory.Limit + m.MemoryUtilized = memoryUtilizedInMb + + m.CPUTotalUsage = *stats.CPU.CPUUsage.TotalUsage + m.CPUUsageInKernelmode = *stats.CPU.CPUUsage.UsageInKernelmode + m.CPUUsageInUserMode = *stats.CPU.CPUUsage.UsageInUserMode + m.NumOfCPUCores = numOfCores + m.CPUOnlineCpus = *stats.CPU.OnlineCpus + m.SystemCPUUsage = *stats.CPU.SystemCPUUsage + m.CPUUtilized = cpuUtilized + + m.NetworkRateRxBytesPerSecond = *stats.NetworkRate.TxBytesPerSecond + m.NetworkRateTxBytesPerSecond = *stats.NetworkRate.TxBytesPerSecond + + m.NetworkRxBytes = netStatArray[0] + m.NetworkRxPackets = netStatArray[1] + m.NetworkRxErrors = netStatArray[2] + m.NetworkRxDropped = netStatArray[3] + + m.NetworkTxBytes = netStatArray[4] + m.NetworkTxPackets = netStatArray[5] + m.NetworkTxErrors = netStatArray[6] + m.NetworkTxDropped = netStatArray[7] + + m.StorageReadBytes = storageReadBytes + m.StorageWriteBytes = storageWriteBytes + return m +} + +// Followed ECS Agent calculations +// https://github.com/aws/amazon-ecs-agent/blob/1ebf0604c13013596cfd4eb239574a85890b13e8/agent/stats/utils.go#L30 +func getNetworkStats(stats map[string]NetworkStats) [8]uint64 { + var netStatArray [8]uint64 + for _, netStat := range stats { + netStatArray[0] += *netStat.RxBytes + netStatArray[1] += *netStat.RxPackets + netStatArray[2] += *netStat.RxErrors + netStatArray[3] += *netStat.RxDropped + + netStatArray[4] += *netStat.TxBytes + netStatArray[5] += *netStat.TxPackets + netStatArray[6] += *netStat.TxErrors + netStatArray[7] += *netStat.TxDropped + } + return netStatArray +} + +// Followed ECS Agent calculations +// https://github.com/aws/amazon-ecs-agent/blob/1ebf0604c13013596cfd4eb239574a85890b13e8/agent/stats/utils_unix.go#L48 +func extractStorageUsage(stats *DiskStats) (uint64, uint64) { + var readBytes, writeBytes uint64 + if stats == nil { + return uint64(0), uint64(0) } - return md + + for _, blockStat := range stats.IoServiceBytesRecursives { + switch op := blockStat.Op; op { + case "Read": + readBytes = *blockStat.Value + case "Write": + writeBytes = *blockStat.Value + default: + //ignoring "Async", "Total", "Sum", etc + continue + } + } + return readBytes, writeBytes +} + +func aggregateTaskMetrics(taskMetrics *ECSMetrics, conMetrics ECSMetrics) { + taskMetrics.MemoryUsage += conMetrics.MemoryUsage + taskMetrics.MemoryMaxUsage += conMetrics.MemoryMaxUsage + taskMetrics.MemoryLimit += conMetrics.MemoryLimit + taskMetrics.MemoryReserved += conMetrics.MemoryReserved + taskMetrics.MemoryUtilized += conMetrics.MemoryUtilized + + taskMetrics.CPUTotalUsage += conMetrics.CPUTotalUsage + taskMetrics.CPUUsageInKernelmode += conMetrics.CPUUsageInKernelmode + taskMetrics.CPUUsageInUserMode += conMetrics.CPUUsageInUserMode + taskMetrics.NumOfCPUCores += conMetrics.NumOfCPUCores + taskMetrics.CPUOnlineCpus += conMetrics.CPUOnlineCpus + taskMetrics.SystemCPUUsage += conMetrics.SystemCPUUsage + taskMetrics.CPUUtilized += conMetrics.CPUUtilized + taskMetrics.CPUReserved += conMetrics.CPUReserved + + taskMetrics.NetworkRateRxBytesPerSecond += conMetrics.NetworkRateRxBytesPerSecond + taskMetrics.NetworkRateTxBytesPerSecond += conMetrics.NetworkRateTxBytesPerSecond + + taskMetrics.NetworkRxBytes += conMetrics.NetworkRxBytes + taskMetrics.NetworkRxPackets += conMetrics.NetworkRxPackets + taskMetrics.NetworkRxErrors += conMetrics.NetworkRxErrors + taskMetrics.NetworkRxDropped += conMetrics.NetworkRxDropped + + taskMetrics.NetworkTxBytes += conMetrics.NetworkTxBytes + taskMetrics.NetworkTxPackets += conMetrics.NetworkTxPackets + taskMetrics.NetworkTxErrors += conMetrics.NetworkTxErrors + taskMetrics.NetworkTxDropped += conMetrics.NetworkTxDropped + + taskMetrics.StorageReadBytes += conMetrics.StorageReadBytes + taskMetrics.StorageWriteBytes += conMetrics.StorageWriteBytes } diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper_test.go index 31b903ab9d3cb..67e1f0f85ecc9 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper_test.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper_test.go @@ -20,8 +20,116 @@ import ( "github.com/stretchr/testify/require" ) -func TestGenerateDummyMetrics(t *testing.T) { - data := GenerateDummyMetrics() +func TestGetContainerAndTaskMetrics(t *testing.T) { + v := uint64(1) + f := float64(1.0) - require.NotNil(t, data) + memStats := make(map[string]uint64) + memStats["cache"] = v + + mem := MemoryStats{ + Usage: &v, + MaxUsage: &v, + Limit: &v, + MemoryReserved: &v, + MemoryUtilized: &v, + Stats: memStats, + } + + disk := DiskStats{ + IoServiceBytesRecursives: []IoServiceBytesRecursive{ + {Op: "Read", Value: &v}, + {Op: "Write", Value: &v}, + {Op: "Total", Value: &v}, + }, + } + + net := make(map[string]NetworkStats) + net["eth0"] = NetworkStats{ + RxBytes: &v, + RxPackets: &v, + RxErrors: &v, + RxDropped: &v, + TxBytes: &v, + TxPackets: &v, + TxErrors: &v, + TxDropped: &v, + } + + netRate := NetworkRateStats{ + RxBytesPerSecond: &f, + TxBytesPerSecond: &f, + } + + percpu := []*uint64{&v, &v} + cpuUsage := CPUUsage{ + TotalUsage: &v, + UsageInKernelmode: &v, + UsageInUserMode: &v, + PerCPUUsage: percpu, + } + + cpuStats := CPUStats{ + CPUUsage: cpuUsage, + OnlineCpus: &v, + SystemCPUUsage: &v, + CPUUtilized: &v, + CPUReserved: &v, + } + containerStats := ContainerStats{ + Name: "test", + ID: "001", + Memory: mem, + Disk: disk, + Network: net, + NetworkRate: netRate, + CPU: cpuStats, + } + + containerMetrics := getContainerMetrics(containerStats) + require.NotNil(t, containerMetrics) + + taskMetrics := ECSMetrics{} + aggregateTaskMetrics(&taskMetrics, containerMetrics) + require.EqualValues(t, v, taskMetrics.MemoryUsage) + require.EqualValues(t, v, taskMetrics.MemoryMaxUsage) + require.EqualValues(t, v, taskMetrics.StorageReadBytes) +} + +func TestExtractStorageUsage(t *testing.T) { + v := uint64(100) + disk := &DiskStats{ + IoServiceBytesRecursives: []IoServiceBytesRecursive{ + {Op: "Read", Value: &v}, + {Op: "Write", Value: &v}, + {Op: "Total", Value: &v}, + }, + } + read, write := extractStorageUsage(disk) + + require.EqualValues(t, v, read) + require.EqualValues(t, v, write) +} + +func TestGetNetworkStats(t *testing.T) { + v := uint64(100) + stats := make(map[string]NetworkStats) + stats["eth0"] = NetworkStats{ + RxBytes: &v, + RxPackets: &v, + RxErrors: &v, + RxDropped: &v, + TxBytes: &v, + TxPackets: &v, + TxErrors: &v, + TxDropped: &v, + } + + netArray := getNetworkStats(stats) + + sum := uint64(0) + for _, v := range netArray { + sum += v + } + require.EqualValues(t, 800, sum) } diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go new file mode 100644 index 0000000000000..bd2a2dbefb2c4 --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go @@ -0,0 +1,121 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. + +package awsecscontainermetrics + +import ( + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func convertToOTMetrics(prefix string, m ECSMetrics, labelKeys []*metricspb.LabelKey, labelValues []*metricspb.LabelValue, timestamp *timestamppb.Timestamp) []*metricspb.Metric { + + return applyTimestamp([]*metricspb.Metric{ + intGauge(prefix+AttributeMemoryUsage, UnitBytes, &m.MemoryUsage, labelKeys, labelValues), + intGauge(prefix+AttributeMemoryMaxUsage, UnitBytes, &m.MemoryMaxUsage, labelKeys, labelValues), + intGauge(prefix+AttributeMemoryLimit, UnitBytes, &m.MemoryLimit, labelKeys, labelValues), + intGauge(prefix+AttributeMemoryUtilized, UnitMegaBytes, &m.MemoryUtilized, labelKeys, labelValues), + intGauge(prefix+AttributeMemoryReserved, UnitMegaBytes, &m.MemoryReserved, labelKeys, labelValues), + + intCumulative(prefix+AttributeCPUTotalUsage, UnitNanoSecond, &m.CPUTotalUsage, labelKeys, labelValues), + intCumulative(prefix+AttributeCPUKernelModeUsage, UnitNanoSecond, &m.CPUUsageInKernelmode, labelKeys, labelValues), + intCumulative(prefix+AttributeCPUUserModeUsage, UnitNanoSecond, &m.CPUUsageInUserMode, labelKeys, labelValues), + intGauge(prefix+AttributeCPUCores, UnitCount, &m.NumOfCPUCores, labelKeys, labelValues), + intGauge(prefix+AttributeCPUOnlines, UnitCount, &m.CPUOnlineCpus, labelKeys, labelValues), + intCumulative(prefix+AttributeCPUSystemUsage, UnitNanoSecond, &m.SystemCPUUsage, labelKeys, labelValues), + doubleGauge(prefix+AttributeCPUUtilized, UnitVCpu, &m.CPUUtilized, labelKeys, labelValues), + doubleGauge(prefix+AttributeCPUReserved, UnitVCpu, &m.CPUReserved, labelKeys, labelValues), + + doubleGauge(prefix+AttributeNetworkRateRx, UnitBytesPerSec, &m.NetworkRateRxBytesPerSecond, labelKeys, labelValues), + doubleGauge(prefix+AttributeNetworkRateTx, UnitBytesPerSec, &m.NetworkRateTxBytesPerSecond, labelKeys, labelValues), + + intCumulative(prefix+AttributeNetworkRxBytes, UnitBytes, &m.NetworkRxBytes, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkRxPackets, UnitCount, &m.NetworkRxPackets, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkRxErrors, UnitCount, &m.NetworkRxErrors, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkRxDropped, UnitCount, &m.NetworkRxDropped, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkTxBytes, UnitBytes, &m.NetworkTxBytes, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkTxPackets, UnitCount, &m.NetworkTxPackets, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkTxErrors, UnitCount, &m.NetworkTxErrors, labelKeys, labelValues), + intCumulative(prefix+AttributeNetworkTxDropped, UnitCount, &m.NetworkTxDropped, labelKeys, labelValues), + + intCumulative(prefix+AttributeStorageRead, UnitBytes, &m.StorageReadBytes, labelKeys, labelValues), + intCumulative(prefix+AttributeStorageWrite, UnitBytes, &m.StorageWriteBytes, labelKeys, labelValues), + }, timestamp) +} + +func intGauge(metricName string, unit string, value *uint64, labelKeys []*metricspb.LabelKey, labelValues []*metricspb.LabelValue) *metricspb.Metric { + if value == nil { + return nil + } + return &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: metricName, + Unit: unit, + Type: metricspb.MetricDescriptor_GAUGE_INT64, + LabelKeys: labelKeys, + }, + Timeseries: []*metricspb.TimeSeries{{ + LabelValues: labelValues, + Points: []*metricspb.Point{{ + Value: &metricspb.Point_Int64Value{ + Int64Value: int64(*value), + }, + }}, + }}, + } +} + +func doubleGauge(metricName string, unit string, value *float64, labelKeys []*metricspb.LabelKey, labelValues []*metricspb.LabelValue) *metricspb.Metric { + if value == nil { + return nil + } + return &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: metricName, + Unit: unit, + Type: metricspb.MetricDescriptor_GAUGE_DOUBLE, + LabelKeys: labelKeys, + }, + Timeseries: []*metricspb.TimeSeries{{ + LabelValues: labelValues, + Points: []*metricspb.Point{{ + Value: &metricspb.Point_DoubleValue{ + DoubleValue: *value, + }, + }}, + }}, + } +} + +func intCumulative(metricName string, unit string, value *uint64, labelKeys []*metricspb.LabelKey, labelValues []*metricspb.LabelValue) *metricspb.Metric { + if value == nil { + return nil + } + return &metricspb.Metric{ + MetricDescriptor: &metricspb.MetricDescriptor{ + Name: metricName, + Unit: unit, + Type: metricspb.MetricDescriptor_CUMULATIVE_INT64, + LabelKeys: labelKeys, + }, + Timeseries: []*metricspb.TimeSeries{{ + LabelValues: labelValues, + Points: []*metricspb.Point{{ + Value: &metricspb.Point_Int64Value{ + Int64Value: int64(*value), + }, + }}, + }}, + } +} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go new file mode 100644 index 0000000000000..d604c75c4855e --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go @@ -0,0 +1,96 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. +package awsecscontainermetrics + +import ( + "testing" + "time" + + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + "github.com/stretchr/testify/require" +) + +func TestConvertToOTMetrics(t *testing.T) { + timestamp := timestampProto(time.Now()) + m := ECSMetrics{} + + m.MemoryUsage = 100 + m.MemoryMaxUsage = 100 + m.MemoryUtilized = 100 + m.MemoryReserved = 100 + m.CPUTotalUsage = 100 + + labelKeys := []*metricspb.LabelKey{ + {Key: "label_key_1"}, + } + labelValues := []*metricspb.LabelValue{ + {Value: "label_value_1"}, + } + + metrics := convertToOTMetrics("container.", m, labelKeys, labelValues, timestamp) + require.EqualValues(t, 25, len(metrics)) +} + +func TestIntGauge(t *testing.T) { + intValue := uint64(100) + + labelKeys := []*metricspb.LabelKey{ + {Key: "label_key_1"}, + } + labelValues := []*metricspb.LabelValue{ + {Value: "label_value_1"}, + } + + m := intGauge("cpu_utilized", "Count", &intValue, labelKeys, labelValues) + require.NotNil(t, m) + + m = intGauge("cpu_utilized", "Count", nil, labelKeys, labelValues) + require.Nil(t, m) +} + +func TestDoubleGauge(t *testing.T) { + floatValue := float64(100.01) + + labelKeys := []*metricspb.LabelKey{ + {Key: "label_key_1"}, + } + labelValues := []*metricspb.LabelValue{ + {Value: "label_value_1"}, + } + + m := doubleGauge("cpu_utilized", "Count", &floatValue, labelKeys, labelValues) + require.NotNil(t, m) + + m = doubleGauge("cpu_utilized", "Count", nil, labelKeys, labelValues) + require.Nil(t, m) + +} + +func TestIntCumulative(t *testing.T) { + floatValue := uint64(100) + + labelKeys := []*metricspb.LabelKey{ + {Key: "label_key_1"}, + } + labelValues := []*metricspb.LabelValue{ + {Value: "label_value_1"}, + } + + m := intCumulative("cpu_utilized", "Count", &floatValue, labelKeys, labelValues) + require.NotNil(t, m) + + m = intCumulative("cpu_utilized", "Count", nil, labelKeys, labelValues) + require.Nil(t, m) + +} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go new file mode 100644 index 0000000000000..935ff627759b2 --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go @@ -0,0 +1,67 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. + +package awsecscontainermetrics + +import ( + "strconv" + "time" + + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + "github.com/golang/protobuf/ptypes" + "github.com/golang/protobuf/ptypes/timestamp" + "go.opentelemetry.io/collector/consumer/consumerdata" + "go.opentelemetry.io/collector/testutil/metricstestutil" +) + +// GenerateDummyMetrics generates two dummy metrics +func GenerateDummyMetrics() consumerdata.MetricsData { + md := consumerdata.MetricsData{} + + for i := 0; i < 2; i++ { + md.Metrics = append(md.Metrics, createGaugeIntMetric(i)) + } + return md +} + +// createGaugeIntMetric creates a int gauge metric +func createGaugeIntMetric(i int) *metricspb.Metric { + ts := time.Now() + return metricstestutil.GaugeInt( + "test_metric_"+strconv.Itoa(i), + []string{"label_key_0", "label_key_1"}, + metricstestutil.Timeseries( + time.Now(), + []string{"label_value_0", "label_value_1"}, + &metricspb.Point{ + Timestamp: metricstestutil.Timestamp(ts), + Value: &metricspb.Point_Int64Value{Int64Value: int64(i)}, + }, + ), + ) +} + +func timestampProto(t time.Time) *timestamp.Timestamp { + out, _ := ptypes.TimestampProto(t) + return out +} + +func applyTimestamp(metrics []*metricspb.Metric, t *timestamp.Timestamp) []*metricspb.Metric { + for _, metric := range metrics { + if metric != nil { + metric.Timeseries[0].Points[0].Timestamp = t + } + } + return metrics +} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils_test.go new file mode 100644 index 0000000000000..e6de33787ce7e --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils_test.go @@ -0,0 +1,52 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. +package awsecscontainermetrics + +import ( + "testing" + "time" + + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + "github.com/stretchr/testify/require" +) + +func TestGenerateDummyMetrics(t *testing.T) { + md := GenerateDummyMetrics() + + require.EqualValues(t, 2, len(md.Metrics)) +} + +func TestCreateGaugeIntMetric(t *testing.T) { + m := createGaugeIntMetric(100) + + require.EqualValues(t, 1, len(m.Timeseries)) +} + +func TestTimestampProto(t *testing.T) { + timestamp := timestampProto(time.Now()) + + require.NotNil(t, timestamp) +} + +func TestApplyTimestamp(t *testing.T) { + timestamp := timestampProto(time.Now()) + m := []*metricspb.Metric{ + createGaugeIntMetric(1), + } + + metrics := applyTimestamp(m, timestamp) + + require.NotNil(t, metrics) + require.EqualValues(t, timestamp, metrics[0].Timeseries[0].Points[0].Timestamp) +} diff --git a/receiver/awsecscontainermetricsreceiver/go.mod b/receiver/awsecscontainermetricsreceiver/go.mod index 25f4a1c037f3b..7677d3bec677d 100644 --- a/receiver/awsecscontainermetricsreceiver/go.mod +++ b/receiver/awsecscontainermetricsreceiver/go.mod @@ -4,7 +4,9 @@ go 1.14 require ( github.com/census-instrumentation/opencensus-proto v0.3.0 + github.com/golang/protobuf v1.4.2 github.com/stretchr/testify v1.6.1 go.opentelemetry.io/collector v0.10.1-0.20200917170114-639b9a80ed46 go.uber.org/zap v1.16.0 + google.golang.org/protobuf v1.25.0 ) From 8d991e3c75b7045ad0f039d3ab3d1d01cef541c9 Mon Sep 17 00:00:00 2001 From: Rayhan Hossain Date: Mon, 21 Sep 2020 23:15:41 -0700 Subject: [PATCH 2/6] Add metrics accumulator to gather metrics from endpoint response --- .../awsecscontainermetrics/accumulator.go | 105 +++++++++++++++++ .../accumulator_test.go | 111 ++++++++++++++++++ .../awsecscontainermetrics/constant.go | 8 ++ .../awsecscontainermetrics/metrics_helper.go | 5 - 4 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator_test.go diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go new file mode 100644 index 0000000000000..4c7aa68f8dff6 --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go @@ -0,0 +1,105 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. + +package awsecscontainermetrics + +import ( + "time" + + metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" + resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + "github.com/golang/protobuf/ptypes/timestamp" + "go.opentelemetry.io/collector/consumer/consumerdata" +) + +// metricDataAccumulator defines the accumulator +type metricDataAccumulator struct { + md []*consumerdata.MetricsData +} + +// getMetricsData generates OT Metrics data from task metadata and docker stats +func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]ContainerStats, metadata TaskMetadata) { + + var taskMemLimit uint64 + var taskCPULimit float64 + taskMetrics := ECSMetrics{} + timestamp := timestampProto(time.Now()) + taskLabelKeys, taskLabelValues := taskLabelKeysAndValues(metadata) + + for _, containerMetadata := range metadata.Containers { + stats := containerStatsMap[containerMetadata.DockerID] + containerMetrics := getContainerMetrics(stats) + containerMetrics.MemoryReserved = *containerMetadata.Limits.Memory + containerMetrics.CPUReserved = *containerMetadata.Limits.CPU + + taskMemLimit += containerMetrics.MemoryReserved + taskCPULimit += containerMetrics.CPUReserved + + labelKeys, labelValues := containerLabelKeysAndValues(containerMetadata) + labelKeys = append(labelKeys, taskLabelKeys...) + labelValues = append(labelValues, taskLabelValues...) + + acc.accumulate( + timestamp, + convertToOTMetrics(ContainerPrefix, containerMetrics, labelKeys, labelValues, timestamp), + ) + + aggregateTaskMetrics(&taskMetrics, containerMetrics) + } + + // Overwrite Memory limit with task level limit + if metadata.Limits.Memory != nil { + taskMetrics.MemoryReserved = *metadata.Limits.Memory + } + + taskMetrics.CPUReserved = taskMetrics.CPUReserved / CPUsInVCpu + + // Overwrite CPU limit with task level limit + if metadata.Limits.CPU != nil { + taskMetrics.CPUReserved = *metadata.Limits.CPU + } + + acc.accumulate( + timestamp, + convertToOTMetrics(TaskPrefix, taskMetrics, taskLabelKeys, taskLabelValues, timestamp), + ) +} + +func (acc *metricDataAccumulator) accumulate( + startTime *timestamp.Timestamp, + m ...[]*metricspb.Metric, +) { + var resourceMetrics []*metricspb.Metric + for _, metrics := range m { + for _, metric := range metrics { + if metric != nil { + metric.Timeseries[0].StartTimestamp = startTime + resourceMetrics = append(resourceMetrics, metric) + } + } + } + + resourceAttributes := map[string]string{} + resourceAttributes[ResourceAttributeServiceNameKey] = ResourceAttributeServiceNameValue + + r := &resourcepb.Resource{ + Type: MetricResourceType, + Labels: resourceAttributes, + } + + acc.md = append(acc.md, &consumerdata.MetricsData{ + Metrics: resourceMetrics, + Resource: r, + }) +} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator_test.go new file mode 100644 index 0000000000000..27428e089013e --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator_test.go @@ -0,0 +1,111 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. + +package awsecscontainermetrics + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/consumer/consumerdata" +) + +func TestGetMetricsData(t *testing.T) { + v := uint64(1) + f := float64(1.0) + + memStats := make(map[string]uint64) + memStats["cache"] = v + + mem := MemoryStats{ + Usage: &v, + MaxUsage: &v, + Limit: &v, + MemoryReserved: &v, + MemoryUtilized: &v, + Stats: memStats, + } + + disk := DiskStats{ + IoServiceBytesRecursives: []IoServiceBytesRecursive{ + {Op: "Read", Value: &v}, + {Op: "Write", Value: &v}, + {Op: "Total", Value: &v}, + }, + } + + net := make(map[string]NetworkStats) + net["eth0"] = NetworkStats{ + RxBytes: &v, + RxPackets: &v, + RxErrors: &v, + RxDropped: &v, + TxBytes: &v, + TxPackets: &v, + TxErrors: &v, + TxDropped: &v, + } + + netRate := NetworkRateStats{ + RxBytesPerSecond: &f, + TxBytesPerSecond: &f, + } + + percpu := []*uint64{&v, &v} + cpuUsage := CPUUsage{ + TotalUsage: &v, + UsageInKernelmode: &v, + UsageInUserMode: &v, + PerCPUUsage: percpu, + } + + cpuStats := CPUStats{ + CPUUsage: cpuUsage, + OnlineCpus: &v, + SystemCPUUsage: &v, + CPUUtilized: &v, + CPUReserved: &v, + } + containerStats := ContainerStats{ + Name: "test", + ID: "001", + Memory: mem, + Disk: disk, + Network: net, + NetworkRate: netRate, + CPU: cpuStats, + } + + tm := TaskMetadata{ + Cluster: "cluster-1", + TaskARN: "arn:aws:some-value/001", + Family: "task-def-family-1", + Revision: "task-def-version", + Containers: []ContainerMetadata{ + {ContainerName: "container-1", DockerID: "001", DockerName: "docker-container-1", Limits: Limit{CPU: &f, Memory: &v}}, + }, + Limits: Limit{CPU: &f, Memory: &v}, + } + + cstats := make(map[string]ContainerStats) + cstats["001"] = containerStats + + var mds []*consumerdata.MetricsData + acc := metricDataAccumulator{ + md: mds, + } + + acc.getMetricsData(cstats, tm) + require.Less(t, 0, len(acc.md)) +} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go index 3650975b13877..d49f853c39d2c 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go @@ -23,9 +23,17 @@ const ( AttributeECSTaskRevesion = "ecs.task-definition-version" AttributeECSServiceName = "ecs.service" + CPUsInVCpu = 1024 + BytesInMiB = 1024 * 1024 ContainerMetricsLabelLen = 3 TaskMetricsLabelLen = 6 + TaskPrefix = "ecs.task." + ContainerPrefix = "container." + ResourceAttributeServiceNameKey = "service.name" + ResourceAttributeServiceNameValue = "awsecscontainermetrics" + MetricResourceType = "aoc.ecs" + AttributeMemoryUsage = "memory.usage" AttributeMemoryMaxUsage = "memory.usage.max" AttributeMemoryLimit = "memory.usage.limit" diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go index 8904e1b7f6763..7eb96eacd240d 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/metrics_helper.go @@ -14,11 +14,6 @@ package awsecscontainermetrics -const ( - // BytesInMiB is the number of bytes in a MebiByte. - BytesInMiB = 1024 * 1024 -) - // getContainerMetrics generate ECS Container metrics from Container stats func getContainerMetrics(stats ContainerStats) ECSMetrics { memoryUtilizedInMb := (*stats.Memory.Usage - stats.Memory.Stats["cache"]) / BytesInMiB From 88cd8ca583d1140272bfff2432aa4960415357d5 Mon Sep 17 00:00:00 2001 From: Rayhan Hossain Date: Wed, 23 Sep 2020 11:44:15 -0700 Subject: [PATCH 3/6] Use label as Resource Attributes and address PR feedbacks --- .../awsecscontainermetrics/accumulator.go | 34 ++--- .../awsecscontainermetrics/constant.go | 6 +- .../awsecscontainermetrics/label.go | 72 ---------- .../awsecscontainermetrics/resource.go | 58 ++++++++ .../{label_test.go => resource_test.go} | 37 ++--- .../awsecscontainermetrics/translator.go | 4 +- .../awsecscontainermetrics/translator_test.go | 2 +- .../awsecscontainermetricsreceiver/go.mod | 1 - .../awsecscontainermetricsreceiver/go.sum | 136 ++++++++++++++++++ 9 files changed, 231 insertions(+), 119 deletions(-) delete mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label.go create mode 100644 receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go rename receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/{label_test.go => resource_test.go} (57%) diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go index 4c7aa68f8dff6..636fc035a4362 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go @@ -19,7 +19,6 @@ import ( metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" - "github.com/golang/protobuf/ptypes/timestamp" "go.opentelemetry.io/collector/consumer/consumerdata" ) @@ -31,11 +30,9 @@ type metricDataAccumulator struct { // getMetricsData generates OT Metrics data from task metadata and docker stats func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]ContainerStats, metadata TaskMetadata) { - var taskMemLimit uint64 - var taskCPULimit float64 taskMetrics := ECSMetrics{} timestamp := timestampProto(time.Now()) - taskLabelKeys, taskLabelValues := taskLabelKeysAndValues(metadata) + taskResources := taskResources(metadata) for _, containerMetadata := range metadata.Containers { stats := containerStatsMap[containerMetadata.DockerID] @@ -43,16 +40,14 @@ func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]Co containerMetrics.MemoryReserved = *containerMetadata.Limits.Memory containerMetrics.CPUReserved = *containerMetadata.Limits.CPU - taskMemLimit += containerMetrics.MemoryReserved - taskCPULimit += containerMetrics.CPUReserved - - labelKeys, labelValues := containerLabelKeysAndValues(containerMetadata) - labelKeys = append(labelKeys, taskLabelKeys...) - labelValues = append(labelValues, taskLabelValues...) + containerResources := containerResources(containerMetadata) + for k, v := range taskResources.Labels { + containerResources.Labels[k] = v + } acc.accumulate( - timestamp, - convertToOTMetrics(ContainerPrefix, containerMetrics, labelKeys, labelValues, timestamp), + containerResources, + convertToOCMetrics(ContainerPrefix, containerMetrics, nil, nil, timestamp), ) aggregateTaskMetrics(&taskMetrics, containerMetrics) @@ -71,32 +66,25 @@ func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]Co } acc.accumulate( - timestamp, - convertToOTMetrics(TaskPrefix, taskMetrics, taskLabelKeys, taskLabelValues, timestamp), + taskResources, + convertToOCMetrics(TaskPrefix, taskMetrics, nil, nil, timestamp), ) } func (acc *metricDataAccumulator) accumulate( - startTime *timestamp.Timestamp, + r *resourcepb.Resource, m ...[]*metricspb.Metric, ) { var resourceMetrics []*metricspb.Metric for _, metrics := range m { for _, metric := range metrics { if metric != nil { - metric.Timeseries[0].StartTimestamp = startTime resourceMetrics = append(resourceMetrics, metric) } } } - resourceAttributes := map[string]string{} - resourceAttributes[ResourceAttributeServiceNameKey] = ResourceAttributeServiceNameValue - - r := &resourcepb.Resource{ - Type: MetricResourceType, - Labels: resourceAttributes, - } + r.Labels[ResourceAttributeServiceNameKey] = ResourceAttributeServiceNameValue acc.md = append(acc.md, &consumerdata.MetricsData{ Metrics: resourceMetrics, diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go index d49f853c39d2c..c627af1785052 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go @@ -23,10 +23,8 @@ const ( AttributeECSTaskRevesion = "ecs.task-definition-version" AttributeECSServiceName = "ecs.service" - CPUsInVCpu = 1024 - BytesInMiB = 1024 * 1024 - ContainerMetricsLabelLen = 3 - TaskMetricsLabelLen = 6 + CPUsInVCpu = 1024 + BytesInMiB = 1024 * 1024 TaskPrefix = "ecs.task." ContainerPrefix = "container." diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label.go deleted file mode 100644 index a3c2e00ddd1c4..0000000000000 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2020, OpenTelemetry Authors -// -// 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. - -package awsecscontainermetrics - -import ( - "strings" - - metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" - "go.opentelemetry.io/collector/translator/conventions" -) - -func containerLabelKeysAndValues(cm ContainerMetadata) ([]*metricspb.LabelKey, []*metricspb.LabelValue) { - labelKeys := make([]*metricspb.LabelKey, 0, ContainerMetricsLabelLen) - labelValues := make([]*metricspb.LabelValue, 0, ContainerMetricsLabelLen) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: conventions.AttributeContainerName}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: cm.ContainerName, HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: conventions.AttributeContainerID}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: cm.DockerID, HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSDockerName}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: cm.DockerName, HasValue: true}) - - return labelKeys, labelValues -} - -func taskLabelKeysAndValues(tm TaskMetadata) ([]*metricspb.LabelKey, []*metricspb.LabelValue) { - labelKeys := make([]*metricspb.LabelKey, 0, TaskMetricsLabelLen) - labelValues := make([]*metricspb.LabelValue, 0, TaskMetricsLabelLen) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSCluster}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: tm.Cluster, HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSTaskARN}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: tm.TaskARN, HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSTaskID}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: getTaskIDFromARN(tm.TaskARN), HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSTaskFamily}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: tm.Family, HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSTaskRevesion}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: tm.Revision, HasValue: true}) - - labelKeys = append(labelKeys, &metricspb.LabelKey{Key: AttributeECSServiceName}) - labelValues = append(labelValues, &metricspb.LabelValue{Value: "undefined", HasValue: true}) - - return labelKeys, labelValues -} - -func getTaskIDFromARN(arn string) string { - if arn == "" || !strings.HasPrefix(arn, "arn:aws") { - return "" - } - splits := strings.Split(arn, "/") - - return splits[len(splits)-1] -} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go new file mode 100644 index 0000000000000..4af254d85ef73 --- /dev/null +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go @@ -0,0 +1,58 @@ +// Copyright 2020, OpenTelemetry Authors +// +// 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. + +package awsecscontainermetrics + +import ( + "strings" + + resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" + "go.opentelemetry.io/collector/translator/conventions" +) + +func containerResources(cm ContainerMetadata) *resourcepb.Resource { + labels := map[string]string{} + + labels[conventions.AttributeContainerName] = cm.ContainerName + labels[conventions.AttributeContainerID] = cm.DockerID + labels[AttributeECSDockerName] = cm.DockerName + return &resourcepb.Resource{ + Type: MetricResourceType, + Labels: labels, + } +} + +func taskResources(tm TaskMetadata) *resourcepb.Resource { + labels := map[string]string{} + + labels[AttributeECSCluster] = tm.Cluster + labels[AttributeECSTaskARN] = tm.TaskARN + labels[AttributeECSTaskID] = getTaskIDFromARN(tm.TaskARN) + labels[AttributeECSTaskFamily] = tm.Family + labels[AttributeECSTaskRevesion] = tm.Revision + labels[AttributeECSServiceName] = "undefined" + return &resourcepb.Resource{ + Type: MetricResourceType, + Labels: labels, + } +} + +func getTaskIDFromARN(arn string) string { + if arn == "" || !strings.HasPrefix(arn, "arn:aws") { + return "" + } + splits := strings.Split(arn, "/") + + return splits[len(splits)-1] +} diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go similarity index 57% rename from receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label_test.go rename to receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go index 3e38e62345426..01dfdbe5d06b7 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/label_test.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go @@ -18,39 +18,44 @@ import ( "testing" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/translator/conventions" ) -func TestContainerLabelKeysAndValues(t *testing.T) { +func TestContainerResource(t *testing.T) { cm := ContainerMetadata{ ContainerName: "container-1", DockerID: "001", DockerName: "docker-container-1", } - k, v := containerLabelKeysAndValues(cm) - require.EqualValues(t, ContainerMetricsLabelLen, len(k)) - require.EqualValues(t, ContainerMetricsLabelLen, len(v)) + r := containerResources(cm) + require.NotNil(t, r) - require.EqualValues(t, "container-1", v[0].Value) - require.EqualValues(t, "001", v[1].Value) - require.EqualValues(t, "docker-container-1", v[2].Value) + labels := r.Labels + require.EqualValues(t, 3, len(labels)) + + require.EqualValues(t, "container-1", labels[conventions.AttributeContainerName]) + require.EqualValues(t, "001", labels[conventions.AttributeContainerID]) + require.EqualValues(t, "docker-container-1", labels[AttributeECSDockerName]) } -func TestTaskLabelKeysAndValues(t *testing.T) { +func TestTaskResource(t *testing.T) { tm := TaskMetadata{ Cluster: "cluster-1", TaskARN: "arn:aws:some-value/001", Family: "task-def-family-1", Revision: "task-def-version-1", } - k, v := taskLabelKeysAndValues(tm) - require.EqualValues(t, TaskMetricsLabelLen, len(k)) - require.EqualValues(t, TaskMetricsLabelLen, len(v)) + r := taskResources(tm) + require.NotNil(t, r) + + labels := r.Labels + require.EqualValues(t, 6, len(labels)) - require.EqualValues(t, "cluster-1", v[0].Value) - require.EqualValues(t, "arn:aws:some-value/001", v[1].Value) - require.EqualValues(t, "001", v[2].Value) - require.EqualValues(t, "task-def-family-1", v[3].Value) - require.EqualValues(t, "task-def-version-1", v[4].Value) + require.EqualValues(t, "cluster-1", labels[AttributeECSCluster]) + require.EqualValues(t, "arn:aws:some-value/001", labels[AttributeECSTaskARN]) + require.EqualValues(t, "001", labels[AttributeECSTaskID]) + require.EqualValues(t, "task-def-family-1", labels[AttributeECSTaskFamily]) + require.EqualValues(t, "task-def-version-1", labels[AttributeECSTaskRevesion]) } func TestGetTaskIDFromARN(t *testing.T) { diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go index bd2a2dbefb2c4..f6c368f6ab6e1 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator.go @@ -16,10 +16,10 @@ package awsecscontainermetrics import ( metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" - "google.golang.org/protobuf/types/known/timestamppb" + "github.com/golang/protobuf/ptypes/timestamp" ) -func convertToOTMetrics(prefix string, m ECSMetrics, labelKeys []*metricspb.LabelKey, labelValues []*metricspb.LabelValue, timestamp *timestamppb.Timestamp) []*metricspb.Metric { +func convertToOCMetrics(prefix string, m ECSMetrics, labelKeys []*metricspb.LabelKey, labelValues []*metricspb.LabelValue, timestamp *timestamp.Timestamp) []*metricspb.Metric { return applyTimestamp([]*metricspb.Metric{ intGauge(prefix+AttributeMemoryUsage, UnitBytes, &m.MemoryUsage, labelKeys, labelValues), diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go index d604c75c4855e..fab2ea892b7cf 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/translator_test.go @@ -38,7 +38,7 @@ func TestConvertToOTMetrics(t *testing.T) { {Value: "label_value_1"}, } - metrics := convertToOTMetrics("container.", m, labelKeys, labelValues, timestamp) + metrics := convertToOCMetrics("container.", m, labelKeys, labelValues, timestamp) require.EqualValues(t, 25, len(metrics)) } diff --git a/receiver/awsecscontainermetricsreceiver/go.mod b/receiver/awsecscontainermetricsreceiver/go.mod index 7677d3bec677d..af44ee50e199b 100644 --- a/receiver/awsecscontainermetricsreceiver/go.mod +++ b/receiver/awsecscontainermetricsreceiver/go.mod @@ -8,5 +8,4 @@ require ( github.com/stretchr/testify v1.6.1 go.opentelemetry.io/collector v0.10.1-0.20200917170114-639b9a80ed46 go.uber.org/zap v1.16.0 - google.golang.org/protobuf v1.25.0 ) diff --git a/receiver/awsecscontainermetricsreceiver/go.sum b/receiver/awsecscontainermetricsreceiver/go.sum index 918d9df09aa17..ea7d92859f7bf 100644 --- a/receiver/awsecscontainermetricsreceiver/go.sum +++ b/receiver/awsecscontainermetricsreceiver/go.sum @@ -60,19 +60,25 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk= github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -83,9 +89,13 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX github.com/Shopify/sarama v1.22.2-0.20190604114437-cd910a683f9f/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= github.com/Shopify/sarama v1.27.0 h1:tqo2zmyzPf1+gwTTwhI6W+EXDw4PVSczynpHKFtVAmo= github.com/Shopify/sarama v1.27.0/go.mod h1:aCdj6ymI8uyPEux1JJ9gcaDT6cinjGhNCAhs54taSUo= +github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Songmu/retry v0.1.0 h1:hPA5xybQsksLR/ry/+t/7cFajPW+dqjmjhzZhioBILA= github.com/Songmu/retry v0.1.0/go.mod h1:7sXIW7eseB9fq0FUvigRcQMVLR9tuHI0Scok+rkpAuA= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= @@ -131,6 +141,7 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8= github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bsm/sarama-cluster v2.1.13+incompatible/go.mod h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= @@ -152,10 +163,13 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/containerd v1.3.4 h1:3o0smo5SKY7H6AJCmJhsnCjR2/V2T8VmiHt7seN2/kI= github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -178,23 +192,30 @@ github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhr github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w= github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0= github.com/dgraph-io/badger v1.5.3/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.42.1 h1:SJ/XMVsp5CZmyQal8gLlOl9jSl1i3FaN20LlgtK5ZMs= github.com/digitalocean/godo v1.42.1/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v17.12.0-ce-rc1.0.20200706150819-a40b877fbb9e+incompatible h1:+mzU0jHyjWpYHiD0StRlsVXkCvecWS2hc55M3OlUJSk= github.com/docker/docker v17.12.0-ce-rc1.0.20200706150819-a40b877fbb9e+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= @@ -217,10 +238,13 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= @@ -249,7 +273,9 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 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-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -317,17 +343,27 @@ github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +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/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= @@ -353,6 +389,7 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20200228163523-cd4b606dd2fb/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= @@ -400,24 +437,40 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0= github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= github.com/golangci/golangci-lint v1.31.0 h1:+m9I3LEmxXLpymkXRPkDQGzOVBmBYm16UtDiXqZxWek= github.com/golangci/golangci-lint v1.31.0/go.mod h1:aMQuNCA+NDU5+4jLL5pEuFHoue0IznKE2+/GsFvvs8A= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/addlicense v0.0.0-20200622132530-df58acafd6d5 h1:m6Z1Cm53o4VecQFxKCnvULGfIT0Igo3MX131i+00IIo= github.com/google/addlicense v0.0.0-20200622132530-df58acafd6d5/go.mod h1:EMjYTRimagHs1FwlIqKyX3wAM0u3rA+McvlIIWmSamA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -428,9 +481,12 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -453,9 +509,12 @@ github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1a github.com/gookit/color v1.2.5 h1:s1gzb/fg3HhkSLKyWVUsZcVBUo+R1TwEYTmmxH8gGFg= github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gophercloud/gophercloud v0.12.0 h1:mZrie07npp6ODiwHZolTicr5jV8Ogn43AvAsSMm6Ork= github.com/gophercloud/gophercloud v0.12.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -466,10 +525,12 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg= github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -488,8 +549,10 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.6.0 h1:FfhMEkwvQl57CildXJyGHnwGGM4HMODGyfjGwNM1Vdw= github.com/hashicorp/consul/sdk v0.6.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= @@ -500,6 +563,7 @@ github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= @@ -510,12 +574,14 @@ github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -541,6 +607,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY= github.com/influxdata/influxdb v1.8.2/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= @@ -557,9 +624,12 @@ github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0 github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk= github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4= github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= @@ -572,10 +642,13 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -585,6 +658,7 @@ github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaR github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -596,14 +670,17 @@ github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPR github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.7 h1:u+iHuTbkbTS2D/JP7fCuZDo/t3rBVGo3Hf58Rc+lQVY= @@ -625,14 +702,17 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -640,6 +720,7 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -655,11 +736,14 @@ github.com/miekg/dns v1.1.31 h1:sJFOl9BgwbYAWOGEwr61FU28pqsBNdpRBnhGXtO06Oo= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -669,12 +753,16 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mjibson/esc v0.2.0 h1:k96hdaR9Z+nMcnDwNrOvhdBqtjyMrbVyxLpsRCdP2mA= github.com/mjibson/esc v0.2.0/go.mod h1:9Hw9gxxfHulMF5OJKCyhYD7PzlSdhzXyaGEBRPH1OPs= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= @@ -684,6 +772,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -692,7 +781,9 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0 h1:eMV1t2NQRc3r1k3guWiv/zEeqZZP6kPvpUfy6byfL1g= github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c= @@ -701,6 +792,7 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olivere/elastic v6.2.27+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= @@ -721,7 +813,9 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= @@ -743,12 +837,16 @@ github.com/orijtech/prometheus-go-metrics-exporter v0.0.5 h1:76JFgRIgNDA3pW1fUhm github.com/orijtech/prometheus-go-metrics-exporter v0.0.5/go.mod h1:BiTx/ugZex8LheBk3j53tktWaRdFjV5FCfT2o0P7msE= github.com/ory/go-acc v0.2.6 h1:YfI+L9dxI7QCtWn2RbawqO0vXhiThdXu/RgizJBbaq0= github.com/ory/go-acc v0.2.6/go.mod h1:4Kb/UnPcT8qRAk3IAxta+hvVapdxTLWtrr7bFLlEgpw= +github.com/ory/viper v1.7.5 h1:+xVdq7SU3e1vNaCsk/ixsfxE4zylk1TJUiJrY647jUE= github.com/ory/viper v1.7.5/go.mod h1:ypOuyJmEUb3oENywQZRgeAMwqgOyDqwboO1tj3DjTaM= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/pavius/impi v0.0.3 h1:DND6MzU+BLABhOZXbELR3FU8b+zDgcq4dOCNLhiTYuI= github.com/pavius/impi v0.0.3/go.mod h1:x/hU0bfdWIhuOT1SKwiJg++yvkk6EuOtJk8WtDZqgr8= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= @@ -758,7 +856,9 @@ github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bA github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -824,6 +924,7 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quasilyte/go-ruleguard v0.2.0 h1:UOVMyH2EKkxIfzrULvA9n/tO+HtEhqD9mrLSWMr5FwU= github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -840,7 +941,9 @@ github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU= github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -850,6 +953,7 @@ github.com/samuel/go-zookeeper v0.0.0-20200724154423-2164a8ac840e/go.mod h1:gi+0 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sectioneight/md-to-godoc v0.0.0-20161108233149-55e43be6c335/go.mod h1:lPZq22klO8la1kyImIDhrGytugMV0TsrsZB55a+xxI0= github.com/securego/gosec v0.0.0-20200203094520-d13bb6d2420c h1:pThusIwnQVcKbuZSds3HgB/ODEqxMqZf/SgVp89JXY0= @@ -877,15 +981,19 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/go-diff v0.6.0 h1:WbN9e/jD8ujU+o0vd9IFN5AEwtfB0rn/zM/AANaClqQ= github.com/sourcegraph/go-diff v0.6.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= @@ -915,6 +1023,7 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -926,18 +1035,25 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tcnksm/ghr v0.13.0 h1:a5ZbaUAfiaiw6rEDJVUEDYA9YreZOkh3XAfXHWn8zu8= github.com/tcnksm/ghr v0.13.0/go.mod h1:tcp6tzbRYE0LqFSG7ykXP/BVG1/2BkX6aIn9FFV1mIQ= +github.com/tcnksm/go-gitconfig v0.1.2 h1:iiDhRitByXAEyjgBqsKi9QU4o2TNtv9kPP3RgPgXBPw= github.com/tcnksm/go-gitconfig v0.1.2/go.mod h1:/8EhP4H7oJZdIPyT+/UIsG87kTzrzM4UsLGSItWYCpE= +github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e h1:IWllFTiDjjLIf2oeKxpIUmtiDV5sn71VgeQgg6vcE7k= github.com/tcnksm/go-latest v0.0.0-20170313132115-e3007ae9052e/go.mod h1:d7u6HkTYKSv5m6MCKkOQlHwaShTMl3HjqSGW3XtVhXM= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tetafro/godot v0.4.8 h1:h61+hQraWhdI6WYqMwAwZYCE5yxL6a9/Orw4REbabSU= github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As= github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -948,9 +1064,11 @@ github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.15.1/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= @@ -1001,6 +1119,7 @@ go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+ go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1052,6 +1171,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -1060,6 +1180,7 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1108,6 +1229,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1117,6 +1239,7 @@ golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1365,12 +1488,15 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1380,6 +1506,7 @@ gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hr gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI= gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlIrg= @@ -1387,6 +1514,7 @@ gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuv gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1403,6 +1531,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200601152816-913338de1bd2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1422,7 +1551,9 @@ k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= @@ -1431,15 +1562,20 @@ k8s.io/utils v0.0.0-20200414100711-2df71ebbae66 h1:Ly1Oxdu5p5ZFmiVT71LFgeZETvMfZ k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE= mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From d6de8ca07e32ee558c85803a3665318104bba218 Mon Sep 17 00:00:00 2001 From: Rayhan Hossain Date: Wed, 23 Sep 2020 12:12:55 -0700 Subject: [PATCH 4/6] Add a TODO for removing GenerateDummyMetrics() --- .../awsecscontainermetrics/utils.go | 1 + 1 file changed, 1 insertion(+) diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go index 935ff627759b2..b9ade2dec96a8 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/utils.go @@ -26,6 +26,7 @@ import ( ) // GenerateDummyMetrics generates two dummy metrics +// TODO: Remove once this is replaced with actuall metrics generation code func GenerateDummyMetrics() consumerdata.MetricsData { md := consumerdata.MetricsData{} From 0e8cba2eb7974b8a31a00f593d77d820f47a5102 Mon Sep 17 00:00:00 2001 From: Rayhan Hossain Date: Thu, 24 Sep 2020 18:14:31 -0700 Subject: [PATCH 5/6] Remove misleading 'service.name' resource attribute for now --- .../awsecscontainermetrics/accumulator.go | 2 -- .../awsecscontainermetrics/constant.go | 8 +++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go index 636fc035a4362..2ea681d13339c 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go @@ -84,8 +84,6 @@ func (acc *metricDataAccumulator) accumulate( } } - r.Labels[ResourceAttributeServiceNameKey] = ResourceAttributeServiceNameValue - acc.md = append(acc.md, &consumerdata.MetricsData{ Metrics: resourceMetrics, Resource: r, diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go index c627af1785052..6a33ae1761974 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/constant.go @@ -26,11 +26,9 @@ const ( CPUsInVCpu = 1024 BytesInMiB = 1024 * 1024 - TaskPrefix = "ecs.task." - ContainerPrefix = "container." - ResourceAttributeServiceNameKey = "service.name" - ResourceAttributeServiceNameValue = "awsecscontainermetrics" - MetricResourceType = "aoc.ecs" + TaskPrefix = "ecs.task." + ContainerPrefix = "container." + MetricResourceType = "aoc.ecs" AttributeMemoryUsage = "memory.usage" AttributeMemoryMaxUsage = "memory.usage.max" From 91dac3d82162375c4d52a1a724c8e3d7211acb83 Mon Sep 17 00:00:00 2001 From: Rayhan Hossain Date: Fri, 25 Sep 2020 10:19:41 -0700 Subject: [PATCH 6/6] Rename func and variables to address PR feedback --- .../awsecscontainermetrics/accumulator.go | 12 ++++++------ .../awsecscontainermetrics/resource.go | 4 ++-- .../awsecscontainermetrics/resource_test.go | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go index 2ea681d13339c..135a219bbbf94 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/accumulator.go @@ -32,7 +32,7 @@ func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]Co taskMetrics := ECSMetrics{} timestamp := timestampProto(time.Now()) - taskResources := taskResources(metadata) + taskResource := taskResource(metadata) for _, containerMetadata := range metadata.Containers { stats := containerStatsMap[containerMetadata.DockerID] @@ -40,13 +40,13 @@ func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]Co containerMetrics.MemoryReserved = *containerMetadata.Limits.Memory containerMetrics.CPUReserved = *containerMetadata.Limits.CPU - containerResources := containerResources(containerMetadata) - for k, v := range taskResources.Labels { - containerResources.Labels[k] = v + containerResource := containerResource(containerMetadata) + for k, v := range taskResource.Labels { + containerResource.Labels[k] = v } acc.accumulate( - containerResources, + containerResource, convertToOCMetrics(ContainerPrefix, containerMetrics, nil, nil, timestamp), ) @@ -66,7 +66,7 @@ func (acc *metricDataAccumulator) getMetricsData(containerStatsMap map[string]Co } acc.accumulate( - taskResources, + taskResource, convertToOCMetrics(TaskPrefix, taskMetrics, nil, nil, timestamp), ) } diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go index 4af254d85ef73..e357860c4fea9 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource.go @@ -21,7 +21,7 @@ import ( "go.opentelemetry.io/collector/translator/conventions" ) -func containerResources(cm ContainerMetadata) *resourcepb.Resource { +func containerResource(cm ContainerMetadata) *resourcepb.Resource { labels := map[string]string{} labels[conventions.AttributeContainerName] = cm.ContainerName @@ -33,7 +33,7 @@ func containerResources(cm ContainerMetadata) *resourcepb.Resource { } } -func taskResources(tm TaskMetadata) *resourcepb.Resource { +func taskResource(tm TaskMetadata) *resourcepb.Resource { labels := map[string]string{} labels[AttributeECSCluster] = tm.Cluster diff --git a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go index 01dfdbe5d06b7..2042e843a38e8 100644 --- a/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go +++ b/receiver/awsecscontainermetricsreceiver/awsecscontainermetrics/resource_test.go @@ -27,7 +27,7 @@ func TestContainerResource(t *testing.T) { DockerID: "001", DockerName: "docker-container-1", } - r := containerResources(cm) + r := containerResource(cm) require.NotNil(t, r) labels := r.Labels @@ -45,7 +45,7 @@ func TestTaskResource(t *testing.T) { Family: "task-def-family-1", Revision: "task-def-version-1", } - r := taskResources(tm) + r := taskResource(tm) require.NotNil(t, r) labels := r.Labels