AspNetStandard.Diagnostics.HealthChecks.Redis 1.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package AspNetStandard.Diagnostics.HealthChecks.Redis --version 1.0.0                
NuGet\Install-Package AspNetStandard.Diagnostics.HealthChecks.Redis -Version 1.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AspNetStandard.Diagnostics.HealthChecks.Redis" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AspNetStandard.Diagnostics.HealthChecks.Redis --version 1.0.0                
#r "nuget: AspNetStandard.Diagnostics.HealthChecks.Redis, 1.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AspNetStandard.Diagnostics.HealthChecks.Redis as a Cake Addin
#addin nuget:?package=AspNetStandard.Diagnostics.HealthChecks.Redis&version=1.0.0

// Install AspNetStandard.Diagnostics.HealthChecks.Redis as a Cake Tool
#tool nuget:?package=AspNetStandard.Diagnostics.HealthChecks.Redis&version=1.0.0                

AspnetStandard.Diagnostics.HealthCheck

A Biblioteca

AspnetStandard.Diagnostics.HealthCheck é uma biblioteca escrita em C# e que utiliza o framework .Net Standard com a finalidade de ser compatível com os frameworks mais antigos do .Net.

Atualmente a Microsoft possui uma biblioteca de HealthCheck para o .Net Core e o objetivo dessa lib é trazer uma implementação com uma experiência de desenvolvimento parecida com a lib original para o .Net Framework.

A ideia inicial da implementação surgiu a partir de uma implementação da comunidade que utilizava builders e extension methods para fazer a configuração inicial.

A biblioteca original foi desenvolvida pelo @kpol e eu peguei essa ideia para mudar algumas coisas e adicionar algumas features. Para ir para a biblioteca original clique aqui

Como utilizar

A configuração inicial dessa lib foi inspirada no startup da biblioteca oficial para o .Net Core, ela é basicamente um Builder que pode ser adicionada ao startup da aplicação como no exemplo da POC abaixo:

<img src="https://i.imgur.com/yOD2cIb.png">

Endpoint Um endpoint opcional pode ser configurado com o método AddHealthChecks

Autenticação O seu check também pode possuir uma camada de autenticação que utiliza uma ApiKey, basta passar a chave no método UseAuthorization

Checks Para incluir um check na lista de verificação, basta passar um objeto que implemente a interface IHealthCheck e adicionar uma referência de chave valor para o método AddCheck(NomeDoHealthChek, InstânciaDoHealthCheck)

Adicionando HealthChecks Personalizados

A biblioteca ainda está em fase de desenvolvimento e provavelmente ela não possui todas as implementações de HealthCheck para todos os serviços existentes. Para garantir a generalização e extensão da biblioteca para outros casos de uso, é possível implementar uma interface do projeto, desenvolver seu próprio check e utilizar na configuração inicial da aplicação.

Para adicionar um check, você deve implementar a interface IHealthCheck que retorna em seu contrato um HealthCheckResult. A implementação do check fica a critério do usuário, basta respeitar o contrato definido pela interface.

<img src="https://i.imgur.com/M94qCGC.png">

Se precisar de um exemplo basta ver as implementações nesse repositório. As implementações são bem parecidas com as implementações da biblioteca oficial da Microsoft, se tiver em dúvida em relação a como implementar, recomendo dar uma olhada nas implementações oficiais e adequar a interface proposta na imagem acima.

MongoDb RabbitMq

Após realizar a implementação basta adicionar na configuração inicial do check com o AddCheck(NomeDoHealthChek, InstânciaDoHealthCheck)

Tudo feito, agora como essa biblioteca funciona na prática?

Por baixo dos panos o HealthCheck utiliza os princípios do ChainOfResponsability aliado ao DelegatingHandler.

Basicamente quando uma requisição chega ela terá que passar por três handlers que irão tratar a requisição.

DependencyHandler → AuthenticationHandler → HealthCheckHandler

O DependencyHandler checa se as dependências estão resolvidas, e, caso não esteja, ele resolve e passa para o próximo handler.

O AuthenticationHandler verifica se o usuário configurou uma ApiKey e valida se a Key passada na requisição é igual a configurada, caso a validação esteja correta ele passa para o próximo handler, caso contrário retorna uma resposta de erro. Se na configuração inicial da aplicação o desenvolvedor não tenha configurado para usar a autenticação ele apenas passa a requisição para o próximo handler.

Obs: A ApiKey deve ser passada via URL conforme configurado no StartUp GET /qualquer_endpoint?ApiKey=qualquer_string_de_autenticação

Contrato do erro

{
  "status_code": 403,
  "message": "ApiKey is invalid or not provided."
}

O HealthCheckHandler é o verdadeiro protagonista, ele que realiza o HealthCheck em todos os checks configurados e retorna uma resposta para o cliente.

Ele também aceita um QueryParam que pode ser passado na forma: GET /qualquer_endpoint?ApiKey=qualquer_string_de_autenticação&check=mongoDb

Os contratos que o HC retorna são semelhantes aos exemplos abaixo

Resposta completa sem query parameter
{
  "entries": {
    "mongoDb": {
      "response_time": 4,
      "last_execution": "2020-12-30T14:14:09.5767174Z",
      "status": "Healthy",
      "description": "MongoDb is healthy"
    },
    "rabbitMq": {
      "response_time": 2,
      "last_execution": "2020-12-30T14:14:09.5807153Z",
      "status": "Healthy",
      "description": "RabbitMQ is healthy"
    }
  },
  "over_all_status": "Healthy",
  "total_response_time": 6
}
Resposta completa com query parameter = mongoDbHealthCheck
{
  "response_time": 14,
  "last_execution": "2020-12-30T14:14:52.5304477Z",
  "status": "Healthy",
  "description": "MongoDb is healthy"
}

A aplicação está sendo desenvolvida e os próximos passos são:

  • Criar extensão para o SQL Server
  • Criar extensão para o Redis
  • Criar pipeline de CI/CD
  • Fazer integração com o SonarQube
  • Fazer deploy no Nuget.org
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 is compatible.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 is compatible.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.3.0 1,042 8/19/2021
1.2.0 9,540 6/2/2021
1.1.1 310 5/5/2021
1.0.1 342 5/4/2021
1.0.0 385 1/14/2021