Datadog 사이드카는 파일 테일링을 사용하여 로그를 수집합니다. Datadog에서는 이 디렉터리가 다시 시작해도 유지되므로 애플리케이션 로그를 /home/LogFiles/에 작성할 것을 권장합니다.
Datadog으로 전송되는 내용을 더 효과적으로 제어하려면 /home/LogFiles/myapp과 같은 하위 디렉터리를 생성할 수도 있습니다. 그러나 모든 로그 파일을 /home/LogFiles에서 테일링하지 않으면 시작 및 오류와 관련된 Azure App Service 애플리케이션 로그가 수집되지 않습니다.
Datadog 사이드카는 파일 테일링을 사용하여 로그를 수집합니다. Datadog에서는 이 디렉터리가 다시 시작해도 유지되므로 애플리케이션 로그를 /home/LogFiles/에 작성할 것을 권장합니다.
Datadog으로 전송되는 내용을 더 효과적으로 제어하려면 /home/LogFiles/myapp과 같은 하위 디렉터리를 생성할 수도 있습니다. 그러나 모든 로그 파일을 /home/LogFiles에서 테일링하지 않으면 시작 및 오류와 관련된 Azure App Service 애플리케이션 로그가 수집되지 않습니다.
Datadog 사이드카는 파일 테일링을 사용하여 로그를 수집합니다. Datadog에서는 이 디렉터리가 다시 시작해도 유지되므로 애플리케이션 로그를 /home/LogFiles/에 작성할 것을 권장합니다.
Datadog으로 전송되는 내용을 더 효과적으로 제어하려면 /home/LogFiles/myapp과 같은 하위 디렉터리를 생성할 수도 있습니다. 그러나 모든 로그 파일을 /home/LogFiles에서 테일링하지 않으면 시작 및 오류와 관련된 Azure App Service 애플리케이션 로그가 수집되지 않습니다.
메인 애플리케이션의 Dockerfile에 다음의 라인을 추가합니다. 이렇게 하면 애플리케이션 컨테이너 내에서 Datadog 트레이서가 설치 및 구성됩니다.
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"]
Datadog 사이드카는 파일 테일링을 사용하여 로그를 수집합니다. Datadog에서는 이 디렉터리가 다시 시작해도 유지되므로 애플리케이션 로그를 /home/LogFiles/에 작성할 것을 권장합니다.
Datadog으로 전송되는 내용을 더 효과적으로 제어하려면 /home/LogFiles/myapp과 같은 하위 디렉터리를 생성할 수도 있습니다. 그러나 모든 로그 파일을 /home/LogFiles에서 테일링하지 않으면 시작 및 오류와 관련된 Azure App Service 애플리케이션 로그가 수집되지 않습니다.
Datadog 사이드카는 파일 테일링을 사용하여 로그를 수집합니다. Datadog에서는 이 디렉터리가 다시 시작해도 유지되므로 애플리케이션 로그를 /home/LogFiles/에 작성할 것을 권장합니다.
Datadog으로 전송되는 내용을 더 효과적으로 제어하려면 /home/LogFiles/myapp과 같은 하위 디렉터리를 생성할 수도 있습니다. 그러나 모든 로그 파일을 /home/LogFiles에서 테일링하지 않으면 시작 및 오류와 관련된 Azure App Service 애플리케이션 로그가 수집되지 않습니다.
Datadog 사이드카는 파일 테일링을 사용하여 로그를 수집합니다. Datadog에서는 이 디렉터리가 다시 시작해도 유지되므로 애플리케이션 로그를 /home/LogFiles/에 작성할 것을 권장합니다.
Datadog으로 전송되는 내용을 더 효과적으로 제어하려면 /home/LogFiles/myapp과 같은 하위 디렉터리를 생성할 수도 있습니다. 그러나 모든 로그 파일을 /home/LogFiles에서 테일링하지 않으면 시작 및 오류와 관련된 Azure App Service 애플리케이션 로그가 수집되지 않습니다.
참고: .NET 애플리케이션의 경우, .NET 트레이서에서 필요한 추가 환경 변수를 포함하기 위해 --dotnet 플래그를 추가하고, 컨테이너가 musl libc 이미지(예: Alpine Linux)에서 dotnet을 사용하는 경우 --musl 플래그도 추가해야 합니다.
--service 및 --env와 같은 추가 플래그를 사용하여 서비스 및 환경 태그를 설정할 수 있습니다. 전체 옵션 목록을 보려면 datadog-ci aas instrument --help를 실행하세요.
Azure Cloud Shell
Azure Cloud Shell에서 Datadog CLI를 사용하려면 Cloud Shell을 열고 npx를 사용하여 CLI를 직접 실행합니다. DD_API_KEY 및 DD_SITE 환경 변수의 API 키와 사이트를 설정한 후 다음으로 CLI를 실행합니다.
Terraform을 아직 설정하지 않은 경우, Terraform을 설치하고 새 디렉터리를 만들고 main.tf라는 파일을 만듭니다.
그런 다음, 필요에 따라 업데이트하여 Terraform 구성에 다음을 추가합니다.
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을 사용해야 합니다. 다음과 같이 기존 웹 앱을 업데이트하여 필요한 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>
다음과 같이 기존 웹 앱을 업데이트하여 필요한 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>
WEBSITES_ENABLE_APP_SERVICE_STORAGE: true. 이 환경 변수를 설정하면 /home/ 마운트가 지속되고 사이드카와 공유됩니다.
DD_SERVERLESS_LOG_PATH: 로그를 작성하는 위치(예: /home/LogFiles/*.log 또는 /home/LogFiles/myapp/*.log)
DD_AAS_INSTANCE_LOGGING_ENABLED: true일 때, 로그 수집이 추가 파일 경로(/home/LogFiles/*$COMPUTERNAME*.log)에 대해 자동으로 구성됩니다.
DD_AAS_INSTANCE_LOG_FILE_DESCRIPTOR: 보다 정밀한 파일 테일링을 위해 사용되는 선택적 파일 설명자입니다. 로그 로테이션이 빈번하게 발생하는 시나리오에 권장됩니다. 예를 들어, _default_docker를 설정하면 로그 테일러가 로테이션된 파일을 무시하고 Azure의 활성 로그 파일에만 집중하도록 구성됩니다.
애플리케이션에 여러 인스턴스가 있는 경우, 애플리케이션의 로그 파일 이름에 $COMPUTERNAME 변수가 포함되어 있는지 확인하세요. 이를 통해 로그 테일링이 동일한 파일을 읽는 여러 인스턴스에서 중복 로그를 생성하지 않도록 합니다.
.NET 애플리케이션의 경우: 추가로 필요한 환경 변수
.NET 애플리케이션에 대한 모니터링을 설정하는 경우, 다음 필수 환경 변수를 구성하세요.
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를 실행하고 표시되는 메시지를 따릅니다.
메인 웹 앱 대신 배포 슬롯을 대상으로 하도록 템플릿을 업데이트합니다.
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>
메인 웹 앱 대신 배포 슬롯을 대상으로 하도록 템플릿을 업데이트합니다.
{"$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>
프로파일링
Datadog의 Continuous Profiler는 Linux Azure App Service에서 Python 및 Node.js용 프리뷰 버전으로 제공됩니다.
Continuous Profiler를 활성화하려면 애플리케이션 컨테이너에 환경 변수 DD_PROFILING_ENABLED=true를 설정하세요.
애플리케이션 예시
다음 예시에는 추적, 메트릭 및 로그가 설정된 단일 앱이 포함되어 있습니다.
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);