From 34c09e1b83ffe75434c95dbad5cd79d3568474bb Mon Sep 17 00:00:00 2001 From: David Ashpole Date: Thu, 5 May 2022 13:56:57 -0400 Subject: [PATCH] Initial gmp exporter (#342) Add GMP exporter --- exporter/collector/config.go | 16 + .../googlemanagedprometheus/README.md | 52 + .../googlemanagedprometheus/config.go | 52 + .../googlemanagedprometheus/factory.go | 98 ++ .../collector/googlemanagedprometheus/go.mod | 60 + .../collector/googlemanagedprometheus/go.sum | 763 ++++++++++++ .../monitoredresource.go | 54 + .../monitoredresource_test.go | 133 ++ .../googlemanagedprometheus/naming.go | 45 + .../googlemanagedprometheus/naming_test.go | 100 ++ .../integrationtest/config/config_test.go | 13 +- .../integrationtest/config/gmp_config_test.go | 88 ++ exporter/collector/integrationtest/go.mod | 3 + exporter/collector/integrationtest/go.sum | 1 + .../collector/integrationtest/testcases.go | 19 +- .../integrationtest/testdata/config.yaml | 4 + .../basic_counter_metrics_expect.json | 60 + .../basic_prometheus_metrics_expect.json | 60 + .../fixtures/batching_metrics_expect.json | 60 + ...ate_service_timeseries_metrics_expect.json | 60 + .../delta_counter_metrics_expect.json | 60 + .../exponential_histogram_metrics_expect.json | 60 + ...ol_plane_metrics_agent_metrics_expect.json | 60 + .../gke_metrics_agent_metrics_expect.json | 60 + .../fixtures/google_managed_prometheus.json | 368 ++++++ .../google_managed_prometheus_expect.json | 1074 +++++++++++++++++ .../nonmonotonic_counter_metrics_expect.json | 60 + .../ops_agent_host_metrics_expect.json | 60 + .../ops_agent_self_metrics_expect.json | 60 + .../fixtures/summary_metrics_expect.json | 60 + .../unknown_domain_metrics_expect.json | 60 + .../with_resource_filter_metrics_expect.json | 60 + .../fixtures/workload_metrics_expect.json | 60 + ...kloadgoogleapis_prefix_metrics_expect.json | 60 + .../integrationtest/testdata/gmp_config.yaml | 20 + exporter/collector/logs.go | 4 +- exporter/collector/metrics.go | 98 +- exporter/collector/metrics_test.go | 10 +- exporter/collector/monitoredresource.go | 9 +- exporter/collector/monitoredresource_test.go | 262 ++-- tools/release.go | 3 +- 41 files changed, 4184 insertions(+), 125 deletions(-) create mode 100644 exporter/collector/googlemanagedprometheus/README.md create mode 100644 exporter/collector/googlemanagedprometheus/config.go create mode 100644 exporter/collector/googlemanagedprometheus/factory.go create mode 100644 exporter/collector/googlemanagedprometheus/go.mod create mode 100644 exporter/collector/googlemanagedprometheus/go.sum create mode 100644 exporter/collector/googlemanagedprometheus/monitoredresource.go create mode 100644 exporter/collector/googlemanagedprometheus/monitoredresource_test.go create mode 100644 exporter/collector/googlemanagedprometheus/naming.go create mode 100644 exporter/collector/googlemanagedprometheus/naming_test.go create mode 100644 exporter/collector/integrationtest/config/gmp_config_test.go create mode 100644 exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus.json create mode 100644 exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus_expect.json create mode 100644 exporter/collector/integrationtest/testdata/gmp_config.yaml diff --git a/exporter/collector/config.go b/exporter/collector/config.go index 7ce73ccf8..d358c87d8 100644 --- a/exporter/collector/config.go +++ b/exporter/collector/config.go @@ -18,7 +18,9 @@ import ( "fmt" "time" + "go.opentelemetry.io/collector/model/pdata" "google.golang.org/api/option" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" ) const ( @@ -106,6 +108,18 @@ type MetricConfig struct { // so we don't send it by default, and don't expose it to users. For some uses, it is // expected, however. EnableSumOfSquaredDeviation bool `mapstructure:"sum_of_squared_deviation"` + + // GetMetricName is not settable in config files, but can be used by other + // exporters which extend the functionality of this exporter. It allows + // customizing the naming of metrics. baseName already includes type + // suffixes for summary metrics, but does not (yet) include the domain prefix + GetMetricName func(baseName string, metric pdata.Metric) (string, error) + + // MapMonitoredResource is not exposed as an option in the configuration, but + // can be used by other exporters to extend the functionality of this + // exporter. It allows overriding the function used to map otel resource to + // monitored resource. + MapMonitoredResource func(pdata.Resource) *monitoredrespb.MonitoredResource } type ResourceFilter struct { @@ -135,6 +149,8 @@ func DefaultConfig() Config { InstrumentationLibraryLabels: true, ServiceResourceLabels: true, CumulativeNormalization: true, + GetMetricName: defaultGetMetricName, + MapMonitoredResource: defaultResourceToMonitoredResource, }, } } diff --git a/exporter/collector/googlemanagedprometheus/README.md b/exporter/collector/googlemanagedprometheus/README.md new file mode 100644 index 000000000..eab026f39 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/README.md @@ -0,0 +1,52 @@ +# Google Managed Service for Prometheus Collector Exporter + +## Building a container image with the googlemanagedprometheus exporter + +In your own fork of [open-telemetry/opentelemetry-collector-releases](https://github.com/open-telemetry/opentelemetry-collector-releases), add your own "distribution" directory within the distributions directory, based on either the otelcol or otelcol-contrib distributions. In the `exporters` list in `manifest.yaml`, add: +```yaml +exporters: + - gomod: "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.29.0" +``` + +The syntax of `manifest.yaml` is described in the [Collector Builder documentation](https://github.com/open-telemetry/opentelemetry-collector/blob/54f271b7d473f36b4ecbc21994d59359dbd263f6/cmd/builder/README.md#opentelemetry-collector-builder). + +In the `configs` directory, add your collector configuration yaml file, which should look something like: + +```yaml +receivers: + prometheus: + config: + scrape_configs: + # TODO: Add your prometheus scrape configuration here. + # Using kubernetes_sd_configs with namespaced resources + # ensures the namespace is set on your metrics. +processors: + batch: + # batch metrics before sending to reduce API usage + send_batch_max_size: 200 + send_batch_size: 200 + timeout: 5s + memory_limiter: + # drop metrics if memory usage gets too high + check_interval: 1s + limit_percentage: 65 + spike_limit_percentage: 20 + resourcedetection: + # detect cluster name and location + detectors: [gce, gke] + timeout: 10s +exporters: + googlemanagedprometheus: +``` + +Change the Dockerfile in your directory within `distributions` to point to your collector config [here](https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol-contrib/Dockerfile#L17). + +Finally, build the image: + +```sh +DISTRIBUTIONS=my-distribution make build +``` + +## Additional Options + +The [filterprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/filterprocessor) can filter out metrics. The [metricstransformprocessor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/metricstransformprocessor) can manipulate metrics in a variety of ways, including synthesizing new metrics from other metrics, adding or removing labels, renaming metrics, and scaling metrics. `metric_relabl_configs` within the prometheus receiver configuration can also be used to manipulate metrics. diff --git a/exporter/collector/googlemanagedprometheus/config.go b/exporter/collector/googlemanagedprometheus/config.go new file mode 100644 index 000000000..f07231a94 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/config.go @@ -0,0 +1,52 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 googlemanagedprometheus + +import ( + "fmt" + + "go.opentelemetry.io/collector/config" + "go.opentelemetry.io/collector/exporter/exporterhelper" + + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" +) + +// Config defines configuration for Google Cloud Managed Service for Prometheus exporter. +type Config struct { + config.ExporterSettings `mapstructure:",squash"` + GMPConfig `mapstructure:",squash"` + + // Timeout for all API calls. If not set, defaults to 12 seconds. + exporterhelper.TimeoutSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct. + exporterhelper.QueueSettings `mapstructure:"sending_queue"` + exporterhelper.RetrySettings `mapstructure:"retry_on_failure"` +} + +// GMPConfig is a subset of the collector config. +type GMPConfig struct { + ProjectID string `mapstructure:"project"` + UserAgent string `mapstructure:"user_agent"` + ClientConfig collector.ClientConfig `mapstructure:",squash"` +} + +func (cfg *Config) Validate() error { + if err := cfg.ExporterSettings.Validate(); err != nil { + return fmt.Errorf("exporter settings are invalid :%w", err) + } + if err := collector.ValidateConfig(cfg.toCollectorConfig()); err != nil { + return fmt.Errorf("exporter settings are invalid :%w", err) + } + return nil +} diff --git a/exporter/collector/googlemanagedprometheus/factory.go b/exporter/collector/googlemanagedprometheus/factory.go new file mode 100644 index 000000000..14b741242 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/factory.go @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 googlemanagedprometheus + +import ( + "context" + "time" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config" + "go.opentelemetry.io/collector/exporter/exporterhelper" + + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" +) + +const ( + // The value of "type" key in configuration. + typeStr = "googlemanagedprometheus" + defaultTimeout = 12 * time.Second // Consistent with Cloud Monitoring's timeout +) + +// NewFactory creates a factory for the googlemanagedprometheus exporter +func NewFactory() component.ExporterFactory { + return component.NewExporterFactory( + typeStr, + createDefaultConfig, + component.WithMetricsExporter(createMetricsExporter), + ) +} + +// createDefaultConfig creates the default configuration for exporter. +func createDefaultConfig() config.Exporter { + return &Config{ + ExporterSettings: config.NewExporterSettings(config.NewComponentID(typeStr)), + TimeoutSettings: exporterhelper.TimeoutSettings{Timeout: defaultTimeout}, + RetrySettings: exporterhelper.NewDefaultRetrySettings(), + QueueSettings: exporterhelper.NewDefaultQueueSettings(), + GMPConfig: GMPConfig{ + UserAgent: "opentelemetry-collector-contrib/{{version}}", + }, + } +} + +// createMetricsExporter creates a metrics exporter based on this config. +func createMetricsExporter( + ctx context.Context, + params component.ExporterCreateSettings, + cfg config.Exporter) (component.MetricsExporter, error) { + eCfg := cfg.(*Config) + mExp, err := collector.NewGoogleCloudMetricsExporter(ctx, eCfg.GMPConfig.toCollectorConfig(), params.TelemetrySettings.Logger, params.BuildInfo.Version, eCfg.Timeout) + if err != nil { + return nil, err + } + return exporterhelper.NewMetricsExporter( + cfg, + params, + mExp.PushMetrics, + exporterhelper.WithShutdown(mExp.Shutdown), + // Disable exporterhelper Timeout, since we are using a custom mechanism + // within exporter itself + exporterhelper.WithTimeout(exporterhelper.TimeoutSettings{Timeout: 0}), + exporterhelper.WithQueue(eCfg.QueueSettings), + exporterhelper.WithRetry(eCfg.RetrySettings)) +} + +func (c *GMPConfig) toCollectorConfig() collector.Config { + // start with whatever the default collector config is. + cfg := collector.DefaultConfig() + // hard-code some config options to make it work with GMP + cfg.MetricConfig.Prefix = "prometheus.googleapis.com" + cfg.MetricConfig.SkipCreateMetricDescriptor = true + cfg.MetricConfig.InstrumentationLibraryLabels = false + cfg.MetricConfig.ServiceResourceLabels = false + // Update metric naming to match GMP conventions + cfg.MetricConfig.GetMetricName = GetMetricName + // Map to the prometheus_target monitored resource + cfg.MetricConfig.MapMonitoredResource = MapToPrometheusTarget + cfg.MetricConfig.EnableSumOfSquaredDeviation = true + // TODO: Change to GMP's method of reset handling. + cfg.MetricConfig.CumulativeNormalization = false + // map the GMP config's fields to the collector config + cfg.ProjectID = c.ProjectID + cfg.UserAgent = c.UserAgent + cfg.MetricConfig.ClientConfig = c.ClientConfig + return cfg +} diff --git a/exporter/collector/googlemanagedprometheus/go.mod b/exporter/collector/googlemanagedprometheus/go.mod new file mode 100644 index 000000000..4666b4db7 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/go.mod @@ -0,0 +1,60 @@ +module github.com/dashpole/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus + +go 1.17 + +require ( + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.28.0 + github.com/stretchr/testify v1.7.1 + go.opentelemetry.io/collector v0.49.0 + go.opentelemetry.io/collector/model v0.49.0 + go.opentelemetry.io/collector/pdata v0.49.0 + google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf +) + +require ( + cloud.google.com/go v0.100.2 // indirect + cloud.google.com/go/compute v1.5.0 // indirect + cloud.google.com/go/logging v1.4.2 // indirect + cloud.google.com/go/monitoring v1.4.0 // indirect + cloud.google.com/go/trace v1.2.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.5.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.29.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.7 // indirect + github.com/googleapis/gax-go/v2 v2.2.0 // indirect + github.com/knadh/koanf v1.4.1 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/otel v1.6.3 // indirect + go.opentelemetry.io/otel/metric v0.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.6.3 // indirect + go.opentelemetry.io/otel/trace v1.6.3 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + go.uber.org/zap v1.21.0 // indirect + golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect + golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/api v0.74.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/grpc v1.45.0 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +) + +replace ( + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector => ../../collector + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace => ../../trace + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping => ../../../internal/resourcemapping +) diff --git a/exporter/collector/googlemanagedprometheus/go.sum b/exporter/collector/googlemanagedprometheus/go.sum new file mode 100644 index 000000000..8cff98b08 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/go.sum @@ -0,0 +1,763 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/logging v1.4.2 h1:Mu2Q75VBDQlW1HlBMjTX4X84UFR73G1TiLlRYc/b7tA= +cloud.google.com/go/logging v1.4.2/go.mod h1:jco9QZSx8HiVVqLJReq7z7bVdj0P1Jb9PDFs63T+axo= +cloud.google.com/go/monitoring v1.4.0 h1:05+IuNMbh40hbxcqQ4SnynbwZbLG1Wc9dysIJxnfv7U= +cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/trace v1.2.0 h1:oIaB4KahkIUOpLSAAjEJ8y2desbjY/x/RfP4O3KAtTI= +cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= +github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +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/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3 h1:eHv/jVY/JNop1xg2J9cBb4EzyMpWZoNCP1BslSAIkOI= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +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/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.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +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-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +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/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/knadh/koanf v1.4.1 h1:Z0VGW/uo8NJmjd+L1Dc3S5frq6c62w5xQ9Yf4Mg3wFQ= +github.com/knadh/koanf v1.4.1/go.mod h1:1cfH5223ZeZUOs8FU2UdTmaNfHpqgtjV0+NHjRO43gs= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +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/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.49.0 h1:2CyCOGXino7e7bN5J9ns3nOBlLVq+k/jVDm+rlpyCks= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.49.0 h1:vpxb3bz/VjBvU8PB1IRAWN3CPLRPZpVYsnj8Kjo2GOo= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/collector v0.49.0 h1:brKMIUwlL1bt0Faxqqxvj7549KWm9FEN77Z4i4RAlDE= +go.opentelemetry.io/collector v0.49.0/go.mod h1:ErYGC1VzzrpK/uM134DJIbARX3jl9vtTqgIXsiWxjGE= +go.opentelemetry.io/collector/model v0.49.0 h1:mbUSNgpaBE3GWmzGsRb5t0xILpXIVYv7scPTTfoMt6c= +go.opentelemetry.io/collector/model v0.49.0/go.mod h1:nOYQv9KoFPs6ihJwOi24qB209EOhS9HkwhGj54YiEAw= +go.opentelemetry.io/collector/pdata v0.49.0 h1:aYj5rOlRC0x7lGXbc185LMsMMoY/pjOTXr5s1O2SzXs= +go.opentelemetry.io/collector/pdata v0.49.0/go.mod h1:YwmKuiFhNgtmhRdpi8Q8FAWPa0AwJTCSlssSsAtuRcY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0 h1:woM+Mb4d0A+Dxa3rYPenSN5ZeS9qHUvE8rlObiLRXTY= +go.opentelemetry.io/otel v1.6.3 h1:FLOfo8f9JzFVFVyU+MSRJc2HdEAXQgm7pIv2uFKRSZE= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel/metric v0.29.0 h1:7unM/I13Dbc1VHw8lTPQ7zfNIgkhcb8BZhujXOS4jKc= +go.opentelemetry.io/otel/metric v0.29.0/go.mod h1:HahKFp1OC1RNTsuO/HNMBHHJR+dmHZ7wLARRgGDwjLQ= +go.opentelemetry.io/otel/sdk v1.6.3 h1:prSHYdwCQOX5DrsEzxowH3nLhoAzEBdZhvrR79scfLs= +go.opentelemetry.io/otel/sdk v1.6.3/go.mod h1:A4iWF7HTXa+GWL/AaqESz28VuSBIcZ+0CV+IzJ5NMiQ= +go.opentelemetry.io/otel/trace v1.6.3 h1:IqN4L+5b0mPNjdXIiZ90Ni4Bl5BRkDQywePLWemd9bc= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/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= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/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/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +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= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0 h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf h1:JTjwKJX9erVpsw17w+OIPP7iAgEkN/r8urhWSunEDTs= +google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/exporter/collector/googlemanagedprometheus/monitoredresource.go b/exporter/collector/googlemanagedprometheus/monitoredresource.go new file mode 100644 index 000000000..6c8755329 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/monitoredresource.go @@ -0,0 +1,54 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 googlemanagedprometheus + +import ( + "go.opentelemetry.io/collector/model/pdata" + semconv "go.opentelemetry.io/collector/model/semconv/v1.8.0" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" +) + +func MapToPrometheusTarget(res pdata.Resource) *monitoredrespb.MonitoredResource { + attrs := res.Attributes() + // Prepend namespace if it exists to match what is specified in + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/datamodel.md#resource-attributes-1 + job := getStringOrEmpty(attrs, semconv.AttributeServiceName) + serviceNamespace := getStringOrEmpty(attrs, semconv.AttributeServiceNamespace) + if serviceNamespace != "" { + job = serviceNamespace + "/" + job + } + location := getStringOrEmpty(attrs, semconv.AttributeCloudAvailabilityZone) + if location == "" { + // fall back to region if we don't have a zone. + location = getStringOrEmpty(attrs, semconv.AttributeCloudRegion) + } + return &monitoredrespb.MonitoredResource{ + Type: "prometheus_target", + Labels: map[string]string{ + "location": location, + "cluster": getStringOrEmpty(attrs, semconv.AttributeK8SClusterName), + "namespace": getStringOrEmpty(attrs, semconv.AttributeK8SNamespaceName), + "job": job, + "instance": getStringOrEmpty(attrs, semconv.AttributeServiceInstanceID), + }, + } +} + +func getStringOrEmpty(attributes pdata.Map, key string) string { + if val, ok := attributes.Get(key); ok { + return val.StringVal() + } + return "" +} diff --git a/exporter/collector/googlemanagedprometheus/monitoredresource_test.go b/exporter/collector/googlemanagedprometheus/monitoredresource_test.go new file mode 100644 index 000000000..ca3c1a318 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/monitoredresource_test.go @@ -0,0 +1,133 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 googlemanagedprometheus + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/model/pdata" + monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" +) + +func TestMapToPrometheusTarget(t *testing.T) { + for _, tc := range []struct { + desc string + resourceLabels map[string]string + expected *monitoredrespb.MonitoredResource + }{ + { + desc: "no attributes", + resourceLabels: map[string]string{}, + expected: &monitoredrespb.MonitoredResource{ + Type: "prometheus_target", + Labels: map[string]string{ + "location": "", + "cluster": "", + "namespace": "", + "job": "", + "instance": "", + }, + }, + }, + { + desc: "with gke container attributes", + resourceLabels: map[string]string{ + "cloud.platform": "gcp_kubernetes_engine", + "cloud.availability_zone": "us-central1-c", + "k8s.cluster.name": "mycluster", + "k8s.namespace.name": "mynamespace", + "k8s.pod.name": "mypod", + "k8s.container.name": "mycontainer", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expected: &monitoredrespb.MonitoredResource{ + Type: "prometheus_target", + Labels: map[string]string{ + "location": "us-central1-c", + "cluster": "mycluster", + "namespace": "mynamespace", + "job": "myservicename", + "instance": "myserviceinstanceid", + }, + }, + }, + { + desc: "Attributes from prometheus receiver, and zone", + resourceLabels: map[string]string{ + "cloud.availability_zone": "us-central1-c", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expected: &monitoredrespb.MonitoredResource{ + Type: "prometheus_target", + Labels: map[string]string{ + "location": "us-central1-c", + "cluster": "", + "namespace": "", + "job": "myservicename", + "instance": "myserviceinstanceid", + }, + }, + }, + { + desc: "Attributes from prometheus receiver, and region", + resourceLabels: map[string]string{ + "cloud.region": "us-central1", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expected: &monitoredrespb.MonitoredResource{ + Type: "prometheus_target", + Labels: map[string]string{ + "location": "us-central1", + "cluster": "", + "namespace": "", + "job": "myservicename", + "instance": "myserviceinstanceid", + }, + }, + }, + { + desc: "Attributes service from opentelemetry sdk and zone", + resourceLabels: map[string]string{ + "cloud.availability_zone": "us-central1-c", + "service.name": "myservicename", + "service.namespace": "myservicenamespace", + "service.instance.id": "myserviceinstanceid", + }, + expected: &monitoredrespb.MonitoredResource{ + Type: "prometheus_target", + Labels: map[string]string{ + "location": "us-central1-c", + "cluster": "", + "namespace": "", + "job": "myservicenamespace/myservicename", + "instance": "myserviceinstanceid", + }, + }, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + r := pdata.NewResource() + for k, v := range tc.resourceLabels { + r.Attributes().InsertString(k, v) + } + got := MapToPrometheusTarget(r) + assert.Equal(t, tc.expected, got) + }) + } +} diff --git a/exporter/collector/googlemanagedprometheus/naming.go b/exporter/collector/googlemanagedprometheus/naming.go new file mode 100644 index 000000000..f40046680 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/naming.go @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 googlemanagedprometheus + +import ( + "fmt" + "strings" + + "go.opentelemetry.io/collector/model/pdata" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func GetMetricName(baseName string, metric pdata.Metric) (string, error) { + switch metric.DataType() { + case pmetric.MetricDataTypeSum: + return baseName + "/counter", nil + case pmetric.MetricDataTypeGauge: + return baseName + "/gauge", nil + case pmetric.MetricDataTypeSummary: + // summaries are sent as the following series: + // * Sum: prometheus.googleapis.com/_sum/summary:counter + // * Count: prometheus.googleapis.com/_count/summary + // * Quantiles: prometheus.googleapis.com//summary + if strings.HasSuffix(baseName, "_sum") { + return baseName + "/summary:counter", nil + } + return baseName + "/summary", nil + case pmetric.MetricDataTypeHistogram: + return baseName + "/histogram", nil + default: + return "", fmt.Errorf("unsupported metric datatype: %v", metric.DataType()) + } +} diff --git a/exporter/collector/googlemanagedprometheus/naming_test.go b/exporter/collector/googlemanagedprometheus/naming_test.go new file mode 100644 index 000000000..055942d07 --- /dev/null +++ b/exporter/collector/googlemanagedprometheus/naming_test.go @@ -0,0 +1,100 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 googlemanagedprometheus + +import ( + "testing" + + "go.opentelemetry.io/collector/model/pdata" + "go.opentelemetry.io/collector/pdata/pmetric" +) + +func TestGetMetricName(t *testing.T) { + baseName := "my_metric_name" + for _, tc := range []struct { + desc string + baseName string + datatype pmetric.MetricDataType + expected string + expectErr bool + }{ + { + desc: "sum", + baseName: "foo_total", + datatype: pmetric.MetricDataTypeSum, + expected: "foo_total/counter", + }, + { + desc: "gauge", + baseName: "bar", + datatype: pmetric.MetricDataTypeGauge, + expected: "bar/gauge", + }, + { + desc: "summary sum", + baseName: "baz_sum", + datatype: pmetric.MetricDataTypeSummary, + expected: "baz_sum/summary:counter", + }, + { + desc: "summary count", + baseName: "baz_count", + datatype: pmetric.MetricDataTypeSummary, + expected: "baz_count/summary", + }, + { + desc: "summary quantile", + baseName: "baz", + datatype: pmetric.MetricDataTypeSummary, + expected: "baz/summary", + }, + { + desc: "histogram sum", + baseName: "hello_sum", + datatype: pmetric.MetricDataTypeHistogram, + expected: "hello_sum/histogram", + }, + { + desc: "histogram count", + baseName: "hello_count", + datatype: pmetric.MetricDataTypeHistogram, + expected: "hello_count/histogram", + }, + { + desc: "histogram bucket", + baseName: "hello", + datatype: pmetric.MetricDataTypeHistogram, + expected: "hello/histogram", + }, + { + desc: "other", + baseName: "other", + datatype: pmetric.MetricDataTypeExponentialHistogram, + expectErr: true, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + metric := pdata.NewMetric() + metric.SetDataType(tc.datatype) + got, err := GetMetricName(tc.baseName, metric) + if tc.expectErr == (err == nil) { + t.Errorf("MetricName(%v, %v)=err(%v); want err: %v", baseName, tc.datatype, err, tc.expectErr) + } + if got != tc.expected { + t.Errorf("MetricName(%v, %v)=%v; want %v", baseName, tc.datatype, got, tc.expected) + } + }) + } +} diff --git a/exporter/collector/integrationtest/config/config_test.go b/exporter/collector/integrationtest/config/config_test.go index 62626d326..501583b6c 100644 --- a/exporter/collector/integrationtest/config/config_test.go +++ b/exporter/collector/integrationtest/config/config_test.go @@ -45,11 +45,12 @@ func TestLoadConfig(t *testing.T) { assert.Equal(t, len(cfg.Exporters), 2) - r0 := cfg.Exporters[config.NewComponentID(typeStr)] - assert.Equal(t, r0, factory.CreateDefaultConfig()) + r0 := cfg.Exporters[config.NewComponentID(typeStr)].(*testExporterConfig) + defaultConfig := factory.CreateDefaultConfig().(*testExporterConfig) + assert.Equal(t, sanitize(r0), sanitize(defaultConfig)) r1 := cfg.Exporters[config.NewComponentIDWithName(typeStr, "customname")].(*testExporterConfig) - assert.Equal(t, r1, + assert.Equal(t, sanitize(r1), &testExporterConfig{ ExporterSettings: config.NewExporterSettings(config.NewComponentIDWithName(typeStr, "customname")), Config: collector.Config{ @@ -80,6 +81,12 @@ func TestLoadConfig(t *testing.T) { }) } +func sanitize(cfg *testExporterConfig) *testExporterConfig { + cfg.Config.MetricConfig.MapMonitoredResource = nil + cfg.Config.MetricConfig.GetMetricName = nil + return cfg +} + func newFactory() component.ExporterFactory { return component.NewExporterFactory( typeStr, diff --git a/exporter/collector/integrationtest/config/gmp_config_test.go b/exporter/collector/integrationtest/config/gmp_config_test.go new file mode 100644 index 000000000..a41fede31 --- /dev/null +++ b/exporter/collector/integrationtest/config/gmp_config_test.go @@ -0,0 +1,88 @@ +// Copyright 2022 Google LLC +// +// 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 config + +import ( + "path" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config" + "go.opentelemetry.io/collector/service/servicetest" + + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus" +) + +const ( + gmpTypeStr = "googlemanagedprometheus" +) + +func TestLoadGMPConfig(t *testing.T) { + factories, err := componenttest.NopFactories() + assert.Nil(t, err) + + factory := newGMPFactory() + factories.Exporters[gmpTypeStr] = factory + cfg, err := servicetest.LoadConfigAndValidate(path.Join("..", "testdata", "gmp_config.yaml"), factories) + + require.NoError(t, err) + require.NotNil(t, cfg) + + assert.Equal(t, len(cfg.Exporters), 2) + + r0 := cfg.Exporters[config.NewComponentID(gmpTypeStr)].(*gmpTestExporterConfig) + defaultConfig := factory.CreateDefaultConfig().(*gmpTestExporterConfig) + assert.Equal(t, r0, defaultConfig) + + r1 := cfg.Exporters[config.NewComponentIDWithName(gmpTypeStr, "customname")].(*gmpTestExporterConfig) + assert.Equal(t, r1, + &gmpTestExporterConfig{ + ExporterSettings: config.NewExporterSettings(config.NewComponentIDWithName(gmpTypeStr, "customname")), + GMPConfig: googlemanagedprometheus.GMPConfig{ + ProjectID: "my-project", + UserAgent: "opentelemetry-collector-contrib {{version}}", + ClientConfig: collector.ClientConfig{ + Endpoint: "test-metric-endpoint", + UseInsecure: true, + }, + }, + }) +} + +func newGMPFactory() component.ExporterFactory { + return component.NewExporterFactory( + gmpTypeStr, + func() config.Exporter { return defaultGMPConfig() }, + ) +} + +// gmpTestExporterConfig implements exporter.Config so we can test parsing of configuration +type gmpTestExporterConfig struct { + config.ExporterSettings `mapstructure:",squash"` + googlemanagedprometheus.GMPConfig `mapstructure:",squash"` +} + +func defaultGMPConfig() *gmpTestExporterConfig { + return &gmpTestExporterConfig{ + ExporterSettings: config.NewExporterSettings(config.NewComponentID(gmpTypeStr)), + GMPConfig: googlemanagedprometheus.GMPConfig{ + UserAgent: "opentelemetry-collector-contrib {{version}}", + }, + } +} diff --git a/exporter/collector/integrationtest/go.mod b/exporter/collector/integrationtest/go.mod index 43cfbff43..134d51b8d 100644 --- a/exporter/collector/integrationtest/go.mod +++ b/exporter/collector/integrationtest/go.mod @@ -5,6 +5,7 @@ go 1.17 require ( contrib.go.opencensus.io/exporter/stackdriver v0.13.11 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector v0.29.1 + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus v0.0.0-00010101000000-000000000000 github.com/google/go-cmp v0.5.7 github.com/stretchr/testify v1.7.1 go.opencensus.io v0.23.0 @@ -27,6 +28,7 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.5.1 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.29.1 // indirect github.com/aws/aws-sdk-go v1.42.49 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-logr/logr v1.2.3 // indirect @@ -60,6 +62,7 @@ require ( replace ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector => ../../collector + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus => ../../collector/googlemanagedprometheus github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace => ../../trace github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping => ../../../internal/resourcemapping ) diff --git a/exporter/collector/integrationtest/go.sum b/exporter/collector/integrationtest/go.sum index 9c45d5cb3..f46a0d8a0 100644 --- a/exporter/collector/integrationtest/go.sum +++ b/exporter/collector/integrationtest/go.sum @@ -83,6 +83,7 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= diff --git a/exporter/collector/integrationtest/testcases.go b/exporter/collector/integrationtest/testcases.go index 419940950..33b332529 100644 --- a/exporter/collector/integrationtest/testcases.go +++ b/exporter/collector/integrationtest/testcases.go @@ -14,7 +14,10 @@ package integrationtest -import "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" +import ( + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector" + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/collector/googlemanagedprometheus" +) var ( LogsTestCases = []TestCase{ @@ -106,6 +109,20 @@ var ( cfg.MetricConfig.ServiceResourceLabels = false }, }, + { + Name: "Google Managed Prometheus", + OTLPInputFixturePath: "testdata/fixtures/google_managed_prometheus.json", + ExpectFixturePath: "testdata/fixtures/google_managed_prometheus_expect.json", + Configure: func(cfg *collector.Config) { + cfg.MetricConfig.Prefix = "prometheus.googleapis.com/" + cfg.MetricConfig.SkipCreateMetricDescriptor = true + cfg.MetricConfig.GetMetricName = googlemanagedprometheus.GetMetricName + cfg.MetricConfig.MapMonitoredResource = googlemanagedprometheus.MapToPrometheusTarget + cfg.MetricConfig.InstrumentationLibraryLabels = false + cfg.MetricConfig.ServiceResourceLabels = false + cfg.MetricConfig.EnableSumOfSquaredDeviation = true + }, + }, { Name: "GKE Metrics Agent", OTLPInputFixturePath: "testdata/fixtures/gke_metrics_agent_metrics.json", diff --git a/exporter/collector/integrationtest/testdata/config.yaml b/exporter/collector/integrationtest/testdata/config.yaml index 80d9aafaa..41d862496 100644 --- a/exporter/collector/integrationtest/testdata/config.yaml +++ b/exporter/collector/integrationtest/testdata/config.yaml @@ -24,4 +24,8 @@ service: receivers: [nop] processors: [nop] exporters: [googlecloud] + metrics: + receivers: [nop] + processors: [nop] + exporters: [googlecloud] diff --git a/exporter/collector/integrationtest/testdata/fixtures/basic_counter_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/basic_counter_metrics_expect.json index e75e53eaa..c0fc56136 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/basic_counter_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/basic_counter_metrics_expect.json @@ -596,6 +596,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/basic_prometheus_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/basic_prometheus_metrics_expect.json index 8ee8942a4..753612769 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/basic_prometheus_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/basic_prometheus_metrics_expect.json @@ -1057,6 +1057,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/batching_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/batching_metrics_expect.json index 4289f937b..abf3b1413 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/batching_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/batching_metrics_expect.json @@ -8714,6 +8714,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/create_service_timeseries_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/create_service_timeseries_metrics_expect.json index 36bb2291b..ca784d937 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/create_service_timeseries_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/create_service_timeseries_metrics_expect.json @@ -320,6 +320,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/delta_counter_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/delta_counter_metrics_expect.json index 65ffeef12..d2624ff39 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/delta_counter_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/delta_counter_metrics_expect.json @@ -596,6 +596,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/exponential_histogram_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/exponential_histogram_metrics_expect.json index 0cf9250e9..b4db11702 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/exponential_histogram_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/exponential_histogram_metrics_expect.json @@ -769,6 +769,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/gke_control_plane_metrics_agent_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/gke_control_plane_metrics_agent_metrics_expect.json index 47a77742a..6a94e46eb 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/gke_control_plane_metrics_agent_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/gke_control_plane_metrics_agent_metrics_expect.json @@ -1350,6 +1350,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/gke_metrics_agent_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/gke_metrics_agent_metrics_expect.json index c8d72615c..c56eb6825 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/gke_metrics_agent_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/gke_metrics_agent_metrics_expect.json @@ -4334,6 +4334,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus.json b/exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus.json new file mode 100644 index 000000000..f44f187d0 --- /dev/null +++ b/exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus.json @@ -0,0 +1,368 @@ +{ + "resourceMetrics":[ + { + "resource":{ + "attributes":[ + { + "key":"cloud.availability_zone", + "value":{ + "stringValue":"us-central1-c" + } + }, + { + "key":"k8s.container.name", + "value":{ + "stringValue":"rabbitmq" + } + }, + { + "key":"k8s.node.name", + "value":{ + "stringValue":"10.92.5.2" + } + }, + { + "key":"k8s.cluster.name", + "value":{ + "stringValue":"rabbitmq-test-dev" + } + }, + { + "key":"k8s.namespace.name", + "value":{ + "stringValue":"default" + } + }, + { + "key":"k8s.pod.name", + "value":{ + "stringValue":"rabbitmq-server-0" + } + }, + { + "key":"cloud.platform", + "value":{ + "stringValue":"gcp_kubernetes_engine" + } + }, + { + "key":"service.name", + "value":{ + "stringValue":"demo" + } + }, + { + "key":"service.instance.id", + "value":{ + "stringValue":"10.92.5.2:15692" + } + }, + { + "key":"net.host.port", + "value":{ + "stringValue":"15692" + } + }, + { + "key":"net.host.ip", + "value":{ + "stringValue":"10.92.5.2" + } + }, + { + "key":"http.scheme", + "value":{ + "stringValue":"http" + } + } + ] + }, + "instrumentationLibraryMetrics":[ + { + "instrumentationLibrary":{}, + "metrics":[ + { + "name":"scrape_series_added", + "description":"The approximate number of new series in this scrape", + "gauge":{ + "dataPoints":[ + { + "timeUnixNano":"1649443516286000000", + "asDouble":22 + } + ] + } + }, + { + "name":"ex_com_one", + "gauge":{ + "dataPoints":[ + { + "attributes":[ + { + "key":"ex_com_lemons", + "value":{ + "stringValue":"13" + } + } + ], + "timeUnixNano":"1649443516286000000", + "asDouble":1 + }, + { + "attributes":[ + { + "key":"A", + "value":{ + "stringValue":"1" + } + }, + { + "key":"B", + "value":{ + "stringValue":"2" + } + }, + { + "key":"C", + "value":{ + "stringValue":"3" + } + }, + { + "key":"ex_com_lemons", + "value":{ + "stringValue":"10" + } + } + ], + "timeUnixNano":"1649443516286000000", + "asDouble":13 + } + ] + } + }, + { + "name":"ex_com_two", + "histogram":{ + "dataPoints":[ + { + "attributes":[ + { + "key":"ex_com_lemons", + "value":{ + "stringValue":"13" + } + } + ], + "startTimeUnixNano":"1649443516286000000", + "timeUnixNano":"1649443516286000000", + "count":"1", + "sum":2, + "bucketCounts":[ + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ], + "explicitBounds":[ + 1, + 2, + 5, + 10, + 20, + 50 + ] + }, + { + "attributes":[ + { + "key":"A", + "value":{ + "stringValue":"1" + } + }, + { + "key":"B", + "value":{ + "stringValue":"2" + } + }, + { + "key":"C", + "value":{ + "stringValue":"3" + } + }, + { + "key":"ex_com_lemons", + "value":{ + "stringValue":"10" + } + } + ], + "startTimeUnixNano":"1649443516286000000", + "timeUnixNano":"1649443516286000000", + "count":"2", + "sum":14, + "bucketCounts":[ + "0", + "0", + "1", + "0", + "1", + "0", + "0" + ], + "explicitBounds":[ + 1, + 2, + 5, + 10, + 20, + 50 + ] + } + ], + "aggregationTemporality":"AGGREGATION_TEMPORALITY_CUMULATIVE" + } + }, + { + "name":"ex_com_three", + "summary":{ + "dataPoints":[ + { + "attributes":[ + { + "key":"ex_com_lemons", + "value":{ + "stringValue":"13" + } + } + ], + "startTimeUnixNano":"1649443516286000000", + "timeUnixNano":"1649443516286000000", + "count":"1", + "sum":2, + "quantile_values": [ + { + "quantile": 0.5, + "value": 10.2 + }, + { + "quantile": 0.75, + "value": 25.5 + }, + { + "quantile": 0.9, + "value": 100.2 + } + ] + }, + { + "attributes":[ + { + "key":"A", + "value":{ + "stringValue":"1" + } + }, + { + "key":"B", + "value":{ + "stringValue":"2" + } + }, + { + "key":"C", + "value":{ + "stringValue":"3" + } + }, + { + "key":"ex_com_lemons", + "value":{ + "stringValue":"10" + } + } + ], + "startTimeUnixNano":"1649443516286000000", + "timeUnixNano":"1649443516286000000", + "count":"2", + "sum":14, + "quantile_values": [ + { + "quantile": 0.5, + "value": 9.3 + }, + { + "quantile": 0.75, + "value": 12.4 + }, + { + "quantile": 0.9, + "value": 300.2 + } + ] + } + ] + } + }, + { + "name":"up", + "description":"The scraping was successful", + "gauge":{ + "dataPoints":[ + { + "timeUnixNano":"1649443516286000000", + "asDouble":1 + } + ] + } + }, + { + "name":"scrape_duration_seconds", + "description":"Duration of the scrape", + "unit":"seconds", + "gauge":{ + "dataPoints":[ + { + "timeUnixNano":"1649443516286000000", + "asDouble":0.00699415 + } + ] + } + }, + { + "name":"scrape_samples_scraped", + "description":"The number of samples the target exposed", + "gauge":{ + "dataPoints":[ + { + "timeUnixNano":"1649443516286000000", + "asDouble":22 + } + ] + } + }, + { + "name":"scrape_samples_post_metric_relabeling", + "description":"The number of samples remaining after metric relabeling was applied", + "gauge":{ + "dataPoints":[ + { + "timeUnixNano":"1649443516286000000", + "asDouble":22 + } + ] + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus_expect.json b/exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus_expect.json new file mode 100644 index 000000000..1c097467b --- /dev/null +++ b/exporter/collector/integrationtest/testdata/fixtures/google_managed_prometheus_expect.json @@ -0,0 +1,1074 @@ +{ + "createTimeSeriesRequests": [ + { + "timeSeries": [ + { + "metric": { + "type": "prometheus.googleapis.com/scrape_series_added/gauge" + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 22 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_one/gauge", + "labels": { + "ex_com_lemons": "13" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 1 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_one/gauge", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 13 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_two/histogram", + "labels": { + "ex_com_lemons": "13" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "CUMULATIVE", + "valueType": "DISTRIBUTION", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "distributionValue": { + "count": "1", + "mean": 2, + "sumOfSquaredDeviation": 2.25, + "bucketOptions": { + "explicitBuckets": { + "bounds": [ + 1, + 2, + 5, + 10, + 20, + 50 + ] + } + }, + "bucketCounts": [ + "0", + "0", + "1", + "0", + "0", + "0", + "0" + ] + } + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_two/histogram", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "CUMULATIVE", + "valueType": "DISTRIBUTION", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "distributionValue": { + "count": "2", + "mean": 7, + "sumOfSquaredDeviation": 76.25, + "bucketOptions": { + "explicitBuckets": { + "bounds": [ + 1, + 2, + 5, + 10, + 20, + 50 + ] + } + }, + "bucketCounts": [ + "0", + "0", + "1", + "0", + "1", + "0", + "0" + ] + } + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three_sum/summary:counter", + "labels": { + "ex_com_lemons": "13" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "CUMULATIVE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 2 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three_count/summary", + "labels": { + "ex_com_lemons": "13" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "CUMULATIVE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 1 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three/summary", + "labels": { + "ex_com_lemons": "13", + "quantile": "0.5" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 10.2 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three/summary", + "labels": { + "ex_com_lemons": "13", + "quantile": "0.75" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 25.5 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three/summary", + "labels": { + "ex_com_lemons": "13", + "quantile": "0.9" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 100.2 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three_sum/summary:counter", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "CUMULATIVE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 14 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three_count/summary", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "CUMULATIVE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 2 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three/summary", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10", + "quantile": "0.5" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 9.3 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three/summary", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10", + "quantile": "0.75" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 12.4 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/ex_com_three/summary", + "labels": { + "A": "1", + "B": "2", + "C": "3", + "ex_com_lemons": "10", + "quantile": "0.9" + } + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 300.2 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/up/gauge" + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 1 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/scrape_duration_seconds/gauge" + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 0.00699415 + } + } + ], + "unit": "seconds" + }, + { + "metric": { + "type": "prometheus.googleapis.com/scrape_samples_scraped/gauge" + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 22 + } + } + ] + }, + { + "metric": { + "type": "prometheus.googleapis.com/scrape_samples_post_metric_relabeling/gauge" + }, + "resource": { + "type": "prometheus_target", + "labels": { + "cluster": "rabbitmq-test-dev", + "instance": "10.92.5.2:15692", + "job": "demo", + "location": "us-central1-c", + "namespace": "default" + } + }, + "metricKind": "GAUGE", + "valueType": "DOUBLE", + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z" + }, + "value": { + "doubleValue": 22 + } + } + ] + } + ] + } + ], + "selfObservabilityMetrics": { + "createTimeSeriesRequests": [ + { + "timeSeries": [ + { + "metric": { + "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", + "labels": { + "status": "OK" + } + }, + "resource": { + "type": "global" + }, + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "int64Value": "19" + } + } + ] + }, + { + "metric": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/completed_rpcs", + "labels": { + "grpc_client_method": "google.monitoring.v3.MetricService/CreateTimeSeries", + "grpc_client_status": "OK" + } + }, + "resource": { + "type": "global" + }, + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "int64Value": "1" + } + } + ] + }, + { + "metric": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/received_bytes_per_rpc", + "labels": { + "grpc_client_method": "google.monitoring.v3.MetricService/CreateTimeSeries" + } + }, + "resource": { + "type": "global" + }, + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "distributionValue": { + "bucketOptions": { + "explicitBuckets": { + "bounds": [ + 0, + 1024, + 2048, + 4096, + 16384, + 65536, + 262144, + 1048576, + 4194304, + 16777216, + 67108864, + 268435456, + 1073741824, + 4294967296 + ] + } + }, + "bucketCounts": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ] + } + } + } + ] + }, + { + "metric": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/roundtrip_latency", + "labels": { + "grpc_client_method": "google.monitoring.v3.MetricService/CreateTimeSeries" + } + }, + "resource": { + "type": "global" + }, + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "distributionValue": { + "bucketOptions": { + "explicitBuckets": { + "bounds": [ + 0, + 0.01, + 0.05, + 0.1, + 0.3, + 0.6, + 0.8, + 1, + 2, + 3, + 4, + 5, + 6, + 8, + 10, + 13, + 16, + 20, + 25, + 30, + 40, + 50, + 65, + 80, + 100, + 130, + 160, + 200, + 250, + 300, + 400, + 500, + 650, + 800, + 1000, + 2000, + 5000, + 10000, + 20000, + 50000, + 100000 + ] + } + }, + "bucketCounts": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ] + } + } + } + ] + }, + { + "metric": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/sent_bytes_per_rpc", + "labels": { + "grpc_client_method": "google.monitoring.v3.MetricService/CreateTimeSeries" + } + }, + "resource": { + "type": "global" + }, + "points": [ + { + "interval": { + "endTime": "1970-01-01T00:00:00Z", + "startTime": "1970-01-01T00:00:00Z" + }, + "value": { + "distributionValue": { + "bucketOptions": { + "explicitBuckets": { + "bounds": [ + 0, + 1024, + 2048, + 4096, + 16384, + 65536, + 262144, + 1048576, + 4194304, + 16777216, + 67108864, + 268435456, + 1073741824, + 4294967296 + ] + } + }, + "bucketCounts": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ] + } + } + } + ] + } + ] + } + ], + "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", + "labels": [ + { + "key": "status" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Count of metric points written to Cloud Monitoring.", + "displayName": "OpenCensus/googlecloudmonitoring/point_count" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/completed_rpcs", + "labels": [ + { + "key": "grpc_client_method" + }, + { + "key": "grpc_client_status" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Count of RPCs by method and status.", + "displayName": "OpenCensus/grpc.io/client/completed_rpcs" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/received_bytes_per_rpc", + "labels": [ + { + "key": "grpc_client_method" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "DISTRIBUTION", + "unit": "By", + "description": "Distribution of bytes received per RPC, by method.", + "displayName": "OpenCensus/grpc.io/client/received_bytes_per_rpc" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/roundtrip_latency", + "labels": [ + { + "key": "grpc_client_method" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "DISTRIBUTION", + "unit": "ms", + "description": "Distribution of round-trip latency, by method.", + "displayName": "OpenCensus/grpc.io/client/roundtrip_latency" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/grpc.io/client/sent_bytes_per_rpc", + "labels": [ + { + "key": "grpc_client_method" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "DISTRIBUTION", + "unit": "By", + "description": "Distribution of bytes sent per RPC, by method.", + "displayName": "OpenCensus/grpc.io/client/sent_bytes_per_rpc" + } + } + ] + } +} diff --git a/exporter/collector/integrationtest/testdata/fixtures/nonmonotonic_counter_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/nonmonotonic_counter_metrics_expect.json index 9536490a0..4d584bd3c 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/nonmonotonic_counter_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/nonmonotonic_counter_metrics_expect.json @@ -595,6 +595,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/ops_agent_host_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/ops_agent_host_metrics_expect.json index 1989a10a9..7aa2f5022 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/ops_agent_host_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/ops_agent_host_metrics_expect.json @@ -3437,6 +3437,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/ops_agent_self_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/ops_agent_self_metrics_expect.json index affdad2c8..fa31cca35 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/ops_agent_self_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/ops_agent_self_metrics_expect.json @@ -344,6 +344,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/summary_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/summary_metrics_expect.json index 8977f5a33..3fb5513a2 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/summary_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/summary_metrics_expect.json @@ -750,6 +750,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/unknown_domain_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/unknown_domain_metrics_expect.json index 2c095a821..8b4beebcc 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/unknown_domain_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/unknown_domain_metrics_expect.json @@ -596,6 +596,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/with_resource_filter_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/with_resource_filter_metrics_expect.json index 0fee7230c..d3f1c14c8 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/with_resource_filter_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/with_resource_filter_metrics_expect.json @@ -617,6 +617,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/workload_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/workload_metrics_expect.json index 65d9db880..42811f59a 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/workload_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/workload_metrics_expect.json @@ -6690,6 +6690,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/fixtures/workloadgoogleapis_prefix_metrics_expect.json b/exporter/collector/integrationtest/testdata/fixtures/workloadgoogleapis_prefix_metrics_expect.json index e75e53eaa..c0fc56136 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/workloadgoogleapis_prefix_metrics_expect.json +++ b/exporter/collector/integrationtest/testdata/fixtures/workloadgoogleapis_prefix_metrics_expect.json @@ -596,6 +596,66 @@ } ], "createMetricDescriptorRequests": [ + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_log_records", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of log records failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_log_records" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_metric_points", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of metric points failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_metric_points" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/enqueue_failed_spans", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "CUMULATIVE", + "valueType": "INT64", + "unit": "1", + "description": "Number of spans failed to be added to the sending queue.", + "displayName": "OpenCensus/exporter/enqueue_failed_spans" + } + }, + { + "metricDescriptor": { + "type": "custom.googleapis.com/opencensus/exporter/queue_size", + "labels": [ + { + "key": "exporter" + } + ], + "metricKind": "GAUGE", + "valueType": "INT64", + "unit": "1", + "description": "Current size of the retry queue (in batches)", + "displayName": "OpenCensus/exporter/queue_size" + } + }, { "metricDescriptor": { "type": "custom.googleapis.com/opencensus/googlecloudmonitoring/point_count", diff --git a/exporter/collector/integrationtest/testdata/gmp_config.yaml b/exporter/collector/integrationtest/testdata/gmp_config.yaml new file mode 100644 index 000000000..3d8b65f8d --- /dev/null +++ b/exporter/collector/integrationtest/testdata/gmp_config.yaml @@ -0,0 +1,20 @@ +receivers: + nop: + +processors: + nop: + +exporters: + googlemanagedprometheus: + googlemanagedprometheus/customname: + project: my-project + user_agent: opentelemetry-collector-contrib {{version}} + endpoint: test-metric-endpoint + use_insecure: true + +service: + pipelines: + metrics: + receivers: [nop] + processors: [nop] + exporters: [googlemanagedprometheus] diff --git a/exporter/collector/logs.go b/exporter/collector/logs.go index 5546960b7..1deedd4a3 100644 --- a/exporter/collector/logs.go +++ b/exporter/collector/logs.go @@ -169,12 +169,10 @@ func (l *LogsExporter) PushLogs(ctx context.Context, ld plog.Logs) error { func (l logMapper) createEntries(ld plog.Logs) ([]*logpb.LogEntry, error) { errors := []error{} - mapper := &metricMapper{} // Refactor metricMapper to map MRs for logging? - entries := make([]*logpb.LogEntry, 0, 0) for i := 0; i < ld.ResourceLogs().Len(); i++ { rl := ld.ResourceLogs().At(i) - mr, _ := mapper.resourceToMonitoredResource(rl.Resource()) + mr := defaultResourceToMonitoredResource(rl.Resource()) for j := 0; j < rl.ScopeLogs().Len(); j++ { sl := rl.ScopeLogs().At(j) diff --git a/exporter/collector/metrics.go b/exporter/collector/metrics.go index 119f56305..375cce5cb 100644 --- a/exporter/collector/metrics.go +++ b/exporter/collector/metrics.go @@ -172,7 +172,8 @@ func (me *MetricsExporter) PushMetrics(ctx context.Context, m pdata.Metrics) err rms := m.ResourceMetrics() for i := 0; i < rms.Len(); i++ { rm := rms.At(i) - monitoredResource, extraResourceLabels := me.mapper.resourceToMonitoredResource(rm.Resource()) + monitoredResource := me.cfg.MetricConfig.MapMonitoredResource(rm.Resource()) + extraResourceLabels := me.mapper.resourceToMetricLabels(rm.Resource()) sms := rm.ScopeMetrics() for j := 0; j < sms.Len(); j++ { sm := sms.At(j) @@ -393,7 +394,11 @@ func (m *metricMapper) summaryPointToTimeSeries( return nil } point = *normalizedPoint - sumName, countName := summaryMetricNames(metric.Name()) + sumType, countType, quantileType, err := m.summaryMetricTypes(metric) + if err != nil { + m.obs.log.Debug("Failed to get metric type (i.e. name) for summary metric. Dropping the metric.", zap.Error(err), zap.Any("metric", metric)) + return nil + } startTime := timestamppb.New(point.StartTimestamp().AsTime()) endTime := timestamppb.New(point.Timestamp().AsTime()) result := []*monitoringpb.TimeSeries{ @@ -412,7 +417,7 @@ func (m *metricMapper) summaryPointToTimeSeries( }}, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(sumName), + Type: sumType, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -434,7 +439,7 @@ func (m *metricMapper) summaryPointToTimeSeries( }}, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(countName), + Type: countType, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -462,7 +467,7 @@ func (m *metricMapper) summaryPointToTimeSeries( }}, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(metric.Name()), + Type: quantileType, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -633,6 +638,11 @@ func (m *metricMapper) histogramToTimeSeries( // Drop points without a value or without a sum return nil } + t, err := m.metricNameToType(metric.Name(), metric) + if err != nil { + m.obs.log.Debug("Failed to get metric type (i.e. name) for histogram metric. Dropping the metric.", zap.Error(err), zap.Any("metric", metric)) + return nil + } if hist.AggregationTemporality() == pmetric.MetricAggregationTemporalityCumulative { // Normalize cumulative histogram points. metricIdentifier := datapointstorage.Identifier(resource, extraLabels, metric, point.Attributes()) @@ -661,7 +671,7 @@ func (m *metricMapper) histogramToTimeSeries( Value: value, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(metric.Name()), + Type: t, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -681,6 +691,11 @@ func (m *metricMapper) exponentialHistogramToTimeSeries( // Drop points without a value. return nil } + t, err := m.metricNameToType(metric.Name(), metric) + if err != nil { + m.obs.log.Debug("Failed to get metric type (i.e. name) for exponential histogram metric. Dropping the metric.", zap.Error(err), zap.Any("metric", metric)) + return nil + } if exponentialHist.AggregationTemporality() == pmetric.MetricAggregationTemporalityCumulative { // Normalize the histogram point. metricIdentifier := datapointstorage.Identifier(resource, extraLabels, metric, point.Attributes()) @@ -708,7 +723,7 @@ func (m *metricMapper) exponentialHistogramToTimeSeries( Value: value, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(metric.Name()), + Type: t, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -731,6 +746,11 @@ func (m *metricMapper) sumPointToTimeSeries( // prometheus. return nil } + t, err := m.metricNameToType(metric.Name(), metric) + if err != nil { + m.obs.log.Debug("Failed to get metric type (i.e. name) for sum metric. Dropping the metric.", zap.Error(err), zap.Any("metric", metric)) + return nil + } if sum.IsMonotonic() { if sum.AggregationTemporality() == pmetric.MetricAggregationTemporalityCumulative { metricIdentifier := datapointstorage.Identifier(resource, extraLabels, metric, point.Attributes()) @@ -760,7 +780,7 @@ func (m *metricMapper) sumPointToTimeSeries( Value: value, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(metric.Name()), + Type: t, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -780,6 +800,11 @@ func (m *metricMapper) gaugePointToTimeSeries( // Drop points without a value. return nil } + t, err := m.metricNameToType(metric.Name(), metric) + if err != nil { + m.obs.log.Debug("Unable to get metric type (i.e. name) for gauge metric.", zap.Error(err), zap.Any("metric", metric)) + return nil + } metricKind := metricpb.MetricDescriptor_GAUGE value, valueType := numberDataPointToValue(point) @@ -795,7 +820,7 @@ func (m *metricMapper) gaugePointToTimeSeries( Value: value, }}, Metric: &metricpb.Metric{ - Type: m.metricNameToType(metric.Name()), + Type: t, Labels: mergeLabels( attributesToLabels(point.Attributes()), extraLabels, @@ -815,8 +840,17 @@ func (m *metricMapper) getMetricNamePrefix(name string) string { } // metricNameToType maps OTLP metric name to GCM metric type (aka name) -func (m *metricMapper) metricNameToType(name string) string { - return path.Join(m.getMetricNamePrefix(name), name) +func (m *metricMapper) metricNameToType(name string, metric pdata.Metric) (string, error) { + metricName, err := m.cfg.MetricConfig.GetMetricName(name, metric) + if err != nil { + return "", err + } + return path.Join(m.getMetricNamePrefix(name), metricName), nil +} + +// defaultGetMetricName does not (further) customize the baseName +func defaultGetMetricName(baseName string, _ pdata.Metric) (string, error) { + return baseName, nil } func numberDataPointToValue( @@ -951,40 +985,54 @@ func (m *metricMapper) labelDescriptors( return result } -// Returns (sum, count) metric names for a summary metric. -func summaryMetricNames(name string) (string, string) { - sumName := fmt.Sprintf("%s%s", name, SummarySumSuffix) - countName := fmt.Sprintf("%s%s", name, SummaryCountPrefix) - return sumName, countName +// Returns (sum, count, quantile) metric types (i.e. names) for a summary metric. +func (m *metricMapper) summaryMetricTypes(pm pdata.Metric) (string, string, string, error) { + sumType, err := m.metricNameToType(pm.Name()+SummarySumSuffix, pm) + if err != nil { + return "", "", "", err + } + countType, err := m.metricNameToType(pm.Name()+SummaryCountPrefix, pm) + if err != nil { + return "", "", "", err + } + quantileType, err := m.metricNameToType(pm.Name(), pm) + if err != nil { + return "", "", "", err + } + return sumType, countType, quantileType, nil } func (m *metricMapper) summaryMetricDescriptors( pm pdata.Metric, extraLabels labels, ) []*metricpb.MetricDescriptor { - sumName, countName := summaryMetricNames(pm.Name()) + sumType, countType, quantileType, err := m.summaryMetricTypes(pm) + if err != nil { + m.obs.log.Debug("Failed to get metric types (i.e. names) for summary metric. Dropping the metric.", zap.Error(err), zap.Any("metric", pm)) + return nil + } labels := m.labelDescriptors(pm, extraLabels) return []*metricpb.MetricDescriptor{ { - Type: m.metricNameToType(sumName), + Type: sumType, Labels: labels, MetricKind: metricpb.MetricDescriptor_CUMULATIVE, ValueType: metricpb.MetricDescriptor_DOUBLE, Unit: pm.Unit(), Description: pm.Description(), - DisplayName: sumName, + DisplayName: pm.Name() + SummarySumSuffix, }, { - Type: m.metricNameToType(countName), + Type: countType, Labels: labels, MetricKind: metricpb.MetricDescriptor_CUMULATIVE, ValueType: metricpb.MetricDescriptor_DOUBLE, Unit: pm.Unit(), Description: pm.Description(), - DisplayName: countName, + DisplayName: pm.Name() + SummaryCountPrefix, }, { - Type: m.metricNameToType(pm.Name()), + Type: quantileType, Labels: append( labels, &label.LabelDescriptor{ @@ -1009,7 +1057,11 @@ func (m *metricMapper) metricDescriptor( return m.summaryMetricDescriptors(pm, extraLabels) } kind, typ := mapMetricPointKind(pm) - metricType := m.metricNameToType(pm.Name()) + metricType, err := m.metricNameToType(pm.Name(), pm) + if err != nil { + m.obs.log.Debug("Failed to get metric type (i.e. name) for metric descriptor. Dropping the metric descriptor.", zap.Error(err), zap.Any("metric", pm)) + return nil + } labels := m.labelDescriptors(pm, extraLabels) // Return nil for unsupported types. if kind == metricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED { diff --git a/exporter/collector/metrics_test.go b/exporter/collector/metrics_test.go index fcd2d8cff..2d5ce8feb 100644 --- a/exporter/collector/metrics_test.go +++ b/exporter/collector/metrics_test.go @@ -1408,9 +1408,12 @@ func TestSummaryPointWithoutStartTimeToTimeSeries(t *testing.T) { func TestMetricNameToType(t *testing.T) { mapper, shutdown := newTestMetricMapper() defer shutdown() + metric := pdata.NewMetric() + got, err := mapper.metricNameToType("foo", metric) + assert.NoError(t, err) assert.Equal( t, - mapper.metricNameToType("foo"), + got, "workload.googleapis.com/foo", "Should use workload metric domain with default config", ) @@ -1915,12 +1918,15 @@ func TestKnownDomains(t *testing.T) { for _, test := range tests { t.Run(fmt.Sprintf("%v to %v", test.name, test.metricType), func(t *testing.T) { mapper, shutdown := newTestMetricMapper() + metric := pdata.NewMetric() defer shutdown() if len(test.knownDomains) > 0 { mapper.cfg.MetricConfig.KnownDomains = test.knownDomains } mapper.cfg.MetricConfig.Prefix = "prefix" - assert.Equal(t, test.metricType, mapper.metricNameToType(test.name)) + metricType, err := mapper.metricNameToType(test.name, metric) + assert.NoError(t, err) + assert.Equal(t, test.metricType, metricType) }) } } diff --git a/exporter/collector/monitoredresource.go b/exporter/collector/monitoredresource.go index 99601d17a..c4819b59c 100644 --- a/exporter/collector/monitoredresource.go +++ b/exporter/collector/monitoredresource.go @@ -37,11 +37,8 @@ func (attrs *attributes) GetString(key string) (string, bool) { return "", false } -// Transforms pdata Resource to a GCM Monitored Resource. Any additional metric labels from the -// resource are also returned. -func (m *metricMapper) resourceToMonitoredResource( - resource pdata.Resource, -) (*monitoredrespb.MonitoredResource, labels) { +// defaultResourceToMonitoredResource pdata Resource to a GCM Monitored Resource. +func defaultResourceToMonitoredResource(resource pdata.Resource) *monitoredrespb.MonitoredResource { attrs := resource.Attributes() gmr := resourcemapping.ResourceAttributesToMonitoredResource(&attributes{ Attrs: &attrs, @@ -54,7 +51,7 @@ func (m *metricMapper) resourceToMonitoredResource( Type: gmr.Type, Labels: newLabels, } - return mr, m.resourceToMetricLabels(resource) + return mr } // resourceToMetricLabels converts the Resource into metric labels needed to uniquely identify diff --git a/exporter/collector/monitoredresource_test.go b/exporter/collector/monitoredresource_test.go index 48ae4fc07..69ce4ef5d 100644 --- a/exporter/collector/monitoredresource_test.go +++ b/exporter/collector/monitoredresource_test.go @@ -24,11 +24,9 @@ import ( func TestResourceMetricsToMonitoredResource(t *testing.T) { tests := []struct { - name string - resourceLabels map[string]string - expectMr *monitoredrespb.MonitoredResource - expectExtraLabels labels - updateMapper func(mapper *metricMapper) + name string + resourceLabels map[string]string + expectMr *monitoredrespb.MonitoredResource }{ { name: "GCE instance", @@ -41,7 +39,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { Type: "gce_instance", Labels: map[string]string{"instance_id": "abc123", "zone": "us-central1"}, }, - expectExtraLabels: labels{}, }, { name: "GCE with OTel service attribs", @@ -57,49 +54,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { Type: "gce_instance", Labels: map[string]string{"instance_id": "abc123", "zone": "us-central1"}, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - "service_name": "myservicename", - "service_instance_id": "myserviceinstanceid", - }, - }, - { - name: "GCE disable OTel service attribs", - updateMapper: func(mapper *metricMapper) { - mapper.cfg.MetricConfig.ServiceResourceLabels = false - }, - resourceLabels: map[string]string{ - "cloud.platform": "gcp_compute_engine", - "cloud.availability_zone": "us-central1", - "host.id": "abc123", - "service.namespace": "myservicenamespace", - "service.name": "myservicename", - "service.instance.id": "myserviceinstanceid", - }, - expectMr: &monitoredrespb.MonitoredResource{ - Type: "gce_instance", - Labels: map[string]string{"instance_id": "abc123", "zone": "us-central1"}, - }, - expectExtraLabels: labels{}, - }, - { - name: "GCE with resource filter config", - updateMapper: func(mapper *metricMapper) { - mapper.cfg.MetricConfig.ResourceFilters = []ResourceFilter{{Prefix: "cloud."}} - }, - resourceLabels: map[string]string{ - "cloud.platform": "gcp_compute_engine", - "cloud.availability_zone": "us-central1", - "host.id": "abc123", - }, - expectMr: &monitoredrespb.MonitoredResource{ - Type: "gce_instance", - Labels: map[string]string{"instance_id": "abc123", "zone": "us-central1"}, - }, - expectExtraLabels: labels{ - "cloud_platform": "gcp_compute_engine", - "cloud_availability_zone": "us-central1", - }, }, { name: "K8s container", @@ -121,7 +75,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "pod_name": "mypod", }, }, - expectExtraLabels: labels{}, }, { name: "K8s pod", @@ -141,7 +94,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "pod_name": "mypod", }, }, - expectExtraLabels: labels{}, }, { name: "K8s node", @@ -159,7 +111,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "node_name": "mynode", }, }, - expectExtraLabels: labels{}, }, { name: "K8s cluster", @@ -175,7 +126,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "location": "us-central1", }, }, - expectExtraLabels: labels{}, }, { name: "AWS ec2 instance", @@ -193,7 +143,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "region": "us-central1", }, }, - expectExtraLabels: labels{}, }, { name: "Generic task no cloud.platform", @@ -213,11 +162,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "task_id": "myserviceinstanceid", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - "service_name": "myservicename", - "service_instance_id": "myserviceinstanceid", - }, }, { name: "Generic task no location", @@ -235,11 +179,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "task_id": "myserviceinstanceid", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - "service_name": "myservicename", - "service_instance_id": "myserviceinstanceid", - }, }, { name: "Generic task unrecognized cloud.platform", @@ -259,11 +198,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "task_id": "myserviceinstanceid", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - "service_name": "myservicename", - "service_instance_id": "myserviceinstanceid", - }, }, { name: "Generic task without cloud.availability_zone region", @@ -283,11 +217,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "task_id": "myserviceinstanceid", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - "service_name": "myservicename", - "service_instance_id": "myserviceinstanceid", - }, }, { name: "Generic node", @@ -308,10 +237,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "node_id": "myhostid", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - "service_name": "myservicename", - }, }, { name: "Generic node without cloud.availability_zone", @@ -329,9 +254,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "node_id": "myhostid", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - }, }, { name: "Generic node without host.id", @@ -348,9 +270,6 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "node_id": "myhostname", }, }, - expectExtraLabels: labels{ - "service_namespace": "myservicenamespace", - }, }, { name: "Generic node with no labels", @@ -363,8 +282,180 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { "node_id": "", }, }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + r := pdata.NewResource() + for k, v := range test.resourceLabels { + r.Attributes().InsertString(k, v) + } + mr := defaultResourceToMonitoredResource(r) + assert.Equal(t, test.expectMr, mr) + }) + } +} + +func TestResourceToMetricLabels(t *testing.T) { + tests := []struct { + name string + resourceLabels map[string]string + expectExtraLabels labels + updateMapper func(mapper *metricMapper) + }{ + { + name: "No Extra labels", + resourceLabels: map[string]string{ + "cloud.platform": "gcp_compute_engine", + "cloud.availability_zone": "us-central1", + "host.id": "abc123", + }, expectExtraLabels: labels{}, }, + { + name: "GCE with OTel service attribs", + resourceLabels: map[string]string{ + "cloud.platform": "gcp_compute_engine", + "cloud.availability_zone": "us-central1", + "host.id": "abc123", + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + "service_name": "myservicename", + "service_instance_id": "myserviceinstanceid", + }, + }, + { + name: "GCE disable OTel service attribs", + updateMapper: func(mapper *metricMapper) { + mapper.cfg.MetricConfig.ServiceResourceLabels = false + }, + resourceLabels: map[string]string{ + "cloud.platform": "gcp_compute_engine", + "cloud.availability_zone": "us-central1", + "host.id": "abc123", + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expectExtraLabels: labels{}, + }, + { + name: "GCE with resource filter config", + updateMapper: func(mapper *metricMapper) { + mapper.cfg.MetricConfig.ResourceFilters = []ResourceFilter{{Prefix: "cloud."}} + }, + resourceLabels: map[string]string{ + "cloud.platform": "gcp_compute_engine", + "cloud.availability_zone": "us-central1", + "host.id": "abc123", + }, + expectExtraLabels: labels{ + "cloud_platform": "gcp_compute_engine", + "cloud_availability_zone": "us-central1", + }, + }, + { + name: "Generic task no cloud.platform", + resourceLabels: map[string]string{ + "cloud.availability_zone": "us-central1", + "cloud.region": "my-region", + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + "service_name": "myservicename", + "service_instance_id": "myserviceinstanceid", + }, + }, + { + name: "Generic task no location", + resourceLabels: map[string]string{ + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + "service_name": "myservicename", + "service_instance_id": "myserviceinstanceid", + }, + }, + { + name: "Generic task unrecognized cloud.platform", + resourceLabels: map[string]string{ + "cloud.platform": "fooprovider_kubernetes_service", + "cloud.availability_zone": "us-central1", + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + "service_name": "myservicename", + "service_instance_id": "myserviceinstanceid", + }, + }, + { + name: "Generic task without cloud.availability_zone region", + resourceLabels: map[string]string{ + "cloud.platform": "fooprovider_kubernetes_service", + "cloud.region": "my-region", + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "service.instance.id": "myserviceinstanceid", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + "service_name": "myservicename", + "service_instance_id": "myserviceinstanceid", + }, + }, + { + name: "Generic node", + resourceLabels: map[string]string{ + "cloud.platform": "fooprovider_kubernetes_service", + "cloud.availability_zone": "us-central1", + "cloud.region": "my-region", + "service.namespace": "myservicenamespace", + "service.name": "myservicename", + "host.id": "myhostid", + "host.name": "myhostname", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + "service_name": "myservicename", + }, + }, + { + name: "Generic node without cloud.availability_zone", + resourceLabels: map[string]string{ + "cloud.region": "my-region", + "service.namespace": "myservicenamespace", + "host.id": "myhostid", + "host.name": "myhostname", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + }, + }, + { + name: "Generic node without host.id", + resourceLabels: map[string]string{ + "cloud.region": "my-region", + "service.namespace": "myservicenamespace", + "host.name": "myhostname", + }, + expectExtraLabels: labels{ + "service_namespace": "myservicenamespace", + }, + }, } for _, test := range tests { @@ -377,8 +468,7 @@ func TestResourceMetricsToMonitoredResource(t *testing.T) { for k, v := range test.resourceLabels { r.Attributes().InsertString(k, v) } - mr, extraLabels := mapper.resourceToMonitoredResource(r) - assert.Equal(t, test.expectMr, mr) + extraLabels := mapper.resourceToMetricLabels(r) assert.Equal(t, test.expectExtraLabels, extraLabels) }) } diff --git a/tools/release.go b/tools/release.go index 25e9854ef..01f450865 100644 --- a/tools/release.go +++ b/tools/release.go @@ -41,7 +41,8 @@ var versions = map[string]string{ "exporter/metric/": unstable, "example/metric/": unstable, - "exporter/collector/": unstable, + "exporter/collector/": unstable, + "exporter/collector/googlemanagedprometheus": unstable, "internal/resourcemapping/": unstable, }