async function initMetrics()

in src/autoscaler-common/counters-base.js [236:315]


async function initMetrics() {
  // check to see if someone else has started to init counters before
  // so that this function only runs once.
  if (pendingInit) {
    return await pendingInit.promise;
  }
  pendingInit = PromiseWithResolvers.create();

  try {
    logger.debug('initializing metrics');

    if (process.env.KUBERNETES_SERVICE_HOST) {
      // In K8s. We need to set the Pod Name to prevent duplicate
      // timeseries errors.
      if (process.env.K8S_POD_NAME) {
        RESOURCE_ATTRIBUTES[Semconv.SEMRESATTRS_K8S_POD_NAME] =
          process.env.K8S_POD_NAME;
      } else {
        logger.warn(
          'WARNING: running under Kubernetes, but K8S_POD_NAME ' +
            'environment variable is not set. ' +
            'This may lead to Send TimeSeries errors',
        );
      }
    }

    const resources = new GcpDetectorSync()
      .detect()
      .merge(new Resource(RESOURCE_ATTRIBUTES));
    if (resources.waitForAsyncAttributes) {
      await resources.waitForAsyncAttributes();
    }

    let exporter;
    if (process.env.OTEL_COLLECTOR_URL) {
      switch (process.env.OTEL_IS_LONG_RUNNING_PROCESS) {
        case 'true':
          exporterMode = ExporterMode.OTEL_PERIODIC;
          break;
        case 'false':
          exporterMode = ExporterMode.OTEL_ONLY_FLUSHING;
          break;
        default:
          throw new Error(
            `Invalid value for env var OTEL_IS_LONG_RUNNING_PROCESS: "${process.env.OTEL_IS_LONG_RUNNING_PROCESS}"`,
          );
      }
      logger.info(
        `Counters mode: ${exporterMode} OTEL collector: ${process.env.OTEL_COLLECTOR_URL}`,
      );
      exporter = new OTLPMetricExporter({
        url: process.env.OTEL_COLLECTOR_URL,
        // @ts-ignore -- CompressionAlgorithm.NONE (='none') is not exported.
        compression: 'none',
      });
    } else {
      exporterMode = ExporterMode.GCM_ONLY_FLUSHING;
      logger.info(`Counters mode: ${exporterMode} using GCP monitoring`);
      exporter = new GcpMetricExporter({prefix: 'workload.googleapis.com'});
    }

    meterProvider = new MeterProvider({
      resource: resources,
      readers: [
        new PeriodicExportingMetricReader({
          exportIntervalMillis:
            EXPORTER_PARAMETERS[exporterMode].PERIODIC_EXPORT_INTERVAL,
          exportTimeoutMillis:
            EXPORTER_PARAMETERS[exporterMode].PERIODIC_EXPORT_INTERVAL,
          exporter: exporter,
        }),
      ],
    });
  } catch (e) {
    // report failures to other waiters.
    pendingInit.reject(e);
    throw e;
  }
  pendingInit.resolve(null);
}