Azure Diagnostics 확장은 Windows 기반 Azure 가상 머신에서 모니터링 및 진단 기능을 제공합니다. Azure Resource Manager 템플릿의 일부로 확장을 포함하여 가상 머신에서 이러한 기능을 사용하도록 설정할 수 있습니다. 가상 머신 템플릿의 일부로 확장을 포함하는 방법에 대한 자세한 내용은 VM 확장을 사용하여 Azure Resource Manager 템플릿 작성 을 참조하세요. 이 문서에서는 Windows 가상 머신 템플릿에 Azure Diagnostics 확장을 추가하는 방법을 설명합니다.
중요합니다
Azure Diagnostic 확장에서 마이그레이션
Azure Diagnostics 확장은 2026년 3월 31일에 더 이상 사용되지 않습니다. 이 날짜 이후 Microsoft는 더 이상 Azure Diagnostics 확장을 지원하지 않습니다.
지속적인 지원과 새 기능에 대한 액세스를 보장하려면 LINux(LAD) 및 Windows(WAD)용 Azure Diagnostics 확장에서 동일한 데이터를 수집하고 Log Analytics 작업 영역, Azure Event Hubs 및 Azure Storage를 비롯한 여러 대상으로 보낼 수 있는 Azure Monitor 에이전트로 마이그레이션해야 합니다. 중복 데이터를 방지하도록 Azure Monitor 에이전트를 구성한 후 LAD 또는 WAD를 제거합니다.
스토리지 대신 비용 효율적인 로깅을 위해 Log Analytics 작업 영역에서 보조 계획을 사용하여 테이블에 데이터를 보내야 합니다.
단일 VM에 설치된 확장을 확인하려면 VM의 설정에서 확장 + 애플리케이션을 선택합니다. 액세스 권한이 있는 구독의 모든 가상 머신에 설치된 확장을 검토하려면 Azure Resource Graph에서 다음 쿼리를 사용합니다.
resources
| where type contains "extension"
| extend parsedProperties = parse_json(properties)
| extend publisher = tostring(parsedProperties.publisher)
| project-away parsedProperties
| where publisher == "Microsoft.Azure.Diagnostics"
| distinct id
다음과 유사한 결과가 생성됩니다.
비고
더 빠른 진단을 위해 VM 지원을 사용해 보세요. Windows용 VM 지원 또는 Linux용 VM 지원을 실행하는 것이 좋습니다. 이러한 스크립트 기반 진단 도구는 Azure VM 게스트 에이전트 및 전체 VM 상태에 영향을 주는 일반적인 문제를 식별하는 데 도움이 됩니다.
가상 머신에 성능 문제가 발생하는 경우 지원에 문의하기 전에 다음 도구를 실행합니다.
VM 리소스 정의에 Azure Diagnostics 확장 추가
Windows Virtual Machine에서 진단 확장을 사용하도록 설정하려면 Resource Manager 템플릿에서 확장을 VM 리소스로 추가해야 합니다.
간단한 Resource Manager 기반 Virtual Machine의 경우 Virtual Machine의 리소스 배열에 확장 구성을 추가합니다.
"resources": [
{
"name": "Microsoft.Insights.VMDiagnosticsSettings",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
],
"tags": {
"displayName": "AzureDiagnostics"
},
"properties": {
"publisher": "Microsoft.Azure.Diagnostics",
"type": "IaaSDiagnostics",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), variables('vmName'), variables('wadcfgxend')))]",
"storageAccount": "[parameters('existingdiagnosticsStorageAccountName')]"
},
"protectedSettings": {
"storageAccountName": "[parameters('existingdiagnosticsStorageAccountName')]",
"storageAccountKey": "[listkeys(variables('accountid'), '2015-05-01-preview').key1]",
"storageAccountEndPoint": "https://core.windows.net"
}
}
}
]
또 다른 일반적인 규칙은 가상 머신의 리소스 노드에서 정의하는 대신 템플릿의 루트 리소스 노드에 확장 구성을 추가하는 것입니다. 이 방법을 사용하면 이름 및 형식 값을 사용하여 확장과 가상 머신 간의 계층 관계를 명시적으로 지정해야 합니다. 다음은 그 예입니다.
"name": "[concat(variables('vmName'),'Microsoft.Insights.VMDiagnosticsSettings')]",
"type": "Microsoft.Compute/virtualMachines/extensions",
확장은 항상 가상 머신과 연결되며, 가상 머신의 리소스 노드에서 직접 정의하거나 기본 수준에서 정의하고 계층적 명명 규칙을 사용하여 가상 머신과 연결할 수 있습니다.
Virtual Machine Scale Sets의 경우 확장 구성은 VirtualMachineProfile의 extensionProfile 속성에 지정됩니다.
Microsoft.Azure.Diagnostics 값과 IaaSDiagnostics 값이 있는 type 속성이 있는 게시자 속성은 Azure Diagnostics 확장을 고유하게 식별합니다.
이름 속성의 값을 사용하여 리소스 그룹의 확장을 참조할 수 있습니다. 특히 Microsoft.Insights.VMDiagnosticsSettings 로 설정하면 Azure Portal에서 모니터링 차트가 Azure Portal에 올바르게 표시되도록 쉽게 식별할 수 있습니다.
typeHandlerVersion은 사용하려는 확장의 버전을 지정합니다. autoUpgradeMinorVersion 부 버전을 true로 설정하면 사용 가능한 최신 부 버전 확장이 제공됩니다. 항상 모든 새로운 기능 및 버그 수정과 함께 사용 가능한 최신 진단 확장을 사용할 수 있도록 항상 autoUpgradeMinorVersion 을 true 로 설정하는 것이 좋습니다.
설정 요소에는 확장에서 다시 설정하고 읽을 수 있는 확장에 대한 구성 속성이 포함되어 있습니다(공용 구성이라고도 함). xmlcfg 속성에는 진단 에이전트에서 수집하는 진단 로그, 성능 카운터 등에 대한 xml 기반 구성이 포함됩니다. xml 스키마 자체에 대한 자세한 내용은 진단 구성 스키마를 참조하세요. 일반적인 방법은 실제 xml 구성을 Azure Resource Manager 템플릿에 변수로 저장한 다음 연결하고 base64를 인코딩하여 xmlcfg의 값을 설정하는 것입니다. 변수에 xml을 저장하는 방법에 대한 자세한 내용은 진단 구성 변수 에 대한 섹션을 참조하세요. storageAccount 속성은 진단 데이터가 전송되는 스토리지 계정의 이름을 지정합니다.
protectedSettings의 속성(프라이빗 구성이라고도 함)은 설정할 수 있지만 설정된 후에는 다시 읽을 수 없습니다. protectedSettings의 쓰기 전용 특성을 사용하면 진단 데이터가 기록되는 스토리지 계정 키와 같은 비밀을 저장하는 데 유용합니다.
진단 스토리지 계정을 매개 변수로 지정
위의 진단 확장 json 코드 조각은 진단 데이터가 저장되는 진단 스토리지 계정을 지정하기 위해 두 개의 매개 변수 existingdiagnosticsStorageAccountName 및 existingdiagnosticsStorageResourceGroup 을 가정합니다. 진단 스토리지 계정을 매개 변수로 지정하면 다양한 환경에서 진단 스토리지 계정을 쉽게 변경할 수 있습니다. 예를 들어 테스트에 다른 진단 스토리지 계정을 사용하고 프로덕션 배포에 다른 진단 스토리지 계정을 사용할 수 있습니다.
"existingdiagnosticsStorageAccountName": {
"type": "string",
"metadata": {
"description": "The name of an existing storage account to which diagnostics data is transfered."
}
},
"existingdiagnosticsStorageResourceGroup": {
"type": "string",
"metadata": {
"description": "The resource group for the storage account specified in existingdiagnosticsStorageAccountName"
}
}
가상 머신에 대한 리소스 그룹과 다른 리소스 그룹에 진단 스토리지 계정을 지정하는 것이 가장 좋습니다. 리소스 그룹은 자체 수명이 있는 배포 단위로 간주할 수 있으며, 새 구성 업데이트가 만들어질 때 가상 머신을 배포하고 다시 배포할 수 있지만 이러한 가상 머신 배포에서 진단 데이터를 동일한 스토리지 계정에 계속 저장할 수 있습니다. 스토리지 계정이 다른 리소스에 있으면 스토리지 계정이 다양한 가상 머신 배포의 데이터를 수락하여 다양한 버전에서 문제를 쉽게 해결할 수 있습니다.
비고
Visual Studio에서 Windows 가상 머신 템플릿을 만드는 경우 가상 머신 VHD가 업로드되는 동일한 스토리지 계정을 사용하도록 기본 스토리지 계정을 설정할 수 있습니다. 이는 VM의 초기 설정을 간소화하기 위한 것입니다. 매개 변수로 전달할 수 있는 다른 스토리지 계정을 사용하도록 템플릿을 다시 고려합니다.
진단 구성 변수
이전 진단 확장 json 코드 조각은 진단 스토리지에 대한 스토리지 계정 키 가져오기를 간소화하기 위해 계정 변수를 정의합니다.
"accountid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/',parameters('existingdiagnosticsStorageResourceGroup'), '/providers/','Microsoft.Storage/storageAccounts/', parameters('existingdiagnosticsStorageAccountName'))]"
진단 확장에 대한 xmlcfg 속성은 함께 연결된 여러 변수를 사용하여 정의됩니다. 이러한 변수의 값은 xml이므로 json 변수를 설정할 때 올바르게 이스케이프해야 합니다.
다음 예제에서는 일부 Windows 이벤트 로그 및 진단 인프라 로그와 함께 표준 시스템 수준 성능 카운터를 수집하는 진단 구성 xml을 설명합니다. 구성을 템플릿의 변수 섹션에 직접 붙여넣을 수 있도록 이스케이프 및 형식이 올바르게 지정되었습니다. 더 많은 사람이 읽을 수 있는 구성 xml 예제는 진단 구성 스키마 를 참조하세요.
"wadlogs": "<WadCfg> <DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\"> <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/> <WindowsEventLog scheduledTransferPeriod=\"PT1M\" > <DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" /> <DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" /> <DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" /></WindowsEventLog>",
"wadperfcounters1": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\"><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% Processor Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU utilization\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% Privileged Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU privileged time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor(_Total)\\% User Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"CPU user time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Processor Information(_Total)\\Processor Frequency\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"CPU frequency\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\System\\Processes\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Processes\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Threads\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Handle Count\" sampleRate=\"PT15S\" unit=\"Count\"><annotation displayName=\"Handles\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\% Committed Bytes In Use\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Memory usage\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Available Bytes\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory available\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Committed Bytes\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory committed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\Memory\\Commit Limit\" sampleRate=\"PT15S\" unit=\"Bytes\"><annotation displayName=\"Memory commit limit\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active time\" locale=\"en-us\"/></PerformanceCounterConfiguration>",
"wadperfcounters2": "<PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Read Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active read time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\% Disk Write Time\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk active write time\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Transfers/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Reads/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk read operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Writes/sec\" sampleRate=\"PT15S\" unit=\"CountPerSecond\"><annotation displayName=\"Disk write operations\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Read Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk read speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\PhysicalDisk(_Total)\\Disk Write Bytes/sec\" sampleRate=\"PT15S\" unit=\"BytesPerSecond\"><annotation displayName=\"Disk write speed\" locale=\"en-us\"/></PerformanceCounterConfiguration><PerformanceCounterConfiguration counterSpecifier=\"\\LogicalDisk(_Total)\\% Free Space\" sampleRate=\"PT15S\" unit=\"Percent\"><annotation displayName=\"Disk free space (percentage)\" locale=\"en-us\"/></PerformanceCounterConfiguration></PerformanceCounters>",
"wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters1'), variables('wadperfcounters2'), '<Metrics resourceId=\"')]",
"wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name , '/providers/', 'Microsoft.Compute/virtualMachines/')]",
"wadcfgxend": "\"><MetricAggregation scheduledTransferPeriod=\"PT1H\"/><MetricAggregation scheduledTransferPeriod=\"PT1M\"/></Metrics></DiagnosticMonitorConfiguration></WadCfg>"
위의 구성에서 메트릭 정의 xml 노드는 PerformanceCounter 노드의 xml에서 이전에 정의된 성능 카운터를 집계하고 저장하는 방법을 정의하기 때문에 중요한 구성 요소입니다.
중요합니다
이러한 메트릭은 Azure Portal에서 모니터링 차트 및 경고를 구동합니다. Azure Portal에서 VM 모니터링 데이터를 보려면 resourceID 및 MetricAggregation이 있는 메트릭 노드를 VM에 대한 진단 구성에 포함해야 합니다.
다음 예제에서는 메트릭 정의에 대한 xml을 보여 줍니다.
<Metrics resourceId="/subscriptions/subscription().subscriptionId/resourceGroups/resourceGroup().name/providers/Microsoft.Compute/virtualMachines/vmName">
<MetricAggregation scheduledTransferPeriod="PT1H"/>
<MetricAggregation scheduledTransferPeriod="PT1M"/>
</Metrics>
resourceID 특성은 구독의 가상 머신을 고유하게 식별합니다. 템플릿이 배포하려는 구독 및 리소스 그룹에 따라 해당 값을 자동으로 업데이트하도록 구독() 및 resourceGroup() 함수를 사용해야 합니다.
루프에서 여러 Virtual Machines를 만드는 경우 각 개별 VM을 올바르게 구분하려면 resourceID 값을 copyIndex() 함수로 채워야 합니다. xmlCfg 값은 다음과 같이 지원하도록 업데이트할 수 있습니다.
"xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), concat(parameters('vmNamePrefix'), copyindex()), variables('wadcfgxend')))]",
PT1M 및 PT1H의 MetricAggregation 값은 각각 1분 이상 집계와 1시간 동안의 집계를 의미합니다.
스토리지의 WADMetrics 테이블
위의 메트릭 구성은 다음 명명 규칙을 사용하여 진단 스토리지 계정에 테이블을 생성합니다.
- WADMetrics: 모든 WADMetrics 테이블에 대한 표준 접두사
- PT1H 또는 PT1M: 테이블에 1시간 또는 1분 이상의 집계 데이터가 포함되어 있음을 나타냅니다.
- P10D: 테이블이 데이터 수집을 시작한 후 10일 동안의 데이터가 테이블에 포함됨을 나타냅니다.
- V2S: 문자열 상수
- yyyymmdd: 테이블이 데이터 수집을 시작한 날짜입니다.
예: WADMetricsPT1HP10DV2S20151108에는 2015년 11 월 11일부터 10일 동안 1시간 동안 집계된 메트릭 데이터가 포함됩니다.
각 WADMetrics 테이블에는 다음 열이 포함되어 있습니다.
-
PartitionKey: 파티션 키는 resourceID 값을 기반으로 생성되어 VM 리소스를 고유하게 식별합니다. 예:
002Fsubscriptions:<subscriptionID>:002FresourceGroups:002F<ResourceGroupName>:002Fproviders:002FMicrosoft:002ECompute:002FvirtualMachines:002F<vmName> -
RowKey: 형식
<Descending time tick>:<Performance Counter Name>을 따릅니다. 내림차순 시간 틱 계산은 집계 기간의 시작 시간을 뺀 최대 시간 틱입니다. 예를 들어 샘플 기간이 2015년 11월 10일 및 00:00Hrs UTC에서 시작된 경우 계산은 다음과DateTime.MaxValue.Ticks - (new DateTime(2015,11,10,0,0,0,DateTimeKind.Utc).Ticks)같습니다. 사용 가능한 메모리 바이트 성능의 경우 행 키 카운터는 다음과 같습니다.2519551871999999999__:005CMemory:005CAvailable:0020Bytes - CounterName: 성능 카운터의 이름입니다. xml 구성에 정의된 counterSpecifier 와 일치합니다.
- 최대값: 집계 기간 동안 성능 카운터의 최대값입니다.
- 최소: 집계 기간 동안 성능 카운터의 최소값입니다.
- 합계: 집계 기간 동안 보고된 성능 카운터의 모든 값의 합계입니다.
- 개수: 성능 카운터에 대해 보고된 총 값 수입니다.
- 평균: 집계 기간 동안 성능 카운터의 평균(총/개수) 값입니다.
다음 단계
- 진단 확장이 있는 Windows 가상 머신의 전체 샘플 템플릿은 vm-monitoring-diagnostics-extension을 참조하세요.
- Azure PowerShell 또는 Azure 명령줄을 사용하여 Azure Resource Manager 템플릿 배포
- Azure Resource Manager 템플릿 작성에 대해 자세히 알아보기