Comunicar e verificar o estado de funcionamento dos serviços
Quando seus serviços encontram problemas, sua capacidade de responder e corrigir incidentes e interrupções depende de sua capacidade de detetar os problemas rapidamente. Se comunicar problemas e falhas ao gestor de estado de funcionamento do Azure Service Fabric a partir do seu código de serviço, pode utilizar as ferramentas de monitorização de estado de funcionamento padrão que o Service Fabric fornece para verificar o estado de funcionamento.
Há três maneiras de relatar a integridade do serviço:
- Use objetos Partition ou CodePackageActivationContext .
Você pode usar osPartition
objetos eCodePackageActivationContext
para relatar a integridade de elementos que fazem parte do contexto atual. Por exemplo, o código executado como parte de uma réplica pode relatar a integridade somente nessa réplica, na partição à qual pertence e no aplicativo do qual faz parte. FabricClient
Utilize.
Você pode usarFabricClient
para relatar a integridade do código de serviço se o cluster não for seguro ou se o serviço estiver sendo executado com privilégios de administrador. A maioria dos cenários do mundo real não usa clusters não seguros nem fornece privilégios de administrador. ComFabricClient
o , você pode relatar a integridade de qualquer entidade que faça parte do cluster. Idealmente, no entanto, o código de serviço deve enviar apenas relatórios relacionados à sua própria saúde.- Use as APIs REST nos níveis de cluster, aplicativo, aplicativo implantado, serviço, pacote de serviço, partição, réplica ou nó. Isso pode ser usado para relatar a integridade de dentro de um contêiner.
Este artigo orienta você por um exemplo que relata a integridade do código de serviço. O exemplo também mostra como as ferramentas fornecidas pelo Service Fabric podem ser usadas para verificar o status de integridade. Este artigo destina-se a ser uma introdução rápida aos recursos de monitoramento de integridade do Service Fabric. Para obter informações mais detalhadas, você pode ler a série de artigos detalhados sobre saúde que começam com o link no final deste artigo.
Pré-requisitos
Você deve ter o seguinte instalado:
- Visual Studio 2015 ou Visual Studio 2019
- Service Fabric SDK
Para criar um cluster de desenvolvimento seguro local
- Abra o PowerShell com privilégios de administrador e execute os seguintes comandos:
Para implantar um aplicativo e verificar sua integridade
Abra o Visual Studio como administrador.
Crie um projeto usando o modelo Stateful Service .
Pressione F5 para executar o aplicativo no modo de depuração. O aplicativo é implantado no cluster local.
Depois que o aplicativo estiver em execução, clique com o botão direito do mouse no ícone do Gerenciador de Cluster Local na área de notificação e selecione Gerenciar Cluster Local no menu de atalho para abrir o Service Fabric Explorer.
A integridade do aplicativo deve ser exibida como nesta imagem. Neste momento, a aplicação deve estar saudável sem erros.
Você também pode verificar a integridade usando o PowerShell. Você pode usar
Get-ServiceFabricApplicationHealth
para verificar a integridade de um aplicativo e você pode usarGet-ServiceFabricServiceHealth
para verificar a integridade de um serviço. O relatório de integridade para o mesmo aplicativo no PowerShell está nesta imagem.
Para adicionar eventos de integridade personalizados ao seu código de serviço
Os modelos de projeto do Service Fabric no Visual Studio contêm código de exemplo. As etapas a seguir mostram como você pode relatar eventos de integridade personalizados a partir do seu código de serviço. Esses relatórios aparecem automaticamente nas ferramentas padrão para monitoramento de integridade fornecidas pelo Service Fabric, como o Service Fabric Explorer, a exibição de integridade do portal do Azure e o PowerShell.
Reabra o aplicativo que você criou anteriormente no Visual Studio, ou crie um novo aplicativo usando o modelo Stateful Service Visual Studio.
Abra o arquivo Stateful1.cs e localize a
myDictionary.TryGetValueAsync
RunAsync
chamada no método. Você pode ver que esse método retorna umresult
que contém o valor atual do contador porque a lógica de chave neste aplicativo é manter uma contagem em execução. Se este aplicativo fosse um aplicativo real, e se a falta de resultado representasse uma falha, você desejaria sinalizar esse evento.Para relatar um evento de integridade quando a falta de resultado representa uma falha, adicione as etapas a seguir.
a. Adicione o
System.Fabric.Health
namespace ao arquivo 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); }
Relatamos a integridade da réplica porque ela está sendo relatada de um serviço com monitoração de estado. O
HealthInformation
parâmetro armazena informações sobre o problema de integridade que está sendo relatado.Se você criou um serviço sem monitoração de estado, use o seguinte código
if (!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportInstanceHealth(healthInformation); }
Se o serviço estiver sendo executado com privilégios de administrador ou se o cluster não for seguro, você também poderá usar
FabricClient
para relatar a integridade, conforme mostrado nas etapas a seguir.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 essa falha e vê-la aparecer nas ferramentas de monitoramento de integridade. Para simular a falha, comente a primeira linha no código de relatório de integridade que você adicionou anteriormente. Depois de comentar a primeira linha, o código será semelhante ao exemplo a seguir.
//if(!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportReplicaHealth(healthInformation); }
Esse código dispara o relatório de integridade sempre que
RunAsync
é executado. Depois de fazer a alteração, pressione F5 para executar o aplicativo.Depois que o aplicativo estiver em execução, abra o Service Fabric Explorer para verificar a integridade do aplicativo. Desta vez, o Service Fabric Explorer mostra que o aplicativo não está íntegro. O aplicativo mostra como não íntegro porque o erro que foi relatado a partir do código que adicionamos anteriormente.
Se você selecionar a réplica primária na exibição em árvore do Service Fabric Explorer, verá que o Estado de Integridade também indica um erro. O Service Fabric Explorer também exibe os detalhes do relatório de integridade que foram adicionados ao
HealthInformation
parâmetro no código. Você pode ver os mesmos relatórios de integridade no PowerShell e no portal do Azure.
Esse relatório permanece no gerente de integridade até ser substituído por outro relatório ou até que essa réplica seja excluída. Como não definimos TimeToLive
este relatório de saúde no HealthInformation
objeto, o relatório nunca expira.
Recomendamos que a integridade seja relatada no nível mais granular, que neste caso é a réplica. Também pode comunicar o estado de saúde em Partition
.
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);
Para comunicar o estado de funcionamento em Application
, , e DeployedServicePackage
, utilize CodePackageActivationContext
DeployedApplication
.
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);