Dela via


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å grund av 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 standardverktyg 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 endast rapportera hälsa 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 oskyddade 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 sin 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älsotillstånd inifrån en container.

Den här artikeln beskriver ett exempel som rapporterar hälsotillstånd 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 funktionerna för hälsoövervakning i Service Fabric. Mer detaljerad information finns i serien med djupgående artiklar om hälsotillstånd 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

Så här distribuerar du ett program och kontrollerar 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-portalens 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.TryGetValueAsync RunAsync i -metoden. Du kan se att den här metoden returnerar en result som innehåller räknarens aktuella värde eftersom nyckellogik i det här programmet är att hålla ett antal igång. Om det här programmet var ett verkligt 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 bristen på resultat 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 har 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 även använda FabricClient för att rapportera hälsotillstånd som visas i 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 det visas i verktygen för hälsoövervakning. Om du vill simulera felet kommenterar du ut den första raden i hälsorapporteringskoden som du lade till tidigare. När du har kommenterat 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 slutfört ändringen 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.

    Program som inte är felfria i Service Fabric Explorer

  7. Om du väljer den primära repliken i trädvyn i Service Fabric Explorer ser du också att hälsotillståndet indikerar ett fel. Service Fabric Explorer visar även hälsorapportinformationen som lades till i parametern HealthInformation i koden. Du kan se samma hälsorapporter i PowerShell och Azure-portalen.

    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 för Application, DeployedApplicationoch DeployedServicePackage, använder du CodePackageActivationContext.

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

Nästa steg