AspNetStandard.Diagnostics.HealthChecks
1.0.0
See the version list below for details.
dotnet add package AspNetStandard.Diagnostics.HealthChecks --version 1.0.0
NuGet\Install-Package AspNetStandard.Diagnostics.HealthChecks -Version 1.0.0
<PackageReference Include="AspNetStandard.Diagnostics.HealthChecks" Version="1.0.0" />
paket add AspNetStandard.Diagnostics.HealthChecks --version 1.0.0
#r "nuget: AspNetStandard.Diagnostics.HealthChecks, 1.0.0"
// Install AspNetStandard.Diagnostics.HealthChecks as a Cake Addin #addin nuget:?package=AspNetStandard.Diagnostics.HealthChecks&version=1.0.0 // Install AspNetStandard.Diagnostics.HealthChecks as a Cake Tool #tool nuget:?package=AspNetStandard.Diagnostics.HealthChecks&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.
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 | Versions 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. |
-
.NETFramework 4.6.1
- Microsoft.AspNet.WebApi.Core (>= 5.2.7)
- Newtonsoft.Json (>= 12.0.3)
-
.NETFramework 4.7.2
- Microsoft.AspNet.WebApi.Core (>= 5.2.7)
- Newtonsoft.Json (>= 12.0.3)
-
.NETStandard 2.0
- Microsoft.AspNet.WebApi.Core (>= 5.2.7)
- Newtonsoft.Json (>= 12.0.3)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on AspNetStandard.Diagnostics.HealthChecks:
Package | Downloads |
---|---|
AspNetStandard.Diagnostics.HealthChecks.Redis
WebApi extension of the health check for Redis health reporting. |
|
AspNetStandard.Diagnostics.HealthChecks.SqlServer
WebApi extension of the health check for SqlServer health reporting. |
|
AspNetStandard.Diagnostics.HealthChecks.MongoDb
WebApi extension of the health check for mongodb health reporting. |
|
AspNetStandard.Diagnostics.HealthChecks.RabbitMq
WebApi extension of the health check for RabbitMq health reporting. |
|
AspNetStandard.Diagnostics.HealthChecks.AzureBlobStorage
WebApi extension of the health check for AzureBlobStorage health reporting. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.2.0 | 2,241 | 6/2/2021 |
1.2.0-preview.1 | 210 | 6/2/2021 |
1.1.1 | 12,771 | 5/5/2021 |
1.0.1 | 1,054 | 5/4/2021 |
1.0.0 | 1,367 | 1/14/2021 |