Tworzenie raportów i sprawdzanie kondycji usług
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 .
Obiekty iCodePackageActivationContext
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 dla tej repliki, partycji, do których należy, oraz aplikacji, do których należy. - Użyj witryny
FabricClient
.
Możesz użyćFabricClient
polecenia , aby zgłosić kondycję z kodu usługi, jeśli klaster nie jest bezpieczny lub czy usługa jest uruchomiona z uprawnieniami administratora. Większość rzeczywistych scenariuszy nie używa niezabezpieczonych klastrów ani nie zapewnia uprawnień administratora. Za pomocąFabricClient
programu 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:
Aby wdrożyć aplikację i sprawdzić jej kondycję
Otwórz program Visual Studio jako administrator.
Utwórz projekt przy użyciu szablonu Usługi stanowej.
Naciśnij F5 , aby uruchomić aplikację w trybie debugowania. Aplikacja jest wdrażana w klastrze lokalnym.
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.
Kondycja aplikacji powinna być wyświetlana tak jak na tym obrazie. W tej chwili aplikacja powinna być w dobrej kondycji bez błędów.
Kondycję można również sprawdzić przy użyciu programu PowerShell. Możesz użyć
Get-ServiceFabricApplicationHealth
Get-ServiceFabricServiceHealth
polecenia , aby sprawdzić kondycję aplikacji i sprawdzić kondycję usługi. Raport kondycji dla tej samej aplikacji w programie PowerShell znajduje się na tej ilustracji.
Aby dodać niestandardowe zdarzenia kondycji 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 kondycji z poziomu kodu 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.
Otwórz ponownie aplikację utworzoną wcześniej w programie Visual Studio lub utwórz nową aplikację przy użyciu szablonu Stateful Service Visual Studio.
Otwórz plik Stateful1.cs i znajdź wywołanie
myDictionary.TryGetValueAsync
w metodzieRunAsync
. Widać, że ta metoda zwracaresult
wartość, która przechowuje 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.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); }
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 deklaracjivar 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); }
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 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, gdy
RunAsync
jest wykonywany. Po wprowadzeniu zmiany naciśnij F5 , aby uruchomić aplikację.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 wyświetlana jako w złej kondycji, ponieważ błąd zgłoszony z kodu, który dodaliśmy wcześniej.
Jeśli wybierzesz replikę podstawową w widoku drzewa narzędzia 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.
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 ustawiono TimeToLive
dla 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ą. Możesz również zgłosić kondycję w witrynie Partition
.
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);
Aby zgłosić kondycję w systemach Application
, DeployedApplication
i DeployedServicePackage
, użyj polecenia CodePackageActivationContext
.
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);