Иногда вам нужно реализовать конечную точку, которая сообщает внешнему миру, если с вашим приложением все в порядке. Например, вам нужно сообщить K8s, что ваше приложение в нездоровом и позволить ему перезапустить POD.
Есть 3 различных типа проверки здоровья:
- Стартап — случается после начала вашего приложения.
- Lifine — случается во времени после начала приложения и сообщает, нужно ли оно перезапустить.
- Готовность — случается во времени после начала приложения и сообщает, может ли оно обрабатывать запросы.
Стартап и проверки долговечности являются наиболее важными, поэтому давайте сосредоточимся на них.
Любая проверка здоровья может быть Тупой или Умный :
- Тупой Проверки указывают только на то, что приложение не раздавлено и проверяет как можно меньше.
- Умный Проверки указывают, что приложение работает правильно и проверяет как можно больше (DB, сервисная шина, подключения хранения).
И есть правило: проверки запуска должны быть умными, а проверки готовности должны быть глупыми. Вы не хотите проверять свое соединение DB каждые 5 секунд и останавливать контейнер, если соединение исчезло.
Конечно, вы можете реализовать конечную точку, которая всегда возвращает 200. Но давайте проверим, что дает нам ASP.NET!
Для реализации проверки исцеления вам нужно унаследовать от интерфейса iHealthCheck:
public class LivenessHealthCheck : IHealthCheck { public TaskCheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { return Task.FromResult(HealthCheckResult.Healthy()); } }
Это очень простая проверка здоровья, которая всегда полезна. Таким образом, это может быть использовано в качестве проверки долгов.
Теперь нам нужно зарегистрировать его в запуске:
public void ConfigureServices(IServiceCollection services) { ... services.AddHealthChecks() .AddCheck(LivenessHealthCheck.Name, tags: new[] { "liveness" }) ... } ... public void Configure(IApplicationBuilder app, IHostApplicationLifetime appLifetime) { ... app.UseEndpoints(endpoints => { endpoints.MapHealthChecks("/health", new HealthCheckOptions { Predicate = x => x.Tags.Contains("liveness") });}); endpoints.MapControllers(); }); ... }
Итак, теперь у нас есть/здоровье, которые вызывают все чеки, отмеченные тегом «Livensy». В нашем случае именно LivineHealthCheck возвращает истину, если приложение не разбито.
Чтобы реализовать проверку запуска, мы могли бы сделать так же, как и для проверки жизни — реализовать iHealthCheck. Проверьте метод healthasync, проверьте подключения к необходимым службам и зарегистрируйте их в запуске. Но это уже реализовано!
Проверьте это Гитаб репозиторий. Он имеет реализацию наиболее распространенных проверок. Все, что вам нужно, это добавить необходимый Nuget и зарегистрировать его в запуске!
public void ConfigureServices(IServiceCollection services) { ... services.AddHealthChecks() .AddNpgSql(config.DbConnectionString, tags: new[] { "startup" }) .AddAzureServiceBusTopic(config.MessageBusConnectionString, config.MessageBusTopic, tags: new[] { "startup" }) .AddAzureBlobStorage(config.StorageConnectionString, tags: new[] { "startup" }); ... } ... public void Configure(IApplicationBuilder app, IHostApplicationLifetime appLifetime) { ... app.UseEndpoints(endpoints => { endpoints.MapHealthChecks("/health/startup", new HealthCheckOptions { Predicate = x => x.Tags.Contains("startup") }); endpoints.MapControllers(); }); ... }
Этот код создает новую конечную точку «/Health/Startup», которая возвращает 200 только в том случае, если все 3 проверки, отмеченные тегом «Startup» (SQL, Service Bus и Blob), возвращает успех.
GLHF
- https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks
- https://andrewlock.net/deploying-asp-net-core-applications-to-kubernetes-part-6-adding-health-checks-with-liveness-readiness-and-startup-probes/
Оригинал: «https://dev.to/anton_ilin/asp-net-health-checks-12eh»