Partilhar via


Utilizar a monitorização e o diagnóstico com uma VM do Windows e modelos de Resource Manager do Azure

A Extensão Diagnóstico do Azure fornece as capacidades de monitorização e diagnóstico numa máquina virtual do Azure baseada no Windows. Pode ativar estas capacidades na máquina virtual ao incluir a extensão como parte do modelo do Azure Resource Manager. Veja Authoring Azure Resource Manager Templates with VM Extensions (Criar 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 pode adicionar a extensão Diagnóstico do Azure a um modelo de máquina virtual do Windows.

Adicionar a extensão Diagnóstico do Azure à definição de recurso da VM

Para ativar a extensão de diagnóstico numa Máquina Virtual do Windows, tem de adicionar a extensão como um recurso de VM no modelo de Resource Manager.

Para uma Máquina Virtual simples baseada em Resource Manager, adicione a configuração da extensão à matriz de recursos da 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 da extensão no nó de recursos de raiz do modelo em vez de a definir no nó de recursos da máquina virtual. Com esta abordagem, tem de 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. Pode defini-la diretamente no nó de recursos da máquina virtual diretamente ou defini-la ao nível base e utilizar a convenção de nomenclatura hierárquica para associá-la à máquina virtual.

Para Conjuntos de Dimensionamento de Máquinas Virtuais 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 IaaSDiagnostics identificam exclusivamente a extensão Diagnóstico do Azure.

O valor da propriedade name pode ser utilizado para fazer referência à extensão no grupo de recursos. Defini-lo especificamente para Microsoft.Insights.VMDiagnosticsSettings permite que seja facilmente identificado pelo portal do Azure garantir que os gráficos de monitorização são apresentados corretamente no portal do Azure.

O typeHandlerVersion especifica a versão da extensão que pretende utilizar. Definir a versão secundária autoUpgradeMinorVersion como true garante que obtém a versão Secundária mais recente da extensão que está disponível. É altamente recomendado que defina sempre autoUpgradeMinorVersion como sempre verdadeiro para que possa sempre utilizar a extensão de diagnóstico disponível mais recente com todas as novas funcionalidades e correções de erros.

O elemento de definições contém propriedades de configurações para a extensão que podem ser definidas e lidas novamente a partir da extensão (por vezes referida como configuração pública). A propriedade xmlcfg contém a configuração baseada em xml para os registos de diagnóstico, contadores de desempenho, etc. que são recolhidos pelo agente de diagnóstico. Veja Esquema de Configuração de Diagnósticos para obter mais informações sobre o próprio esquema xml. Uma prática comum é armazenar a configuração xml real como uma variável no modelo de Resource Manager do Azure e, em seguida, concatenar e codificar base64 para definir o valor para xmlcfg. Veja a secção sobre variáveis de configuração de diagnóstico para saber 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 (por vezes referidas como configuração privada) podem ser definidas, mas não podem ser lidas novamente depois de serem definidas. A natureza só de escrita de protectedSettings torna-a útil para armazenar segredos como a chave da conta de armazenamento onde os dados de diagnóstico são escritos.

Especificar a conta de armazenamento de diagnósticos como parâmetros

O fragmento json da extensão de diagnóstico acima assume 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ósticos como um parâmetro facilita a alteração da conta de armazenamento de diagnósticos em diferentes ambientes, por exemplo, poderá querer utilizar uma conta de armazenamento de diagnóstico diferente para testes e outra diferente para a implementaçã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"
    }
}

Recomendamos que especifique uma conta de armazenamento de diagnóstico num grupo de recursos diferente do grupo de recursos da máquina virtual. Um grupo de recursos pode ser considerado uma unidade de implementação com a sua própria duração, uma máquina virtual pode ser implementada e reimplementada à medida que as novas atualizações de configurações são efetuadas na mesma, mas poderá querer continuar a armazenar os dados de diagnóstico na mesma conta de armazenamento nessas implementações de máquina virtual. Ter a conta de armazenamento num recurso diferente permite que a conta de armazenamento aceite dados de várias implementações de máquinas virtuais, facilitando a resolução de problemas em várias versões.

Nota

Se criar um modelo de máquina virtual do Windows a partir do Visual Studio, a conta de armazenamento predefinida poderá estar definida para utilizar a mesma conta de armazenamento onde o VHD da máquina virtual é carregado. Isto serve para simplificar a configuração inicial da VM. Volte a considerar o modelo para utilizar uma conta de armazenamento diferente que possa ser transmitida como um parâmetro.

Variáveis de configuração de diagnóstico

O fragmento 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ósticos:

"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 com múltiplas variáveis que são concatenadas em conjunto. Os valores destas variáveis estão em xml, pelo que têm de ser escapados corretamente ao definir as variáveis json.

O exemplo seguinte descreve o xml de configuração de diagnóstico que recolhe contadores de desempenho padrão ao nível do sistema, juntamente com alguns registos de eventos do Windows e registos de infraestrutura de diagnósticos. Foi escapada e formatada corretamente para que a configuração possa ser colada diretamente na secção de variáveis do seu modelo. Veja 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, uma vez que define como os contadores de desempenho definidos anteriormente no xml no nó PerformanceCounter são agregados e armazenados.

Importante

Estas métricas impulsionam os gráficos de monitorização e os alertas no portal do Azure. O nó Métricas com o resourceID e MetricAggregation tem de ser incluído na configuração de diagnóstico da VM se quiser ver os dados de monitorização da VM no portal do Azure.

O exemplo seguinte 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 na sua subscrição. Certifique-se de que utiliza as funções subscription() e resourceGroup() para que o modelo atualize automaticamente esses valores com base na subscrição e no grupo de recursos no qual está a implementar.

Se estiver a criar vários Máquinas Virtuais num ciclo, terá de preencher o valor resourceID com uma função copyIndex() para diferenciar corretamente cada VM individual. O valor xmlCfg pode ser atualizado para suportar isto da seguinte forma:

"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 no armazenamento

A configuração de Métricas acima gera tabelas na sua conta de armazenamento de diagnósticos 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 ao longo de 1 hora ou 1 minuto
  • P10D: Significa que a tabela contém dados durante 10 dias a partir do momento em que a tabela começou a recolher dados
  • V2S: constante de cadeia
  • yyyymmdd: a data em que a tabela começou a recolher 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 da 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 tique-taque de tempo descendente é o tempo máximo de tiques menos o tempo do início do período de agregação. Por exemplo, se o período de exemplo tiver começado em 10-Nov-2015 e 00:00Hrs UTC, o cálculo será: DateTime.MaxValue.Ticks - (new DateTime(2015,11,10,0,0,0,DateTimeKind.Utc).Ticks). Para o desempenho de bytes de memória disponível, contrapona a chave de linha com o seguinte aspeto: 2519551871999999999__:005CMemory:005CAvailable:0020Bytes
  • CounterName: é o nome do contador de desempenho. Isto 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 comunicados durante o período de agregação.
  • Contagem: o número total de valores comunicados 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