dd-trace
Version:
Datadog APM tracing client for JavaScript
122 lines (105 loc) • 4.05 kB
JavaScript
// 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
}