UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

122 lines (105 loc) 4.05 kB
'use strict' // Modeled after https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/ddcommon/src/azure_app_services.rs const os = require('os') const { getIsAzureFunction } = require('./serverless') const { getEnvironmentVariable, getEnvironmentVariables } = require('../../dd-trace/src/config-helper') function extractSubscriptionID (ownerName) { if (ownerName !== undefined) { const subId = ownerName.split('+')[0].trim() if (subId.length > 0) { return subId } } } function extractResourceGroup (ownerName) { return /.+\+(.+)-.+webspace(-Linux)?/.exec(ownerName)?.[1] } function buildResourceID (subscriptionID, siteName, resourceGroup) { if (subscriptionID === undefined || siteName === undefined || resourceGroup === undefined) { return } return `/subscriptions/${subscriptionID}/resourcegroups/${resourceGroup}/providers/microsoft.web/sites/${siteName}` .toLowerCase() } function trimObject (obj) { Object.entries(obj) .filter(([_, value]) => value === undefined) .forEach(([key, _]) => { delete obj[key] }) return obj } function buildMetadata () { const { COMPUTERNAME, DD_AAS_DOTNET_EXTENSION_VERSION, FUNCTIONS_EXTENSION_VERSION, FUNCTIONS_WORKER_RUNTIME, FUNCTIONS_WORKER_RUNTIME_VERSION, WEBSITE_INSTANCE_ID, WEBSITE_OWNER_NAME, WEBSITE_OS, WEBSITE_RESOURCE_GROUP, WEBSITE_SITE_NAME } = getEnvironmentVariables() const subscriptionID = extractSubscriptionID(WEBSITE_OWNER_NAME) const siteName = WEBSITE_SITE_NAME const [siteKind, siteType] = getIsAzureFunction() ? ['functionapp', 'function'] : ['app', 'app'] const resourceGroup = WEBSITE_RESOURCE_GROUP ?? extractResourceGroup(WEBSITE_OWNER_NAME) return trimObject({ extensionVersion: DD_AAS_DOTNET_EXTENSION_VERSION, functionRuntimeVersion: FUNCTIONS_EXTENSION_VERSION, instanceID: WEBSITE_INSTANCE_ID, instanceName: COMPUTERNAME, operatingSystem: WEBSITE_OS ?? os.platform(), resourceGroup, resourceID: buildResourceID(subscriptionID, siteName, resourceGroup), runtime: FUNCTIONS_WORKER_RUNTIME, runtimeVersion: FUNCTIONS_WORKER_RUNTIME_VERSION, siteKind, siteName, siteType, subscriptionID }) } function getAzureAppMetadata () { // WEBSITE_SITE_NAME is the unique name of the website instance within Azure App Services. Its // presence is used to determine if we are running in Azure App Service // See equivalent in dd-trace-dotnet: // https://github.com/DataDog/dd-trace-dotnet/blob/37030168b2996e549ba23231ae732874b53a37e6/tracer/src/Datadog.Trace/Util/EnvironmentHelpers.cs#L99-L155 if (getEnvironmentVariable('WEBSITE_SITE_NAME') !== undefined) { return buildMetadata() } } function getAzureFunctionMetadata () { if (getIsAzureFunction()) { return buildMetadata() } } // Modeled after https://github.com/DataDog/libdatadog/blob/92272e90a7919f07178f3246ef8f82295513cfed/profiling/src/exporter/mod.rs#L187 // and https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/trace-utils/src/trace_utils.rs#L533 function getAzureTagsFromMetadata (metadata) { if (metadata === undefined) { return {} } return trimObject({ 'aas.environment.extension_version': metadata.extensionVersion, 'aas.environment.function_runtime': metadata.functionRuntimeVersion, 'aas.environment.instance_id': metadata.instanceID, 'aas.environment.instance_name': metadata.instanceName, 'aas.environment.os': metadata.operatingSystem, 'aas.environment.runtime': metadata.runtime, 'aas.environment.runtime_version': metadata.runtimeVersion, 'aas.resource.group': metadata.resourceGroup, 'aas.resource.id': metadata.resourceID, 'aas.site.kind': metadata.siteKind, 'aas.site.name': metadata.siteName, 'aas.site.type': metadata.siteType, 'aas.subscription.id': metadata.subscriptionID }) } module.exports = { getAzureAppMetadata, getAzureFunctionMetadata, getAzureTagsFromMetadata }