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);
}