private void Export()
        {
            var viewDataList = new List <IViewData>();

            foreach (var view in viewManager.AllExportedViews)
            {
                if (RegisterView(view))
                {
                    var data = viewManager.GetView(view.Name);
                    viewDataList.Add(data);
                }
            }

            // Add time series from all the views that need exporting
            var timeSeriesList = new List <TimeSeries>();

            foreach (var viewData in viewDataList)
            {
                MetricDescriptor  metricDescriptor = metricDescriptors[viewData.View];
                List <TimeSeries> timeSeries       = MetricsConversions.CreateTimeSeriesList(viewData, monitoredResource, metricDescriptor, domain);
                timeSeriesList.AddRange(timeSeries);
            }

            // Perform the operation in batches of MAX_BATCH_EXPORT_SIZE
            foreach (IEnumerable <TimeSeries> batchedTimeSeries in timeSeriesList.Partition(MAX_BATCH_EXPORT_SIZE))
            {
                var request = new CreateTimeSeriesRequest();
                request.ProjectName = project;
                request.TimeSeries.AddRange(batchedTimeSeries);

                try
                {
                    metricServiceClient.CreateTimeSeries(request);
                }
                catch (RpcException e)
                {
                    ExporterStackdriverEventSource.Log.UnknownProblemWhileCreatingStackdriverTimeSeriesError(e);
                }
            }
        }
        private bool RegisterView(IView view)
        {
            IView existing = null;

            if (registeredViews.TryGetValue(view.Name, out existing))
            {
                // Ignore views that are already registered.
                return(existing.Equals(view));
            }
            registeredViews.Add(view.Name, view);

            string metricDescriptorTypeName = GenerateMetricDescriptorTypeName(view.Name, domain);

            // TODO - zeltser: don't need to create MetricDescriptor for RpcViewConstants once we defined
            // canonical metrics. Registration is required only for custom view definitions. Canonical
            // views should be pre-registered.
            MetricDescriptor metricDescriptor = MetricsConversions.CreateMetricDescriptor(
                metricDescriptorTypeName,
                view,
                project,
                domain,
                displayNamePrefix);

            if (metricDescriptor == null)
            {
                // Don't register interval views in this version.
                return(false);
            }

            // Cache metric descriptor and ensure it exists in Stackdriver
            if (!metricDescriptors.ContainsKey(view))
            {
                metricDescriptors.Add(view, metricDescriptor);
            }
            return(EnsureMetricDescriptorExists(metricDescriptor));
        }