Tutorial: Monitorizar um cluster do Service Fabric no Azure

A monitorização e o diagnóstico são fundamentais para desenvolver, testar e implementar cargas de trabalho em qualquer ambiente da cloud. Este tutorial é a segunda parte de uma série e mostra-lhe como monitorizar e diagnosticar um cluster do Service Fabric com eventos, contadores de desempenho e relatórios de estado de funcionamento. Para obter mais informações, leia a descrição geral sobre a monitorização de clusters e a monitorização da infraestrutura.

Neste tutorial, ficará a saber como:

  • Ver eventos do Service Fabric
  • Consultar APIs eventStore para eventos de cluster
  • Monitorizar a infraestrutura/recolher contadores de desempenho
  • Ver relatórios de estado de funcionamento do cluster

Nesta série de tutoriais, ficará a saber como:

Nota

Recomendamos que utilize o módulo do Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Pré-requisitos

Antes de começar este tutorial:

Ver eventos do Service Fabric com os registos do Azure Monitor

Os registos do Azure Monitor recolhem e analisam a telemetria de aplicações e serviços alojados na cloud e fornecem ferramentas de análise para o ajudar a maximizar a disponibilidade e o desempenho. Pode executar consultas nos registos do Azure Monitor para obter informações e resolver problemas do que está a acontecer no cluster.

Para aceder à solução análise do Service Fabric, aceda ao portal do Azure e selecione o grupo de recursos no qual criou a solução de Análise do Service Fabric.

Selecione o recurso ServiceFabric(mysfomsworkspace).

Em Descrição geral , verá mosaicos na forma de um gráfico para cada uma das soluções ativadas, incluindo uma para o Service Fabric. Clique no gráfico do Service Fabric para continuar para a solução de Análise do Service Fabric.

Captura de ecrã que mostra o gráfico do Service Fabric.

A imagem seguinte mostra a home page da solução de Análise do Service Fabric. Esta home page fornece uma vista instantânea do que está a acontecer no cluster.

Solução do Service Fabric

Se tiver ativado o diagnóstico após a criação do cluster, pode ver eventos para

Nota

Além dos eventos do Service Fabric fora da caixa, podem ser recolhidos eventos de sistema mais detalhados ao atualizar a configuração da extensão de diagnóstico.

Ver Eventos do Service Fabric, incluindo ações em nós

Na página Análise do Service Fabric, clique no gráfico para Eventos de Cluster. Os registos de todos os eventos de sistema que foram recolhidos são apresentados. Para referência, estes são da WADServiceFabricSystemEventsTable na conta de Armazenamento do Azure e, da mesma forma, os serviços fiáveis e os eventos de atores que vê a seguir são dessas respetivas tabelas.

Canal Operacional de Consulta

A consulta utiliza a linguagem de consulta Kusto, que pode modificar para refinar o que procura. Por exemplo, para localizar todas as ações efetuadas em nós no cluster, pode utilizar a seguinte consulta. Os IDs de evento utilizados abaixo encontram-se na referência de eventos do canal operacional.

ServiceFabricOperationalEvent
| where EventId < 25627 and EventId > 25619 

A linguagem de consulta Kusto é poderosa. Seguem-se outras consultas úteis.

Crie uma tabela de pesquisa ServiceFabricEvent como função definida pelo utilizador ao guardar a consulta como uma função com o alias ServiceFabricEvent:

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

Devolver eventos operacionais registados na ú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 operacionais com EventId == 18604 e EventName == "NodeDownOperational":

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

Devolver eventos operacionais com EventId == 18604 e EventName == "NodeUpOperational":

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

Devolve Relatórios de Estado de Funcionamento com HealthState == 3 (Erro) e extrai propriedades adicionais do 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 um gráfico de tempo de eventos com 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 

Obtenha eventos operacionais do Service Fabric agregados com o serviço e o nó específicos:

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

Compor a contagem de eventos do Service Fabric por EventId/EventName com uma 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

Ver eventos de aplicações do Service Fabric

Pode ver eventos para os serviços fiáveis e aplicações de atores fiáveis implementadas no cluster. Na página Análise do Service Fabric, clique no gráfico para Eventos de Aplicação.

Execute a seguinte consulta para ver eventos das suas aplicações de serviços fiáveis:

ServiceFabricReliableServiceEvent
| sort by TimeGenerated desc

Pode ver diferentes eventos para quando o serviço runasync é iniciado e concluído, o que normalmente acontece em implementações e atualizações.

Service Fabric Solution Reliable Services

Também pode encontrar eventos para o serviço fiável com ServiceName == "fabric:/Watchdog/WatchdogService":

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

Os eventos de ator fiáveis podem ser vistos de forma semelhante:

ServiceFabricReliableActorEvent
| sort by TimeGenerated desc

Para configurar eventos mais detalhados para atores fiáveis, pode alterar a scheduledTransferKeywordFilter configuração da extensão de diagnóstico no modelo de cluster. Os detalhes sobre os valores para estes valores estão na referência de eventos de atores fiáveis.

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

Ver contadores de desempenho com registos do Azure Monitor

Para ver os contadores de desempenho, aceda ao portal do Azure e ao grupo de recursos no qual criou a solução de Análise do Service Fabric.

Selecione o recurso ServiceFabric(mysfomsworkspace) e, em seguida, Área de Trabalho do Log Analytics e, em seguida , Definições Avançadas.

Clique em Dados e, em seguida, clique em Contadores de Desempenho do Windows. Existe uma lista de contadores predefinidos que pode optar por ativar e também pode definir o intervalo para a coleção. Também pode adicionar contadores de desempenho adicionais para recolher. O formato adequado é referenciado neste artigo. Clique em Guardar e, em seguida, clique em OK.

Feche o painel Definições Avançadas e selecione Resumo da Área de Trabalho no cabeçalho Geral . Para cada uma das soluções ativadas, existe um mosaico gráfico, incluindo um para o Service Fabric. Clique no gráfico do Service Fabric para continuar para a solução de Análise do Service Fabric.

Existem mosaicos gráficos para canais operacionais e eventos de serviços fiáveis. A representação gráfica dos dados que fluem para os contadores selecionados será apresentada em Métricas do Nó.

Selecione o gráfico Métrica do Contentor para ver detalhes adicionais. Também pode consultar dados do contador de desempenho de forma semelhante a eventos de cluster e filtrar os nós, o nome do contador perf e os valores com a linguagem de consulta Kusto.

Consultar o serviço EventStore

O serviço EventStore fornece uma forma de compreender o estado do cluster ou das cargas de trabalho num determinado momento. O EventStore é um serviço do Service Fabric com estado que mantém os eventos do cluster. Os eventos são expostos através do Service Fabric Explorer, REST e APIs. EventStore consulta diretamente o cluster para obter dados de diagnóstico em qualquer entidade no cluster Para ver uma lista completa dos eventos disponíveis na EventStore, veja Eventos do Service Fabric.

As APIs eventStore podem ser consultadas programaticamente com a biblioteca de cliente do Service Fabric.

Eis um pedido de exemplo para todos os eventos de cluster entre 2018-04-03T18:00:00Z e 2018-04-04T18:00:00Z, através da função 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();

Eis outro exemplo que consulta o estado de funcionamento do cluster e todos os eventos de nós em setembro de 2018 e os imprime.

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

Monitorizar o estado de funcionamento do cluster

O Service Fabric introduz um modelo de estado de funcionamento com entidades de estado de funcionamento nas quais os componentes do sistema e os watchdogs podem comunicar as condições locais que estão a monitorizar. O arquivo de estado de funcionamento agrega todos os dados de estado de funcionamento para determinar se as entidades estão em bom estado de funcionamento.

O cluster é preenchido automaticamente com relatórios de estado de funcionamento enviados pelos componentes do sistema. Leia mais em Utilizar relatórios de estado de funcionamento do sistema para resolver problemas.

O Service Fabric expõe consultas de estado de funcionamento para cada um dos tipos de entidade suportados. Podem ser acedidos através da API, utilizando métodos em FabricClient.HealthManager, cmdlets do PowerShell e REST. Estas consultas devolvem informações completas sobre o estado de funcionamento da entidade: o estado de funcionamento agregado, os eventos de estado de funcionamento da entidade, os estados de saúde subordinado (quando aplicável), as avaliações em mau estado de funcionamento (quando a entidade não está em bom estado de funcionamento) e as estatísticas de estado de funcionamento das crianças (quando aplicável).

Obter estado de funcionamento do cluster

O cmdlet Get-ServiceFabricClusterHealth devolve o estado de funcionamento da entidade do cluster e contém os estados de funcionamento das aplicações e dos nós (subordinados do cluster). Primeiro, ligue-se ao cluster com o cmdlet Connect-ServiceFabricCluster.

O estado do cluster é de 11 nós, a aplicação de sistema e recursos de infraestrutura:/Votação configurados conforme descrito.

O exemplo seguinte obtém o estado de funcionamento do cluster com as políticas de estado de funcionamento predefinidas. Os 11 nós estão em bom estado de funcionamento, mas o estado de funcionamento agregado do cluster é Erro porque a aplicação fabric:/Voting está em Erro. Tenha em atenção como as avaliações em mau estado de funcionamento fornecem detalhes sobre as condições que acionaram o estado de funcionamento 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

O exemplo seguinte obtém o estado de funcionamento do cluster com uma política de aplicação personalizada. Filtra os resultados para obter apenas aplicações e nós com erro ou aviso. Neste exemplo, não são devolvidos nós, uma vez que estão todos em bom estado de funcionamento. Apenas os recursos de infraestrutura:/Aplicação de voto respeita o filtro de aplicações. Uma vez que a política personalizada especifica considerar os avisos como erros para a aplicação fabric:/Voting, a aplicação é avaliada como em erro, tal como o cluster.

$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

Obter estado de funcionamento do nó

O cmdlet Get-ServiceFabricNodeHealth devolve o estado de funcionamento de uma entidade de nó e contém os eventos de estado de funcionamento comunicados no nó. Em primeiro lugar, ligue-se ao cluster com o cmdlet Connect-ServiceFabricCluster. O exemplo seguinte obtém o estado de funcionamento de um nó específico com políticas de estado de funcionamento predefinidas:

Get-ServiceFabricNodeHealth _nt1vm_3

O exemplo seguinte obtém o estado de funcionamento de todos os nós no cluster:

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

Obter o estado de funcionamento do serviço de sistema

Obtenha o estado de funcionamento agregado dos serviços do sistema:

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

Passos seguintes

Neste tutorial, ficou a saber como:

  • Ver eventos do Service Fabric
  • Consultar APIs eventStore para eventos de cluster
  • Monitorizar a infraestrutura/recolher contadores de desempenho
  • Ver relatórios de estado de funcionamento do cluster

Em seguida, avance para o tutorial seguinte para saber como dimensionar um cluster.