Servicestatus rapporteren en controleren
Wanneer uw services problemen ondervinden, is uw mogelijkheid om te reageren op incidenten en storingen, afhankelijk van uw vermogen om de problemen snel te detecteren. Als u problemen en fouten rapporteert aan de Azure Service Fabric-statusbeheerder vanuit uw servicecode, kunt u standaardhulpprogramma's voor statuscontrole gebruiken die Service Fabric biedt om de status te controleren.
Er zijn drie manieren waarop u de status van de service kunt rapporteren:
- Gebruik Partition- of CodePackageActivationContext-objecten .
U kunt dePartition
status enCodePackageActivationContext
objecten gebruiken om de status van elementen te rapporteren die deel uitmaken van de huidige context. Code die als onderdeel van een replica wordt uitgevoerd, kan bijvoorbeeld alleen de status rapporteren op die replica, de partitie waartoe deze behoort en de toepassing waarvan deze deel uitmaakt. - Gebruik
FabricClient
.
U kunt deFabricClient
status van de servicecode rapporteren als het cluster niet beveiligd is of als de service wordt uitgevoerd met beheerdersbevoegdheden. De meeste praktijkscenario's maken geen gebruik van onbeveiligde clusters of bieden beheerdersbevoegdheden. MetFabricClient
kunt u de status rapporteren over elke entiteit die deel uitmaakt van het cluster. In het ideale geval mag servicecode echter alleen rapporten verzenden die zijn gerelateerd aan de eigen status. - Gebruik de REST API's op het cluster, de toepassing, de geïmplementeerde toepassing, de service, het servicepakket, de partitie, de replica of het knooppuntniveau. Dit kan worden gebruikt om de status vanuit een container te rapporteren.
In dit artikel wordt een voorbeeld beschreven dat de status van de servicecode rapporteert. In het voorbeeld ziet u ook hoe de hulpprogramma's van Service Fabric kunnen worden gebruikt om de status te controleren. Dit artikel is bedoeld als een korte inleiding tot de mogelijkheden voor statuscontrole van Service Fabric. Voor meer gedetailleerde informatie kunt u de reeks uitgebreide artikelen lezen over de status die beginnen met de koppeling aan het einde van dit artikel.
Vereisten
U moet het volgende hebben geïnstalleerd:
- Visual Studio 2015 of Visual Studio 2019
- Service Fabric SDK
Een lokaal beveiligd dev-cluster maken
- Open PowerShell met beheerdersbevoegdheden en voer de volgende opdrachten uit:
Een toepassing implementeren en de status ervan controleren
Open Visual Studio als beheerder.
Maak een project met behulp van de Stateful Service-sjabloon .
Druk op F5 om de toepassing uit te voeren in de foutopsporingsmodus. De toepassing wordt geïmplementeerd in het lokale cluster.
Nadat de toepassing is uitgevoerd, klikt u met de rechtermuisknop op het pictogram Lokaal clusterbeheer in het systeemvak en selecteert u Lokaal cluster beheren in het snelmenu om Service Fabric Explorer te openen.
De toepassingsstatus moet worden weergegeven zoals in deze afbeelding. Op dit moment moet de toepassing in orde zijn zonder fouten.
U kunt ook de status controleren met behulp van PowerShell. U kunt de
Get-ServiceFabricApplicationHealth
status van een toepassing controleren en u kunt deze gebruikenGet-ServiceFabricServiceHealth
om de status van een service te controleren. Het statusrapport voor dezelfde toepassing in PowerShell bevindt zich in deze afbeelding.
Aangepaste statusevenementen toevoegen aan uw servicecode
De Service Fabric-projectsjablonen in Visual Studio bevatten voorbeeldcode. De volgende stappen laten zien hoe u aangepaste statusevenementen vanuit uw servicecode kunt rapporteren. Dergelijke rapporten worden automatisch weergegeven in de standaardhulpprogramma's voor statuscontrole die Service Fabric biedt, zoals Service Fabric Explorer, de statusweergave van Azure Portal en PowerShell.
Open de toepassing die u eerder hebt gemaakt in Visual Studio opnieuw of maak een nieuwe toepassing met behulp van de Stateful Service Visual Studio-sjabloon.
Open het Stateful1.cs-bestand en zoek de
myDictionary.TryGetValueAsync
aanroep in deRunAsync
methode. U kunt zien dat deze methode eenresult
waarde retourneert die de huidige waarde van de teller bevat, omdat de sleutellogica in deze toepassing is om het aantal actief te houden. Als deze toepassing een echte toepassing was en als het gebrek aan resultaat een fout vertegenwoordigde, zou u die gebeurtenis willen markeren.Als u een status gebeurtenis wilt rapporteren wanneer het gebrek aan resultaat een fout vertegenwoordigt, voegt u de volgende stappen toe.
a. Voeg de
System.Fabric.Health
naamruimte toe aan het Stateful1.cs-bestand.using System.Fabric.Health;
b. Voeg de volgende code toe na de
myDictionary.TryGetValueAsync
aanroepif (!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportReplicaHealth(healthInformation); }
We rapporteren de status van replica's omdat deze wordt gerapporteerd vanuit een stateful service. De
HealthInformation
parameter slaat informatie op over het statusprobleem dat wordt gerapporteerd.Als u een staatloze service hebt gemaakt, gebruikt u de volgende code
if (!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportInstanceHealth(healthInformation); }
Als uw service wordt uitgevoerd met beheerdersbevoegdheden of als het cluster niet beveiligd is, kunt u ook de
FabricClient
status rapporteren, zoals wordt weergegeven in de volgende stappen.a. Maak het
FabricClient
exemplaar na devar myDictionary
declaratie.var fabricClient = new FabricClient(new FabricClientSettings() { HealthReportSendInterval = TimeSpan.FromSeconds(0) });
b. Voeg de volgende code toe na de
myDictionary.TryGetValueAsync
aanroep.if (!result.HasValue) { var replicaHealthReport = new StatefulServiceReplicaHealthReport( this.Context.PartitionId, this.Context.ReplicaId, new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error)); fabricClient.HealthManager.ReportHealth(replicaHealthReport); }
Laten we deze fout simuleren en zien dat deze wordt weergegeven in de hulpprogramma's voor statuscontrole. Als u de fout wilt simuleren, markeert u de eerste regel in de statusrapportagecode die u eerder hebt toegevoegd. Nadat u de eerste regel hebt uitgecommentarieert, ziet de code eruit als in het volgende voorbeeld.
//if(!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportReplicaHealth(healthInformation); }
Met deze code wordt het statusrapport elke keer geactiveerd wanneer
RunAsync
deze wordt uitgevoerd. Nadat u de wijziging hebt aangebracht, drukt u op F5 om de toepassing uit te voeren.Nadat de toepassing is uitgevoerd, opent u Service Fabric Explorer om de status van de toepassing te controleren. Deze keer geeft Service Fabric Explorer aan dat de toepassing niet in orde is. De toepassing wordt als beschadigd weergegeven omdat de fout die is gerapporteerd uit de code die we eerder hebben toegevoegd.
Als u de primaire replica selecteert in de structuurweergave van Service Fabric Explorer, ziet u dat status ook een fout aangeeft. Service Fabric Explorer geeft ook de details van het statusrapport weer die zijn toegevoegd aan de
HealthInformation
parameter in de code. U kunt dezelfde statusrapporten zien in PowerShell en Azure Portal.
Dit rapport blijft in health manager totdat het wordt vervangen door een ander rapport of totdat deze replica wordt verwijderd. Omdat dit statusrapport niet is ingesteld TimeToLive
in het HealthInformation
object, verloopt het rapport nooit.
We raden aan dat de status moet worden gerapporteerd op het meest gedetailleerde niveau, wat in dit geval de replica is. U kunt ook de status rapporteren.Partition
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);
Als u de status wilt rapporteren over Application
, DeployedApplication
en DeployedServicePackage
, gebruikt CodePackageActivationContext
u .
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);