개요

Azure App Service용 Datadog 확장 프로그램은 메트릭과 로그를 제공하는 Datadog-Azure 통합 외에도 모니터링 기능을 제공합니다.

  • 자동 계측을 사용한 전체 분산 APM 트레이싱
  • 관련 Azure App Service 메트릭과 메타데이터를 보여주는 사용자 지정 APM 서비스 및 트레이스 보기
  • 스팬을 사용자 지정할 수 있는 수동 APM 계측 지원
  • Trace_ID 애플리케이션 로그에 삽입
  • DogStatsD를 사용한 사용자 지정 메트릭 전송 지원
이 확장 프로그램은 다음을 지원합니다.

.NET이 아닌 Azure Functions 또는 Dedicated/Premium 플랜이 아닌 환경의 .NET 구성에서는 Serverless Compatibility Layer를 사용해야 합니다.

다른 App Service 리소스 유형이나 런타임에 대한 지원이 필요하신가요? 가입하여 미리 보기가 제공되면 알림을 받으세요.

지원되는 런타임

Datadog .NET, Java 및 Node.js APM 확장 프로그램은 다음 런타임을 지원합니다.

프레임워크지원되는 런타임
.NETASPNET:V3.5, ASPNET:V4.8, dotnet:8, dotnet:9, dotnet:10
JavaJAVA:8, JAVA:11, JAVA:17, JAVA:21, TOMCAT:9.0-java8, TOMCAT:9.0-java11, TOMCAT:9.0-java17, TOMCAT:9.0-java21, TOMCAT:10.1-java8, TOMCAT:10.1-java11, TOMCAT:10.1-java17, TOMCAT:10.1-java21, TOMCAT:11.0-java8, TOMCAT:11.0-java11, TOMCAT:11.0-java17, TOMCAT:11.0-java21
Node.jsNODE:20LTS, NODE:22LTS

확장 프로그램별 참고 사항

Datadog의 자동 계측은 .NET CLR 프로파일링 API를 사용합니다. 이 API는 하나의 구독자만 허용합니다(예: 프로파일러가 활성화된 Datadog의 .NET 트레이서). 최대한의 가시성을 확보하려면 애플리케이션 환경에서 APM 솔루션을 하나만 실행하세요.

또한 Azure Native 통합을 사용하는 경우 Azure의 Datadog 리소스를 사용하여 .NET 앱에 확장 프로그램을 추가할 수 있습니다. 지침은 Datadog의 Azure Native 통합 가이드 중 App Service 확장 프로그램 섹션을 참조하세요.

Java Web Apps에 대한 지원은 확장 프로그램 v2.4+에서 미리 보기로 제공되고 있습니다.

이 기간 동안 Java Web Apps를 트레이싱해도 추가 청구에는 영향을 미치지 않습니다.

설치

Datadog은 최적의 성능, 안정성 및 기능 가용성을 유지할 수 있도록 확장 프로그램을 정기적으로 최신 버전으로 업데이트할 것을 권장합니다. 초기 설치와 이후 업데이트를 성공적으로 수행하려면 웹 앱을 완전히 중지해야 합니다.

아직 설정하지 않았다면 Datadog-Azure 통합을 설정하세요. Datadog에서 azure.app_services.count 또는 azure.functions.count 메트릭이 표시되는지 확인하여 Azure 통합이 올바르게 구성되었는지 검증할 수 있습니다.

이 단계는 메트릭/트레이스 상관관계와 트레이스 패널 보기 기능에 매우 중요하며, Azure App Services와 함께 Datadog을 사용하는 전반적인 환경을 개선합니다.

로컬

Datadog CLI 설치

npm install -g @datadog/datadog-ci @datadog/datadog-ci-plugin-aas

Azure CLI를 설치하고 az login으로 인증하세요.

그런 다음, 아래의 명령어를 실행하여 사이드카 컨테이너를 설정핫요.

export DD_API_KEY=<DATADOG_API_KEY>
export DD_SITE=<DATADOG_SITE>
datadog-ci aas instrument -s <subscription-id> -g <resource-group-name> -n <app-service-name>

Datadog 사이트를 다음과 같이 설정하세요. 기본값은 datadoghq.com입니다.

Datadog CLI는 앱의 런타임을 자동으로 추론하고 해당 애플리케이션을 설치합니다. 어떤 이유로든 실패할 경우 --windows-runtime 플래그로 런타임을 지정하여 이 동작을 재정의할 수 있습니다.

--service 및 --env와 같은 추가 플래그를 사용하여 서비스 및 환경 태그를 설정할 수 있습니다. 전체 옵션 목록을 보려면 datadog-ci aas instrument --help를 실행하세요.

datadog-ci aas instrument 계측 설정 시 한 번만 실행하면 됩니다. 코드를 배포할 때마다 다시 실행할 필요는 없으며, Datadog 구성을 변경할 경우에만 다시 실행하세요.

Azure Cloud Shell

Azure Cloud Shell에서 Datadog CLI를 사용하려면 클라우드 셸을 열고 DD_API_KEY 및 DD_SITE 환경 변수에 API 키와 사이트를 설정한 다음, npx를 사용하여 CLI를 직접 실행하세요.

export DD_API_KEY=<DATADOG_API_KEY>
export DD_SITE=<DATADOG_SITE>
npx @datadog/datadog-ci aas instrument -s <subscription-id> -g <resource-group-name> -n <app-service-name>

Windows Web Apps용 Datadog Terraform 모듈은 azurerm_windows_web_app 리소스를 래핑하고 필수 환경 변수 및 런타임용 Windows Web App 확장 프로그램을 추가하여 Datadog Serverless Monitoring을 위해 웹 앱을 자동으로 구성합니다.

Terraform을 아직 설정하지 않은 경우 Terraform을 설치하고 새 디렉터리를 만든 후 main.tf라는 파일을 생성하세요.

그런 다음, 필요에 따라 업데이트하여 Terraform 구성에 다음을 추가하세요

variable "datadog_api_key" {
  description = "Your Datadog API key"
  type        = string
  sensitive   = 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
  os_type             = "Windows"
  location            = "eastus"
  sku_name            = "P1v2"
}

module "my_web_app" {
  source  = "DataDog/web-app-datadog/azurerm//modules/windows"
  version = "~> 1.0"

  name                = "my-web-app"        // Replace with your web app name
  resource_group_name = "my-resource-group" // Replace with your resource group
  service_plan_id     = azurerm_service_plan.my_asp.id
  location            = "eastus"

  datadog_api_key = var.datadog_api_key
  datadog_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 = {
      node_version = "~22" // change for your specific runtime
    }
  }
  app_settings = {
    DD_TRACE_ENABLED = "true" // Example setting
  }
}

마지막으로 terraform apply를 실행하고 프롬프트를 따르세요.

Datadog Windows Web App 모듈은 Web App 리소스와 확장 프로그램만 배포하므로, 코드 배포 작업은 별도로 수행해야 합니다.

다음과 같이 기존 Web App을 업데이트하여 필요한 Datadog App Settings와 확장 프로그램을 포함하세요.

// Version: 1.0.0
@secure()
param datadogApiKey string

resource webApp 'Microsoft.Web/sites@2025-03-01' = {
  // ...
  properties: {
    // ...
    siteConfig: {
      // ...
      appSettings: [
        //... Your existing app settings
        { 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
        // Add any additional options here
      ]
    }
  }
}

resource datadogExtension 'Microsoft.Web/sites/siteextensions@2025-03-01' = {
  parent: webApp
  // Uncomment the extension for your runtime:
  // name: 'Datadog.AzureAppServices.Node.Apm'
  // name: 'Datadog.AzureAppServices.DotNet'
  // name: 'Datadog.AzureAppServices.Java.Apm'
}

업데이트된 템플릿을 배포하세요.

az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>

참고: 앱을 수동으로 또는 스크립트를 통해 중지했다가 다시 시작해야 합니다. 그렇지 않으면 자동 트레이싱이 작동하지 않습니다. 업데이트 시에는 템플릿을 배포하기 전에 앱을 중지하고, 배포가 완료된 후 다시 시작해야 합니다.

모든 환경 변수에 대한 설명은 Manual 탭을 참조하세요.

다음과 같이 기존 웹 앱을 업데이트하여 필요한 Datadog 앱 설정과 사이드카를 포함하세요.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": { "version": "1.0.0" },
  "parameters": {
    "webAppName": {
      "type": "string"
    },
    // ...
    "datadogApiKey": {
      "type": "securestring"
    }
  },
  "resources": {
    "webApp": {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2025-03-01",
      "name": "[parameters('webAppName')]",
      // ...
      "properties": {
        // ...
        "siteConfig": {
          // ...
          "appSettings": [
            //... Your existing app settings
            { "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
            // Add any additional options here
          ]
        }
      }
    },
    "datadogExtension": {
      "type": "Microsoft.Web/sites/siteextensions",
      "apiVersion": "2025-03-01",
      // Uncomment the extension for your runtime:
      // "name": "[concat(parameters('webAppName'), '/Datadog.AzureAppServices.Node.Apm')]"
      // "name": "[concat(parameters('webAppName'), '/Datadog.AzureAppServices.DotNet')]"
      // "name": "[concat(parameters('webAppName'), '/Datadog.AzureAppServices.Java.Apm')]"
    }
  }
}

업데이트된 템플릿을 배포하세요.

az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>

참고: 앱을 수동으로 또는 스크립트를 통해 중지했다가 다시 시작해야 합니다. 그렇지 않으면 자동 트레이싱이 작동하지 않습니다. 업데이트 시에는 템플릿을 배포하기 전에 앱을 중지하고, 배포가 완료된 후 다시 시작해야 합니다.

모든 환경 변수에 대한 설명은 Manual 탭을 참조하세요.

  1. Azure 포털을 열고 Datadog으로 계측하려는 Azure 앱의 대시보드로 이동합니다.

  2. 다음 Application Settings를 구성합니다.

    필수 환경 변수

    DD_API_KEY
    값: Datadog API 키입니다.
    Datadog에서 Organization Settings > API Keys를 참조하세요.
    DD_SITE
    값: Datadog 사이트
    Datadog 사이트입니다. 기본값은 datadoghq.com입니다.

    Unified Service Tagging

    Datadog은 unified service tagging을 위해 애플리케이션에 env, service, version 태그를 지정할 것을 권장합니다.

    DD_SERVICE
    값: 애플리케이션의 서비스 이름입니다.
    DD_ENV
    값: 애플리케이션의 환경 이름입니다.
    이 필드에는 기본값이 없습니다.
    DD_VERSION
    값: 애플리케이션의 버전입니다.
    이 필드에는 기본값이 없습니다.

    추가 환경 변수

    DD_LOGS_INJECTION
    값: true(권장)
    애플리케이션 로그에 트레이스 ID를 삽입하여 트레이스-로그 상관관계를 활성화합니다.
    이를 통해 Datadog UI에서 로그와 트레이스를 연결할 수 있습니다.
  3. Save를 클릭합니다. 이렇게 하면 애플리케이션이 다시 시작됩니다.

  4. Stop을 클릭하여 애플리케이션을 중지합니다.

    Datadog을 성공적으로 설치하려면 반드시 애플리케이션을 중지해야 합니다.
  5. Azure 포털l에서 Extensions 페이지로 이동하여 Datadog APM 확장 프로그램을 선택합니다.

    .NET Datadog APM 확장 프로그램이 표시된 Azure 포털의 Extensions 페이지 예시입니다.
  6. 법적 약관에 동의하고 OK를 클릭한 다음 설치가 완료될 때까지 기다립니다.

    이 단계를 수행하려면 애플리케이션이 중지된 상태여야 합니다.
  7. Start를 클릭하여 메인 애플리케이션을 시작합니다.

    Azure 시작 버튼
  8. Azure 포털의 Extensions 페이지를 확인하여 확장 프로그램이 설치되어 실행 중인지 확인합니다.

가동 중지 시간을 방지하려면 배포 슬롯을 사용하세요. GitHub Action for Azure CLI를 사용하는 워크플로를 만들 수 있습니다. 샘플 GitHub 워크플로를 참조하세요.

Do not set the following environment variables in your serverless environment. They should only be set in non-serverless environments.

  • DD_AGENT_HOST
  • DD_TRACE_AGENT_URL

배포 슬롯

배포 슬롯 계측은 미리 보기 상태입니다. 미리 보기 기간 동안에는 기본 웹 앱 아래에 슬롯의 텔레메트리가 표시됩니다. 슬롯과 프로덕션 텔레메트리를 구분하려면 각 슬롯에 대해 서로 다른 값으로 unified service tagging을 구성합니다.

기본 웹 앱 대신 배포 슬롯을 계측하려면 다음 방법 중 하나를 사용합니다.

Datadog CLI(v5.9.0 이상)를 사용하여 --slot 플래그를 추가합니다. --service, --env 및 --version을 사용하여 슬롯에 대해 서로 다른 unified service tagging 값을 설정합니다.

배포 슬롯의 이름을 찾으려면 다음을 실행하세요.

az webapp deployment slot list --query '[].name' -o tsv -g <resource-group> -n <web-app>
datadog-ci aas instrument -s <subscription-id> -g <resource-group-name> -n <app-service-name> \
  --slot <slot-name> \
  --service <service-name> --env <slot-env> --version <app-version>

또는 --resource-id 플래그와 함께 전체 슬롯 리소스 ID를 제공하세요.

datadog-ci aas instrument --resource-id /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<app-name>/slots/<slot-name> \
  --service <service-name> --env <slot-env> --version <app-version>

참고: --env를 전달하면 CLI가 자동으로 DD_ENV를 고정 설정으로 표시하므로, 슬롯 교체 시에도 env 태그가 동일하게 유지됩니다.

Datadog Windows Web App Slot 모듈을 사용하세요.

module "my_web_app_slot" {
  source  = "DataDog/web-app-datadog/azurerm//modules/windows-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

  datadog_api_key = var.datadog_api_key
  datadog_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 = {
      node_version = "~22" // change for your specific runtime
    }
  }
  app_settings = {
    DD_TRACE_ENABLED = "true" // Example setting
  }
}

terraform apply을 실행하고 모든 프롬프트를 따르세요.

참고: 메인 웹 앱 모듈에 datadog_env가 설정되면, 모듈은 DD_ENV를 고정 설정으로 표시하므로, 슬롯 교체 시에도 env 태그가 동일하게 유지됩니다.

메인 웹 앱 대신 배포 슬롯을 대상으로 지정하도록 템플릿을 업데이트하세요.

// Version: 1.0.0
@secure()
param datadogApiKey string

param webAppName string
param slotName string

@description('Names of app settings already marked slot-sticky on this web app. Pass [] for a new app with no existing sticky settings. This template does a full replace of slotConfigNames — omitting an existing sticky setting name will de-sticky it.')
param existingStickyAppSettingNames array = []

resource webApp 'Microsoft.Web/sites@2025-03-01' existing = {
  name: webAppName
}

resource slot 'Microsoft.Web/sites/slots@2025-03-01' = {
  parent: webApp
  name: slotName
  // ...
  properties: {
    // ...
    siteConfig: {
      // ...
      appSettings: [
        //... Your existing app settings
        { 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
        // Add any additional options here
      ]
    }
  }
}

// Marks DD_ENV as slot-sticky so your `env` tag persists across slot swaps. Replaces the
// full slotConfigNames list — existingStickyAppSettingNames must include any settings already
// marked sticky or they will be de-stickied.
resource stickySettings 'Microsoft.Web/sites/config@2025-03-01' = {
  parent: webApp
  name: 'slotConfigNames'
  properties: {
    appSettingNames: union(existingStickyAppSettingNames, ['DD_ENV'])
  }
  dependsOn: [slot]
}

resource datadogExtension 'Microsoft.Web/sites/slots/siteextensions@2025-03-01' = {
  parent: slot
  // Uncomment the extension for your runtime:
  // name: 'Datadog.AzureAppServices.Node.Apm'
  // name: 'Datadog.AzureAppServices.DotNet'
  // name: 'Datadog.AzureAppServices.Java.Apm'
}

업데이트된 템플릿을 배포하세요.

az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>

참고: 확장 프로그램이 적용되려면 슬롯(메인 앱 아님)을 중지했다가 다시 시작해야 합니다.

참고: Azure 앱 설정은 기본적으로 슬롯 간에 전환됩니다. 상기 slotConfigNames 리소스는 DD_ENV를 고정 설정으로 표시하므로, 슬롯 교체 시에도 env 태그가 동일하게 유지됩니다.

slotConfigNames 리소스는 고정 설정 목록을 완전히 대체합니다. existingStickyAppSettingNames에 이미 고정으로 표시된 설정을 전달하거나, 새 앱의 경우 []을 전달합니다. 생략된 이름은 고정이 해제됩니다.

메인 웹 앱 대신 배포 슬롯을 대상으로 지정하도록 템플릿을 업데이트하세요.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": { "version": "1.0.0" },
  "parameters": {
    "webAppName": {
      "type": "string"
    },
    "slotName": {
      "type": "string"
    },
    // ...
    "datadogApiKey": {
      "type": "securestring"
    },
    "existingStickyAppSettingNames": {
      "type": "array",
      "defaultValue": [],
      "metadata": { "description": "Names of app settings already marked slot-sticky on this web app. Pass [] for a new app with no existing sticky settings. This template does a full replace of slotConfigNames — omitting an existing sticky setting name will de-sticky it." }
    }
  },
  "resources": {
    "slot": {
      "type": "Microsoft.Web/sites/slots",
      "apiVersion": "2025-03-01",
      "name": "[concat(parameters('webAppName'), '/', parameters('slotName'))]",
      // ...
      "properties": {
        // ...
        "siteConfig": {
          // ...
          "appSettings": [
            //... Your existing app settings
            { "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
            // Add any additional options here
          ]
        }
      }
    },
    "datadogExtension": {
      "type": "Microsoft.Web/sites/slots/siteextensions",
      "apiVersion": "2025-03-01",
      // Uncomment the extension for your runtime:
      // "name": "[concat(parameters('webAppName'), '/', parameters('slotName'), '/Datadog.AzureAppServices.Node.Apm')]"
      // "name": "[concat(parameters('webAppName'), '/', parameters('slotName'), '/Datadog.AzureAppServices.DotNet')]"
      // "name": "[concat(parameters('webAppName'), '/', parameters('slotName'), '/Datadog.AzureAppServices.Java.Apm')]"
    },
    // Marks DD_ENV as slot-sticky so your `env` tag persists across slot swaps. Replaces the
    // full slotConfigNames list — existingStickyAppSettingNames must include any settings
    // already marked sticky or they will be de-stickied.
    "stickySettings": {
      "type": "Microsoft.Web/sites/config",
      "apiVersion": "2025-03-01",
      "name": "[concat(parameters('webAppName'), '/slotConfigNames')]",
      "properties": {
        "appSettingNames": "[union(parameters('existingStickyAppSettingNames'), createArray('DD_ENV'))]"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites/slots', parameters('webAppName'), parameters('slotName'))]"
      ]
    }
  }
}

업데이트된 템플릿을 배포하세요.

az deployment group create --resource-group <RESOURCE GROUP> --template-file <TEMPLATE FILE>

참고: 확장 프로그램이 적용되려면 슬롯(메인 앱 아님)을 중지했다가 다시 시작해야 합니다.

참고: Azure 앱 설정은 기본적으로 슬롯 간에 전환됩니다. 상기 slotConfigNames 리소스는 DD_ENV를 고정 설정으로 표시하므로, 슬롯 교체 시에도 env 태그가 동일하게 유지됩니다.

slotConfigNames 리소스는 고정 설정 목록을 완전히 대체합니다. existingStickyAppSettingNames에 이미 고정으로 표시된 설정을 전달하거나, 새 앱의 경우 []을 전달합니다. 생략된 이름은 고정이 해제됩니다.

Azure Functions를 사용하시나요? 확장 프로그램 설치 중 파일 잠금 오류를 방지하는 방법을 포함한 Function App별 설치 지침은 Azure Functions .NET APM Extension을 참조하세요.

사용자 지정 메트릭

Azure App Service 확장 프로그램에는 Datadog의 메트릭 집계 서비스인 DogStatsD 인스턴스가 포함되어 있습니다. 이 확장 프로그램을 사용하면 Azure Web Apps 및 Functions에서 Datadog으로 사용자 지정 메트릭, 서비스 검사 및 이벤트를 직접 전송할 수 있습니다.

Azure App Service에서 사용자 지정 메트릭과 검사를 작성하는 과정은 Datadog Agent가 실행 중인 호스트의 애플리케이션에서 수행하는 과정과 유사합니다. 표준 DogStatsD 구성 프로세스와 달리, DogStatsD 구성을 초기화할 때 포트나 서버 이름을 설정할 필요가 없습니다. Azure App Service에는 메트릭 전송 방식을 결정하는 환경 변수가 있습니다(DogStatsD 클라이언트 v6.0.0 이상 필요).

확장 프로그램을 사용하여 Azure App Service에서 Datadog으로 사용자 지정 메트릭을 전송하려면 다음 단계를 따르세요.

  1. Add the DogStatsD NuGet package to your Visual Studio project.
  2. Initialize DogStatsD and write custom metrics in your application.
  3. Deploy your code to Azure App Service.
  4. If you have not already, install the Datadog App Service extension.

To send metrics, use this code:

// Configure your DogStatsd client and configure any tags
if (!DogStatsd.Configure(new StatsdConfig() { ConstantTags = new[] { "app:sample.mvc.aspnetcore" } }))
{
    // `Configure` returns false if the necessary environment variables are not present.
    // These environment variables are present in Azure App Service, but
    // need to be set in order to test your custom metrics: DD_API_KEY:{api_key}, DD_AGENT_HOST:localhost
    // Ignore or log the error as it suits you
    Console.WriteLine("Cannot initialize DogstatsD.");
}

// Send a metric
DogStatsd.Increment("sample.startup");
  1. DogStatsD 클라이언트를 프로젝트에 추가합니다.
  2. DogStatsD를 초기화하고 애플리케이션에서 사용자 지정 메트릭을 작성합니다.
  3. 지원되는 Azure Web App에 코드를 배포합니다.
  4. 아직 설치하지 않았다면 Datadog App Service 확장 프로그램을 설치합니다.

메트릭을 전송하려면 다음 코드를 사용하세요.

// Configure your DogStatsd client and configure any tags
StatsDClient client = new NonBlockingStatsDClientBuilder()
                            .constantTags("app:sample.service")
                            .build();
// Send a metric
client.Increment("sample.startup");
  1. 애플리케이션에서 DogStatsD를 초기화하고 사용자 지정 메트릭을 작성합니다.
  2. 지원되는 Azure Web App에 코드를 배포합니다.
  3. 아직 설치하지 않았다면 Datadog의 Azure App Service Node.js 확장 프로그램을 설치합니다.
Node.js DogStatsD 클라이언트는 Node.js 트레이서(dd-trace)에 포함되어 있으며, 이 트레이서는 Azure App Service 확장 프로그램에 패키지되어 있으므로 별도로 설치할 필요가 없습니다.

메트릭을 전송하려면 다음 코드를 사용하세요.

const tracer = require('dd-trace');
tracer.init();

tracer.dogstatsd.increment('example_metric.increment', 1, { environment: 'dev' });
tracer.dogstatsd.decrement('example_metric.decrement', 1, { environment: 'dev' });
Datadog의 Node.js 트레이서는 dd-traceAzure App Services 확장 프로그램에 패키지되어 있습니다. 이는 자동으로 NODE_PATH에 추가됩니다.

dd-trace 을 의 종속성으로 추가할 필요가 없습니다. package.json. 명시적으로 dd-trace 종속성으로 추가하면 확장 프로그램에서 제공하는 버전이 재정의될 수 있습니다. 로컬 테스트의 경우 릴리스 노트를 참조하여 Azure App Service 확장 프로그램 버전에 적합한 Node.js 트레이서 버전을 확인하세요.

참고: 트레이싱을 비활성화하고 사용자 지정 메트릭만 전송하려면 애플리케이션 구성에 다음 변수를 설정하세요.

  • DD_TRACE_ENABLED를 false로 설정합니다.
  • DD_AAS_ENABLE_CUSTOM_METRICS를 true로 설정합니다.

사용자 지정 메트릭에 대해 자세히 알아보세요.

로깅

애플리케이션 로깅

You can send logs from your application in Azure App Service to Datadog in one of the following ways:

Both methods allow trace ID injection, making it possible to connect logs and traces in Datadog. To enable trace ID injection with the extension, add the application setting DD_LOGS_INJECTION:true.

Azure App Service의 애플리케이션에서 Datadog으로 로그를 전송하려면 앱에서 Datadog으로 직접 로그를 스트리밍해야 합니다. 이 방법으로 로그를 제출하면 트레이스 ID 주입이 가능해져 Datadog에서 로그와 트레이스를 연결할 수 있습니다.

Azure App Service의 애플리케이션에서 Datadog으로 로그를 전송하려면 앱에서 Datadog으로 직접 로그를 스트리밍해야 합니다. 이 방법으로 로그를 제출하면 트레이스 ID 주입이 가능해져 Datadog에서 로그와 트레이스를 연결할 수 있습니다.


로깅용 환경 변수

최적의 로그 수집을 위해 Azure App Service Application Settings에서 다음 환경 변수를 구성하세요.

변수설명예시
DD_SERVICE애플리케이션의 서비스 이름my-web-app
DD_ENV애플리케이션의 환경production, staging, development
DD_LOGS_INJECTION트레이스-로그 상관관계 활성화true

로깅 모범 사례

  • 트레이스 상관관계 활성화: 로그와 트레이스를 연결하려면 DD_LOGS_INJECTION=true를 설정하세요.
  • 적절한 서비스 이름 설정: 로그가 올바른 서비스 이름으로 표시되도록 DD_SERVICE를 사용하세요.
  • 구조적 로깅 사용: 더 나은 로그 구문 분석을 위해 애플리케이션에 구조적 로깅을 구현하세요.

참고: 트레이스 ID 주입은 애플리케이션 내부에서 발생합니다. Azure 리소스 로그는 관리 평면에서 Azure에 의해 생성되므로 트레이스 ID를 포함하지 않습니다.

코드 예시: Microsoft 네이티브 로깅

Microsoft.Extensions.Logging을 사용하여 .NET 애플리케이션에서 로깅을 설정하는 방법의 예시는 다음과 같습니다.

using Microsoft.Extensions.Logging;

public class WeatherForecastController : ControllerBase
{
    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public IActionResult Get()
    {
        _logger.LogInformation("Processing weather forecast request");

        // Your business logic here
        var forecast = GetWeatherForecast();

        _logger.LogInformation("Weather forecast retrieved for user: {UserId}", userId);

        return Ok(forecast);
    }
}

Program.cs 구성

using Microsoft.Extensions.Logging;

var builder = WebApplication.CreateBuilder(args);

// Configure logging
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
builder.Logging.AddDebug();

// Add structured logging with JSON format
builder.Logging.AddJsonConsole(options =>
{
    options.JsonWriterOptions = new JsonWriterOptions
    {
        Indented = true
    };
});

var app = builder.Build();
// ... rest of your application configuration

appsettings.json 구성

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    },
    "Console": {
      "FormatterName": "json",
      "FormatterOptions": {
        "IncludeScopes": true,
        "TimestampFormat": "yyyy-MM-dd HH:mm:ss "
      }
    }
  }
}

이 설정은 Azure App Service Application Settings에서 DD_LOGS_INJECTION=true가 설정된 경우 트레이스 상관관계를 자동으로 활성화합니다.

Azure App Service에서 Java 애플리케이션 로깅을 구성하려면 [Agent로 직접 로그 스트리밍][1]을 참조하세요.

[1]: /logs/log_collection/java/ stream-logs-directly-to-the-agent

Azure App Service에서 Node.js 애플리케이션 로깅을 구성하려면 Node.js를 사용한 Agentless 로깅을 참조하세요.

프로그래밍 방식의 관리

Datadog은 PowerShell을 사용하여 Azure App Service Extension을 업데이트하거나 설치하는 스크립트를 제공합니다. 스크립트 기반 확장 프로그램 관리를 통해 리소스 그룹별로 확장 프로그램을 일괄 업데이트하고 특정 버전의 사이트 확장 프로그램을 설치하도록 지정할 수 있습니다. 또한 스크립트를 사용하여 CI/CD 파이프라인에 확장 프로그램을 프로그래밍 방식으로 추가하고, 이미 설치된 확장 프로그램을 검색하고 업데이트할 수 있습니다.

전제 조건

확장 프로그램 최초 설치

설치 스크립트는 Azure Web App 또는 Azure Function App에 최신 버전의 확장 프로그램을 추가합니다. 이는 리소스 그룹 단위가 아닌 앱 단위로 수행됩니다.

  1. Azure CLI 또는 Azure Cloud Shell을 엽니다.

  2. 다음 명령을 사용하여 설치 스크립트를 다운로드합니다.

    Invoke-WebRequest -Uri "https://raw.githubusercontent.com/DataDog/datadog-aas-extension/master/management-scripts/extension/install-latest-extension.ps1" -OutFile "install-latest-extension.ps1"
    
  3. 다음 명령을 실행하고 필요에 따라 필수 및 선택 인수를 전달합니다.

    .\install-latest-extension.ps1 -Username <USERNAME> -Password <PASSWORD> -SubscriptionId <SUBSCRIPTION_ID> -ResourceGroup <RESOURCE_GROUP_NAME> -SiteName <SITE_NAME> -DDApiKey <DATADOG_API_KEY> -DDSite <DATADOG_SITE> -DDEnv <DATADOG_ENV> -DDService <DATADOG_SERVICE> -DDVersion <DATADOG_VERSION> [-SlotName <SLOT_NAME>]
    

참고: 위 명령을 실행할 때 다음 인수가 필요합니다.

  • <USERNAME>: Azure 사용자 범위 사용자 이름입니다.
  • <PASSWORD>: Azure 사용자 범위 암호입니다.
  • <SUBSCRIPTION_ID>: Azure 구독 ID입니다.
  • <RESOURCE_GROUP_NAME>: Azure 리소스 그룹 이름입니다.
  • <SITE_NAME>: 앱 이름입니다.
  • <DATADOG_API_KEY>: Datadog API 키입니다.

또한 DATADOG_SITE를 Datadog 사이트로 설정하세요. DATADOG_SITE의 기본값은 datadoghq.com입니다. 현재 사이트는 다음과 같습니다. .

기본 앱 대신 배포 슬롯을 대상으로 지정하려면 -SlotName <SLOT_NAME>을 추가하세요. Azure Function Apps에서는 확장 프로그램 설치 실패를 방지하기 위해 WEBSITE_PRIVATE_EXTENSIONS=0 고정 슬롯 설정도 자동으로 적용됩니다. 자세한 내용은 Azure Functions .NET APM Extension을 참조하세요.

리소스 그룹의 확장 프로그램 업데이트

업데이트 스크립트는 전체 리소스 그룹에 적용됩니다. 이 스크립트는 확장 프로그램이 설치된 모든 Web App 또는 Function App을 업데이트합니다. Datadog 확장 프로그램이 설치되지 않은 App Service 앱에는 영향을 주지 않습니다.

  1. Azure CLI 또는 Azure Cloud Shell을 엽니다.

  2. 다음 명령을 실행하여 업데이트 스크립트를 다운로드합니다.

    $baseUri="https://raw.githubusercontent.com/DataDog/datadog-aas-extension/master/management-scripts/extension"; Invoke-WebRequest -Uri "$baseUri/update-all-site-extensions.ps1" -OutFile "update-all-site-extensions.ps1"; Invoke-WebRequest -Uri "$baseUri/install-latest-extension.ps1" -OutFile "install-latest-extension.ps1"
    
  3. 다음 명령을 실행합니다. 모든 인수는 필수입니다.

    .\update-all-site-extensions.ps1 -SubscriptionId <SUBSCRIPTION_ID> -ResourceGroup <RESOURCE_GROUP_NAME> -Username <USERNAME> -Password <PASSWORD>
    

특정 버전의 확장 프로그램 설치

Azure App Service UI에서는 특정 버전의 확장 프로그램을 설치할 수 없습니다. 설치 또는 업데이트 스크립트를 사용하면 특정 버전을 설치할 수 있습니다.

단일 리소스에 특정 버전 설치

단일 인스턴스에 특정 버전을 설치하려면 확장 프로그램 최초 설치 지침을 따르고 설치 명령에 -ExtensionVersion 파라미터를 추가합니다.

.\install-latest-extension.ps1 -Username <USERNAME> -Password <PASSWORD> -SubscriptionId <SUBSCRIPTION_ID> -ResourceGroup <RESOURCE_GROUP_NAME> -SiteName <SITE_NAME> -DDApiKey <DATADOG_API_KEY> -ExtensionVersion <EXTENSION_VERSION>

<EXTENSION_VERSION>을 설치하려는 확장 프로그램 버전으로 바꿉니다. 예를 들어, 1.4.0입니다.

전체 리소스 그룹에 특정 버전 설치

리소스 그룹에 특정 버전을 설치하려면 리소스 그룹의 확장 프로그램 업데이트 지침을 따르고 설치 명령에 -ExtensionVersion 파라미터를 추가합니다.

.\update-all-site-extensions.ps1 -SubscriptionId <SUBSCRIPTION_ID> -ResourceGroup <RESOURCE_GROUP_NAME> -Username <USERNAME> -Password <PASSWORD> -ExtensionVersion <EXTENSION_VERSION>

<EXTENSION_VERSION>을 설치하려는 확장 프로그램 버전으로 바꿉니다. 예를 들어, 1.4.0입니다.

ARM 템플릿

많은 조직에서 Azure Resource Management(ARM) 템플릿을 사용하여 코드형 인프라 관행을 구현합니다. 이러한 템플릿에 App Service Extension을 포함하려면 Datadog의 App Service Extension 설치 템플릿을 배포에 통합하여 확장 프로그램을 추가하고 App Service 리소스와 함께 구성하세요.

Java Web Apps에 대한 지원은 확장 프로그램 v2.4+에서 미리 보기로 제공되고 있습니다. Java 웹 앱에 대한 프로그래밍 방식 관리는 지원되지 않습니다.

다른 App Service 리소스 유형이나 런타임에 대한 지원이 필요하신가요? 가입하여 미리 보기가 제공되면 알림을 받으세요.

프로파일링

Datadog의 Continuous Profiler는 Windows Azure App Service에서 .NET 및 Node.js에 대해 미리 보기로 제공되고 있습니다.

Continuous Profiler를 활성화하려면 환경 변수 DD_PROFILING_ENABLED=true를 설정합니다.

배포

To update your Datadog instrumentation with zero downtime, use deployment slots. You can create a workflow that uses GitHub Action for Azure CLI.

See the sample GitHub workflow.

문제 해결

Serverless 보기에서 앱이 잘못 구성된 것으로 식별되거나 트레이스에 해당하는 메트릭이 누락된 경우

애플리케이션을 모니터링하도록 Azure 통합이 구성되지 않았을 가능성이 높습니다. 적절하게 구성하면 Datadog 플랫폼에서 메트릭, 트레이스 및 로그를 더 효과적으로 연결할 수 있습니다. Azure 통합이 구성되지 않으면 트레이스에 필요한 중요한 컨텍스트가 누락됩니다. 문제를 해결하려면 다음 단계를 따르세요.

  1. Azure 통합 타일로 이동합니다.

  2. 애플리케이션이 실행 중인 Azure 구독에 Azure 통합을 설치했는지 확인합니다.

  3. 적용한 App Service 플랜 필터링 규칙에 앱이 실행 중인 App Service 플랜이 포함되어 있는지 확인합니다. App Service 플랜이 포함되지 않으면 해당 플랜에서 호스팅되는 모든 앱과 함수도 제외됩니다. 앱 자체의 태그는 Datadog의 필터링에 사용되지 않습니다.

APM 트레이스가 Datadog에 나타나지 않을 경우

  1. DD_SITE 및 DD_API_KEY를 올바르게 설정했는지 확인합니다.

  2. 애플리케이션을 완전히 중지했다가 다시 시작합니다.

  3. 문제가 해결되지 않으면 확장 프로그램을 제거한 후 다시 설치하세요(이렇게 하면 최신 버전을 실행 중인지도 확인할 수 있습니다).

참고: 지원팀과 애플리케이션 오류를 더 빠르게 조사하려면 DD_TRACE_DEBUG:true를 설정하고 Datadog 로그 디렉터리(%AzureAppServiceHomeDirectory%\LogFiles\datadog)의 내용을 이메일에 첨부하세요.

도움이 더 필요하신가요? Datadog 지원팀에 문의하세요.

트레이스에서 관련 없는 스팬이 표시되는 경우

App Service 플랜에서 Automatic Scaling이 활성화되어 있고 관련 없는 트레이스가 서로 병합되는 경우 Azure 플랫폼 상태 프로브(User-Agent: HttpScaleManager)에 이전 W3C 트레이스 컨텍스트가 포함되어 있을 수 있습니다. 앱을 호출하는 모든 호출자가 Datadog으로 계측된 경우, 영향을 받는 앱에서 DD_TRACE_PROPAGATION_STYLE_EXTRACT=datadog을 설정하여 트레이스 컨텍스트 추출을 Datadog 형식으로 제한하세요. Datadog으로 계측되지 않은 호출자가 있는 앱에서는 이 설정으로 인해 Datadog이 해당 호출자의 W3C 트레이스 컨텍스트를 무시하므로, 해당 요청이 상위 트레이스에 병합되지 않고 별도의 트레이스로 분리됩니다.

추가 자료