Konfigurowanie alertów dotyczących kondycji zasobów przy użyciu szablonów usługi Resource Manager

W tym artykule pokazano, jak programowo tworzyć alerty dziennika aktywności usługi Resource Health przy użyciu szablonów usługi Azure Resource Manager i programu Azure PowerShell.

Usługa Azure Resource Health informuje o bieżącym i historycznym stanie kondycji zasobów platformy Azure. Alerty usługi Azure Resource Health mogą powiadamiać użytkownika niemal w czasie rzeczywistym o zmianie stanu kondycji tych zasobów. Programowe tworzenie alertów usługi Resource Health umożliwia użytkownikom tworzenie i dostosowywanie alertów zbiorczo.

Uwaga

Do interakcji z platformą Azure zalecamy używanie modułu Azure Az w programie PowerShell. Zobacz Instalowanie programu Azure PowerShell, aby rozpocząć. Aby dowiedzieć się, jak przeprowadzić migrację do modułu Az PowerShell, zobacz Migracja programu Azure PowerShell z modułu AzureRM do modułu Az.

Wymagania wstępne

Aby postępować zgodnie z instrukcjami na tej stronie, musisz skonfigurować kilka czynności z wyprzedzeniem:

  1. Musisz zainstalować moduł Azure PowerShell
  2. Musisz utworzyć lub ponownie użyć grupy akcji skonfigurowanej do powiadomienia

Instrukcje

  1. Za pomocą programu PowerShell zaloguj się do platformy Azure przy użyciu konta i wybierz subskrypcję, z którą chcesz korzystać

    Login-AzAccount
    Select-AzSubscription -Subscription <subscriptionId>
    

    Możesz użyć Get-AzSubscription polecenia , aby wyświetlić listę subskrypcji, do których masz dostęp.

  2. Znajdowanie i zapisywanie pełnego identyfikatora usługi Azure Resource Manager dla grupy akcji

    (Get-AzActionGroup -ResourceGroupName <resourceGroup> -Name <actionGroup>).Id
    
  3. Tworzenie i zapisywanie szablonu usługi Resource Manager dla alertów usługi Resource Health jako resourcehealthalert.json (zobacz szczegóły poniżej)

  4. Utwórz nowe wdrożenie usługi Azure Resource Manager przy użyciu tego szablonu

    New-AzResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName <resourceGroup> -TemplateFile <path\to\resourcehealthalert.json>
    
  5. Zostanie wyświetlony monit o wpisenie nazwy alertu i skopiowanego wcześniej identyfikatora zasobu grupy akcji:

    Supply values for the following parameters:
    (Type !? for Help.)
    activityLogAlertName: <Alert Name>
    actionGroupResourceId: /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/microsoft.insights/actionGroups/<actionGroup>
    
  6. Jeśli wszystko zadziałało pomyślnie, otrzymasz potwierdzenie w programie PowerShell

    DeploymentName          : ExampleDeployment
    ResourceGroupName       : <resourceGroup>
    ProvisioningState       : Succeeded
    Timestamp               : 11/8/2017 2:32:00 AM
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                            Name                     Type       Value
                            ===============          =========  ==========
                            activityLogAlertName     String     <Alert Name>
                            activityLogAlertEnabled  Bool       True
                            actionGroupResourceId    String     /...
    
    Outputs                 :
    DeploymentDebugLogLevel :
    

Należy pamiętać, że jeśli planujesz w pełni zautomatyzować ten proces, wystarczy zmodyfikować szablon usługi Resource Manager, aby nie wyświetlić monitu o wartości w kroku 5.

Opcje szablonu usługi Resource Manager dla alertów usługi Resource Health

Możesz użyć tego szablonu podstawowego jako punktu wyjścia do tworzenia alertów usługi Resource Health. Ten szablon będzie działać zgodnie z opisem i zarejestruje Cię, aby otrzymywać alerty dotyczące wszystkich nowo aktywowanych zdarzeń kondycji zasobów we wszystkich zasobach w subskrypcji.

W dolnej części tego artykułu dołączyliśmy również bardziej złożony szablon alertu, który powinien zwiększyć współczynnik szumu sygnału dla alertów usługi Resource Health w porównaniu z tym szablonem.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "activityLogAlertName": {
      "type": "string",
      "metadata": {
        "description": "Unique name (within the Resource Group) for the Activity log alert."
      }
    },
    "actionGroupResourceId": {
      "type": "string",
      "metadata": {
        "description": "Resource Id for the Action group."
      }
    }
  },
  "resources": [   
    {
      "type": "Microsoft.Insights/activityLogAlerts",
      "apiVersion": "2017-04-01",
      "name": "[parameters('activityLogAlertName')]",      
      "location": "Global",
      "properties": {
        "enabled": true,
        "scopes": [
            "[subscription().id]"
        ],        
        "condition": {
          "allOf": [
            {
              "field": "category",
              "equals": "ResourceHealth"
            },
            {
              "field": "status",
              "equals": "Active"
            }
          ]
        },
        "actions": {
          "actionGroups":
          [
            {
              "actionGroupId": "[parameters('actionGroupResourceId')]"
            }
          ]
        }
      }
    }
  ]
}

Jednak ogólny alert podobny do tego zwykle nie jest zalecany. Dowiedz się, jak można ograniczyć zakres tego alertu, aby skupić się na zdarzeniach, o których się troszczymy poniżej.

Dostosowywanie zakresu alertu

Alerty usługi Resource Health można skonfigurować do monitorowania zdarzeń w trzech różnych zakresach:

  • Poziom subskrypcji
  • Poziom grupy zasobów
  • Poziom zasobu

Szablon alertu jest skonfigurowany na poziomie subskrypcji, ale jeśli chcesz skonfigurować alert, aby powiadomić Cię tylko o określonych zasobach lub zasobach w ramach określonej grupy zasobów, wystarczy zmodyfikować scopes sekcję w powyższym szablonie.

W przypadku zakresu na poziomie grupy zasobów sekcja zakresów powinna wyglądać następująco:

"scopes": [
    "/subscriptions/<subscription id>/resourcegroups/<resource group>"
],

W przypadku zakresu na poziomie zasobu sekcja zakresu powinna wyglądać następująco:

"scopes": [
    "/subscriptions/<subscription id>/resourcegroups/<resource group>/providers/<resource>"
],

Na przykład: "/subscriptions/d37urb3e-ed41-4670-9c19-02a1d2808ff9/resourcegroups/myRG/providers/microsoft.compute/virtualmachines/myVm".

Możesz przejść do witryny Azure Portal i wyświetlić adres URL podczas wyświetlania zasobu platformy Azure, aby uzyskać ten ciąg.

Dostosowywanie typów zasobów, które alerty

Alerty na poziomie subskrypcji lub grupy zasobów mogą mieć różne rodzaje zasobów. Jeśli chcesz ograniczyć alerty tylko z określonego podzestawu typów zasobów, możesz zdefiniować je w condition sekcji szablonu w następujący sposób:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "resourceType",
                    "equals": "MICROSOFT.COMPUTE/VIRTUALMACHINES",
                    "containsAny": null
                },
                {
                    "field": "resourceType",
                    "equals": "MICROSOFT.STORAGE/STORAGEACCOUNTS",
                    "containsAny": null
                },
                ...
            ]
        }
    ]
},

W tym miejscu użyjemy anyOf otoki, aby umożliwić alertowi kondycji zasobów dopasowanie dowolnego określonego przez nas warunków, umożliwiając alerty przeznaczone dla określonych typów zasobów.

Dostosowywanie zdarzeń usługi Resource Health, które ostrzegają

Gdy zasoby przechodzą zdarzenie kondycji, mogą przejść przez szereg etapów reprezentujących stan zdarzenia kondycji: Active, , In ProgressUpdatedi Resolved.

Możesz otrzymywać powiadomienia tylko wtedy, gdy zasób stanie się w złej kondycji, w tym przypadku chcesz skonfigurować alert, aby powiadamiać tylko wtedy, gdy status element ma wartość Active. Jeśli jednak chcesz również otrzymywać powiadomienia na innych etapach, możesz dodać te szczegóły w następujący sposób:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "status",
                    "equals": "Active"
                },
                {
                    "field": "status",
                    "equals": "In Progress"
                },
                {
                    "field": "status",
                    "equals": "Resolved"
                },
                {
                    "field": "status",
                    "equals": "Updated"
                }
            ]
        }
    ]
}

Jeśli chcesz otrzymywać powiadomienia o wszystkich czterech etapach zdarzeń kondycji, możesz usunąć ten warunek razem, a alert powiadomi Cię niezależnie od status właściwości.

Uwaga

Każda sekcja "anyOf" powinna zawierać tylko jedną wartość typu pola.

Dostosowywanie alertów usługi Resource Health w celu uniknięcia zdarzeń "Nieznany"

Usługa Azure Resource Health może zgłaszać najnowszą kondycję zasobów, stale monitorując je przy użyciu modułów uruchamiającego testy. Odpowiednie zgłoszone stany kondycji to: "Dostępne", "Niedostępne" i "Obniżona wydajność". Jednak w sytuacjach, w których moduł uruchamiający i zasób platformy Azure nie mogą się komunikować, stan kondycji "Nieznany" jest zgłaszany dla zasobu i jest uważany za zdarzenie kondycji "Aktywne".

Jednak gdy zasób zgłasza wartość "Nieznany", prawdopodobnie jego stan kondycji nie uległ zmianie od czasu ostatniego dokładnego raportu. Jeśli chcesz wyeliminować alerty dotyczące zdarzeń "Nieznany", możesz określić logikę w szablonie:

"condition": {
    "allOf": [
        ...,
        {
            "anyOf": [
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Available",
                    "containsAny": null
                },
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Unavailable",
                    "containsAny": null
                },
                {
                    "field": "properties.currentHealthStatus",
                    "equals": "Degraded",
                    "containsAny": null
                }
            ]
        },
        {
            "anyOf": [
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Available",
                    "containsAny": null
                },
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Unavailable",
                    "containsAny": null
                },
                {
                    "field": "properties.previousHealthStatus",
                    "equals": "Degraded",
                    "containsAny": null
                }
            ]
        },
    ]
},

W tym przykładzie powiadamiamy tylko o zdarzeniach, w których bieżący i poprzedni stan kondycji nie ma wartości "Nieznany". Ta zmiana może być przydatna, jeśli alerty są wysyłane bezpośrednio na telefon komórkowy lub wiadomość e-mail.

Należy pamiętać, że właściwości currentHealthStatus i previousHealthStatus mają wartość null w niektórych zdarzeniach. Na przykład gdy wystąpi zaktualizowane zdarzenie, prawdopodobnie stan kondycji zasobu nie uległ zmianie od czasu ostatniego raportu, dostępne są tylko dodatkowe informacje o zdarzeniu (np. przyczyna). W związku z tym użycie powyższej klauzuli może spowodować, że niektóre alerty nie zostaną wyzwolone, ponieważ wartości properties.currentHealthStatus i properties.previousHealthStatus zostaną ustawione na wartość null.

Dostosowywanie alertu w celu uniknięcia zdarzeń zainicjowanych przez użytkownika

Zdarzenia usługi Resource Health mogą być wyzwalane przez zdarzenia inicjowane przez platformę i inicjowane przez użytkownika. Warto wysłać powiadomienie tylko wtedy, gdy zdarzenie kondycji jest spowodowane przez platformę Azure.

Alert można łatwo skonfigurować tak, aby filtrować tylko pod kątem tego rodzaju zdarzeń:

"condition": {
    "allOf": [
        ...,
        {
            "field": "properties.cause",
            "equals": "PlatformInitiated",
            "containsAny": null
        }
    ]
}

Należy pamiętać, że w niektórych zdarzeniach pole przyczyn może mieć wartość null. Oznacza to, że następuje przejście kondycji (np. dostępne do niedostępności), a zdarzenie jest rejestrowane natychmiast, aby zapobiec opóźnieniom powiadomień. W związku z tym użycie powyższej klauzuli może spowodować, że alert nie zostanie wyzwolony, ponieważ wartość właściwości properties.cause zostanie ustawiona na wartość null.

Ukończ szablon alertu usługi Resource Health

Korzystając z różnych korekt opisanych w poprzedniej sekcji, poniżej przedstawiono przykładowy szablon skonfigurowany do zmaksymalizowania współczynnika szumu sygnału. Należy pamiętać o zastrzeżeniach wymienionych powyżej, w których bieżącyStatus, previousHealthStatus i przyczyna wartości właściwości mogą mieć wartość null w niektórych zdarzeniach.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "activityLogAlertName": {
            "type": "string",
            "metadata": {
                "description": "Unique name (within the Resource Group) for the Activity log alert."
            }
        },
        "actionGroupResourceId": {
            "type": "string",
            "metadata": {
                "description": "Resource Id for the Action group."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Insights/activityLogAlerts",
            "apiVersion": "2017-04-01",
            "name": "[parameters('activityLogAlertName')]",
            "location": "Global",
            "properties": {
                "enabled": true,
                "scopes": [
                    "[subscription().id]"
                ],
                "condition": {
                    "allOf": [
                        {
                            "field": "category",
                            "equals": "ResourceHealth",
                            "containsAny": null
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Available",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Unavailable",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.currentHealthStatus",
                                    "equals": "Degraded",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Available",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Unavailable",
                                    "containsAny": null
                                },
                                {
                                    "field": "properties.previousHealthStatus",
                                    "equals": "Degraded",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "properties.cause",
                                    "equals": "PlatformInitiated",
                                    "containsAny": null
                                }
                            ]
                        },
                        {
                            "anyOf": [
                                {
                                    "field": "status",
                                    "equals": "Active",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "Resolved",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "In Progress",
                                    "containsAny": null
                                },
                                {
                                    "field": "status",
                                    "equals": "Updated",
                                    "containsAny": null
                                }
                            ]
                        }
                    ]
                },
                "actions": {
                    "actionGroups": [
                        {
                            "actionGroupId": "[parameters('actionGroupResourceId')]"
                        }
                    ]
                }
            }
        }
    ]
}

Jednak będziesz wiedzieć, jakie konfiguracje są skuteczne dla Ciebie, więc użyj narzędzi nauczanych w tej dokumentacji, aby dostosować własne ustawienia.

Następne kroki

Dowiedz się więcej o usłudze Resource Health:

Tworzenie alertów usługi Service Health: