Tutorial: Supervisión de un clúster de Service Fabric en Azure

La supervisión y el diagnóstico son fundamentales para el desarrollo, las pruebas y la implementación de flujos de trabajo en cualquier entorno de la nube. Este tutorial es la segunda parte de una serie, y en él se muestra cómo supervisar y diagnosticar un clúster de Service Fabric mediante eventos, contadores de rendimiento e informes de mantenimiento. Para más información, lea la información general sobre la supervisión de clústeres y la supervisión de infraestructuras.

En este tutorial, aprenderá a:

  • Visualización de eventos de Service Fabric
  • Consulta de las API del servicio EventStore para obtener eventos de clúster
  • Supervisar la infraestructura y recopilar contadores de rendimiento
  • Ver los informes de mantenimiento del clúster

En esta serie de tutoriales, se aprende a:

Nota

Se recomienda usar el módulo Azure Az de PowerShell para interactuar con Azure. Para comenzar, consulte Instalación de Azure PowerShell. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Prerrequisitos

Antes de empezar este tutorial:

Visualización de eventos de Service Fabric mediante los registros de Azure Monitor

Los registros de Azure Monitor recopilan y analizan la telemetría de las aplicaciones y los servicios hospedados en la nube y proporcionan herramientas de análisis para ayudarle a maximizar su disponibilidad y rendimiento. Puede ejecutar consultas en los registros de Azure Monitor para obtener conclusiones sobre lo que sucede en el clúster y solucionar sus problemas.

Para acceder la solución Service Fabric Analytics, vaya a Azure Portal y seleccione el grupo de recursos en el que creó la solución Service Fabric Analytics.

Seleccione el recurso ServiceFabric(mysfomsworkspace) .

En Información general, verá iconos en forma de gráfico para cada una de las soluciones habilitadas, entre ellos uno para Service Fabric. Seleccione el grafo de Service Fabric para ir a la solución Service Fabric Analytics.

Captura de pantalla que muestra el grafo de Service Fabric.

En la siguiente imagen se muestra la página principal de la solución Service Fabric Analytics. Esta página principal proporciona una instantánea de lo que sucede en el clúster.

Solución Service Fabric

Si habilitó el diagnóstico durante la creación del clúster, puede ver eventos de

Nota:

Además de los eventos de Service Fabric estándar, se pueden recopilar eventos del sistema más detallados mediante la actualización de la configuración de la extensión de diagnósticos.

Visualización de eventos de Service Fabric, como acciones en nodos

En la página de Service Fabric Analytics, haga clic en el gráfico de Eventos de clúster. Aparecen los registros de todos los eventos del sistema que se han recopilado. Como referencia, proceden de WADServiceFabricSystemEventsTable en la cuenta de Azure Storage y, de manera similar, los eventos de Reliable Services y Reliable Actors que ve a continuación provienen de esas tablas respectivas.

Canal operativo de consulta

La consulta usa el lenguaje de consulta Kusto, que se puede modificar para optimizar la búsqueda. Por ejemplo, para buscar todas las acciones realizadas en los nodos del clúster, puede usar la consulta siguiente. Los identificadores de evento que se usan a continuación se encuentran en la referencia de eventos del canal operativo.

ServiceFabricOperationalEvent
| where EventId < 25627 and EventId > 25619 

El lenguaje de consulta Kusto es eficaz. Estas son algunas otras consultas útiles.

Cree una tabla de búsqueda ServiceFabricEvent como una función definida por el usuario y, para ello, guarde la consulta como una función con el alias ServiceFabricEvent:

let ServiceFabricEvent = datatable(EventId: int, EventName: string)
[
    ...
    18603, 'NodeUpOperational',
    18604, 'NodeDownOperational',
    ...
];
ServiceFabricEvent

Devolver eventos operativos registrados en la última hora:

ServiceFabricOperationalEvent
| where TimeGenerated > ago(1h)
| join kind=leftouter ServiceFabricEvent on EventId
| project EventId, EventName, TaskName, Computer, ApplicationName, EventMessage, TimeGenerated
| sort by TimeGenerated

Devolver eventos operativos con EventId == 18604 y EventName == "NodeDownOperational":

ServiceFabricOperationalEvent
| where EventId == 18604
| project EventId, EventName = 'NodeDownOperational', TaskName, Computer, EventMessage, TimeGenerated
| sort by TimeGenerated 

Devolver eventos operativos con EventId == 18604 y EventName == "NodeUpOperational":

ServiceFabricOperationalEvent
| where EventId == 18603
| project EventId, EventName = 'NodeUpOperational', TaskName, Computer, EventMessage, TimeGenerated
| sort by TimeGenerated 

Devuelve informes de mantenimiento con HealthState == 3 (Error) y extrae más propiedades del campo EventMessage:

ServiceFabricOperationalEvent
| join kind=leftouter ServiceFabricEvent on EventId
| extend HealthStateId = extract(@"HealthState=(\S+) ", 1, EventMessage, typeof(int))
| where TaskName == 'HM' and HealthStateId == 3
| extend SourceId = extract(@"SourceId=(\S+) ", 1, EventMessage, typeof(string)),
         Property = extract(@"Property=(\S+) ", 1, EventMessage, typeof(string)),
         HealthState = case(HealthStateId == 0, 'Invalid', HealthStateId == 1, 'Ok', HealthStateId == 2, 'Warning', HealthStateId == 3, 'Error', 'Unknown'),
         TTL = extract(@"TTL=(\S+) ", 1, EventMessage, typeof(string)),
         SequenceNumber = extract(@"SequenceNumber=(\S+) ", 1, EventMessage, typeof(string)),
         Description = extract(@"Description='([\S\s, ^']+)' ", 1, EventMessage, typeof(string)),
         RemoveWhenExpired = extract(@"RemoveWhenExpired=(\S+) ", 1, EventMessage, typeof(bool)),
         SourceUTCTimestamp = extract(@"SourceUTCTimestamp=(\S+)", 1, EventMessage, typeof(datetime)),
         ApplicationName = extract(@"ApplicationName=(\S+) ", 1, EventMessage, typeof(string)),
         ServiceManifest = extract(@"ServiceManifest=(\S+) ", 1, EventMessage, typeof(string)),
         InstanceId = extract(@"InstanceId=(\S+) ", 1, EventMessage, typeof(string)),
         ServicePackageActivationId = extract(@"ServicePackageActivationId=(\S+) ", 1, EventMessage, typeof(string)),
         NodeName = extract(@"NodeName=(\S+) ", 1, EventMessage, typeof(string)),
         Partition = extract(@"Partition=(\S+) ", 1, EventMessage, typeof(string)),
         StatelessInstance = extract(@"StatelessInstance=(\S+) ", 1, EventMessage, typeof(string)),
         StatefulReplica = extract(@"StatefulReplica=(\S+) ", 1, EventMessage, typeof(string))

Devolver un gráfico temporal de eventos con EventId! = 17523:

ServiceFabricOperationalEvent
| join kind=leftouter ServiceFabricEvent on EventId
| where EventId != 17523
| summarize Count = count() by Timestamp = bin(TimeGenerated, 1h), strcat(tostring(EventId), " - ", case(EventName != "", EventName, "Unknown"))
| render timechart 

Obtener eventos operativos de Service Fabric agregados con el servicio y el nodo específicos:

ServiceFabricOperationalEvent
| where ApplicationName  != "" and ServiceName != ""
| summarize AggregatedValue = count() by ApplicationName, ServiceName, Computer 

Representar el recuento de eventos de Service Fabric por EventId/EventName mediante una consulta entre recursos:

app('PlunkoServiceFabricCluster').traces
| where customDimensions.ProviderName == 'Microsoft-ServiceFabric'
| extend EventId = toint(customDimensions.EventId), TaskName = tostring(customDimensions.TaskName)
| where EventId != 17523
| join kind=leftouter ServiceFabricEvent on EventId
| extend EventName = case(EventName != '', EventName, 'Undocumented')
| summarize ["Event Count"]= count() by bin(timestamp, 30m), EventName = strcat(tostring(EventId), " - ", EventName)
| render timechart

Visualización de eventos de aplicación de Service Fabric

Puede ver los eventos de las aplicaciones de Reliable Services y Reliable Actors implementadas en el clúster. En la página de Service Fabric Analytics, seleccione el grafo de Eventos de aplicaciones.

Ejecute la siguiente consulta para ver los eventos de las aplicaciones de Reliable Services:

ServiceFabricReliableServiceEvent
| sort by TimeGenerated desc

Puede ver eventos diferentes para cuando el servicio runasync se inicia y se completa, lo que ocurre habitualmente en las implementaciones y las actualizaciones.

Reliable Services de la solución Service Fabric

También puede encontrar eventos para el servicio confiable con ServiceName == "fabric:/Watchdog/WatchdogService":

ServiceFabricReliableServiceEvent
| where ServiceName == "fabric:/Watchdog/WatchdogService"
| project TimeGenerated, EventMessage
| order by TimeGenerated desc  

Los eventos de Reliable Actors pueden verse de forma similar:

ServiceFabricReliableActorEvent
| sort by TimeGenerated desc

Para configurar eventos más detallados para Reliable Actors, debe cambiar scheduledTransferKeywordFilter en la configuración de la extensión de diagnóstico de la plantilla del clúster. Los detalles de los valores de estos están en la referencia de eventos de Reliable Actors.

"EtwEventSourceProviderConfiguration": [
                {
                    "provider": "Microsoft-ServiceFabric-Actors",
                    "scheduledTransferKeywordFilter": "1",
                    "scheduledTransferPeriod": "PT5M",
                    "DefaultEvents": {
                    "eventDestination": "ServiceFabricReliableActorEventTable"
                    }
                },

Visualización de contadores de rendimiento con los registros de Azure Monitor

Para ver los contadores de rendimiento, vaya a Azure Portal y al grupo de recursos en el que creó la solución de Service Fabric Analytics.

Seleccione el recurso ServiceFabric(mysfomsworkspace) , luego Área de trabajo de Log Analytics y, finalmente, Configuración avanzada.

Seleccione Datos y luego elija Contadores de rendimiento de Windows. Existe una lista de contadores predeterminados que puede elegir para habilitar, y también puede establecer el intervalo para la recopilación. También puede agregar contadores de rendimiento adicionales para recopilar. En este artículo puede comprobar el formato adecuado. Haga clic en Guardar y luego seleccione Aceptar.

Cierre la hoja de configuración avanzada y seleccione Resumen del área de trabajo en el encabezado General. Para cada una de las soluciones habilitadas hay un icono gráfico (también se incluye uno para Service Fabric). Seleccione el grafo de Service Fabric para ir a la solución Service Fabric Analytics.

Hay iconos gráficos para los eventos del canal operativo y de Reliable Services. La representación gráfica de los datos que entran en los contadores que seleccionó aparecerán en Métricas de nodo.

Seleccione el grafo de Métrica de contenedor para ver más detalles. También puede consultar los datos del contador de rendimiento de forma similar a los eventos de clúster y filtrar en los nodos, el nombre del contador de rendimiento y los valores mediante el lenguaje de consulta Kusto.

Consulta del servicio EventStore

El servicio EventStore proporciona una manera de comprender el estado del clúster o las cargas de trabajo en un momento dado. EventStore es un servicio de Service Fabric con estado que mantiene los eventos del clúster. Los eventos se exponen a través de Service Fabric Explorer, REST y las API. EventStore consulta el clúster directamente para obtener datos de diagnóstico de cualquier entidad del clúster. Para ver una lista completa de los eventos disponibles en EventStore, consulte Eventos de Service Fabric.

Las API de EventStore se pueden consultar mediante programación con la biblioteca cliente de Service Fabric.

Esta es una solicitud de ejemplo de todos los eventos de clúster entre 2018-04-03T18:00:00Z y 2018-04-04T18:00:00Z, mediante la función 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();

Este es otro ejemplo que consulta el estado del clúster y todos los eventos del nodo en septiembre de 2018 e imprime los resultados.

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

Supervisión del estado del clúster

Service Fabric presenta un modelo de mantenimiento con entidades de estado en las que componentes y guardianes del sistema pueden notificar las condiciones locales que están supervisando. El almacén de estado agrega todos los datos de mantenimiento para determinar si las entidades son correctas.

El clúster se rellena automáticamente con informes de estado enviados por los componentes del sistema. Lea más en Uso de informes de mantenimiento del sistema para solucionar problemas.

Service Fabric expone las consultas de mantenimiento para cada uno de los tipos de entidadadmitidos. Se puede acceder a ellas mediante la API, con los métodos de FabricClient.HealthManager, los cmdlets de PowerShell y REST. Estas consultas devuelven información completa de mantenimiento sobre la entidad: el estado de mantenimiento agregado, los eventos de mantenimiento de la entidad, los estados de mantenimiento de los elementos secundarios (si procede), las evaluaciones de estado incorrecto y las estadísticas de mantenimiento de los elementos secundarios (cuando corresponde).

Obtención del mantenimiento de clúster

El cmdlet Get-ServiceFabricClusterHealth devuelve el mantenimiento de la entidad del clúster y contiene los estados de mantenimiento de las aplicaciones y los nodos (hijos del clúster). En primer lugar, conéctese al clúster mediante el cmdlet Connect-ServiceFabricCluster.

El estado del clúster es 11 nodos, la aplicación del sistema y fabric:/WordCount configurado tal como se ha descrito.

En el siguiente ejemplo se obtiene el mantenimiento del clúster mediante directivas de mantenimiento predeterminadas. Los 11 nodos están en buen estado, pero el estado de mantenimiento agregado del clúster es Error porque la aplicación fabric:/Voing está en estado de error. Observe cómo las evaluaciones de mantenimiento incorrecto muestran detalles de las condiciones que desencadenaron el mantenimiento agregado.

Get-ServiceFabricClusterHealth

AggregatedHealthState   : Error
UnhealthyEvaluations    : 
                          100% (1/1) applications are unhealthy. The evaluation tolerates 0% unhealthy applications.
                          
                          Application 'fabric:/Voting' is in Error.
                          
                          	33% (1/3) deployed applications are unhealthy. The evaluation tolerates 0% unhealthy deployed applications.
                          
                          	Deployed application on node '_nt2vm_3' is in Error.
                          
                          		50% (1/2) deployed service packages are unhealthy.
                          
                          		Service package for manifest 'VotingWebPkg' and service package activation ID '8723eb73-9b83-406b-9de3-172142ba15f3' is in Error.
                          
                          			'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376195593305'.
                          			There was an error during CodePackage activation.The service host terminated with exit code:1
                          
                          
NodeHealthStates        : 
                          NodeName              : _nt2vm_3
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt1vm_4
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt2vm_2
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt1vm_3
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt2vm_1
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt1vm_2
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt2vm_0
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt1vm_1
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt1vm_0
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt3vm_0
                          AggregatedHealthState : Ok
                          
                          NodeName              : _nt2vm_4
                          AggregatedHealthState : Ok
                          
ApplicationHealthStates : 
                          ApplicationName       : fabric:/System
                          AggregatedHealthState : Ok
                          
                          ApplicationName       : fabric:/Voting
                          AggregatedHealthState : Error
                          
HealthEvents            : None
HealthStatistics        : 
                          Node                  : 11 Ok, 0 Warning, 0 Error
                          Replica               : 4 Ok, 0 Warning, 0 Error
                          Partition             : 2 Ok, 0 Warning, 0 Error
                          Service               : 2 Ok, 0 Warning, 0 Error
                          DeployedServicePackage : 3 Ok, 1 Warning, 1 Error
                          DeployedApplication   : 1 Ok, 1 Warning, 1 Error
                          Application           : 0 Ok, 0 Warning, 1 Error

En el ejemplo siguiente se obtiene el mantenimiento del clúster mediante una directiva de aplicación personalizada. Filtra los resultados para obtener solo los nodos y las aplicaciones con error o advertencia. En este ejemplo no se devuelve ningún nodo, ya que todos ellos tienen un estado correcto. Solo la aplicación fabric:/Voting respeta el filtro de aplicaciones. Puesto que la directiva personalizada especifica que hay que considerar que las advertencias son errores en la aplicación fabric:/Voting, la aplicación se evalúa como con errores y lo mismo el clúster.

$appHealthPolicy = New-Object -TypeName System.Fabric.Health.ApplicationHealthPolicy
$appHealthPolicy.ConsiderWarningAsError = $true
$appHealthPolicyMap = New-Object -TypeName System.Fabric.Health.ApplicationHealthPolicyMap
$appUri1 = New-Object -TypeName System.Uri -ArgumentList "fabric:/Voting"
$appHealthPolicyMap.Add($appUri1, $appHealthPolicy)
Get-ServiceFabricClusterHealth -ApplicationHealthPolicyMap $appHealthPolicyMap -ApplicationsFilter "Warning,Error" -NodesFilter "Warning,Error" -ExcludeHealthStatistics

AggregatedHealthState   : Error
UnhealthyEvaluations    : 
                          100% (1/1) applications are unhealthy. The evaluation tolerates 0% unhealthy applications.
                          
                          Application 'fabric:/Voting' is in Error.
                          
                          	100% (5/5) deployed applications are unhealthy. The evaluation tolerates 0% unhealthy deployed applications.
                          
                          	Deployed application on node '_nt2vm_3' is in Error.
                          
                          		50% (1/2) deployed service packages are unhealthy.
                          
                          		Service package for manifest 'VotingWebPkg' and service package activation ID '8723eb73-9b83-406b-9de3-172142ba15f3' is in Error.
                          
                          			'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376195593305'.
                          			There was an error during CodePackage activation.The service host terminated with exit code:1
                          
                          	Deployed application on node '_nt2vm_2' is in Error.
                          
                          		50% (1/2) deployed service packages are unhealthy.
                          
                          		Service package for manifest 'VotingWebPkg' and service package activation ID '2466f2f9-d5fd-410c-a6a4-5b1e00630cca' is in Error.
                          
                          			'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376486201388'.
                          			There was an error during CodePackage activation.The service host terminated with exit code:1
                          
                          	Deployed application on node '_nt2vm_4' is in Error.
                          
                          		100% (1/1) deployed service packages are unhealthy.
                          
                          		Service package for manifest 'VotingWebPkg' and service package activation ID '5faa5201-eede-400a-865f-07f7f886aa32' is in Error.
                          
                          			'System.Hosting' reported Warning for property 'CodePackageActivation:Code:SetupEntryPoint:131959376207396204'. The evaluation treats 
                          Warning as Error.
                          			There was an error during CodePackage activation.The service host terminated with exit code:1
                          
                          	Deployed application on node '_nt2vm_0' is in Error.
                          
                          		100% (1/1) deployed service packages are unhealthy.
                          
                          		Service package for manifest 'VotingWebPkg' and service package activation ID '204f1783-f774-4f3a-b371-d9983afaf059' is in Error.
                          
                          			'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959375885791093'.
                          			There was an error during CodePackage activation.The service host terminated with exit code:1
                          
                          	Deployed application on node '_nt3vm_0' is in Error.
                          
                          		50% (1/2) deployed service packages are unhealthy.
                          
                          		Service package for manifest 'VotingWebPkg' and service package activation ID '2533ae95-2d2a-4f8b-beef-41e13e4c0081' is in Error.
                          
                          			'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376108346272'.
                          			There was an error during CodePackage activation.The service host terminated with exit code:1                         
                          
NodeHealthStates        : None
ApplicationHealthStates : 
                          ApplicationName       : fabric:/Voting
                          AggregatedHealthState : Error
                          
HealthEvents            : None

Obtención del mantenimiento de nodo

El cmdlet Get-ServiceFabricNodeHealth devuelve el mantenimiento de una entidad del nodo y contiene los eventos de mantenimiento notificados en el nodo. Conéctese primero al clúster mediante el cmdlet Connect-ServiceFabricCluster. En el ejemplo siguiente se obtiene el mantenimiento de un nodo específico mediante directivas de mantenimiento predeterminadas:

Get-ServiceFabricNodeHealth _nt1vm_3

En el siguiente ejemplo se obtiene el mantenimiento de todos los nodos del clúster:

Get-ServiceFabricNode | Get-ServiceFabricNodeHealth | select NodeName, AggregatedHealthState | ft -AutoSize

Obtención del mantenimiento de los servicios del sistema

Obtenga el mantenimiento agregado de los servicios del sistema:

Get-ServiceFabricService -ApplicationName fabric:/System | Get-ServiceFabricServiceHealth | select ServiceName, AggregatedHealthState | ft -AutoSize

Pasos siguientes

En este tutorial, ha aprendido a:

  • Visualización de eventos de Service Fabric
  • Consulta de las API del servicio EventStore para obtener eventos de clúster
  • Supervisar la infraestructura y recopilar contadores de rendimiento
  • Ver los informes de mantenimiento del clúster

A continuación, avance al siguiente tutorial para aprender a escalar un clúster.