Repository: GoogleCloudPlatform/opentelemetry-operations-go
Pull request #342 (2022-04-01 17:40:18)

Initial gmp exporter
The new exporter adds type suffixes, and maps to the the prometheus_target monitored resource.  It wraps the configuration exposed by the standard googlecloud exporter, and only exposes a subset of that configuration.  The remaining fields are hard-coded to ensure a GMP-compatible export.

Customizing the reset logic will be done after https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/pull/360 merges in a follow-up change.

dashpole: This is ready for review
dashpole: I confirmed that metrics from the GMP integration test are queryable via the "Managed Service for Prometheus" UI in the GCP console.
dashpole: Confirmed that summary metrics appear correctly in the Managed Prometheus promql window.
dashpole: I think this should be all ready to go.  @xichen2020 can you take a final pass?

Patch:
diff --git a/exporter/collector/config.go b/exporter/collector/config.go
index 7ce73cc..d358c87 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 0000000..eab026f
--- /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 0000000..f07231a
--- /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 0000000..14b7412
--- /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 0000000..4666b4d
--- /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 0000000..8cff98b
--- /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 0000000..6c87553
--- /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/naming.go b/exporter/collector/googlemanagedprometheus/naming.go
new file mode 100644
index 0000000..f400466
--- /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/<baseName>_sum/summary:counter
+		// * Count: prometheus.googleapis.com/<baseName>_count/summary
+		// * Quantiles: prometheus.googleapis.com/<baseName>/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/logs.go b/exporter/collector/logs.go
index 5546960..1deedd4 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 3c6ceda..375cce5 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)
@@ -320,8 +321,8 @@ func (m *metricMapper) instrumentationScopeToLabels(is pdata.InstrumentationScop
 		return labels{}
 	}
 	return labels{
-		"instrumentation_source":  is.Name(),
-		"instrumentation_version": is.Version(),
+		"instrumentation_source":  sanitizeUTF8(is.Name()),
+		"instrumentation_version": sanitizeUTF8(is.Version()),
 	}
 }
 
@@ -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(
@@ -834,17 +868,19 @@ func numberDataPointToValue(
 		metricpb.MetricDescriptor_DOUBLE
 }
 
-func attributesToLabels(
-	attrs pdata.Map,
-) labels {
+func attributesToLabels(attrs pdata.Map) labels {
 	ls := make(labels, attrs.Len())
 	attrs.Range(func(k string, v pdata.Value) bool {
-		ls[sanitizeKey(k)] = v.AsString()
+		ls[sanitizeKey(k)] = sanitizeUTF8(v.AsString())
 		return true
 	})
 	return ls
 }
 
+func sanitizeUTF8(s string) string {
+	return strings.ToValidUTF8(s, "�")
+}
+
 // Replaces non-alphanumeric characters to underscores. Note, this does not truncate label keys
 // longer than 100 characters or prepend "key" when the first character is "_" like OpenCensus
 // did.
@@ -949,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{
@@ -1007,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/monitoredresource.go b/exporter/collector/monitoredresource.go
index 8999300..c4819b5 100644
--- a/exporter/collector/monitoredresource.go
+++ b/exporter/collector/monitoredresource.go
@@ -37,20 +37,21 @@ 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,
 	})
+	newLabels := make(labels, len(gmr.Labels))
+	for k, v := range gmr.Labels {
+		newLabels[k] = sanitizeUTF8(v)
+	}
 	mr := &monitoredrespb.MonitoredResource{
 		Type:   gmr.Type,
-		Labels: gmr.Labels,
+		Labels: newLabels,
 	}
-	return mr, m.resourceToMetricLabels(resource)
+	return mr
 }
 
 // resourceToMetricLabels converts the Resource into metric labels needed to uniquely identify
diff --git a/exporter/metric/metric.go b/exporter/metric/metric.go
index e643059..69ca601 100644
--- a/exporter/metric/metric.go
+++ b/exporter/metric/metric.go
@@ -254,7 +254,7 @@ func (me *metricExporter) createMetricDescriptorIfNeeded(ctx context.Context, md
 	return err
 }
 
-// exportTimeSeriees create TimeSeries from the records in cps.
+// exportTimeSeries create TimeSeries from the records in cps.
 // res should be the common resource among all TimeSeries, such as instance id, application name and so on.
 func (me *metricExporter) exportTimeSeries(ctx context.Context, res *resource.Resource, ilr export.InstrumentationLibraryReader) error {
 	tss := []*monitoringpb.TimeSeries{}
@@ -386,7 +386,7 @@ func (me *metricExporter) resourceToMonitoredResourcepb(res *resource.Resource)
 	monitoredRes := &monitoredrespb.MonitoredResource{
 		Type: "global",
 		Labels: map[string]string{
-			"project_id": me.o.ProjectID,
+			"project_id": sanitizeUTF8(me.o.ProjectID),
 		},
 	}
 
@@ -420,7 +420,7 @@ func (me *metricExporter) resourceToMonitoredResourcepb(res *resource.Resource)
 	}
 
 	monitoredRes.Type = resTypeStr
-	monitoredRes.Labels["project_id"] = me.o.ProjectID
+	monitoredRes.Labels["project_id"] = sanitizeUTF8(me.o.ProjectID)
 
 	return monitoredRes
 }
@@ -428,7 +428,7 @@ func (me *metricExporter) resourceToMonitoredResourcepb(res *resource.Resource)
 func generateResLabelMap(res *resource.Resource) map[string]string {
 	resLabelMap := make(map[string]string)
 	for _, label := range res.Attributes() {
-		resLabelMap[string(label.Key)] = label.Value.Emit()
+		resLabelMap[string(label.Key)] = sanitizeUTF8(label.Value.Emit())
 	}
 	return resLabelMap
 }
@@ -494,7 +494,7 @@ func (me *metricExporter) recordToMpb(r *export.Record, library instrumentation.
 	iter := r.Labels().Iter()
 	for iter.Next() {
 		kv := iter.Label()
-		labels[normalizeLabelKey(string(kv.Key))] = kv.Value.Emit()
+		labels[normalizeLabelKey(string(kv.Key))] = sanitizeUTF8(kv.Value.Emit())
 	}
 
 	return &googlemetricpb.Metric{
@@ -545,6 +545,10 @@ func (me *metricExporter) recordToTypedValueAndTimestamp(r *export.Record) (*mon
 	return nil, nil, errUnexpectedInstrumentKind{kind: ikind}
 }
 
+func sanitizeUTF8(s string) string {
+	return strings.ToValidUTF8(s, "�")
+}
+
 func lastValueToTypedValueAndTimestamp(lv *lastvalue.Aggregator, kind number.Kind) (*monitoringpb.TypedValue, *monitoringpb.TimeInterval, error) {
 	value, timestamp, err := lv.LastValue()
 	if err != nil {
diff --git a/tools/release.go b/tools/release.go
index 25e9854..01f4508 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,
 }


Test patch:
diff --git a/exporter/collector/googlemanagedprometheus/monitoredresource_test.go b/exporter/collector/googlemanagedprometheus/monitoredresource_test.go
new file mode 100644
index 0000000..ca3c1a3
--- /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_test.go b/exporter/collector/googlemanagedprometheus/naming_test.go
new file mode 100644
index 0000000..055942d
--- /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 62626d3..501583b 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 0000000..a41fede
--- /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 43cfbff..134d51b 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 9c45d5c..f46a0d8 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 4199409..33b3325 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 80d9aaf..41d8624 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 e75e53e..c0fc561 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 8ee8942..7536127 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 4289f93..abf3b14 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 36bb229..ca784d9 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 65ffeef..d2624ff 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 0cf9250..b4db117 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 47a7774..6a94e46 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 c8d7261..c56eb68 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 0000000..f44f187
--- /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 0000000..1c09746
--- /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 9536490..4d584bd 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 1989a10..7aa2f50 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 affdad2..fa31cca 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 8977f5a..3fb5513 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 2c095a8..8b4beeb 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 0fee723..d3f1c14 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 65d9db8..42811f5 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 e75e53e..c0fc561 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 0000000..3d8b65f
--- /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/metrics_test.go b/exporter/collector/metrics_test.go
index ae19856..2d5ce8f 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)
 		})
 	}
 }
@@ -1928,8 +1934,8 @@ func TestKnownDomains(t *testing.T) {
 func TestInstrumentationScopeToLabels(t *testing.T) {
 	newInstrumentationScope := func(name, version string) pdata.InstrumentationScope {
 		is := pdata.NewInstrumentationScope()
-		is.SetName("foo")
-		is.SetVersion("1.2.3")
+		is.SetName(name)
+		is.SetVersion(version)
 		return is
 	}
 
@@ -1967,3 +1973,62 @@ func TestInstrumentationScopeToLabels(t *testing.T) {
 		})
 	}
 }
+
+var (
+	invalidUtf8TwoOctet   = string([]byte{0xc3, 0x28}) // Invalid 2-octet sequence
+	invalidUtf8SequenceID = string([]byte{0xa0, 0xa1}) // Invalid sequence identifier
+)
+
+func TestAttributesToLabelsUTF8(t *testing.T) {
+	attributes := map[string]interface{}{
+		"valid_ascii":         "abcdefg",
+		"valid_utf8":          "שלום",
+		"invalid_two_octet":   invalidUtf8TwoOctet,
+		"invalid_sequence_id": invalidUtf8SequenceID,
+	}
+	expectLabels := labels{
+		"valid_ascii":         "abcdefg",
+		"valid_utf8":          "שלום",
+		"invalid_two_octet":   "�(",
+		"invalid_sequence_id": "�",
+	}
+
+	assert.Equal(
+		t,
+		attributesToLabels(pcommon.NewMapFromRaw(attributes)),
+		expectLabels,
+	)
+}
+
+func TestInstrumentationScopeToLabelsUTF8(t *testing.T) {
+	newInstrumentationScope := func(name, version string) pdata.InstrumentationScope {
+		is := pdata.NewInstrumentationScope()
+		is.SetName(name)
+		is.SetVersion(version)
+		return is
+	}
+
+	m, shutdown := newTestMetricMapper()
+	defer shutdown()
+
+	tests := []struct {
+		name                 string
+		InstrumentationScope pdata.InstrumentationScope
+		output               labels
+	}{{
+		name:                 "valid",
+		InstrumentationScope: newInstrumentationScope("abcdefg", "שלום"),
+		output:               labels{"instrumentation_source": "abcdefg", "instrumentation_version": "שלום"},
+	}, {
+		name:                 "invalid",
+		InstrumentationScope: newInstrumentationScope(invalidUtf8TwoOctet, invalidUtf8SequenceID),
+		output:               labels{"instrumentation_source": "�(", "instrumentation_version": "�"},
+	}}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			out := m.instrumentationScopeToLabels(test.InstrumentationScope)
+			assert.Equal(t, out, test.output)
+		})
+	}
+}
diff --git a/exporter/collector/monitoredresource_test.go b/exporter/collector/monitoredresource_test.go
index 65d6f54..69ce4ef 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,9 +468,53 @@ 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)
 		})
 	}
 }
+
+func TestResourceMetricsToMonitoredResourceUTF8(t *testing.T) {
+	invalidUtf8TwoOctet := string([]byte{0xc3, 0x28})   // Invalid 2-octet sequence
+	invalidUtf8SequenceID := string([]byte{0xa0, 0xa1}) // Invalid sequence identifier
+
+	resourceLabels := map[string]string{
+		"cloud.platform":          "gcp_kubernetes_engine",
+		"cloud.availability_zone": "abcdefg", // valid ascii
+		"k8s.cluster.name":        "שלום",    // valid utf8
+		"k8s.namespace.name":      invalidUtf8TwoOctet,
+		"k8s.pod.name":            invalidUtf8SequenceID,
+		"valid_ascii":             "abcdefg",
+		"valid_utf8":              "שלום",
+		"invalid_two_octet":       invalidUtf8TwoOctet,
+		"invalid_sequence_id":     invalidUtf8SequenceID,
+	}
+	expectMr := &monitoredrespb.MonitoredResource{
+		Type: "k8s_pod",
+		Labels: map[string]string{
+			"cluster_name":   "שלום",
+			"location":       "abcdefg",
+			"namespace_name": "�(",
+			"pod_name":       "�",
+		},
+	}
+	expectExtraLabels := labels{
+		"valid_ascii":         "abcdefg",
+		"valid_utf8":          "שלום",
+		"invalid_two_octet":   "�(",
+		"invalid_sequence_id": "�",
+	}
+
+	mapper := metricMapper{cfg: DefaultConfig()}
+	mapper.cfg.MetricConfig.ResourceFilters = []ResourceFilter{
+		{Prefix: "valid_"},
+		{Prefix: "invalid_"},
+	}
+	r := pdata.NewResource()
+	for k, v := range resourceLabels {
+		r.Attributes().InsertString(k, v)
+	}
+	mr, extraLabels := mapper.resourceToMonitoredResource(r)
+	assert.Equal(t, expectMr, mr)
+	assert.Equal(t, expectExtraLabels, extraLabels)
+}
diff --git a/exporter/metric/metric_test.go b/exporter/metric/metric_test.go
index 9e99f5d..0e807d9 100644
--- a/exporter/metric/metric_test.go
+++ b/exporter/metric/metric_test.go
@@ -494,6 +494,123 @@ func TestGenerateResLabelMap(t *testing.T) {
 	}
 }
 
+var (
+	invalidUtf8TwoOctet   = string([]byte{0xc3, 0x28}) // Invalid 2-octet sequence
+	invalidUtf8SequenceID = string([]byte{0xa0, 0xa1}) // Invalid sequence identifier
+)
+
+func TestGenerateResLabelMapUTF8(t *testing.T) {
+	monResource := resource.NewWithAttributes(
+		semconv.SchemaURL,
+		attribute.String("valid_ascii", "abcdefg"),
+		attribute.String("valid_utf8", "שלום"),
+		attribute.String("invalid_two_octet", invalidUtf8TwoOctet),
+		attribute.String("invalid_sequence_id", invalidUtf8SequenceID),
+	)
+	expectedLabels := map[string]string{
+		"valid_ascii":         "abcdefg",
+		"valid_utf8":          "שלום",
+		"invalid_two_octet":   "�(",
+		"invalid_sequence_id": "�",
+	}
+
+	got := generateResLabelMap(monResource)
+	if !reflect.DeepEqual(got, expectedLabels) {
+		t.Errorf("expected: %v, actual: %v", expectedLabels, got)
+	}
+}
+
+func TestResourceToMonitoredResourcepbProjectIDUTF8(t *testing.T) {
+	expectedProjectID := "�"
+
+	me := &metricExporter{
+		o: &options{
+			ProjectID: invalidUtf8SequenceID,
+		},
+	}
+
+	got := me.resourceToMonitoredResourcepb(nil)
+	if got.Labels["project_id"] != expectedProjectID {
+		t.Errorf("expected: %v, actual: %v", expectedProjectID, got.Labels["project_id"])
+	}
+}
+
+func TestRecordToMpbUTF8(t *testing.T) {
+	desc := metrictest.NewDescriptor("testing", sdkapi.HistogramInstrumentKind, number.Float64Kind)
+
+	md := &googlemetricpb.MetricDescriptor{
+		Name:        desc.Name(),
+		Type:        fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name()),
+		MetricKind:  googlemetricpb.MetricDescriptor_GAUGE,
+		ValueType:   googlemetricpb.MetricDescriptor_DOUBLE,
+		Description: "test",
+	}
+
+	mdkey := key{
+		name:        md.Name,
+		libraryname: "",
+	}
+
+	metricLabels := []attribute.KeyValue{
+		attribute.Key("valid_ascii").String("abcdefg"),
+		attribute.Key("valid_utf8").String("שלום"),
+		attribute.Key("invalid_two_octet").String(invalidUtf8TwoOctet),
+		attribute.Key("invalid_sequence_id").String(invalidUtf8SequenceID),
+	}
+
+	expectedLabels := map[string]string{
+		"valid_ascii":         "abcdefg",
+		"valid_utf8":          "שלום",
+		"invalid_two_octet":   "�(",
+		"invalid_sequence_id": "�",
+	}
+
+	ctx := context.Background()
+	cloudMock := cloudmock.NewCloudMock()
+	defer cloudMock.Shutdown()
+
+	clientOpt := option.WithGRPCConn(cloudMock.ClientConn())
+
+	pusher, err := InstallNewPipeline(
+		[]Option{
+			WithProjectID("PROJECT_ID_NOT_REAL"),
+			WithMonitoringClientOptions(clientOpt),
+			WithMetricDescriptorTypeFormatter(formatter),
+		},
+	)
+	assert.NoError(t, err)
+
+	me := &metricExporter{
+		o: &options{},
+		mdCache: map[key]*googlemetricpb.MetricDescriptor{
+			mdkey: md,
+		},
+	}
+	meter := pusher.Meter("custom.googleapis.com/opentelemetry")
+	counter, err := meter.SyncInt64().Counter(desc.Name())
+	require.NoError(t, err)
+	counter.Add(ctx, 100, metricLabels...)
+
+	require.NoError(t, pusher.Stop(ctx))
+
+	want := &googlemetricpb.Metric{
+		Type:   md.Type,
+		Labels: expectedLabels,
+	}
+	aggError := pusher.ForEach(func(library instrumentation.Library, reader export.Reader) error {
+		return reader.ForEach(aggregation.CumulativeTemporalitySelector(), func(r export.Record) error {
+			out := me.recordToMpb(&r, library)
+			if !reflect.DeepEqual(want, out) {
+				return fmt.Errorf("expected: %v, actual: %v", want, out)
+			}
+			return nil
+		})
+	})
+	if aggError != nil {
+		t.Errorf("%v", aggError)
+	}
+}
+
 func TestTimeIntervalStaggering(t *testing.T) {
 	var tm time.Time