Korzystanie z monitorowania i diagnostyki przy użyciu maszyny wirtualnej z systemem Windows i szablonów usługi Azure Resource Manager

Rozszerzenie Diagnostyka Azure zapewnia możliwości monitorowania i diagnostyki na maszynie wirtualnej platformy Azure opartej na systemie Windows. Te możliwości można włączyć na maszynie wirtualnej, dołączając rozszerzenie w ramach szablonu usługi Azure Resource Manager. Zobacz Tworzenie szablonów usługi Azure Resource Manager z rozszerzeniami maszyn wirtualnych, aby uzyskać więcej informacji na temat dowolnego rozszerzenia w ramach szablonu maszyny wirtualnej. W tym artykule opisano sposób dodawania rozszerzenia Diagnostyka Azure do szablonu maszyny wirtualnej z systemem Windows.

Dodawanie rozszerzenia Diagnostyka Azure do definicji zasobu maszyny wirtualnej

Aby włączyć rozszerzenie diagnostyczne na maszynie wirtualnej z systemem Windows, należy dodać rozszerzenie jako zasób maszyny wirtualnej w szablonie Resource Manager.

Aby uzyskać prostą maszynę wirtualną opartą na Resource Manager, dodaj konfigurację rozszerzenia do tablicy zasobów dla maszyny wirtualnej:

"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"
            }
        }
    }
]

Kolejną wspólną konwencją jest dodanie konfiguracji rozszerzenia w węźle zasobów głównych szablonu zamiast definiowania go w węźle zasobów maszyny wirtualnej. Dzięki temu podejściu należy jawnie określić hierarchiczną relację między rozszerzeniem a maszyną wirtualną z wartościami nazwy i typu . Na przykład:

"name": "[concat(variables('vmName'),'Microsoft.Insights.VMDiagnosticsSettings')]",
"type": "Microsoft.Compute/virtualMachines/extensions",

Rozszerzenie jest zawsze skojarzone z maszyną wirtualną. Można ją bezpośrednio zdefiniować w węźle zasobu maszyny wirtualnej lub zdefiniować ją na poziomie podstawowym i użyć konwencji nazewnictwa hierarchicznego, aby skojarzyć ją z maszyną wirtualną.

W przypadku Virtual Machine Scale Sets konfiguracja rozszerzeń jest określona we właściwości extensionProfile pliku VirtualMachineProfile.

Właściwość wydawcy z wartością Microsoft.Azure.Diagnostics i właściwości type z wartością IaaSDiagnostics unikatowo identyfikuje rozszerzenie Diagnostyka Azure.

Wartość właściwości name może służyć do odwoływania się do rozszerzenia w grupie zasobów. Ustawienie go w szczególności na Microsoft.Insights.VMDiagnosticsSettings umożliwia łatwe zidentyfikowanie go przez Azure Portal zapewnienie prawidłowego wyświetlania wykresów monitorowania w Azure Portal.

TypeHandlerVersion określa wersję rozszerzenia, którego chcesz użyć. Ustawienie autoUpgradeMinorVersion wersji pomocniczej na wartość true gwarantuje, że uzyskasz najnowszą wersję pomocniczą dostępnego rozszerzenia. Zdecydowanie zaleca się, aby zawsze ustawiać wartość autoUpgradeMinorVersion tak, aby zawsze używać najnowszego dostępnego rozszerzenia diagnostycznego ze wszystkimi nowymi funkcjami i poprawkami błędów.

Element settings zawiera właściwości konfiguracji rozszerzenia, które można ustawić i odczytać z rozszerzenia (czasami nazywane konfiguracją publiczną). Właściwość xmlcfg zawiera konfigurację opartą na xml dla dzienników diagnostycznych, liczników wydajności itp. zbierane przez agenta diagnostycznego. Aby uzyskać więcej informacji na temat samego schematu xml, zobacz Schemat konfiguracji diagnostyki . Typowym rozwiązaniem jest przechowywanie rzeczywistej konfiguracji xml jako zmiennej w szablonie usługi Azure Resource Manager, a następnie łączenie i kodowanie base64 w celu ustawienia wartości xmlcfg. Zobacz sekcję dotyczącą zmiennych konfiguracji diagnostyki , aby dowiedzieć się więcej na temat sposobu przechowywania kodu XML w zmiennych. Właściwość storageAccount określa nazwę konta magazynu, do którego są przesyłane dane diagnostyczne.

Właściwości w pliku protectedSettings (czasami nazywane konfiguracją prywatną) można ustawić, ale nie można ich odczytać ponownie po ustawieniu. Charakter tylko do zapisu funkcji protectedSettings ułatwia przechowywanie wpisów tajnych, takich jak klucz konta magazynu, w którym są zapisywane dane diagnostyczne.

Określanie konta magazynu diagnostycznego jako parametrów

Powyższy fragment kodu json rozszerzenia diagnostycznego zakłada dwa parametry istniejącediagnosticsStorageAccountName i existingdiagnosticsStorageResourceGroup w celu określenia konta magazynu diagnostycznego, na którym są przechowywane dane diagnostyczne. Określenie konta magazynu diagnostycznego jako parametr ułatwia zmianę konta magazynu diagnostycznego w różnych środowiskach, na przykład możesz użyć innego konta magazynu diagnostycznego do testowania i innego konta magazynu dla wdrożenia produkcyjnego.

"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"
    }
}

Najlepszym rozwiązaniem jest określenie konta magazynu diagnostycznego w innej grupie zasobów niż grupa zasobów dla maszyny wirtualnej. Grupę zasobów można uznać za jednostkę wdrożenia z własnym okresem istnienia. Maszynę wirtualną można wdrożyć i wdrożyć ponownie, ponieważ zostaną wprowadzone nowe aktualizacje konfiguracji, ale możesz kontynuować przechowywanie danych diagnostycznych na tym samym koncie magazynu w ramach tych wdrożeń maszyn wirtualnych. Posiadanie konta magazynu w innym zasobie umożliwia konto magazynu akceptowanie danych z różnych wdrożeń maszyn wirtualnych, co ułatwia rozwiązywanie problemów w różnych wersjach.

Uwaga

Jeśli tworzysz szablon maszyny wirtualnej z systemem Windows z poziomu programu Visual Studio, domyślne konto magazynu może być ustawione na użycie tego samego konta magazynu, na którym zostanie przekazany wirtualny dysk twardy maszyny wirtualnej. Upraszcza to początkową konfigurację maszyny wirtualnej. Ponownie uwzględnij szablon, aby użyć innego konta magazynu, które można przekazać jako parametr.

Zmienne konfiguracji diagnostyki

Powyższy fragment kodu json rozszerzenia diagnostyki definiuje zmienną accountid , aby uprościć uzyskiwanie klucza konta magazynu dla magazynu diagnostycznego:

"accountid": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/',parameters('existingdiagnosticsStorageResourceGroup'), '/providers/','Microsoft.Storage/storageAccounts/', parameters('existingdiagnosticsStorageAccountName'))]"

Właściwość xmlcfg rozszerzenia diagnostycznego jest definiowana przy użyciu wielu zmiennych połączonych razem. Wartości tych zmiennych są w formacie XML, więc muszą zostać prawidłowo uniknięte podczas ustawiania zmiennych json.

W poniższym przykładzie opisano kod XML konfiguracji diagnostyki, który zbiera standardowe liczniki wydajności na poziomie systemu wraz z niektórymi dziennikami zdarzeń systemu Windows i dziennikami infrastruktury diagnostycznej. Została ona usunięta i sformatowana poprawnie, aby można było bezpośrednio wkleić konfigurację do sekcji zmiennych szablonu. Zobacz Schemat konfiguracji diagnostyki , aby uzyskać bardziej czytelny przykład kodu XML konfiguracji.

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

Węzeł xml definicji metryk w powyższej konfiguracji jest ważnym elementem konfiguracji, ponieważ definiuje, jak liczniki wydajności zdefiniowane wcześniej w pliku XML w węźle PerformanceCounter są agregowane i przechowywane.

Ważne

Te metryki napędzają wykresy monitorowania i alerty w Azure Portal. Węzeł Metryki z identyfikatorem resourceID i MetricAggregation musi być uwzględniony w konfiguracji diagnostycznej maszyny wirtualnej, jeśli chcesz wyświetlić dane monitorowania maszyny wirtualnej w Azure Portal.

W poniższym przykładzie przedstawiono kod XML definicji metryk:

<Metrics resourceId="/subscriptions/subscription().subscriptionId/resourceGroups/resourceGroup().name/providers/Microsoft.Compute/virtualMachines/vmName">
    <MetricAggregation scheduledTransferPeriod="PT1H"/>
    <MetricAggregation scheduledTransferPeriod="PT1M"/>
</Metrics>

Atrybut resourceID jednoznacznie identyfikuje maszynę wirtualną w subskrypcji. Upewnij się, że używasz funkcji subscription() i resourceGroup(), aby szablon automatycznie aktualizował te wartości na podstawie subskrypcji i grupy zasobów, do której wdrażasz.

Jeśli tworzysz wiele Virtual Machines w pętli, musisz wypełnić wartość resourceID funkcją copyIndex(), aby poprawnie odróżnić poszczególne maszyny wirtualne. Wartość xmlCfg można zaktualizować, aby obsługiwać tę funkcję w następujący sposób:

"xmlCfg": "[base64(concat(variables('wadcfgxstart'), variables('wadmetricsresourceid'), concat(parameters('vmNamePrefix'), copyindex()), variables('wadcfgxend')))]",

Wartość MetricAggregation pt1M i PT1H oznacza agregację w ciągu minuty i agregację odpowiednio przez godzinę.

Tabele WADMetrics w magazynie

Konfiguracja metryk powyżej generuje tabele na koncie magazynu diagnostyki z następującymi konwencjami nazewnictwa:

  • Metryki WAD: prefiks standardowy dla wszystkich tabel WADMetrics
  • PT1H lub PT1M: oznacza, że tabela zawiera dane zagregowane przez 1 godzinę lub 1 minutę
  • P10D: oznacza, że tabela zawiera dane przez 10 dni od momentu rozpoczęcia zbierania danych przez tabelę
  • Wersja 2S: stała ciągu
  • rrdd: data rozpoczęcia zbierania danych przez tabelę

Przykład: WADMetricsPT1HP10DV2S2015108 zawiera dane metryk zagregowane przez 10 dni od 11 listopada 2015 r.

Każda tabela WADMetrics zawiera następujące kolumny:

  • PartitionKey: klucz partycji jest skonstruowany na podstawie wartości resourceID w celu unikatowego zidentyfikowania zasobu maszyny wirtualnej. Na przykład: 002Fsubscriptions:<subscriptionID>:002FresourceGroups:002F<ResourceGroupName>:002Fproviders:002FMicrosoft:002ECompute:002FvirtualMachines:002F<vmName>
  • RowKey: jest zgodny z formatem <Descending time tick>:<Performance Counter Name>. Malejące obliczenie znacznika czasu to maksymalne znaczniki czasu minus czas rozpoczęcia okresu agregacji. Jeśli na przykład okres próbny rozpoczął się w dniach 10-listopad-2015 i 00:00 Czasu UTC, obliczenie będzie następujące: DateTime.MaxValue.Ticks - (new DateTime(2015,11,10,0,0,0,DateTimeKind.Utc).Ticks). W przypadku wydajności dostępnej pamięci bajtów licznik klucza wiersza wygląda następująco: 2519551871999999999__:005CMemory:005CAvailable:0020Bytes
  • CounterName: to nazwa licznika wydajności. Jest to zgodne z licznikamiSpecifier zdefiniowanymi w konfiguracji xml.
  • Maksymalna: maksymalna wartość licznika wydajności w okresie agregacji.
  • Minimum: minimalna wartość licznika wydajności w okresie agregacji.
  • Suma: suma wszystkich wartości licznika wydajności zgłoszonego w okresie agregacji.
  • Liczba: całkowita liczba wartości zgłoszonych dla licznika wydajności.
  • Średnia: średnia (suma/liczba) licznika wydajności w okresie agregacji.

Następne kroki