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
iCodePackageActivationContext
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ą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
do sprawdzenia kondycji aplikacji, aGet-ServiceFabricServiceHealth
do sprawdzenia kondycji usługi. Raport kondycji dla tej samej aplikacji w programie PowerShell znajduje się na tej ilustracji.
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.
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
, 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.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); }
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 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 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ę.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.
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.
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);