Выполнение запросов к интерфейсам API EventStore для получения событий кластера

В этой статье описывается, как выполнить запрос к интерфейсам API EventStore, которые доступны в Service Fabric версии 6.2 и более поздней версии. Если вы хотите узнать больше о службе EventStore, прочитайте обзор службы EventStore. В настоящее время службе EventStore доступны только данные за последние 7 дней (это обусловлено диагностической политикой хранения данных кластера).

Примечание

API EventStore предоставляются как общедоступная версия в рамках Service Fabric 6.4 для кластеров Windows, работающих в Azure.

К интерфейсам API EventStore можно обращаться напрямую через конечную точку REST или программно. В зависимости от запроса требуется указать несколько параметров, которые необходимы для сбора соответствующих данных. Как правило, это:

  • api-version: версия интерфейсов API EventStore, которую вы используете.
  • StartTimeUtc: определяет начало запрашиваемого периода.
  • EndTimeUtc: конец периода времени.

Кроме этого, доступны дополнительные параметры, в том числе:

  • timeout: переопределяет время ожидания по умолчанию (60 с) для выполнения операции запроса.
  • eventstypesfilter: позволяет фильтровать события по типу.
  • ExcludeAnalysisEvents: исключает из результатов события анализа. По умолчанию запросы EventStore будут возвращать события анализа, когда это возможно. События анализа — это события операционного канала, которые содержат дополнительный контекст и более подробные сведения по сравнению с обычными событиями Service Fabric.
  • SkipCorrelationLookup: позволяет не выполнять поиск потенциальных связанных событий в кластере. По умолчанию EventStore попытается сопоставить события в кластере и связать события между собой, когда это возможно.

У каждой сущности в кластере можно запросить события. Можно также запрашивать события для всех сущностей определенного типа. Например, можно запросить события для конкретного узла или для всех узлов в кластере. Текущий набор сущностей, для которых вы можете запрашивать события (и структура запроса):

  • кластер: /EventsStore/Cluster/Events;
  • Узлы: /EventsStore/Nodes/Events
  • узел: /EventsStore/Nodes/<NodeName>/$/Events;
  • приложения: /EventsStore/Applications/Events;
  • приложение: /EventsStore/Applications/<AppName>/$/Events;
  • службы: /EventsStore/Services/Events;
  • служба: /EventsStore/Services/<ServiceName>/$/Events;
  • секции: /EventsStore/Partitions/Events;
  • секция: /EventsStore/Partitions/<PartitionID>/$/Events;
  • реплики: /EventsStore/Partitions/<PartitionID>/$/Replicas/Events;
  • реплика: /EventsStore/Partitions/<PartitionID>/$/Replicas/<ReplicaID>/$/Events.

Примечание

При ссылке на имя приложения или службы запрос может не содержать префикс fabric:/. Кроме того, если имена приложений или служб содержат косую черту "/", замените ее знаком "~", чтобы сохранить работоспособность запроса. Например, если приложение отображается как fabric:/App1/FrontendApp, то в запросах к этому приложению оно имело бы следующий вид: /EventsStore/Applications/App1~FrontendApp/$/Events. Кроме того, сейчас отчеты о работоспособности служб отображаются под соответствующим приложением, поэтому следует запрашивать события DeployedServiceHealthReportCreated для соответствующей сущности приложения.

Отправка запроса к EventStore через конечные точки REST API

Вы можете отправить запрос к EventStore напрямую через конечную точку REST, выполнив запросы GET к <your cluster address>/EventsStore/<entity>/Events/.

Например, запрос всех событий кластера с 2018-04-03T18:00:00Z до 2018-04-04T18:00:00Z выглядит следующим образом.

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

Он может не возвращать события или вернуть список событий в формате 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
  }
]

Как видите, после первого запуска с 2018-04-03T18:00:00Z до 2018-04-04T18:00:00Z этот кластер успешно завершил свое первое обновление с "CurrentClusterVersion": "0.0.0.0:" до "TargetClusterVersion": "6.2:1.0" за "OverallUpgradeElapsedTimeInMs": "120196.5212" мс.

Отправка запроса к EventStore программным способом

Можно также выполнить запрос к EventStore программно при помощи клиентской библиотеки Service Fabric.

Настроив клиент Service Fabric, вы сможете запрашивать события, обращаясь к EventStore следующим образом: sfhttpClient.EventStore.<request>.

Ниже приведен пример запроса всех событий кластера с 2018-04-03T18:00:00Z до 2018-04-04T18:00:00Z с помощью функции GetClusterEventListAsync.

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

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

Вот еще один пример запроса и вывода состояния работоспособности кластера и всех событий узла за сентябрь 2018 г.

  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);
      }
  }

Примеры сценариев и запросов

Вот несколько примеров того, как можно вызвать интерфейсы REST API хранилища событий для получения представления о состоянии кластера.

Обновления кластера

Чтобы узнать время последнего успешного обновления или попытки обновления кластера на прошлой неделе, можно отправить запрос к API и получить данные о недавно завершенных обновлениях кластера. Для этого нужно запросить события ClusterUpgradeCompleted в 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.

Проблемы при обновлении кластера

Аналогично, если при последнем обновлении кластера возникли проблемы, может запросить все события для сущности кластера. Вы увидите различные события, включая запуск обновлений и каждый домен обновления, для которого обновление прошло успешно. Также вы увидите события на момент, когда начался откат, и соответствующие события работоспособности. Запрос, который можно использовать для получения этих сведений: 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

Изменения состояния узлов

Чтобы просмотреть изменения состояния узлов за последние несколько дней (запуск и остановка узлов, а также их активация или деактивация (платформой, службой тестирования в условиях хаоса или пользователем)), используйте следующий запрос: 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.

События приложений

Вы также можете отслеживать последние развертывания и обновления приложений. Используйте следующий запрос, чтобы увидеть все события, связанные с приложениями, в кластере: 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.

Хронологические данные о работоспособности приложения

Помимо событий жизненного цикла приложений может понадобиться просмотреть хронологические данные о работоспособности определенного приложения. Для этого можно указать имя приложения, для которого нужно собрать данные. Используйте данный запрос, чтобы получить все события работоспособности приложения: 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. Если вы хотите включить в результаты события работоспособности с истекшим сроком действия (то есть с истекшим сроком жизни), добавьте ,ApplicationHealthReportExpired в конец запроса, чтобы использовать фильтр по двум типам событий.

Хронологические данные о работоспособности для всех служб в myApp

В настоящее время события отчета о работоспособности для служб отображаются как события DeployedServicePackageNewHealthReport для соответствующей сущности приложения. Чтобы увидеть, как ваши службы функционируют для App1, используйте следующий запрос: 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.

Перенастройка секций

Чтобы просмотреть все перемещения секций, которые произошли в кластере, запросите событие PartitionReconfigured. Это поможет выяснить, когда и какие рабочие нагрузки выполнялись на том или ином узле, при диагностике проблем в кластере. Вот пример запроса для этого: 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.

Служба тестирования в условиях хаоса

Это событие запуска или остановки службы тестирования в условиях хаоса, представленной на уровне кластера. Для просмотра последних данных об использовании службы тестирования в условиях хаоса выполните следующий запрос: 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.