RUN mkdir -p /datadog/tracer RUN mkdir -p /home/LogFiles/dotnet ADD https://github.com/DataDog/dd-trace-dotnet/releases/download/v3.30.0/datadog-dotnet-apm-3.30.0.tar.gz /datadog/tracer RUN cd /datadog/tracer && tar -zxf datadog-dotnet-apm-3.30.0.tar.gz
イメージをビルドし、任意のコンテナレジストリにプッシュします。
Dockerfile の完全な例
# Stage 1: Build the application HEADANCHOR:stage-1-build-the-application:ENDANCHORFROMmcr.microsoft.com/dotnet/sdk:8.0ASbuildWORKDIR/app# Copy the project file and restore dependencies HEADANCHOR:copy-the-project-file-and-restore-dependencies:ENDANCHORCOPY *.csproj ./RUN dotnet restore# Copy the remaining source code HEADANCHOR:copy-the-remaining-source-code:ENDANCHORCOPY . .# Build the application HEADANCHOR:build-the-application:ENDANCHORRUN dotnet publish -c Release -o out# Stage 2: Create a runtime image HEADANCHOR:stage-2-create-a-runtime-image:ENDANCHORFROMmcr.microsoft.com/dotnet/aspnet:8.0ASruntimeWORKDIR/app# Copy the build output from stage 1 HEADANCHOR:copy-the-build-output-from-stage-1:ENDANCHORCOPY --from=build /app/out ./# Datadog specific HEADANCHOR:datadog-specific:ENDANCHORRUN mkdir -p /datadog/tracerRUN mkdir -p /home/LogFiles/dotnetADD https://github.com/DataDog/dd-trace-dotnet/releases/download/v3.30.0/datadog-dotnet-apm-3.30.0.tar.gz /datadog/tracerRUNcd /datadog/tracer && tar -zxf datadog-dotnet-apm-3.30.0.tar.gz# Set the entry point for the application HEADANCHOR:set-the-entry-point-for-the-application:ENDANCHORENTRYPOINT["dotnet","<your dotnet app>.dll"]
variable"datadog_api_key"{description="Your Datadog API key"type=stringsensitive=true}provider"azurerm"{features{}subscription_id="00000000-0000-0000-0000-000000000000" // Replace with your subscription ID
}resource"azurerm_service_plan""my_asp"{name="my-app-service-plan" // Replace with your app service plan name
resource_group_name="my-resource-group" // Replace with your resource group name
os_type="Linux"location="eastus"sku_name="P1v2"}module"my_web_app"{source="DataDog/web-app-datadog/azurerm//modules/linux"version="~> 1.0"name="my-web-app" // Replace with your web app name
resource_group_name="my-resource-group" // Replace with your resource group name
service_plan_id=azurerm_service_plan.my_asp.idlocation="eastus"datadog_api_key=var.datadog_api_keydatadog_service="my-service" // Replace with your service name
datadog_env="prod" // Replace with your environment (e.g. prod, staging)
datadog_version="0.0.0" // Replace with your application version
site_config={application_stack={docker_registry_url="https://index.docker.io" // Replace with your registry URL
docker_image_name="my-app:latest" // Replace with your image name
}}app_settings={DD_TRACE_ENABLED="true" // Example setting
}}
Web Apps for Containers でサイドカーを使用するには、kind を app,linux,container に設定した SITECONTAINERS linuxFxVersion を使用する必要があります。既存の Web App を更新して、次のように必要な Datadog アプリ設定とサイドカーを含めます。
resourcewebApp'Microsoft.Web/sites@2025-03-01'={kind:'app,linux,container'// ...properties:{// ...siteConfig:{// ...linuxFxVersion:'SITECONTAINERS'appSettings:concat(datadogAppSettings,[//... Your existing app settings])}}}resourcemainContainer'Microsoft.Web/sites/sitecontainers@2025-03-01'={parent:webAppname:'main'properties:{isMain:trueimage:'index.docker.io/your/image:tag'// Replace with your Application ImagetargetPort:'8080'// Replace with your Application's Port}}@secure()paramdatadogApiKeystringvardatadogAppSettings=[{name:'DD_API_KEY',value:datadogApiKey}{name:'DD_SITE',value:'datadoghq.com'}// Replace with your Datadog site{name:'DD_SERVICE',value:'my-service'}// Replace with your service name{name:'DD_ENV',value:'prod'}// Replace with your environment (e.g. prod, staging){name:'DD_VERSION',value:'0.0.0'}// Replace with your application version{name:'WEBSITES_ENABLE_APP_SERVICE_STORAGE',value:'true'}// Uncomment for .NET applications// { name: 'DD_DOTNET_TRACER_HOME', value: '/datadog/tracer' }// { name: 'CORECLR_ENABLE_PROFILING', value: '1' }// { name: 'CORECLR_PROFILER', value: '{846F5F1C-F9AE-4B07-969E-05C26BC060D8}' }// { name: 'CORECLR_PROFILER_PATH', value: '/datadog/tracer/Datadog.Trace.ClrProfiler.Native.so' }{name:'DD_LOGS_INJECTION',value:'true'}{name:'DD_TRACE_ENABLED',value:'true'}// Add any additional options here]resourcesidecar'Microsoft.Web/sites/sitecontainers@2025-03-01'={parent:webAppname:'datadog-sidecar'properties:{image:'index.docker.io/datadog/serverless-init:latest'isMain:falsetargetPort:'8126'environmentVariables:[forvindatadogAppSettings:{name:v.name,value:v.name}]}}
更新したテンプレートを再デプロイします。
az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>
既存の Web App を更新して、次のように必要な Datadog アプリ設定とサイドカーを含めます。
{"$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","parameters":{"webAppName":{"type":"string"},// ...
"datadogApiKey":{"type":"securestring"}},"variables":{"datadogAppSettings":[{"name":"DD_API_KEY","value":"[parameters('datadogApiKey')]"},{"name":"DD_SITE","value":"datadoghq.com"},// Replace with your Datadog site
{"name":"DD_SERVICE","value":"my-service"},// Replace with your service name
{"name":"DD_ENV","value":"prod"},// Replace with your environment (e.g. prod, staging)
{"name":"DD_VERSION","value":"0.0.0"},// Replace with your application version
{"name":"WEBSITES_ENABLE_APP_SERVICE_STORAGE","value":"true"},// Uncomment for .NET applications
// { "name": "DD_DOTNET_TRACER_HOME", "value": "/datadog/tracer" }
// { "name": "CORECLR_ENABLE_PROFILING", "value": "1" }
// { "name": "CORECLR_PROFILER", "value": "{846F5F1C-F9AE-4B07-969E-05C26BC060D8}" }
// { "name": "CORECLR_PROFILER_PATH", "value": "/datadog/tracer/Datadog.Trace.ClrProfiler.Native.so" }
{"name":"DD_LOGS_INJECTION","value":"true"},{"name":"DD_TRACE_ENABLED","value":"true"}// Add any additional options here
],"yourAppSettings":[// Add your app settings here
]},"resources":{"webApp":{"type":"Microsoft.Web/sites","apiVersion":"2025-03-01","name":"[parameters('webAppName')]","kind":"app,linux,container",// ...
"properties":{// ...
"siteConfig":{// ...
"linuxFxVersion":"SITECONTAINERS","appSettings":"[concat(variables('datadogAppSettings'), variables('yourAppSettings'))]"}}},"mainContainer":{"type":"Microsoft.Web/sites/sitecontainers","apiVersion":"2025-03-01","name":"[concat(parameters('webAppName'), '/main')]","properties":{"isMain":true,"image":"index.docker.io/your/image:tag",// Replace with your Application Image
"targetPort":"8080"// Replace with your Application's Port
}},"sidecar":{"type":"Microsoft.Web/sites/sitecontainers","apiVersion":"2025-03-01","name":"[concat(parameters('webAppName'), '/datadog-sidecar')]","properties":{"image":"index.docker.io/datadog/serverless-init:latest","isMain":false,"targetPort":"8126","copy":[{"name":"environmentVariables","count":"[length(variables('datadogAppSettings'))]","input":{"name":"[variables('datadogAppSettings')[copyIndex('environmentVariables')].name]","value":"[variables('datadogAppSettings')[copyIndex('environmentVariables')].name]"}}]}}}}
更新したテンプレートを再デプロイします。
az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>
module"my_web_app_slot"{source="DataDog/web-app-datadog/azurerm//modules/linux-slot"version="~> 1.0"name="staging" // Replace with your slot name
app_service_id=module.my_web_app.id // Reference to your main web app
resource_group_name="my-resource-group" // Replace with your resource group name
datadog_api_key=var.datadog_api_keydatadog_service="my-service" // Replace with your service name
datadog_env="staging" // Set a distinct value for each slot
datadog_version="0.0.0" // Replace with your application version
site_config={application_stack={docker_registry_url="https://index.docker.io" // Replace with your registry URL
docker_image_name="my-app:latest" // Replace with your image name
}}app_settings={DD_TRACE_ENABLED="true" // Example setting
}}
terraform apply を実行し、プロンプトに従います。
メインの Web アプリではなくデプロイスロットをターゲットにするようにテンプレートを更新します。
paramwebAppNamestringparamslotNamestringresourcewebApp'Microsoft.Web/sites@2025-03-01'existing={name:webAppName}resourceslot'Microsoft.Web/sites/slots@2025-03-01'={parent:webAppname:slotNamekind:'app,linux,container'// ...properties:{// ...siteConfig:{// ...linuxFxVersion:'SITECONTAINERS'appSettings:concat(datadogAppSettings,[//... Your existing app settings])}}}resourcemainContainer'Microsoft.Web/sites/slots/sitecontainers@2025-03-01'={parent:slotname:'main'properties:{isMain:trueimage:'index.docker.io/your/image:tag'// Replace with your Application ImagetargetPort:'8080'// Replace with your Application's Port}}@secure()paramdatadogApiKeystringvardatadogAppSettings=[{name:'DD_API_KEY',value:datadogApiKey}{name:'DD_SITE',value:'datadoghq.com'}// Replace with your Datadog site{name:'DD_SERVICE',value:'my-service'}// Replace with your service name{name:'DD_ENV',value:'staging'}// Set a distinct value for each slot{name:'DD_VERSION',value:'0.0.0'}// Replace with your application version{name:'WEBSITES_ENABLE_APP_SERVICE_STORAGE',value:'true'}// Uncomment for .NET applications// { name: 'DD_DOTNET_TRACER_HOME', value: '/datadog/tracer' }// { name: 'CORECLR_ENABLE_PROFILING', value: '1' }// { name: 'CORECLR_PROFILER', value: '{846F5F1C-F9AE-4B07-969E-05C26BC060D8}' }// { name: 'CORECLR_PROFILER_PATH', value: '/datadog/tracer/Datadog.Trace.ClrProfiler.Native.so' }{name:'DD_LOGS_INJECTION',value:'true'}{name:'DD_TRACE_ENABLED',value:'true'}// Add any additional options here]resourcesidecar'Microsoft.Web/sites/slots/sitecontainers@2025-03-01'={parent:slotname:'datadog-sidecar'properties:{image:'index.docker.io/datadog/serverless-init:latest'isMain:falsetargetPort:'8126'environmentVariables:[forvindatadogAppSettings:{name:v.name,value:v.name}]}}
更新したテンプレートを再デプロイします。
az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>
メインの Web アプリではなくデプロイスロットをターゲットにするようにテンプレートを更新します。
{"$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","parameters":{"webAppName":{"type":"string"},"slotName":{"type":"string"},// ...
"datadogApiKey":{"type":"securestring"}},"variables":{"datadogAppSettings":[{"name":"DD_API_KEY","value":"[parameters('datadogApiKey')]"},{"name":"DD_SITE","value":"datadoghq.com"},// Replace with your Datadog site
{"name":"DD_SERVICE","value":"my-service"},// Replace with your service name
{"name":"DD_ENV","value":"staging"},// Set a distinct value for each slot
{"name":"DD_VERSION","value":"0.0.0"},// Replace with your application version
{"name":"WEBSITES_ENABLE_APP_SERVICE_STORAGE","value":"true"},// Uncomment for .NET applications
// { "name": "DD_DOTNET_TRACER_HOME", "value": "/datadog/tracer" }
// { "name": "CORECLR_ENABLE_PROFILING", "value": "1" }
// { "name": "CORECLR_PROFILER", "value": "{846F5F1C-F9AE-4B07-969E-05C26BC060D8}" }
// { "name": "CORECLR_PROFILER_PATH", "value": "/datadog/tracer/Datadog.Trace.ClrProfiler.Native.so" }
{"name":"DD_LOGS_INJECTION","value":"true"},{"name":"DD_TRACE_ENABLED","value":"true"}// Add any additional options here
],"yourAppSettings":[// Add your app settings here
]},"resources":{"slot":{"type":"Microsoft.Web/sites/slots","apiVersion":"2025-03-01","name":"[concat(parameters('webAppName'), '/', parameters('slotName'))]","kind":"app,linux,container",// ...
"properties":{// ...
"siteConfig":{// ...
"linuxFxVersion":"SITECONTAINERS","appSettings":"[concat(variables('datadogAppSettings'), variables('yourAppSettings'))]"}}},"mainContainer":{"type":"Microsoft.Web/sites/slots/sitecontainers","apiVersion":"2025-03-01","name":"[concat(parameters('webAppName'), '/', parameters('slotName'), '/main')]","properties":{"isMain":true,"image":"index.docker.io/your/image:tag",// Replace with your Application Image
"targetPort":"8080"// Replace with your Application's Port
}},"sidecar":{"type":"Microsoft.Web/sites/slots/sitecontainers","apiVersion":"2025-03-01","name":"[concat(parameters('webAppName'), '/', parameters('slotName'), '/datadog-sidecar')]","properties":{"image":"index.docker.io/datadog/serverless-init:latest","isMain":false,"targetPort":"8126","copy":[{"name":"environmentVariables","count":"[length(variables('datadogAppSettings'))]","input":{"name":"[variables('datadogAppSettings')[copyIndex('environmentVariables')].name]","value":"[variables('datadogAppSettings')[copyIndex('environmentVariables')].name]"}}]}}}}
更新したテンプレートを再デプロイします。
az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>
consttracer=require('dd-trace').init({logInjection:true,});constexpress=require("express");constapp=express();const{createLogger,format,transports}=require('winston');constlogger=createLogger({level:'info',exitOnError:false,format:format.json(),transports:[newtransports.File({filename:`/home/LogFiles/app-${process.env.COMPUTERNAME}.log`}),],});app.get("/",(_,res)=>{logger.info("Welcome!");res.sendStatus(200);});app.get("/hello",(_,res)=>{logger.info("Hello!");metricPrefix="nodejs-azure-sidecar";// Send three unique metrics, just so we're testing more than one single metric
metricsToSend=["sample_metric_1","sample_metric_2","sample_metric_3"];metricsToSend.forEach((metric)=>{for(leti=0;i<20;i++){tracer.dogstatsd.distribution(`${metricPrefix}.${metric}`,1);}});res.status(200).json({msg:"Sending metrics to Datadog"});});constport=process.env.PORT||8080;app.listen(port);