Rapportera och kontrollera hälsan hos tjänster

När dina tjänster stöter på problem beror din förmåga att svara på och åtgärda incidenter och avbrott på din förmåga att snabbt identifiera problemen. Om du rapporterar problem och fel till Azure Service Fabric Health Manager från din tjänstkod kan du använda standardverktygen för hälsoövervakning som Service Fabric tillhandahåller för att kontrollera hälsostatusen.

Det finns tre sätt att rapportera hälsotillstånd från tjänsten:

  • Använd Partition- eller CodePackageActivationContext-objekt .
    Du kan använda objekten Partition och CodePackageActivationContext för att rapportera hälsotillståndet för element som ingår i den aktuella kontexten. Kod som körs som en del av en replik kan till exempel bara rapportera hälsotillstånd på repliken, partitionen som den tillhör och det program som den är en del av.
  • Använd FabricClient.
    Du kan använda FabricClient för att rapportera hälsotillstånd från tjänstkoden om klustret inte är säkert eller om tjänsten körs med administratörsbehörighet. De flesta verkliga scenarier använder inte osäkrade kluster eller ger administratörsprivilegier. Med FabricClientkan du rapportera hälsotillstånd för alla entiteter som ingår i klustret. Helst bör dock tjänstkoden bara skicka rapporter som är relaterade till dess egen hälsa.
  • Använd REST-API:erna i kluster-, program-, distribuerade program-, tjänst-, tjänstpaket-, partitions-, replik- eller nodnivåer. Detta kan användas för att rapportera hälsa inifrån en container.

Den här artikeln vägleder dig genom ett exempel som rapporterar hälsa från tjänstkoden. Exemplet visar också hur de verktyg som tillhandahålls av Service Fabric kan användas för att kontrollera hälsostatusen. Den här artikeln är avsedd att vara en snabb introduktion till hälsoövervakningsfunktionerna i Service Fabric. Mer detaljerad information finns i serien med djupgående artiklar om hälsa som börjar med länken i slutet av den här artikeln.

Förutsättningar

Du måste ha följande installerat:

  • Visual Studio 2015 eller Visual Studio 2019
  • Service Fabric SDK

Så här skapar du ett lokalt säkert dev-kluster

  • Öppna PowerShell med administratörsbehörighet och kör följande kommandon:

Kommandon som visar hur du skapar ett säkert dev-kluster

Distribuera ett program och kontrollera dess hälsotillstånd

  1. Öppna Visual Studio som administratör.

  2. Skapa ett projekt med hjälp av mallen Tillståndskänslig tjänst .

    Skapa ett Service Fabric-program med Tillståndskänslig tjänst

  3. Tryck på F5 för att köra programmet i felsökningsläge. Programmet distribueras till det lokala klustret.

  4. När programmet har körts högerklickar du på ikonen Lokal klusterhanterare i meddelandefältet och väljer Hantera lokalt kluster på snabbmenyn för att öppna Service Fabric Explorer.

    Öppna Service Fabric Explorer från meddelandefältet

  5. Programmets hälsotillstånd ska visas som i den här bilden. För närvarande bör programmet vara felfritt utan fel.

    Felfritt program i Service Fabric Explorer

  6. Du kan också kontrollera hälsotillståndet med hjälp av PowerShell. Du kan använda Get-ServiceFabricApplicationHealth för att kontrollera ett programs hälsa och du kan använda Get-ServiceFabricServiceHealth för att kontrollera en tjänsts hälsa. Hälsorapporten för samma program i PowerShell finns i den här avbildningen.

    Felfritt program i PowerShell

Så här lägger du till anpassade hälsohändelser i tjänstkoden

Service Fabric-projektmallarna i Visual Studio innehåller exempelkod. Följande steg visar hur du kan rapportera anpassade hälsohändelser från din tjänstkod. Sådana rapporter visas automatiskt i standardverktygen för hälsoövervakning som Service Fabric tillhandahåller, till exempel Service Fabric Explorer, Azure Portal hälsovy och PowerShell.

  1. Öppna programmet som du skapade tidigare i Visual Studio eller skapa ett nytt program med hjälp av Visual Studio-mallen Stateful Service .

  2. Öppna filen Stateful1.cs och leta reda på anropet myDictionary.TryGetValueAsyncRunAsync i -metoden. Du kan se att den här metoden returnerar en result som innehåller det aktuella värdet för räknaren eftersom nyckellogik i det här programmet är att hålla ett antal igång. Om det här programmet var ett riktigt program, och om bristen på resultat utgjorde ett fel, skulle du vilja flagga händelsen.

  3. Om du vill rapportera en hälsohändelse när resultatbristen representerar ett fel lägger du till följande steg.

    a. System.Fabric.Health Lägg till namnområdet i filen Stateful1.cs.

    using System.Fabric.Health;
    

    b. Lägg till följande kod efter anropet myDictionary.TryGetValueAsync

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

    Vi rapporterar replikhälsa eftersom den rapporteras från en tillståndskänslig tjänst. Parametern HealthInformation lagrar information om det hälsoproblem som rapporteras.

    Om du hade skapat en tillståndslös tjänst använder du följande kod

    if (!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportInstanceHealth(healthInformation);
    }
    
  4. Om din tjänst körs med administratörsbehörighet eller om klustret inte är säkert kan du också använda FabricClient för att rapportera hälsotillstånd enligt följande steg.

    a. Skapa instansen FabricClient efter deklarationen var myDictionary .

    var fabricClient = new FabricClient(new FabricClientSettings() { HealthReportSendInterval = TimeSpan.FromSeconds(0) });
    

    b. Lägg till följande kod efter anropet 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. Nu ska vi simulera det här felet och se hur det visas i hälsoövervakningsverktygen. Om du vill simulera felet kommenterar du ut den första raden i hälsorapporteringskoden som du lade till tidigare. När du kommenterar ut den första raden ser koden ut som i följande exempel.

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

    Den här koden utlöser hälsorapporten varje gång RunAsync den körs. När du har ändrat trycker du på F5 för att köra programmet.

  6. När programmet har körts öppnar du Service Fabric Explorer för att kontrollera programmets hälsotillstånd. Den här gången visar Service Fabric Explorer att programmet är felfritt. Programmet visas som felaktigt eftersom felet som rapporterades från koden som vi lade till tidigare.

    Felfritt program i Service Fabric Explorer

  7. Om du väljer den primära repliken i trädvyn för Service Fabric Explorer visas även hälsotillståndet som ett fel. Service Fabric Explorer visar även hälsorapportinformationen som har lagts till i parametern HealthInformation i koden. Du kan se samma hälsorapporter i PowerShell och Azure Portal.

    Replikhälsa i Service Fabric Explorer

Den här rapporten finns kvar i hälsohanteraren tills den ersätts av en annan rapport eller tills den här repliken tas bort. Eftersom vi inte har angett TimeToLive för den här hälsorapporten i HealthInformation objektet upphör rapporten aldrig att gälla.

Vi rekommenderar att hälsotillståndet rapporteras på den mest detaljerade nivån, vilket i det här fallet är repliken. Du kan också rapportera hälsa på Partition.

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

Om du vill rapportera hälsotillståndet Applicationför , DeployedApplicationoch DeployedServicePackage, använder du CodePackageActivationContext.

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

Nästa steg