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 vanuit uw servicecode problemen en fouten rapporteert aan de Azure Service Fabric Health Manager, kunt u de standaardhulpprogramma's voor statuscontrole van Service Fabric gebruiken 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
objecten enCodePackageActivationContext
gebruiken om de status te rapporteren van elementen die deel uitmaken van de huidige context. Code die wordt uitgevoerd als onderdeel van een replica, kan bijvoorbeeld alleen de status rapporteren van die replica, de partitie waartoe deze behoort en de toepassing waarvan deze deel uitmaakt. - Gebruik
FabricClient
.
U kunt gebruikenFabricClient
om de status van de servicecode te 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 en bieden geen beheerdersbevoegdheden. MetFabricClient
kunt u de status rapporteren voor elke entiteit die deel uitmaakt van het cluster. In het ideale geval moet de servicecode echter alleen rapporten verzenden die betrekking hebben op de eigen status. - Gebruik de REST API's op het niveau van het cluster, de toepassing, de geïmplementeerde toepassing, de service, het servicepakket, de partitie, de replica of het knooppunt. Dit kan worden gebruikt om de status te rapporteren vanuit een container.
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 over status lezen 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 ontwikkelcluster 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 sjabloon Stateful Service .
Druk op F5 om de toepassing uit te voeren in de foutopsporingsmodus. De toepassing wordt geïmplementeerd in het lokale cluster.
Nadat de toepassing wordt 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 de status ook controleren met behulp van PowerShell. U kunt gebruiken
Get-ServiceFabricApplicationHealth
om de status van een toepassing te controleren en u kunt gebruikenGet-ServiceFabricServiceHealth
om de status van een service te controleren. Het statusrapport voor dezelfde toepassing in PowerShell bevindt zich in deze afbeelding.
Aangepaste statusgebeurtenissen toevoegen aan uw servicecode
De Service Fabric-projectsjablonen in Visual Studio bevatten voorbeeldcode. In de volgende stappen ziet u hoe u aangepaste statusgebeurtenissen kunt rapporteren vanuit uw servicecode. Dergelijke rapporten worden automatisch weergegeven in de standaardhulpprogramma's voor statuscontrole die Service Fabric biedt, zoals Service Fabric Explorer, Azure Portal statusweergave en PowerShell.
Open de toepassing die u eerder in Visual Studio hebt gemaakt opnieuw of maak een nieuwe toepassing met behulp van de Visual Studio-sjabloon Stateful Service .
Open het bestand Stateful1.cs en zoek de
myDictionary.TryGetValueAsync
aanroep in deRunAsync
methode. U kunt zien dat deze methode eenresult
retourneert die de huidige waarde van de teller bevat, omdat de sleutellogica in deze toepassing is om een telling actief te houden. Als deze toepassing een echte toepassing is en als het ontbreken van resultaat een fout vertegenwoordigt, kunt u die gebeurtenis markeren.Voeg de volgende stappen toe als u een statusgebeurtenis wilt rapporteren wanneer het ontbreken van resultaat een fout aangeeft.
a. Voeg de
System.Fabric.Health
naamruimte toe aan het bestand Stateful1.cs.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 de replica 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 gebruiken
FabricClient
om de status te 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 deze zien verschijnen 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 gemarkeerd, ziet de code eruit zoals 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 telkens geactiveerd wanneer
RunAsync
het wordt uitgevoerd. Nadat u de wijziging hebt aangebracht, drukt u op F5 om de toepassing uit te voeren.Nadat de toepassing wordt 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 weergegeven als beschadigd vanwege de fout die is gerapporteerd op basis van 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 de Azure Portal.
Dit rapport blijft in statusbeheer totdat het wordt vervangen door een ander rapport of totdat deze replica wordt verwijderd. Omdat we dit statusrapport niet hebben ingesteld TimeToLive
in het HealthInformation
-object, verloopt het rapport nooit.
We raden u aan om de status te rapporteren op het meest gedetailleerde niveau, in dit geval de replica. U kunt ook de status rapporteren op 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);