packages/opentelemetry-node/lib/detectors.js (90 lines of code) (raw):
/*
* Copyright Elasticsearch B.V. and contributors
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @typedef {import('@opentelemetry/resources').ResourceDetector} ResourceDetector
*/
const {getStringListFromEnv} = require('@opentelemetry/core');
const {
alibabaCloudEcsDetector,
} = require('@opentelemetry/resource-detector-alibaba-cloud');
const {
awsBeanstalkDetector,
awsEcsDetector,
awsEksDetector,
awsEc2Detector,
awsLambdaDetector,
} = require('@opentelemetry/resource-detector-aws');
const {
azureAppServiceDetector,
azureFunctionsDetector,
azureVmDetector,
} = require('@opentelemetry/resource-detector-azure');
const {
containerDetector,
} = require('@opentelemetry/resource-detector-container');
const {
envDetector,
hostDetector,
osDetector,
processDetector,
serviceInstanceIdDetector,
} = require('@opentelemetry/resources');
const {log} = require('./logging');
const {gcpDetector} = require('./detector-gcp');
// @ts-ignore - compiler options do not allow lookp outside `lib` folder
const ELASTIC_SDK_VERSION = require('../package.json').version;
// Elastic's own detector to add distro related metadata
/** @type {ResourceDetector} */
const distroDetector = {
detect() {
// TODO: change to semconv resource attribs when
// `@opentelemetry/semantic-conventions` gets updated with the attribs used
// https://github.com/open-telemetry/opentelemetry-js/issues/4235
return {
attributes: {
'telemetry.distro.name': 'elastic',
'telemetry.distro.version': ELASTIC_SDK_VERSION,
},
};
},
};
/** @type {Record<string, ResourceDetector | Array<ResourceDetector>>} */
const defaultDetectors = {
env: envDetector,
process: processDetector,
serviceinstance: serviceInstanceIdDetector,
os: osDetector,
host: hostDetector,
container: containerDetector,
alibaba: alibabaCloudEcsDetector,
aws: [
awsBeanstalkDetector,
awsEc2Detector,
awsEcsDetector,
awsEksDetector,
awsLambdaDetector,
],
// TODO: Switch back to `@opentelemetry/resource-detector-gcp` when
// https://github.com/open-telemetry/opentelemetry-js-contrib/issues/2320 is complete
gcp: gcpDetector,
azure: [azureAppServiceDetector, azureFunctionsDetector, azureVmDetector],
};
/**
* @param {Array<ResourceDetector>} [detectors]
* @returns {Array<ResourceDetector>}
*/
function resolveDetectors(detectors) {
if (detectors) {
detectors.push(distroDetector);
return detectors;
}
let detectorKeys = getStringListFromEnv('OTEL_NODE_RESOURCE_DETECTORS') || [
'all',
];
if (detectorKeys.some((k) => k === 'all')) {
detectorKeys = Object.keys(defaultDetectors);
} else if (detectorKeys.some((k) => k === 'none')) {
return [];
}
// NOTE: Kibana is doing a breakdown by service instance when plotting the metrics dashboard. So it needs the instance ID.
// Dashboard was added in https://github.com/elastic/kibana/pull/215735
if (!detectorKeys.includes('serviceinstance')) {
log.info(
`The "serviceinstance" resource detector has not been selected. This will result in Kibana's APM Service Metrics dashboard not working. See https://elastic.github.io/opentelemetry/edot-sdks/nodejs/configuration.html#otel_node_resource_detectors-details`
);
}
/** @type {Array<ResourceDetector | ResourceDetector[]>} */
const resolvedDetectors = [distroDetector];
for (const key of detectorKeys) {
if (defaultDetectors[key]) {
resolvedDetectors.push(defaultDetectors[key]);
} else {
log.warn(
`Invalid resource detector "${key}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`
);
}
}
return resolvedDetectors.flat();
}
module.exports = {
resolveDetectors,
};