Udostępnij za pośrednictwem


Raportowanie i sprawdzanie kondycji usługi

Gdy twoje usługi napotykają problemy, możliwość reagowania na zdarzenia i ich naprawiania zależy od możliwości szybkiego wykrywania problemów. Jeśli zgłaszasz problemy i niepowodzenia menedżera kondycji usługi Azure Service Fabric z poziomu kodu usługi, możesz użyć standardowych narzędzi do monitorowania kondycji zapewnianych przez usługę Service Fabric w celu sprawdzenia stanu kondycji.

Istnieją trzy sposoby raportowania kondycji z poziomu usługi:

  • Użyj obiektów Partition lub CodePackageActivationContext .
    Partition i CodePackageActivationContext mogą być używane do raportowania stanu elementów będących częścią bieżącego kontekstu. Na przykład kod uruchamiany w ramach repliki może zgłaszać kondycję tylko dla tej repliki, partycji, do których należy, oraz aplikacji, do których należy.
  • Użyj FabricClient.
    Możesz użyć FabricClient komendy, aby zgłosić kondycję na podstawie kodu usługi, jeśli klaster nie jest bezpieczny lub jeśli usługa jest uruchomiona z uprawnieniami administratora. Większość rzeczywistych scenariuszy nie używa niezabezpieczonych klastrów ani nie zapewnia uprawnień administratora. Za pomocą FabricClientprogramu można zgłaszać kondycję dowolnej jednostki będącej częścią klastra. W idealnym przypadku kod usługi powinien jednak wysyłać tylko raporty powiązane z własnym zdrowiem.
  • Użyj interfejsów API REST na poziomie klastra, aplikacji, wdrożonej aplikacji, usługi, pakietu usługi, partycji, repliki lub węzła. Może to służyć do raportowania kondycji z poziomu kontenera.

W tym artykule przedstawiono przykład raportujący kondycję z kodu usługi. W przykładzie pokazano również, jak narzędzia udostępniane przez usługę Service Fabric mogą służyć do sprawdzania stanu kondycji. Ten artykuł jest przeznaczony do szybkiego wprowadzenia do możliwości monitorowania kondycji usługi Service Fabric. Aby uzyskać bardziej szczegółowe informacje, możesz przeczytać serię szczegółowych artykułów na temat kondycji, które zaczynają się od linku na końcu tego artykułu.

Wymagania wstępne

Musisz mieć zainstalowane następujące elementy:

  • Visual Studio 2015 lub Visual Studio 2019
  • Service Fabric SDK

Aby utworzyć lokalny bezpieczny klaster deweloperski

  • Otwórz program PowerShell z uprawnieniami administratora i uruchom następujące polecenia:

Polecenia pokazujące sposób tworzenia bezpiecznego klastra deweloperskiego

Aby wdrożyć aplikację i sprawdzić jej kondycję

  1. Otwórz program Visual Studio jako administrator.

  2. Utwórz projekt przy użyciu szablonu Usługi stanowej .

    Tworzenie aplikacji usługi Service Fabric z usługą stanową

  3. Naciśnij F5 , aby uruchomić aplikację w trybie debugowania. Aplikacja jest wdrażana w klastrze lokalnym.

  4. Po uruchomieniu aplikacji kliknij prawym przyciskiem myszy ikonę Menedżer klastra lokalnego w obszarze powiadomień i wybierz polecenie Zarządzaj klastrem lokalnym z menu skrótów, aby otworzyć narzędzie Service Fabric Explorer.

    Otwieranie narzędzia Service Fabric Explorer z obszaru powiadomień

  5. Kondycja aplikacji powinna być wyświetlana tak jak na tym obrazie. W tej chwili aplikacja powinna być w dobrej kondycji bez błędów.

    Zdrowa aplikacja w narzędziu Service Fabric Explorer

  6. Kondycję można również sprawdzić przy użyciu programu PowerShell. Możesz użyć Get-ServiceFabricApplicationHealth do sprawdzenia kondycji aplikacji, a Get-ServiceFabricServiceHealth do sprawdzenia kondycji usługi. Raport kondycji dla tej samej aplikacji w programie PowerShell znajduje się na tej ilustracji.

    Zdrowa aplikacja w programie PowerShell

Aby dodać niestandardowe zdarzenia zdrowotne do kodu usługi

Szablony projektów usługi Service Fabric w programie Visual Studio zawierają przykładowy kod. W poniższych krokach pokazano, jak można zgłaszać niestandardowe zdarzenia dotyczące zdrowia w kodzie usługi. Takie raporty są wyświetlane automatycznie w standardowych narzędziach do monitorowania kondycji zapewnianych przez usługę Service Fabric, takich jak Service Fabric Explorer, Widok kondycji witryny Azure Portal i program PowerShell.

  1. Otwórz ponownie aplikację utworzoną wcześniej w programie Visual Studio lub utwórz nową aplikację przy użyciu szablonu Stateful Service Visual Studio.

  2. Otwórz plik Stateful1.cs i znajdź wywołanie myDictionary.TryGetValueAsync w metodzie RunAsync . Widać, że ta metoda zwraca result, która przechowuje bieżącą wartość licznika, ponieważ kluczowa logika tej aplikacji polega na utrzymywaniu działającego licznika. Jeśli ta aplikacja była prawdziwą aplikacją, a brak wyniku stanowił błąd, należy oznaczyć to zdarzenie.

  3. Aby zgłosić zdarzenie zdrowotne, gdy brak wyniku oznacza niepowodzenie, dodaj następujące kroki.

    a. System.Fabric.Health Dodaj przestrzeń nazw do pliku Stateful1.cs.

    using System.Fabric.Health;
    

    b. Dodaj następujący kod po wywołaniu myDictionary.TryGetValueAsync

    if (!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportReplicaHealth(healthInformation);
    }
    

    Zgłaszamy kondycję repliki, ponieważ jest ona zgłaszana z usługi stanowej. Parametr HealthInformation przechowuje informacje o zgłaszanym problemie z kondycją.

    Gdybyś utworzył usługę bezstanową, użyj następującego kodu

    if (!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportInstanceHealth(healthInformation);
    }
    
  4. Jeśli usługa jest uruchomiona z uprawnieniami administratora lub jeśli klaster nie jest bezpieczny, możesz również użyć FabricClient polecenia do raportowania kondycji, jak pokazano w poniższych krokach.

    a. Utwórz wystąpienie FabricClient po deklaracji var myDictionary.

    var fabricClient = new FabricClient(new FabricClientSettings() { HealthReportSendInterval = TimeSpan.FromSeconds(0) });
    

    b. Dodaj następujący kod po wywołaniu myDictionary.TryGetValueAsync .

    if (!result.HasValue)
    {
       var replicaHealthReport = new StatefulServiceReplicaHealthReport(
            this.Context.PartitionId,
            this.Context.ReplicaId,
            new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error));
        fabricClient.HealthManager.ReportHealth(replicaHealthReport);
    }
    
  5. Symulujmy ten błąd i zobaczmy, jak jest on wyświetlany w narzędziach do monitorowania kondycji. Aby zasymulować błąd, oznacz jako komentarz pierwszy wiersz w dodanym wcześniej kodzie raportowania kondycji. Po zakomentowaniu pierwszego wiersza kod będzie wyglądał jak w poniższym przykładzie.

    //if(!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportReplicaHealth(healthInformation);
    }
    

    Ten kod uruchamia raport kondycji za każdym razem, gdy RunAsync jest wykonywany. Po wprowadzeniu zmiany naciśnij F5 , aby uruchomić aplikację.

  6. Po uruchomieniu aplikacji otwórz narzędzie Service Fabric Explorer, aby sprawdzić kondycję aplikacji. Tym razem program Service Fabric Explorer pokazuje, że aplikacja jest w złej kondycji. Aplikacja jest uznawana za niefunkcjonalną, ponieważ błąd zgłoszony w kodzie, który dodaliśmy wcześniej.

    Niesprawna aplikacja w środowisku Service Fabric Explorer

  7. Jeśli wybierzesz replikę podstawową w widoku drzewa w narzędziu Service Fabric Explorer, zobaczysz, że stan kondycji również wskazuje błąd. Program Service Fabric Explorer wyświetla również szczegóły raportu kondycji dodane do parametru HealthInformation w kodzie. Te same raporty dotyczące kondycji można wyświetlić w programie PowerShell i witrynie Azure Portal.

    Kondycja repliki w narzędziu Service Fabric Explorer

Ten raport pozostaje w menedżerze kondycji, dopóki nie zostanie zastąpiony przez inny raport lub dopóki ta replika nie zostanie usunięta. Ponieważ nie ustawiliśmy TimeToLive dla tego raportu zdrowia w obiekcie HealthInformation, raport nigdy nie traci ważności.

Zalecamy raportowanie kondycji na najbardziej szczegółowym poziomie, który w tym przypadku jest repliką. Możesz również zgłosić zdrowie w witrynie Partition.

HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);

Aby zgłosić stan systemów Application, DeployedApplication, i DeployedServicePackage, użyj CodePackageActivationContext.

HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);

Następne kroki