func NewGoogleCloudMetricsExporter()

in exporter/collector/metrics.go [177:236]


func NewGoogleCloudMetricsExporter(
	ctx context.Context,
	cfg Config,
	set exporter.Settings,
	timeout time.Duration,
) (*MetricsExporter, error) {
	SetUserAgent(&cfg, set.BuildInfo)
	meter := set.TelemetrySettings.MeterProvider.Meter(scopeName, metricapi.WithInstrumentationVersion(Version()))
	pointsExportedCounter, err := meter.Int64Counter(
		"googlecloudmonitoring/point_count",
		metricapi.WithDescription("Count of metric points written to Cloud Monitoring."),
		metricapi.WithUnit("1"),
	)
	if err != nil {
		return nil, err
	}
	exemplarAttachmentDropCount, err := meter.Int64Counter(
		"googlecloudmonitoring/exemplar_attachments_dropped",
		metricapi.WithDescription("Count of exemplar attachments dropped."),
		metricapi.WithUnit("{attachments}"),
	)
	if err != nil {
		return nil, err
	}

	obs := selfObservability{
		log:           set.TelemetrySettings.Logger,
		meterProvider: set.TelemetrySettings.MeterProvider,
	}
	normalizer := normalization.NewDisabledNormalizer()
	mExp := &MetricsExporter{
		cfg: cfg,
		obs: obs,
		mapper: metricMapper{
			obs:                         obs,
			cfg:                         cfg,
			normalizer:                  normalizer,
			exemplarAttachmentDropCount: exemplarAttachmentDropCount,
		},
		// We create a buffered channel for metric descriptors.
		// MetricDescritpors are asychronously sent and optimistic.
		// We only get Unit/Description/Display name from them, so it's ok
		// to drop / conserve resources for sending timeseries.
		metricDescriptorC:     make(chan *monitoringpb.CreateMetricDescriptorRequest, cfg.MetricConfig.CreateMetricDescriptorBufferSize),
		mdCache:               make(map[string]*monitoringpb.CreateMetricDescriptorRequest),
		shutdownC:             make(chan struct{}),
		timeout:               timeout,
		pointsExportedCounter: pointsExportedCounter,
	}
	mExp.exportFunc = mExp.exportToTimeSeries

	mExp.requestOpts = make([]func(*context.Context, requestInfo), 0)
	if cfg.DestinationProjectQuota {
		mExp.requestOpts = append(mExp.requestOpts, func(ctx *context.Context, ri requestInfo) {
			*ctx = metadata.NewOutgoingContext(*ctx, metadata.New(map[string]string{"x-goog-user-project": strings.TrimPrefix(ri.projectName, "projects/")}))
		})
	}

	return mExp, nil
}