Usar monitoramento e diagnóstico com uma VM do Windows e modelos do Azure Resource Manager
A Extensão de Diagnóstico do Azure fornece os recursos de monitoramento e diagnóstico em uma máquina virtual do Azure baseada no Windows. Você pode habilitar esses recursos na máquina virtual incluindo a extensão como parte do modelo do Azure Resource Manager. Consulte Criação de modelos do Azure Resource Manager com extensões de VM para obter mais informações sobre como incluir qualquer extensão como parte de um modelo de máquina virtual. Este artigo descreve como você pode adicionar a extensão de Diagnóstico do Azure a um modelo de máquina virtual do Windows.
Adicionar a extensão de Diagnóstico do Azure à definição de recurso de VM
Para habilitar a extensão de diagnóstico em uma máquina virtual do Windows, você precisa adicionar a extensão como um recurso de VM no modelo do Gerenciador de recursos.
Para uma máquina virtual simples baseada no Resource Manager, adicione a configuração de extensão à matriz de recursos para a máquina virtual:
"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"
}
}
}
]
Outra convenção comum é adicionar a configuração de extensão no nó de recursos raiz do modelo em vez de defini-la no nó de recursos da máquina virtual. Com essa abordagem, você precisa especificar explicitamente uma relação hierárquica entre a extensão e a máquina virtual com os valores de nome e tipo . Por exemplo:
"name": "[concat(variables('vmName'),'Microsoft.Insights.VMDiagnosticsSettings')]",
"type": "Microsoft.Compute/virtualMachines/extensions",
A extensão está sempre associada à máquina virtual, você pode defini-la diretamente no nó de recursos da máquina virtual diretamente ou defini-la no nível base e usar a convenção de nomenclatura hierárquica para associá-la à máquina virtual.
Para Conjuntos de Escala de Máquina Virtual, a configuração de extensões é especificada na propriedade extensionProfile do VirtualMachineProfile.
A propriedade publisher com o valor de Microsoft.Azure.Diagnostics e a propriedade type com o valor de IaaSDiagnostics identificam exclusivamente a extensão Azure Diagnostics.
O valor da propriedade name pode ser usado para fazer referência à extensão no grupo de recursos. Defini-lo especificamente como Microsoft.Insights.VMDiagnosticsSettings permite que ele seja facilmente identificado pelo portal do Azure, garantindo que os gráficos de monitoramento apareçam corretamente no portal do Azure.
O typeHandlerVersion especifica a versão da extensão que você gostaria de usar. Definir a versão secundária autoUpgradeMinorVersion como true garante que você obtenha a versão secundária mais recente da extensão disponível. É altamente recomendável que você sempre defina autoUpgradeMinorVersion para ser sempre verdadeiro para que você sempre possa usar a extensão de diagnóstico mais recente disponível com todos os novos recursos e correções de bugs.
O elemento settings contém propriedades de configuração para a extensão que podem ser definidas e lidas de volta a partir da extensão (às vezes referida como configuração pública). A propriedade xmlcfg contém configuração baseada em xml para os logs de diagnóstico, contadores de desempenho, etc., que são coletados pelo agente de diagnóstico. Consulte Esquema de configuração de diagnóstico para obter mais informações sobre o esquema xml em si. Uma prática comum é armazenar a configuração xml real como uma variável no modelo do Azure Resource Manager e, em seguida, concatenar e codificá-las base64 para definir o valor para xmlcfg. Consulte a seção sobre variáveis de configuração de diagnóstico para entender mais sobre como armazenar o xml em variáveis. A propriedade storageAccount especifica o nome da conta de armazenamento para a qual os dados de diagnóstico são transferidos.
As propriedades em protectedSettings (às vezes referidas como configuração privada) podem ser definidas, mas não podem ser lidas de volta depois de serem definidas. A natureza somente gravação de protectedSettings o torna útil para armazenar segredos como a chave da conta de armazenamento onde os dados de diagnóstico são gravados.
Especificando a conta de armazenamento de diagnóstico como parâmetros
O trecho json da extensão de diagnóstico acima pressupõe dois parâmetros existingdiagnosticsStorageAccountName e existingdiagnosticsStorageResourceGroup para especificar a conta de armazenamento de diagnósticos onde os dados de diagnóstico são armazenados. Especificar a conta de armazenamento de diagnóstico como um parâmetro facilita a alteração da conta de armazenamento de diagnóstico em ambientes diferentes, por exemplo, você pode querer usar uma conta de armazenamento de diagnóstico diferente para testes e uma conta diferente para sua implantação de produção.
"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"
}
}
É uma prática recomendada especificar uma conta de armazenamento de diagnóstico em um grupo de recursos diferente do grupo de recursos da máquina virtual. Um grupo de recursos pode ser considerado uma unidade de implantação com seu próprio tempo de vida, uma máquina virtual pode ser implantada e reimplantada à medida que novas atualizações de configuração são feitas nele, mas você pode querer continuar armazenando os dados de diagnóstico na mesma conta de armazenamento nessas implantações de máquina virtual. Ter a conta de armazenamento em um recurso diferente permite que a conta de armazenamento aceite dados de várias implantações de máquina virtual, facilitando a solução de problemas nas várias versões.
Nota
Se você criar um modelo de máquina virtual do Windows a partir do Visual Studio, a conta de armazenamento padrão poderá ser definida para usar a mesma conta de armazenamento em que o VHD da máquina virtual é carregado. Isso é para simplificar a configuração inicial da VM. Refatore o modelo para usar uma conta de armazenamento diferente que possa ser passada como parâmetro.
Variáveis de configuração de diagnóstico
O trecho json da extensão de diagnóstico anterior define uma variável accountid para simplificar a obtenção da chave da conta de armazenamento para o armazenamento de diagnóstico:
"accountid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/',parameters('existingdiagnosticsStorageResourceGroup'), '/providers/','Microsoft.Storage/storageAccounts/', parameters('existingdiagnosticsStorageAccountName'))]"
A propriedade xmlcfg para a extensão de diagnóstico é definida usando várias variáveis que são concatenadas juntas. Os valores dessas variáveis estão em xml, portanto, eles precisam ser escapados corretamente ao definir as variáveis json.
O exemplo a seguir descreve o xml de configuração de diagnóstico que coleta contadores de desempenho padrão no nível do sistema, juntamente com alguns logs de eventos do Windows e logs de infraestrutura de diagnóstico. Ele foi escapado e formatado corretamente para que a configuração possa ser colada diretamente na seção de variáveis do seu modelo. Consulte o Esquema de configuração de diagnóstico para obter um exemplo mais legível por humanos do xml de configuração.
"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>"
O nó xml de definição de métricas na configuração acima é um elemento de configuração importante, pois define como os contadores de desempenho definidos anteriormente no nó xml no PerformanceCounter são agregados e armazenados.
Importante
Essas métricas orientam os gráficos de monitoramento e alertas no portal do Azure. O nó Métricas com o resourceID e MetricAggregation deve ser incluído na configuração de diagnóstico para sua VM se você quiser ver os dados de monitoramento da VM no portal do Azure.
O exemplo a seguir mostra o xml para definições de métricas:
<Metrics resourceId="/subscriptions/subscription().subscriptionId/resourceGroups/resourceGroup().name/providers/Microsoft.Compute/virtualMachines/vmName">
<MetricAggregation scheduledTransferPeriod="PT1H"/>
<MetricAggregation scheduledTransferPeriod="PT1M"/>
</Metrics>
O atributo resourceID identifica exclusivamente a máquina virtual em sua assinatura. Certifique-se de usar as funções subscription() e resourceGroup() para que o modelo atualize automaticamente esses valores com base na assinatura e no grupo de recursos em que você está implantando.
Se você estiver criando várias máquinas virtuais em um loop, precisará preencher o valor resourceID com uma função copyIndex() para diferenciar corretamente cada VM individual. O valor xmlCfg pode ser atualizado para oferecer suporte a isso da seguinte maneira:
"xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), concat(parameters('vmNamePrefix'), copyindex()), variables('wadcfgxend')))]",
O valor MetricAggregation de PT1M e PT1H significa uma agregação ao longo de um minuto e uma agregação ao longo de uma hora, respetivamente.
Tabelas WADMetrics em armazenamento
A configuração de métricas acima gera tabelas em sua conta de armazenamento de diagnóstico com as seguintes convenções de nomenclatura:
- WADMetrics: Prefixo padrão para todas as tabelas WADMetrics
- PT1H ou PT1M: Significa que a tabela contém dados agregados durante 1 hora ou 1 minuto
- P10D: Significa que a tabela contém dados por 10 dias a partir de quando a tabela começou a coletar dados
- V2S: Constante de cadeia de caracteres
- aaaammdd: a data em que a tabela começou a coletar dados
Exemplo: WADMetricsPT1HP10DV2S20151108 contém dados de métricas agregados ao longo de uma hora durante 10 dias a partir de 11-Nov-2015
Cada tabela WADMetrics contém as seguintes colunas:
- PartitionKey: A chave de partição é construída com base no valor resourceID para identificar exclusivamente o recurso VM. Por exemplo:
002Fsubscriptions:<subscriptionID>:002FresourceGroups:002F<ResourceGroupName>:002Fproviders:002FMicrosoft:002ECompute:002FvirtualMachines:002F<vmName>
- RowKey: Segue o formato
<Descending time tick>:<Performance Counter Name>
. O cálculo do tick de tempo decrescente é o tempo máximo de ticks menos o tempo do início do período de agregação. Por exemplo, se o período de amostra começou em 10-Nov-2015 e 00:00Hrs UTC, então o cálculo seria:DateTime.MaxValue.Ticks - (new DateTime(2015,11,10,0,0,0,DateTimeKind.Utc).Ticks)
. Para o desempenho de bytes disponíveis na memória, o contador da chave de linha tem a seguinte aparência:2519551871999999999__:005CMemory:005CAvailable:0020Bytes
- CounterName: é o nome do contador de desempenho. Isso corresponde ao counterSpecifier definido na configuração xml.
- Máximo: O valor máximo do contador de desempenho durante o período de agregação.
- Mínimo: O valor mínimo do contador de desempenho durante o período de agregação.
- Total: a soma de todos os valores do contador de desempenho relatados durante o período de agregação.
- Contagem: O número total de valores relatados para o contador de desempenho.
- Média: O valor médio (total/contagem) do contador de desempenho durante o período de agregação.
Passos Seguintes
- Para obter um modelo de exemplo completo de uma máquina virtual do Windows com extensão de diagnóstico, consulte vm-monitoring-diagnostics-extension
- Implantar o modelo do Azure Resource Manager usando o Azure PowerShell ou a Linha de Comando do Azure
- Saiba mais sobre a criação de modelos do Azure Resource Manager