Fråga EventStore-API:er för klusterhändelser

Den här artikeln beskriver hur du frågar eventstore-API:er som är tillgängliga i Service Fabric version 6.2 och senare – om du vill veta mer om EventStore-tjänsten kan du läsa översikten över EventStore-tjänsten. För närvarande kan EventStore-tjänsten bara komma åt data under de senaste 7 dagarna (detta baseras på klustrets kvarhållningsprincip för diagnostikdata).

Anteckning

EventStore-API:erna är GA från och med Service Fabric version 6.4 för endast Windows-kluster som körs i Azure.

EventStore-API:erna kan nås direkt via en REST-slutpunkt eller programmatiskt. Beroende på frågan finns det flera parametrar som krävs för att samla in rätt data. Dessa parametrar omfattar vanligtvis:

  • api-version: den version av EventStore-API:erna som du använder
  • StartTimeUtc: definierar början av den period som du är intresserad av att titta på
  • EndTimeUtc: Slutet av tidsperioden

Utöver dessa parametrar finns det även valfria parametrar tillgängliga, till exempel:

  • timeout: åsidosätt standardtimeouten på 60 sekunder för att utföra begärandeåtgärden
  • eventstypesfilter: Detta ger dig möjlighet att filtrera efter specifika händelsetyper
  • ExcludeAnalysisEvents: returnera inte "Analysis"-händelser. Som standard returneras EventStore-frågor med "analys"-händelser där det är möjligt. Analyshändelser är mer omfattande operativa kanalhändelser som innehåller ytterligare kontext eller information utöver en vanlig Service Fabric-händelse och ger mer djup.
  • SkipCorrelationLookup: leta inte efter potentiella korrelerade händelser i klustret. Som standard försöker EventStore korrelera händelser i ett kluster och länka samman dina händelser när det är möjligt.

Varje entitet i ett kluster kan vara frågor om händelser. Du kan också fråga efter händelser för alla entiteter av typen. Du kan till exempel fråga efter händelser för en specifik nod eller för alla noder i klustret. Den aktuella uppsättningen entiteter som du kan fråga efter händelser för är (med hur frågan skulle struktureras):

  • Kluster: /EventsStore/Cluster/Events
  • Noder: /EventsStore/Nodes/Events
  • Nod: /EventsStore/Nodes/<NodeName>/$/Events
  • Program: /EventsStore/Applications/Events
  • Program: /EventsStore/Applications/<AppName>/$/Events
  • Tjänster: /EventsStore/Services/Events
  • Tjänst: /EventsStore/Services/<ServiceName>/$/Events
  • Partitioner: /EventsStore/Partitions/Events
  • Partition: /EventsStore/Partitions/<PartitionID>/$/Events
  • Repliker: /EventsStore/Partitions/<PartitionID>/$/Replicas/Events
  • Replika: /EventsStore/Partitions/<PartitionID>/$/Replicas/<ReplicaID>/$/Events

Anteckning

När du refererar till ett program- eller tjänstnamn behöver frågan inte innehålla "fabric:/" Prefix. Om program- eller tjänstnamnen dessutom har ett "/" i sig växlar du det till ett "~" för att hålla frågan igång. Om ditt program till exempel visas som "fabric:/App1/FrontendApp" skulle dina appspecifika frågor struktureras som /EventsStore/Applications/App1~FrontendApp/$/Events. Dessutom visas hälsorapporter för tjänster i dag under motsvarande program, så du frågar efter händelser för DeployedServiceHealthReportCreated rätt programentitet.

Fråga EventStore via REST API-slutpunkter

Du kan fråga EventStore direkt via en REST-slutpunkt genom att göra GET begäranden till: <your cluster address>/EventsStore/<entity>/Events/.

Om du till exempel vill fråga efter alla klusterhändelser mellan 2018-04-03T18:00:00Z och 2018-04-04T18:00:00Zser din begäran ut så här:

Method: GET 
URL: http://mycluster:19080/EventsStore/Cluster/Events?api-version=6.4&StartTimeUtc=2018-04-03T18:00:00Z&EndTimeUtc=2018-04-04T18:00:00Z

Detta kan antingen returnera inga händelser eller listan över händelser som returneras i json:

Response: 200
Body:
[
  {
    "Kind": "ClusterUpgradeStart",
    "CurrentClusterVersion": "0.0.0.0:",
    "TargetClusterVersion": "6.2:1.0",
    "UpgradeType": "Rolling",
    "RollingUpgradeMode": "UnmonitoredAuto",
    "FailureAction": "Manual",
    "EventInstanceId": "090add3c-8f56-4d35-8d57-a855745b6064",
    "TimeStamp": "2018-04-03T20:18:59.4313064Z",
    "HasCorrelatedEvents": false
  },
  {
    "Kind": "ClusterUpgradeDomainComplete",
    "TargetClusterVersion": "6.2:1.0",
    "UpgradeState": "RollingForward",
    "UpgradeDomains": "(0 1 2)",
    "UpgradeDomainElapsedTimeInMs": "78.5288",
    "EventInstanceId": "090add3c-8f56-4d35-8d57-a855745b6064",
    "TimeStamp": "2018-04-03T20:19:59.5729953Z",
    "HasCorrelatedEvents": false
  },
  {
    "Kind": "ClusterUpgradeDomainComplete",
    "TargetClusterVersion": "6.2:1.0",
    "UpgradeState": "RollingForward",
    "UpgradeDomains": "(3 4)",
    "UpgradeDomainElapsedTimeInMs": "0",
    "EventInstanceId": "090add3c-8f56-4d35-8d57-a855745b6064",
    "TimeStamp": "2018-04-03T20:20:59.6271949Z",
    "HasCorrelatedEvents": false
  },
  {
    "Kind": "ClusterUpgradeComplete",
    "TargetClusterVersion": "6.2:1.0",
    "OverallUpgradeElapsedTimeInMs": "120196.5212",
    "EventInstanceId": "090add3c-8f56-4d35-8d57-a855745b6064",
    "TimeStamp": "2018-04-03T20:20:59.8134457Z",
    "HasCorrelatedEvents": false
  }
]

Här kan vi se att klustret mellan 2018-04-03T18:00:00Z och 2018-04-04T18:00:00Zhar slutfört sin första uppgradering när det först stod upp, från "CurrentClusterVersion": "0.0.0.0:" till "TargetClusterVersion": "6.2:1.0", i "OverallUpgradeElapsedTimeInMs": "120196.5212".

Fråga EventStore programmatiskt

Du kan också fråga EventStore programmatiskt via Service Fabric-klientbiblioteket.

När du har konfigurerat Service Fabric-klienten kan du fråga efter händelser genom att komma åt EventStore så här: sfhttpClient.EventStore.<request>

Här är en exempelbegäran för alla klusterhändelser mellan 2018-04-03T18:00:00Z och 2018-04-04T18:00:00Z, via GetClusterEventListAsync funktionen.

var sfhttpClient = ServiceFabricClientFactory.Create(clusterUrl, settings);

var clstrEvents = sfhttpClient.EventsStore.GetClusterEventListAsync(
    "2018-04-03T18:00:00Z",
    "2018-04-04T18:00:00Z")
    .GetAwaiter()
    .GetResult()
    .ToList();

Här är ett annat exempel som frågar efter klusterhälsan och alla nodhändelser i september 2018 och skriver ut dem.

  const int timeoutSecs = 60;
  var clusterUrl = new Uri(@"http://localhost:19080"); // This example is for a Local cluster
  var sfhttpClient = ServiceFabricClientFactory.Create(clusterUrl);

  var clusterHealth = sfhttpClient.Cluster.GetClusterHealthAsync().GetAwaiter().GetResult();
  Console.WriteLine("Cluster Health: {0}", clusterHealth.AggregatedHealthState.Value.ToString());

  
  Console.WriteLine("Querying for node events...");
  var nodesEvents = sfhttpClient.EventsStore.GetNodesEventListAsync(
      "2018-09-01T00:00:00Z",
      "2018-09-30T23:59:59Z",
      timeoutSecs,
      "NodeDown,NodeUp")
      .GetAwaiter()
      .GetResult()
      .ToList();
  Console.WriteLine("Result Count: {0}", nodesEvents.Count());

  foreach (var nodeEvent in nodesEvents)
  {
      Console.Write("Node event happened at {0}, Node name: {1} ", nodeEvent.TimeStamp, nodeEvent.NodeName);
      if (nodeEvent is NodeDownEvent)
      {
          var nodeDownEvent = nodeEvent as NodeDownEvent;
          Console.WriteLine("(Node is down, and it was last up at {0})", nodeDownEvent.LastNodeUpAt);
      }
      else if (nodeEvent is NodeUpEvent)
      {
          var nodeUpEvent = nodeEvent as NodeUpEvent;
          Console.WriteLine("(Node is up, and it was last down at {0})", nodeUpEvent.LastNodeDownAt);
      }
  }

Exempelscenarier och frågor

Här följer några exempel på hur du kan anropa REST-API:er för Event Store för att förstå statusen för klustret.

Klusteruppgraderingar:

Om du vill se den senaste gången klustret lyckades eller försökte uppgraderas förra veckan kan du fråga API:erna om nyligen slutförda uppgraderingar till klustret genom att fråga efter händelserna "ClusterUpgradeCompleted" i EventStore: https://mycluster.cloudapp.azure.com:19080/EventsStore/Cluster/Events?api-version=6.4&starttimeutc=2017-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z&EventsTypesFilter=ClusterUpgradeCompleted

Problem med klusteruppgradering:

På samma sätt kan du fråga efter alla händelser för klusterentiteten om det har uppstått problem med en nyligen genomförd klusteruppgradering. Du ser olika händelser, inklusive initiering av uppgraderingar och varje UD som uppgraderingen har genomförts för. Du ser även händelser för den punkt där återställningen startade och motsvarande hälsohändelser. Här är den fråga som du skulle använda för detta: https://mycluster.cloudapp.azure.com:19080/EventsStore/Cluster/Events?api-version=6.4&starttimeutc=2017-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z

Nodstatusändringar:

Om du vill se dina nodstatusändringar under de senaste dagarna – när noderna har gått upp eller ned, eller har aktiverats eller inaktiverats (antingen av plattformen, kaostjänsten eller från användarindata) – använder du följande fråga: https://mycluster.cloudapp.azure.com:19080/EventsStore/Nodes/Events?api-version=6.4&starttimeutc=2017-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z

Programhändelser:

Du kan också spåra de senaste programdistributionerna och uppgraderingarna. Använd följande fråga för att se alla programhändelser i klustret: https://mycluster.cloudapp.azure.com:19080/EventsStore/Applications/Events?api-version=6.4&starttimeutc=2017-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z

Historisk hälsa för ett program:

Förutom att bara se programlivscykelhändelser kanske du också vill se historiska data om hälsotillståndet för ett visst program. Du kan göra detta genom att ange det programnamn som du vill samla in data för. Använd den här frågan för att hämta alla programhälsohändelser: https://mycluster.cloudapp.azure.com:19080/EventsStore/Applications/myApp/$/Events?api-version=6.4&starttimeutc=2018-03-24T17:01:51Z&endtimeutc=2018-03-29T17:02:51Z&EventsTypesFilter=ApplicationNewHealthReport. Om du vill inkludera hälsohändelser som kan ha upphört att gälla (har passerat sin tid till live (TTL)) lägger du ,ApplicationHealthReportExpired till i slutet av frågan för att filtrera på två typer av händelser.

Historisk hälsa för alla tjänster i "myApp":

För närvarande visas hälsorapporthändelser för tjänster som DeployedServicePackageNewHealthReport händelser under motsvarande programentitet. Om du vill se hur dina tjänster har gjort för "App1" använder du följande fråga: https://mycluster.cloudapp.azure.com:19080/EventsStore/Applications/myapp/$/Events?api-version=6.4&starttimeutc=2017-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z&EventsTypesFilter=DeployedServicePackageNewHealthReport

Omkonfiguration av partition:

Om du vill se alla partitionsförflyttningar som har inträffat i klustret frågar du efter PartitionReconfigured händelsen. Detta kan hjälpa dig att ta reda på vilka arbetsbelastningar som kördes på vilken nod vid specifika tidpunkter när du diagnostiserar problem i klustret. Här är en exempelfråga som gör det: https://mycluster.cloudapp.azure.com:19080/EventsStore/Partitions/Events?api-version=6.4&starttimeutc=2018-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z&EventsTypesFilter=PartitionReconfigured

Kaostjänst:

Det finns en händelse för när Chaos-tjänsten startas eller stoppas som exponeras på klusternivå. Om du vill se din senaste användning av Chaos-tjänsten använder du följande fråga: https://mycluster.cloudapp.azure.com:19080/EventsStore/Cluster/Events?api-version=6.4&starttimeutc=2017-04-22T17:01:51Z&endtimeutc=2018-04-29T17:02:51Z&EventsTypesFilter=ChaosStarted,ChaosStopped