Azure App Service 및 Python에 대한 애플리케이션 모니터링(미리 보기)

Important

베타, 미리 보기로 제공되거나 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 약관은 Microsoft Azure 미리 보기에 대한 추가 사용 약관을 참조하세요.

코드를 수정하지 않고 Azure App Services에서 Python 웹 애플리케이션을 모니터링합니다. 이 가이드에서는 Azure Monitor Application Insights를 사용하도록 설정하는 방법을 보여 주고 대규모 배포를 자동화하기 위한 팁을 제공합니다.

통합은 코드에서 널리 사용되는 Python 라이브러리를 계측하여 종속성, 로그 및 메트릭을 자동으로 수집하고 상호 관련시킬 수 있도록 합니다. 계측 후 다음 Python 라이브러리에서 호출 및 메트릭을 수집합니다.

계측 지원되는 라이브러리 이름 지원되는 버전
OpenTelemetry Django 계측 django link
OpenTelemetry FastApi 계측 fastapi link
OpenTelemetry Flask 계측 flask link
OpenTelemetry Psycopg2 계측 psycopg2 link
OpenTelemetry Requests 계측 requests link
OpenTelemetry UrlLib 계측 urllib 모두
OpenTelemetry UrlLib3 계측 urllib3 link

참고 항목

Django를 사용하는 경우 이 문서의 추가 Django 계측 섹션을 참조하세요.

로깅 원격 분석은 루트 로거 수준에서 수집됩니다. Python의 네이티브 로깅 계층 구조에 대해 자세히 알아보려면 Python 로깅 설명서를 참조하세요.

필수 조건

  • Python 버전 3.11 이하.
  • App Service는 코드로 배포되어야 합니다. 사용자 지정 컨테이너는 지원되지 않습니다.

Application Insights 사용

Azure App Services에서 Python 애플리케이션을 모니터링하는 가장 쉬운 방법은 Azure Portal을 이용하는 것입니다.

Azure Portal에서 모니터링을 활성화하면 Application Insights를 사용하여 애플리케이션이 자동으로 계측되며 코드를 변경할 필요가 없습니다.

참고 항목

코드에서 Azure Monitor OpenTelemetry Distro 또는 Azure Monitor OpenTelemetry 내보내기 도구와 같은 OpenTelemetry의 수동 계측을 사용하지 않는 경우 App Service에서 자동 계측만 사용해야 합니다. 이를 통해 중복 데이터가 전송되는 것을 방지합니다. 이 기능에 관한 자세한 내용은 이 문서의 문제 해결 섹션을 확인하세요.

Azure Portal을 통한 자동 계측

지원되는 자동 계측 시나리오의 전체 목록은 지원되는 환경, 언어 및 리소스 공급자를 참조하세요.

코드를 변경할 필요 없이 Azure App Service에서 Python 앱 모니터링을 켜세요.

Python용 Application Insights는 코드 기반 Linux Azure App Service와 통합됩니다.

통합은 퍼블릭 미리 보기 상태입니다. GA에 있는 Python SDK를 추가합니다.

  1. App Service의 Azure 제어판에서 Application Insights를 선택한 다음 사용을 선택합니다.

    사용이 선택된 Application Insights 탭의 스크린샷.

  2. 새 리소스를 만들도록 선택하거나 이 애플리케이션에 대한 기존 Application Insights 리소스를 선택합니다.

    참고 항목

    확인을 선택하여 새 리소스를 만들면 모니터링 설정 적용 메시지가 표시됩니다. 계속을 선택하면 새 Application Insights 리소스가 App Service에 연결됩니다. 또한 이로 인해 App Service 다시 시작이 트리거됩니다.

    리소스 변경 드롭다운의 스크린샷.

  3. 리소스를 지정하면 바로 사용할 수 있습니다.

    애플리케이션 계측의 스크린샷.

구성

다음과 같은 OpenTelemetry 환경 변수를 사용하여 구성할 수 있습니다.

환경 변수 설명
OTEL_SERVICE_NAME, OTEL_RESOURCE_ATTRIBUTES 애플리케이션과 관련된 OpenTelemetry 리소스 특성을 지정합니다. OTEL_RESOURCE_ATTRIBUTES를 사용하여 리소스 특성을 설정하거나 OTEL_SERVICE_NAME을 사용하여 service.name만 설정할 수 있습니다.
OTEL_LOGS_EXPORTER None으로 설정하면 로깅 원격 분석의 컬렉션 및 내보내기가 사용하지 않도록 설정됩니다.
OTEL_METRICS_EXPORTER None으로 설정하면 메트릭 원격 분석의 컬렉션 및 내보내기가 사용하지 않도록 설정됩니다.
OTEL_TRACES_EXPORTER None으로 설정하면 분산 추적 원격 분석의 컬렉션 및 내보내기가 사용하지 않도록 설정됩니다.
OTEL_BLRP_SCHEDULE_DELAY 로깅 내보내기 간격을 밀리초 단위로 지정합니다. 기본값은 5000입니다.
OTEL_BSP_SCHEDULE_DELAY 분산 추적 내보내기 간격을 밀리초 단위로 지정합니다. 기본값은 5000입니다.
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS 사용하지 않도록 설정할 OpenTelemetry 계측을 지정합니다. 사용하지 않도록 설정되면 계측이 자동 계측의 일부로 실행되지 않습니다. 쉼표로 구분된 소문자 라이브러리 이름 목록을 허용합니다. 예를 들어, Psycopg2 및 FastAPI 계측을 사용하지 않도록 설정하려면 이를 "psycopg2,fastapi"로 설정합니다. 기본값은 빈 목록으로, 지원되는 모든 계측을 사용하도록 설정합니다.

커뮤니티 계측 라이브러리 추가

OpenTelemetry 커뮤니티에서 계측 라이브러리를 포함하면 더 많은 데이터를 자동으로 수집할 수 있습니다.

주의

커뮤니티 계측 라이브러리의 품질을 지원하거나 보장하지 않습니다. 배포판에 대해 제안하려면 피드백 커뮤니티에 게시하거나 투표하세요. 일부는 실험적 OpenTelemetry 사양을 기반으로 하며 향후 호환성이 손상되는 변경이 발생할 수 있습니다.

커뮤니티 OpenTelemetry 계측 라이브러리를 추가하려면 앱의 requirements.txt 파일을 통해 설치합니다. OpenTelemetry 자동 계측은 설치된 모든 라이브러리를 자동으로 선택하고 계측합니다. 여기에서 커뮤니티 라이브러리 목록을 찾습니다.

모니터링 자동화

Application Insights로 원격 분석 컬렉션을 사용하려면 다음 애플리케이션 설정만 설정하면 됩니다.

사용 가능한 Application Insights 설정을 사용한 App Service 애플리케이션 설정의 스크린샷.

애플리케이션 설정 정의

앱 설정 이름 정의
APPLICATIONINSIGHTS_CONNECTION_STRING Application Insights 리소스에 대한 연결 문자열 예: abcd1234-ab12-cd34-abcd1234abcd
ApplicationInsightsAgent_EXTENSION_VERSION 런타임 모니터링을 제어하는 기본 확장입니다. ~3

참고 항목

Python 애플리케이션에서는 프로파일러 및 스냅샷 디버거를 사용할 수 없습니다.

Azure Resource Manager를 사용한 App Service 애플리케이션 설정

Azure App Service에 대한 애플리케이션 설정은 Azure Resource Manager 템플릿으로 관리 및 구성할 수 있습니다. Resource Manager 자동화를 사용하여 새 App Service 리소스를 배포하거나 기존 리소스의 설정을 수정할 때 이 방법을 사용할 수 있습니다.

App Service 리소스에 대한 애플리케이션 설정 JSON의 기본 구조:

      "resources": [
        {
          "name": "appsettings",
          "type": "config",
          "apiVersion": "2015-08-01",
          "dependsOn": [
            "[resourceId('Microsoft.Web/sites', variables('webSiteName'))]"
          ],
          "tags": {
            "displayName": "Application Insights Settings"
          },
          "properties": {
            "key1": "value1",
            "key2": "value2"
          }
        }
      ]

Application Insights에 대해 구성된 애플리케이션 설정이 포함된 Resource Manager 템플릿의 예제에서는 이 템플릿이 유용할 수 있습니다. 특히 238행에서 시작하는 섹션을 참조하세요.

기본 Application Insights 설정을 사용하여 Resource Manager 템플릿을 만들려면 Application Insights를 사용하도록 설정하여 새 웹앱을 만들려는 것처럼 프로세스를 시작합니다.

  1. 원하는 웹앱 정보로 새 App Service 리소스를 만듭니다. 모니터링 탭에서 Application Insights를 사용하도록 설정합니다.

  2. 검토 + 만들기를 선택합니다. 그런 다음 자동화용 템플릿 다운로드를 선택합니다.

    App Service 웹앱 만들기 메뉴를 보여 주는 스크린샷

    이 옵션은 모든 필수 설정이 구성된 최신 Resource Manager 템플릿을 생성합니다.

    App Service 웹앱 템플릿을 보여 주는 스크린샷.

다음 샘플에서 AppMonitoredSite의 모든 인스턴스를 사이트 이름으로 바꿉니다.

참고 항목

Windows를 사용하는 경우 ApplicationInsightsAgent_EXTENSION_VERSION을(를) ~2(으)로 설정합니다. Linux를 사용하는 경우 ApplicationInsightsAgent_EXTENSION_VERSION을(를) ~3(으)로 설정합니다.

{
    "resources": [
        {
            "name": "[parameters('name')]",
            "type": "Microsoft.Web/sites",
            "properties": {
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                            "value": "[reference('microsoft.insights/components/AppMonitoredSite', '2015-05-01').InstrumentationKey]"
                        },
                        {
                            "name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
                            "value": "[reference('microsoft.insights/components/AppMonitoredSite', '2015-05-01').ConnectionString]"
                        },
                        {
                            "name": "ApplicationInsightsAgent_EXTENSION_VERSION",
                            "value": "~2"
                        }
                    ]
                },
                "name": "[parameters('name')]",
                "serverFarmId": "[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                "hostingEnvironment": "[parameters('hostingEnvironment')]"
            },
            "dependsOn": [
                "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                "microsoft.insights/components/AppMonitoredSite"
            ],
            "apiVersion": "2016-03-01",
            "location": "[parameters('location')]"
        },
        {
            "apiVersion": "2016-09-01",
            "name": "[parameters('hostingPlanName')]",
            "type": "Microsoft.Web/serverfarms",
            "location": "[parameters('location')]",
            "properties": {
                "name": "[parameters('hostingPlanName')]",
                "workerSizeId": "[parameters('workerSize')]",
                "numberOfWorkers": "1",
                "hostingEnvironment": "[parameters('hostingEnvironment')]"
            },
            "sku": {
                "Tier": "[parameters('sku')]",
                "Name": "[parameters('skuCode')]"
            }
        },
        {
            "apiVersion": "2015-05-01",
            "name": "AppMonitoredSite",
            "type": "microsoft.insights/components",
            "location": "West US 2",
            "properties": {
                "ApplicationId": "[parameters('name')]",
                "Request_Source": "IbizaWebAppExtensionCreate"
            }
        }
    ],
    "parameters": {
        "name": {
            "type": "string"
        },
        "hostingPlanName": {
            "type": "string"
        },
        "hostingEnvironment": {
            "type": "string"
        },
        "location": {
            "type": "string"
        },
        "sku": {
            "type": "string"
        },
        "skuCode": {
            "type": "string"
        },
        "workerSize": {
            "type": "string"
        },
        "serverFarmResourceGroup": {
            "type": "string"
        },
        "subscriptionId": {
            "type": "string"
        }
    },
    "$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0"
}

PowerShell을 통해 사용

PowerShell을 통해 애플리케이션 모니터링을 사용하도록 설정하려면 기본 애플리케이션 설정만 변경해야 합니다. 다음 샘플은 리소스 그룹 AppMonitoredRG에서 AppMonitoredSite라는 웹 사이트에 대한 애플리케이션 모니터링을 사용하도록 설정합니다. 012345678-abcd-ef01-2345-6789abcd 계측 키로 전송되는 데이터를 구성합니다.

참고 항목

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

참고 항목

Windows를 사용하는 경우 ApplicationInsightsAgent_EXTENSION_VERSION을 ~2(으)로 설정합니다. Linux를 사용하는 경우 ApplicationInsightsAgent_EXTENSION_VERSION을 ~3으로 설정합니다.

$app = Get-AzWebApp -ResourceGroupName "AppMonitoredRG" -Name "AppMonitoredSite" -ErrorAction Stop
$newAppSettings = @{} # case-insensitive hash map
$app.SiteConfig.AppSettings | %{$newAppSettings[$_.Name] = $_.Value} # preserve non Application Insights application settings.
$newAppSettings["APPINSIGHTS_INSTRUMENTATIONKEY"] = "012345678-abcd-ef01-2345-6789abcd"; # set the Application Insights instrumentation key
$newAppSettings["APPLICATIONINSIGHTS_CONNECTION_STRING"] = "InstrumentationKey=012345678-abcd-ef01-2345-6789abcd"; # set the Application Insights connection string
$newAppSettings["ApplicationInsightsAgent_EXTENSION_VERSION"] = "~2"; # enable the ApplicationInsightsAgent
$app = Set-AzWebApp -AppSettings $newAppSettings -ResourceGroupName $app.ResourceGroup -Name $app.Name -ErrorAction Stop

Django 계측

OpenTelemetry Django Instrumentation을 사용하려면 앱 폴더에서 설정 모듈을 가리키도록 App Service 설정에서 DJANGO_SETTINGS_MODULE 환경 변수를 설정해야 합니다. 자세한 내용은 Django 설명서를 참조하세요.

자주 묻는 질문

Application Insights의 표준 메트릭과 Azure App Service 메트릭의 차이점은 무엇인가요?

Application Insights는 애플리케이션에 대한 요청에 대한 원격 분석을 수집합니다. WebApps/WebServer에서 오류가 발생했고 요청이 사용자 애플리케이션에 도달하지 못한 경우 Application Insights는 이에 대한 원격 분석을 하지 않습니다.

Application Insights에서 계산한 serverresponsetime의 기간은 Web Apps에서 관찰한 서버 응답 시간과 반드시 일치하지는 않습니다. 이 동작은 Application Insights가 요청이 실제로 사용자 애플리케이션에 도달하는 기간만 계산하기 때문입니다. 요청이 WebServer에서 멈추거나 대기 중인 경우 대기 시간은 Web Apps 메트릭에 포함되지만 Application Insights 메트릭에는 포함되지 않습니다.

문제 해결

여기에서는 자동 계측을 사용하여 Azure App Services에서 Python 애플리케이션을 모니터링하기 위한 문제 해결 가이드를 제공합니다.

중복된 원격 분석

코드에서 Azure Monitor OpenTelemetry Distro 또는 Azure Monitor OpenTelemetry 내보내기 도구와 같은 OpenTelemetry의 수동 계측을 사용하지 않는 경우 App Service에서 자동 계측만 사용해야 합니다. 수동 계측 외에 자동 계측을 사용하면 원격 분석이 중복되어 비용이 증가할 수 있습니다. App Service OpenTelemetry 자동 계측을 사용하려면 먼저 코드에서 OpenTelemetry의 수동 계측을 제거합니다.

원격 분석 누락

원격 분석이 누락된 경우 다음 단계에 따라 자동 계측이 올바르게 사용하도록 설정되었는지 확인합니다.

1단계: App Service 리소스에서 Application Insights 블레이드 확인

App Service 리소스의 Application Insights 블레이드에서 자동 계측이 사용하도록 설정되어 있는지 확인합니다.

사용이 선택된 Application Insights 탭의 스크린샷.

2단계: 앱 설정이 올바른지 확인

ApplicationInsightsAgent_EXTENSION_VERSION 앱 설정이 ~3 값으로 설정되어 있고 APPLICATIONINSIGHTS_CONNECTION_STRING이 적절한 Application Insights 리소스를 가리키는지 확인합니다.

사용 가능한 Application Insights 설정을 사용한 App Service 애플리케이션 설정의 스크린샷.

3단계: 자동 계측 진단 및 상태 로그 확인

/var/log/applicationinsights/로 이동하고 status_*.json을 엽니다.

AgentInitializedSuccessfully가 true로 설정되어 있고 IKey가 유효한 iKey를 가지고 있는지 확인합니다.

다음은 JSON 파일의 예입니다.

    "AgentInitializedSuccessfully":true,
            
    "AppType":"python",
            
    "MachineName":"c89d3a6d0357",
            
    "PID":"47",
            
    "IKey":"00000000-0000-0000-0000-000000000000",
            
    "SdkVersion":"1.0.0"

동일한 폴더에 있는 applicationinsights-extension.log 파일에는 다른 유용한 진단이 표시될 수 있습니다.

Django 앱

앱이 Django를 사용하고 시작에 실패하거나 잘못된 설정을 사용하는 경우 DJANGO_SETTINGS_MODULE 환경 변수를 설정해야 합니다. 자세한 내용은 Django 계측 섹션을 참조하세요.


애플리케이션 호스트와 수집 서비스 간의 연결 테스트

Application Insights SDK 및 에이전트는 수집 엔드포인트에 대한 REST 호출로 수집하기 위해 원격 분석을 보냅니다. PowerShell 또는 curl 명령의 원시 REST 클라이언트를 사용하여 웹 서버 또는 애플리케이션 호스트 컴퓨터에서 수집 서비스 엔드포인트로의 연결을 테스트할 수 있습니다. Azure Monitor Application Insights에서 누락된 애플리케이션 원격 분석 문제 해결을 참조하세요.

최신 업데이트 및 버그 수정에 대해서는 릴리스 정보를 참조하세요. -->

다음 단계