Comunicar e verificar o estado de funcionamento dos serviços
Quando os seus serviços se deparam com problemas, a sua capacidade de responder e corrigir incidentes e indisponibilidades depende da capacidade de detetar os problemas rapidamente. Se comunicar problemas e falhas ao gestor de estado de funcionamento do Azure Service Fabric a partir do código de serviço, pode utilizar as ferramentas padrão de monitorização do estado de funcionamento fornecidas pelo Service Fabric para verificar o estado de funcionamento.
Existem três formas de comunicar o estado de funcionamento a partir do serviço:
- Utilize objetos Partition ou CodePackageActivationContext .
Pode utilizar osPartition
objetos eCodePackageActivationContext
para comunicar o estado de funcionamento dos elementos que fazem parte do contexto atual. Por exemplo, o código que é executado como parte de uma réplica só pode comunicar o estado de funcionamento nessa réplica, a partição à qual pertence e a aplicação da qual faz parte. - Utilize
FabricClient
.
Pode utilizarFabricClient
para comunicar o estado de funcionamento a partir do código de serviço se o cluster não for seguro ou se o serviço estiver em execução com privilégios de administrador. A maioria dos cenários do mundo real não utiliza clusters não garantidos nem fornece privilégios de administrador. ComFabricClient
o , pode comunicar o estado de funcionamento em qualquer entidade que faça parte do cluster. No entanto, idealmente, o código de serviço só deve enviar relatórios relacionados com o seu próprio estado de funcionamento. - Utilize as APIs REST nos níveis de cluster, aplicação, aplicação, serviço, pacote de serviço, partição, réplica ou nó implementados. Isto pode ser utilizado para comunicar o estado de funcionamento a partir de um contentor.
Este artigo explica-lhe um exemplo que comunica o estado de funcionamento a partir do código de serviço. O exemplo também mostra como as ferramentas fornecidas pelo Service Fabric podem ser utilizadas para verificar o estado de funcionamento. Este artigo destina-se a ser uma introdução rápida às capacidades de monitorização do estado de funcionamento do Service Fabric. Para obter informações mais detalhadas, pode ler a série de artigos aprofundados sobre o estado de funcionamento que começam com a ligação no final deste artigo.
Pré-requisitos
Tem de ter o seguinte instalado:
- Visual Studio 2015 ou Visual Studio 2019
- Service Fabric SDK
Para criar um cluster de programador seguro local
- Abra o PowerShell com privilégios de administrador e execute os seguintes comandos:
Para implementar uma aplicação e verificar o respetivo estado de funcionamento
Abra o Visual Studio como administrador.
Crie um projeto com o modelo Serviço com Monitorização de Estado .
Prima F5 para executar a aplicação no modo de depuração. A aplicação é implementada no cluster local.
Depois de a aplicação estar em execução, clique com o botão direito do rato no ícone Gestor de Clusters Local na área de notificação e selecione Gerir Cluster Local no menu de atalho para abrir Service Fabric Explorer.
O estado de funcionamento da aplicação deve ser apresentado como nesta imagem. Neste momento, a aplicação deve estar em bom estado de funcionamento sem erros.
Também pode verificar o estado de funcionamento com o PowerShell. Pode utilizar
Get-ServiceFabricApplicationHealth
para verificar o estado de funcionamento de uma aplicação e pode utilizarGet-ServiceFabricServiceHealth
para verificar o estado de funcionamento de um serviço. O relatório de estado de funcionamento da mesma aplicação no PowerShell está nesta imagem.
Para adicionar eventos de estado de funcionamento personalizados ao código de serviço
Os modelos de projeto do Service Fabric no Visual Studio contêm código de exemplo. Os passos seguintes mostram como pode comunicar eventos de estado de funcionamento personalizados a partir do código de serviço. Estes relatórios são apresentados automaticamente nas ferramentas padrão de monitorização do estado de funcionamento que o Service Fabric fornece, como Service Fabric Explorer, portal do Azure vista de estado de funcionamento e o PowerShell.
Reabra a aplicação que criou anteriormente no Visual Studio ou crie uma nova aplicação com o modelo Stateful Service Visual Studio.
Abra o ficheiro Stateful1.cs e localize a
myDictionary.TryGetValueAsync
chamada noRunAsync
método . Pode ver que este método devolve umresult
que contém o valor atual do contador porque a lógica da chave nesta aplicação é manter uma contagem em execução. Se esta aplicação fosse uma aplicação real e se a falta de resultado representasse uma falha, seria útil sinalizar esse evento.Para comunicar um evento de estado de funcionamento quando a falta de resultados representa uma falha, adicione os seguintes passos.
a. Adicione o
System.Fabric.Health
espaço de nomes ao ficheiro Stateful1.cs.using System.Fabric.Health;
b. Adicione o seguinte código após a
myDictionary.TryGetValueAsync
chamadaif (!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportReplicaHealth(healthInformation); }
Reportamos o estado de funcionamento da réplica porque está a ser comunicado a partir de um serviço com monitorização de estado. O
HealthInformation
parâmetro armazena informações sobre o problema de estado de funcionamento que está a ser comunicado.Se tiver criado um serviço sem estado, utilize o seguinte código
if (!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportInstanceHealth(healthInformation); }
Se o seu serviço estiver em execução com privilégios de administrador ou se o cluster não for seguro, também pode utilizar
FabricClient
para comunicar o estado de funcionamento, conforme mostrado nos passos seguintes.a. Crie a
FabricClient
instância após avar myDictionary
declaração.var fabricClient = new FabricClient(new FabricClientSettings() { HealthReportSendInterval = TimeSpan.FromSeconds(0) });
b. Adicione o seguinte código após a
myDictionary.TryGetValueAsync
chamada.if (!result.HasValue) { var replicaHealthReport = new StatefulServiceReplicaHealthReport( this.Context.PartitionId, this.Context.ReplicaId, new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error)); fabricClient.HealthManager.ReportHealth(replicaHealthReport); }
Vamos simular esta falha e vê-la aparecer nas ferramentas de monitorização do estado de funcionamento. Para simular a falha, comente a primeira linha no código do relatório de estado de funcionamento que adicionou anteriormente. Depois de comentar a primeira linha, o código terá o seguinte aspeto.
//if(!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportReplicaHealth(healthInformation); }
Este código aciona o relatório de estado de funcionamento sempre
RunAsync
que é executado. Depois de fazer a alteração, prima F5 para executar a aplicação.Depois de a aplicação estar em execução, abra Service Fabric Explorer para verificar o estado de funcionamento da aplicação. Desta vez, Service Fabric Explorer mostra que a aplicação está em mau estado de funcionamento. A aplicação aparece como em mau estado de funcionamento porque o erro que foi comunicado a partir do código que adicionámos anteriormente.
Se selecionar a réplica primária na vista de árvore do Service Fabric Explorer, verá que o Estado de Funcionamento também indica um erro. Service Fabric Explorer também apresenta os detalhes do relatório de estado de funcionamento que foram adicionados ao
HealthInformation
parâmetro no código. Pode ver os mesmos relatórios de estado de funcionamento no PowerShell e no portal do Azure.
Este relatório permanece no gestor de estado de funcionamento até ser substituído por outro relatório ou até que esta réplica seja eliminada. Como não definimos TimeToLive
para este relatório de estado de funcionamento no HealthInformation
objeto, o relatório nunca expira.
Recomendamos que o estado de funcionamento seja comunicado ao nível mais granular, que neste caso é a réplica. Também pode comunicar o estado de funcionamento em Partition
.
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);
Para comunicar o estado de funcionamento em Application
, DeployedApplication
e DeployedServicePackage
, utilize CodePackageActivationContext
.
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);