-
Notifications
You must be signed in to change notification settings - Fork 377
Expand file tree
/
Copy pathazure_metadata.js
More file actions
127 lines (111 loc) · 4.41 KB
/
azure_metadata.js
File metadata and controls
127 lines (111 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
'use strict'
// Modeled after https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/ddcommon/src/azure_app_services.rs
const os = require('os')
const { getEnvironmentVariable, getEnvironmentVariables } = require('../../dd-trace/src/config/helper')
const { getIsAzureFunction, getIsFlexConsumptionAzureFunction } = require('./serverless')
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,
DD_AZURE_RESOURCE_GROUP,
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']
// Azure Functions on Flex Consumption plans require the `DD_AZURE_RESOURCE_GROUP` env var.
// If this logic ever changes, update the logic in `libdatadog`, `serverless-components/src/datadog-trace-agent`,
// and the serverless compat layers accordingly.
const resourceGroup = getIsFlexConsumptionAzureFunction()
? (DD_AZURE_RESOURCE_GROUP ?? WEBSITE_RESOURCE_GROUP ?? extractResourceGroup(WEBSITE_OWNER_NAME))
: (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
}