Udostępnij za pośrednictwem


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 dołączania 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 usługi Resource Manager.

W przypadku prostej maszyny wirtualnej opartej na usłudze 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"
            }
        }
    }
]

Inną wspólną konwencją jest dodanie konfiguracji rozszerzenia w węźle zasobów głównych szablonu zamiast definiowania jej w węźle zasobów maszyny wirtualnej. W przypadku tego podejścia 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 go bezpośrednio zdefiniować w węźle zasobu maszyny wirtualnej lub zdefiniować na poziomie podstawowym i użyć konwencji nazewnictwa hierarchicznego, aby skojarzyć je z maszyną wirtualną.

W przypadku zestawów skalowania maszyn wirtualnych konfiguracja rozszerzeń jest określona we właściwości extensionProfile pliku VirtualMachineProfile.

Właściwość publisher z wartością Microsoft.Azure.Diagnostics i właściwości type z wartością IaaSDiagnostics unikatowo identyfikują 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 specjalnie na Microsoft.Insights.VMDiagnosticsSettings umożliwia łatwe zidentyfikowanie go przez witrynę Azure Portal, dzięki czemu wykresy monitorowania są prawidłowo wyświetlane w witrynie Azure Portal.

TypeHandlerVersion określa wersję rozszerzenia, którego chcesz użyć. Ustawienie opcji autoUpgradeMinorVersion wersja pomocnicza 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., które są zbierane przez agenta diagnostyki. 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 o sposobie przechowywania pliku 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 określane jako konfiguracja prywatna) można ustawić, ale nie można ich odczytać po ustawieniu. Charakter tylko do zapisu chronionychUstawienia ułatwia przechowywanie wpisów tajnych, takich jak klucz konta magazynu, w którym zapisywane są dane diagnostyczne.

Określanie konta magazynu diagnostyki jako parametrów

Powyższy fragment kodu json rozszerzenia diagnostyki zakłada dwa parametry istniejącediagnosticsStorageAccountName i existingdiagnosticsStorageResourceGroup w celu określenia konta magazynu diagnostyki, na którym są przechowywane dane diagnostyczne. Określenie konta magazynu diagnostycznego jako parametru 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ż w tych wdrożeniach maszyn wirtualnych zostaną wprowadzone nowe aktualizacje konfiguracji, ale możesz kontynuować przechowywanie danych diagnostycznych na tym samym koncie magazynu w tych wdrożeniach 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 jest przekazywany 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ć pobieranie klucza konta magazynu dla magazynu diagnostycznego:

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

Właściwość xmlcfg dla rozszerzenia diagnostyki jest definiowana przy użyciu wielu zmiennych połączonych razem. Wartości tych zmiennych znajdują się w pliku XML, więc podczas ustawiania zmiennych json muszą zostać poprawnie uniknięte.

W poniższym przykładzie opisano kod XML konfiguracji diagnostyki, który zbiera standardowe liczniki wydajności na poziomie systemu oraz niektóre dzienniki zdarzeń systemu Windows i dzienniki infrastruktury diagnostyki. Został on poprawnie sformatowany i sformatowany, aby można było bezpośrednio wkleić konfigurację do sekcji zmiennych szablonu. Zobacz Schemat konfiguracji diagnostyki, aby uzyskać bardziej czytelny przykład pliku 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 sposób agregowania i przechowywania liczników wydajności zdefiniowanych wcześniej w pliku XML w węźle PerformanceCounter .

Ważne

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

Poniższy przykład przedstawia 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, w której wdrażasz.

Jeśli tworzysz wiele maszyn wirtualnych 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:

  • WADMetrics: prefiks standardowy dla wszystkich tabel WADMetrics
  • PT1H lub PT1M: oznacza, że tabela zawiera zagregowane dane w ciągu 1 godziny lub 1 minuty
  • P10D: Oznacza, że tabela zawiera dane z 10 dni od momentu rozpoczęcia zbierania danych przez tabelę
  • Wersja 2S: stała ciągu
  • yyyymmdd: Data rozpoczęcia zbierania danych w tabeli

Przykład: WADMetricsPT1HP10DV2S2015108 zawiera dane metryk zagregowane w ciągu godziny przez 10 dni od 11 listopada 2015 r.

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

  • PartitionKey: klucz partycji jest konstruowany 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 pomniejszone o godzinę rozpoczęcia okresu agregacji. Jeśli na przykład okres próbny rozpoczął się w dniach 10 listopada-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 elementem counterSpecifier zdefiniowanym w konfiguracji xml.
  • Maksimum: 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: łączna liczba wartości zgłoszonych dla licznika wydajności.
  • Średnia: średnia (łączna/liczba) licznika wydajności w okresie agregacji.

Następne kroki