Tworzenie raportów i sprawdzanie kondycji usług

Gdy usługi napotykają problemy, możliwość reagowania na zdarzenia i ich naprawiania zależy od możliwości szybkiego wykrywania problemów. W przypadku zgłaszania problemów i niepowodzeń do menedżera kondycji usługi Azure Service Fabric z poziomu kodu usługi można 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 usługi:

  • Użyj obiektów Partition lub CodePackageActivationContext .
    Obiekty i CodePackageActivationContext umożliwiają Partition raportowanie kondycji elementów będących częścią bieżącego kontekstu. Na przykład kod uruchamiany w ramach repliki może zgłaszać kondycję tylko na tej repliki, partycji, do których należy, oraz aplikacji, do których należy.
  • Użyj polecenia FabricClient.
    Możesz użyć FabricClient polecenia , aby zgłosić kondycję z poziomu 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ą polecenia FabricClientmożna raportować kondycję dowolnej jednostki, która jest częścią klastra. Najlepiej jednak kod usługi powinien wysyłać tylko raporty związane z własną kondycją.
  • 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, który raportuje kondycję z kodu usługi. W przykładzie pokazano również, w jaki sposób 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 klawisz 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ć Service Fabric Explorer.

    Otwieranie 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.

    Aplikacja w dobrej kondycji w Service Fabric Explorer

  6. Kondycję można również sprawdzić przy użyciu programu PowerShell. Get-ServiceFabricApplicationHealth Służy do sprawdzania kondycji aplikacji i sprawdzania Get-ServiceFabricServiceHealth kondycji usługi. Raport o kondycji dla tej samej aplikacji w programie PowerShell znajduje się na tym obrazie.

    Aplikacja w dobrej kondycji w programie PowerShell

Aby dodać niestandardowe zdarzenia kondycji do kodu usługi

Szablony projektów usługi Service Fabric w programie Visual Studio zawierają przykładowy kod. Poniższe kroki pokazują, jak można zgłaszać niestandardowe zdarzenia kondycji z poziomu kodu usługi. Takie raporty są automatycznie wyświetlane w standardowych narzędziach do monitorowania kondycji zapewnianych przez usługę Service Fabric, takich jak Service Fabric Explorer, Azure Portal widok kondycji i program PowerShell.

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

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

  3. Aby zgłosić zdarzenie kondycji, gdy brak wyniku reprezentuje błąd, 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ą.

    Jeśli utworzono 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. FabricClient Utwórz wystąpienie 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. Zasymulujmy ten błąd i zobaczmy go w narzędziach do monitorowania kondycji. Aby zasymulować błąd, oznacz jako komentarz pierwszy wiersz w dodanym wcześniej kodzie raportowania kondycji. Po oznaczeniu komentarza w pierwszym wierszu kod będzie wyglądać podobnie do poniższego przykładu.

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

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

  6. Po uruchomieniu aplikacji otwórz Service Fabric Explorer, aby sprawdzić kondycję aplikacji. Tym razem Service Fabric Explorer pokazuje, że aplikacja jest w złej kondycji. Aplikacja jest wyświetlana jako w złej kondycji, ponieważ zgłoszony błąd z kodu, który został wcześniej dodany.

    Aplikacja w złej kondycji w Service Fabric Explorer

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

    Kondycja repliki w Service Fabric Explorer

Ten raport pozostaje w menedżerze kondycji, dopóki nie zostanie zastąpiony innym raportem lub dopóki ta replika nie zostanie usunięta. Ponieważ nie ustawiono TimeToLive tego raportu kondycji HealthInformation w obiekcie , raport nigdy nie wygasa.

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

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

Aby zgłosić kondycję w systemach Application, DeployedApplicationi DeployedServicePackage, użyj polecenia CodePackageActivationContext.

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

Następne kroki