Tutorial: Monitorar um cluster do Service Fabric no Azure
O monitoramento e o diagnóstico são essenciais para desenvolver, testar e implantar cargas de trabalho em qualquer ambiente de nuvem. Este tutorial é a segunda parte de uma série e mostra como monitorar e diagnosticar um cluster do Service Fabric usando eventos, contadores de desempenho e relatórios de integridade. Para obter mais informações, leia a visão geral sobre monitoramento de cluster e monitoramento de infraestrutura.
Neste tutorial, irá aprender a:
- Exibir eventos do Service Fabric
- Consultar APIs do EventStore para eventos de cluster
- Monitore a infraestrutura/colete contadores de perf
- Exibir relatórios de integridade do cluster
Nesta série de tutoriais, ficará a saber como:
- Criar um cluster seguro do Windows no Azure usando um modelo
- Monitorar um cluster
- Reduzir ou aumentar um cluster horizontalmente
- Atualizar o tempo de execução de um cluster
- Eliminar um cluster
Nota
Recomendamos que utilize o módulo Azure Az do PowerShell para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. 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:
- Se não tiver uma subscrição do Azure, crie uma conta gratuita
- Instale o Azure PowerShell ou a CLI do Azure.
- Criar um cluster seguro do Windows
- Configurar a coleta de diagnósticos para o cluster
- Habilitar o serviço EventStore no cluster
- Configurar os logs do Azure Monitor e o agente do Log Analytics para o cluster
Exibir eventos do Service Fabric usando logs do Azure Monitor
Os logs do Azure Monitor coletam e analisam a telemetria de aplicativos e serviços hospedados na nuvem e fornecem ferramentas de análise para ajudá-lo a maximizar sua disponibilidade e desempenho. Você pode executar consultas nos logs do Azure Monitor para obter informações e solucionar problemas do que está acontecendo em seu cluster.
Para acessar a solução do Service Fabric Analytics, vá para o portal do Azure e selecione o grupo de recursos no qual você criou a solução do Service Fabric Analytics.
Selecione o recurso ServiceFabric(mysfomsworkspace).
Em Visão geral , você vê blocos na forma de um gráfico para cada uma das soluções habilitadas, incluindo uma para o Service Fabric. Selecione o gráfico do Service Fabric para continuar para a solução do Service Fabric Analytics.
A imagem a seguir mostra a home page da solução do Service Fabric Analytics. Esta home page fornece uma visualização instantânea do que está acontecendo em seu cluster.
Se você habilitou o diagnóstico na criação do cluster, poderá ver eventos para
- Eventos de cluster do Service Fabric
- Atores confiáveis programando eventos modelo
- Eventos do modelo de programação de serviços confiáveis
Nota
Além dos eventos do Service Fabric prontos para uso, eventos do sistema mais detalhados podem ser coletados atualizando a configuração da sua extensão de diagnóstico.
Exibir 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 logs de todos os eventos do sistema que foram coletados aparecem. A consulta usa a linguagem de consulta Kusto, que você pode modificar para refinar o que está procurando. Por exemplo, para localizar todas as ações executadas em nós no cluster, você pode usar a consulta a seguir. Os IDs de evento usados abaixo são encontrados na referência de eventos do canal operacional.
ServiceFabricOperationalEvent
| where EventId < 25627 and EventId > 25619
A linguagem de consulta Kusto é poderosa. Aqui estão algumas outras consultas úteis.
Crie uma tabela de pesquisa ServiceFabricEvent como função definida pelo usuário salvando a consulta como uma função com o alias ServiceFabricEvent:
let ServiceFabricEvent = datatable(EventId: int, EventName: string)
[
...
18603, 'NodeUpOperational',
18604, 'NodeDownOperational',
...
];
ServiceFabricEvent
Eventos operacionais de retorno registrados 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
Retornar eventos operacionais com EventId == 18604 e EventName == 'NodeDownOperational':
ServiceFabricOperationalEvent
| where EventId == 18604
| project EventId, EventName = 'NodeDownOperational', TaskName, Computer, EventMessage, TimeGenerated
| sort by TimeGenerated
Retornar eventos operacionais com EventId == 18604 e EventName == 'NodeUpOperational':
ServiceFabricOperationalEvent
| where EventId == 18603
| project EventId, EventName = 'NodeUpOperational', TaskName, Computer, EventMessage, TimeGenerated
| sort by TimeGenerated
Retorna relatórios de integridade com HealthState == 3 (erro) e extraia mais propriedades 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))
Retornar 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 ao serviço e ao nó específicos:
ServiceFabricOperationalEvent
| where ApplicationName != "" and ServiceName != ""
| summarize AggregatedValue = count() by ApplicationName, ServiceName, Computer
Renderize a contagem de eventos do Service Fabric por EventId / EventName usando 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
Exibir eventos do aplicativo Service Fabric
Você pode exibir eventos para os serviços confiáveis e aplicativos de atores confiáveis implantados no cluster. Na página Análise do Service Fabric, selecione o gráfico para Eventos do aplicativo.
Execute a seguinte consulta para exibir eventos de seus aplicativos de serviços confiáveis:
ServiceFabricReliableServiceEvent
| sort by TimeGenerated desc
Você pode ver diferentes eventos para quando o serviço runasync
é iniciado e concluído, o que normalmente acontece em implantações e atualizações.
Você também pode encontrar eventos para o serviço confiável com ServiceName == "fabric:/Watchdog/WatchdogService":
ServiceFabricReliableServiceEvent
| where ServiceName == "fabric:/Watchdog/WatchdogService"
| project TimeGenerated, EventMessage
| order by TimeGenerated desc
Eventos de atores confiáveis podem ser vistos de maneira semelhante:
ServiceFabricReliableActorEvent
| sort by TimeGenerated desc
Para configurar eventos mais detalhados para atores confiáveis, você pode alterar o scheduledTransferKeywordFilter
na configuração para a extensão de diagnóstico no modelo de cluster. Os detalhes sobre os valores para estes estão na referência de eventos de atores confiáveis.
"EtwEventSourceProviderConfiguration": [
{
"provider": "Microsoft-ServiceFabric-Actors",
"scheduledTransferKeywordFilter": "1",
"scheduledTransferPeriod": "PT5M",
"DefaultEvents": {
"eventDestination": "ServiceFabricReliableActorEventTable"
}
},
Exibir contadores de desempenho com logs do Azure Monitor
Para exibir contadores de desempenho, vá para o portal do Azure e o grupo de recursos no qual você criou a solução do Service Fabric Analytics.
Selecione o recurso ServiceFabric(mysfomsworkspace), Log Analytics Workspace e Configurações avançadas.
Selecione Dados e, em seguida, escolha Contadores de Desempenho do Windows. Há uma lista de contadores padrão que você pode optar por habilitar e você também pode definir o intervalo para coleta. Você também pode adicionar contadores de desempenho adicionais para coletar. O formato adequado é mencionado neste artigo. Clique em Salvar e selecione OK.
Feche a folha Configurações avançadas e selecione Resumo do espaço de trabalho sob o título Geral . Para cada uma das soluções habilitadas, há um bloco gráfico, incluindo um para o Service Fabric. Selecione o gráfico do Service Fabric para continuar para a solução do Service Fabric Analytics.
Há blocos gráficos para eventos de canal operacional e serviços confiáveis. A representação gráfica dos dados que fluem para os contadores selecionados aparece em Métricas de Nó.
Selecione o gráfico Container Metric para ver mais detalhes. Você também pode consultar dados do contador de desempenho de forma semelhante aos eventos de cluster e filtrar nos nós, nome do contador perf e valores usando a linguagem de consulta Kusto.
Consultar o serviço EventStore
O serviço EventStore fornece uma maneira de entender o estado do cluster ou das cargas de trabalho em um determinado momento. O EventStore é um serviço do Service Fabric com estado que mantém eventos do cluster. Os eventos são expostos por meio do Service Fabric Explorer, REST e APIs. EventStore consulta o cluster diretamente para obter dados de diagnóstico em qualquer entidade no cluster Para ver uma lista completa de eventos disponíveis na EventStore, consulte Eventos do Service Fabric.
As APIs do EventStore podem ser consultadas programaticamente usando a biblioteca de cliente do Service Fabric.
Aqui está um exemplo de solicitação para todos os eventos de cluster entre 2018-04-03T18:00:00Z e 2018-04-04T18:00:00Z, por meio 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();
Aqui está outro exemplo que consulta a integridade do cluster e todos os eventos de nó 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 integridade com entidades de saúde nas quais os componentes do sistema e os vigilantes podem relatar as condições locais que estão monitorando. O armazenamento de integridade agrega todos os dados de integridade para determinar se as entidades estão íntegras.
O cluster é preenchido automaticamente com relatórios de integridade enviados pelos componentes do sistema. Leia mais em Usar relatórios de integridade do sistema para solucionar problemas.
O Service Fabric expõe consultas de integridade para cada um dos tipos de entidade suportados. Eles podem ser acessados por meio da API, usando métodos em FabricClient.HealthManager, cmdlets do PowerShell e REST. Essas consultas retornam informações completas de saúde sobre a entidade: o estado de saúde agregado, eventos de saúde da entidade, estados de saúde infantil (quando aplicável), avaliações não saudáveis (quando a entidade não é saudável) e estatísticas de saúde infantil (quando aplicável).
Obter integridade do cluster
O cmdlet Get-ServiceFabricClusterHealth retorna a integridade da entidade do cluster e contém os estados de integridade de aplicativos e nós (filhos do cluster). Primeiro, conecte-se ao cluster usando o cmdlet Connect-ServiceFabricCluster.
O estado do cluster é de 11 nós, o aplicativo do sistema e a malha:/Votação configurada conforme descrito.
O exemplo a seguir obtém a integridade do cluster usando diretivas de integridade padrão. Os 11 nós estão íntegros, mas o estado de integridade agregado do cluster é Erro porque o aplicativo malha:/Votação está em Erro. Observe como as avaliações não saudáveis fornecem detalhes sobre as condições que desencadearam a saúde agregada.
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 a seguir obtém a integridade do cluster usando uma diretiva de aplicativo personalizada. Ele filtra os resultados para obter apenas aplicativos e nós em erro ou aviso. Neste exemplo, nenhum nó é retornado, pois todos estão íntegros. Somente o aplicativo fabric:/Voting respeita o filtro de aplicativos. Como a política personalizada especifica considerar avisos como erros para o aplicativo fabric:/Voteing, o aplicativo é avaliado como em erro, assim 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 integridade do nó
O cmdlet Get-ServiceFabricNodeHealth retorna a integridade de uma entidade de nó e contém os eventos de integridade relatados no nó. Primeiro, conecte-se ao cluster usando o cmdlet Connect-ServiceFabricCluster. O exemplo a seguir obtém a integridade de um nó específico usando diretivas de integridade padrão:
Get-ServiceFabricNodeHealth _nt1vm_3
O exemplo a seguir obtém a integridade de todos os nós no cluster:
Get-ServiceFabricNode | Get-ServiceFabricNodeHealth | select NodeName, AggregatedHealthState | ft -AutoSize
Obter estado de funcionamento do serviço do sistema
Obtenha a integridade agregada dos serviços do sistema:
Get-ServiceFabricService -ApplicationName fabric:/System | Get-ServiceFabricServiceHealth | select ServiceName, AggregatedHealthState | ft -AutoSize
Próximos passos
Neste tutorial, ficou a saber como:
- Exibir eventos do Service Fabric
- Consultar APIs do EventStore para eventos de cluster
- Monitore a infraestrutura/colete contadores de perf
- Exibir relatórios de integridade do cluster
Em seguida, avance para o tutorial a seguir para aprender a dimensionar um cluster.