private async _exportAsync()

in packages/opentelemetry-cloud-monitoring-exporter/src/monitoring.ts [133:184]


  private async _exportAsync(
    resourceMetrics: ResourceMetrics
  ): Promise<ExportResult> {
    if (this._projectId instanceof Promise) {
      this._projectId = await this._projectId;
    }

    if (!this._projectId) {
      const error = new Error('expecting a non-blank ProjectID');
      diag.error(error.message);
      return {code: ExportResultCode.FAILED, error};
    }

    diag.debug('Google Cloud Monitoring export');
    const resource = mapOtelResourceToMonitoredResource(
      resourceMetrics.resource
    );
    const timeSeries: TimeSeries[] = [];
    for (const scopeMetric of resourceMetrics.scopeMetrics) {
      for (const metric of scopeMetric.metrics) {
        const isRegistered =
          this._disableCreateMetricDescriptors ||
          (await this._registerMetricDescriptor(metric));
        if (isRegistered) {
          timeSeries.push(
            ...createTimeSeries(metric, resource, this._metricPrefix)
          );
        }
      }
    }

    let failure: {sendFailed: false} | {sendFailed: true; error: Error} = {
      sendFailed: false,
    };
    for (const batchedTimeSeries of partitionList(
      timeSeries,
      MAX_BATCH_EXPORT_SIZE
    )) {
      try {
        await this._sendTimeSeries(batchedTimeSeries);
      } catch (e) {
        const err = asError(e);
        err.message = `Send TimeSeries failed: ${err.message}`;
        failure = {sendFailed: true, error: err};
        diag.error(err.message);
      }
    }
    if (failure.sendFailed) {
      return {code: ExportResultCode.FAILED, error: failure.error};
    }
    return {code: ExportResultCode.SUCCESS};
  }