tnblog
首页
视频
资源
登录

.net core 健康检测

7366人阅读 2020/8/2 17:44 总访问:3467413 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

.net core 健康检测

检查应用的健康状态

ASP.NET Core 框架的健康检查功能是通过 HealthCheckMiddleware 中间件完成的。我们不仅可以利用该中间件确定当前应用的可用性,还可以注册相应的 IHealthCheck 对象来完成针对不同方面的健康检查。例如,当前应用部署或者依赖一些组件或者服务,我们可以注册相应的 IHealthCheck 对象来完成针对它们的健康检查。下面通过实例演示一些典型的健康检查应用场景。

GitHub:https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks

确定当前应用是否可用

对于部署于集群或者容器的应用或者服务来说,它需要对外暴露一个终结点,以便负载均衡器或者容器编排框架可以利用该终结点是否可用。ASP.NET Core 可以通过如下所示的编程方式来提供这个健康检查终结点。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Host.CreateDefaultBuilder()
  6. .ConfigureWebHostDefaults(builder=>builder
  7. .ConfigureServices(svcs=>svcs.AddHealthChecks())
  8. .Configure(app=>app.UseHealthChecks("/healthcheck")))
  9. .Build()
  10. .Run();
  11. }
  12. }

从上面的代码来看,我们通过 IServiceCollection接口的 AddHealthChecks 扩展方法注册 IHealthChecksBuilder 健康检查的服务,再通过 IApplicationBuilder 接口的 UseHealthChecks 扩展方法注册 HealthChecksMiddle 中间件,其中参数 /healthcheck 表示检查健康终结点的访问路径,最后我们只需要 Get 访问该路径便可知当前的健康状态(结果如下图所示)。

简单举例结果

如下所显示的图片是我们请求健康检查后得到的报文,这里我们可以看到这是一个响应码200OK媒体类型为 text\planin 说明是以文本输出的格式。通过健康检查我们想获取的是当前应用程序的状态,所以我们是不需要缓存内容的,在响应的报文中PragmaCache-Control的报头恰好说明了这一点。

定制健康检查逻辑

生活中,我们经常也会更具自身的需求进行选择不同食物用膳,健康检查也是如此。在上一个案例中应用程序一旦启动成功所请求的状态就是Healthy,如果我们需要在程序启动之前定制一些条件再进行判断是否健康,那这就不符合需求了。


在下面的案例中,我们通过 IServiceCollection 接口的 AddHealthChecks 扩展方法注册所需的服务依赖之后,返回 IHealthChecksBuilder 对象的 AddCheck 方法注册了一个 IHealthCheck 对象,该对象会调用 Check 方法来决定最终的健康状态。在内嵌的 Check 方法中,该方法会返回 3 种健康状态(Healthy、UnHealthy、Degraded)

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var random = new Random();
  6. Host.CreateDefaultBuilder()
  7. .ConfigureWebHostDefaults(builder=>builder
  8. .ConfigureServices(svcs=>svcs.AddHealthChecks()
  9. .AddCheck("default",Check))
  10. .Configure(app=>app.UseHealthChecks("/healthcheck")))
  11. .Build()
  12. .Run();
  13. HealthCheckResult Check()
  14. {
  15. return (random.Next(1,4)) switch
  16. {
  17. 1 => HealthCheckResult.Unhealthy(),
  18. 2 => HealthCheckResult.Degraded(),
  19. _ => HealthCheckResult.Healthy()
  20. };
  21. }
  22. }
  23. }

从如上所示的代码中有3种健康检查状态的响应报文。HealthyDegraded 响应的都是 200 Ok,它们都表示是可用(Available)状态,两者之间的区别在于完全可用部分可用Unhealthy 的服务被视为不可用(Unavailable),所以响应状态码为 Service Unabailable

改变响应状态码

上面讲解了3种健康检查与所对应的状态码,默认的状态码虽然是一种规范,但还是无法分辨出 HealthyDegraded,所以我们可用通过自定义不同但状态码进行区分。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var random = new Random();
  6. var option = new HealthCheckOptions{
  7. ResultStatusCodes = new Dictionary<HealthStatus,int>{
  8. [HealthStatus.Healthy] = 99,
  9. [HealthStatus.Degraded] = 299,
  10. [HealthStatus.Unhealthy] = 503
  11. }
  12. };
  13. Host.CreateDefaultBuilder()
  14. .ConfigureWebHostDefaults(builder=>builder
  15. .ConfigureServices(svcs=>svcs.AddHealthChecks()
  16. .AddCheck("default",Check))
  17. .Configure(app=>app.UseHealthChecks("/healthcheck",option)))
  18. .Build()
  19. .Run();
  20. HealthCheckResult Check()
  21. {
  22. return (random.Next(1,4)) switch
  23. {
  24. 1 => HealthCheckResult.Unhealthy(),
  25. 2 => HealthCheckResult.Degraded(),
  26. _ => HealthCheckResult.Healthy()
  27. };
  28. }
  29. }
  30. }

HealthChecksMiddleware 提供了 HealthCheckOptions 对象作为对应的配置选项。HealthCheckOptions 对象通过 ResultStatusCodes 属性字段返回的字典维护了3种健康状态与所对应的状态码,这里我们只修改 HealthyDegraded 这两种健康状态的状态码,分别为 99299

Healthy

Degraded

细粒度的健康检查

如果当应用的本身依赖了其他服务与组件时,这个时候就可以针对它们做细粒度的健康检查。前面通过 IHealthCheck 对象对应用级别的健康检查做了定制,同样我们可以通过 IHealthCheck 对象对某个组件或者服务注册相应对 IHealthCheck 对象来确定它们的健康状态。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var random = new Random();
  6. Host.CreateDefaultBuilder()
  7. .ConfigureWebHostDefaults(builder=>builder
  8. .ConfigureServices(svcs=>svcs.AddHealthChecks()
  9. .AddCheck("aaa",Check)
  10. .AddCheck("bbb",Check)
  11. .AddCheck("ccc",Check))
  12. .Configure(app=>app.UseHealthChecks("/healthcheck")))
  13. .Build()
  14. .Run();
  15. HealthCheckResult Check()
  16. {
  17. return (random.Next(1,4)) switch
  18. {
  19. 1 => HealthCheckResult.Unhealthy(),
  20. 2 => HealthCheckResult.Degraded(),
  21. _ => HealthCheckResult.Healthy()
  22. };
  23. }
  24. }
  25. }

这里以自定义的3个服务,通过3个 IHealthCheck 对象来完成对它们对健康检查。由于注册的 3 个 IHealthCheck采用的不同同一个 Check 方法决定最后的健康状态,所以也只有3种不同的结果。(这里我就不上图了)


从这个案例可以反应出所有得到的结果有点以面盖全了,如果是Healthy那么所有的服务以及所依赖的组件都是Healthy,…所以这并不是我们想要的,应该对服务与依赖进行定制响应内容。

定制响应内容

上面演示的实例所得到的应用整体健康状态,如果要得到对服务与依赖的插件一份比较完整且详细“健康报告”,我们将程序做适当修改。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var random = new Random();
  6. var options = new HealthCheckOptions{
  7. ResponseWriter = ReportAsync
  8. };
  9. Host.CreateDefaultBuilder()
  10. .ConfigureWebHostDefaults(builder=>builder
  11. .ConfigureServices(svcs=>svcs.AddHealthChecks()
  12. .AddCheck("aaa",Check,new string[]{ "aaa1","bbb2" })
  13. .AddCheck("bbb",Check,new string[]{ "bbb1","bbb2" })
  14. .AddCheck("ccc",Check,new string[]{ "ccc1","ccc1" }))
  15. .Configure(app=>app.UseHealthChecks("/healthcheck",options)))
  16. .Build()
  17. .Run();
  18. static Task ReportAsync(Microsoft.AspNetCore.Http.HttpContext content,HealthReport report){
  19. content.Response.ContentType = "application/json";
  20. var settings = new JsonSerializerSettings();
  21. settings.Formatting = Formatting.Indented;
  22. settings.Converters.Add(new StringEnumConverter());
  23. return content.Response.WriteAsync(JsonConvert.SerializeObject(report,settings));
  24. }
  25. HealthCheckResult Check()
  26. {
  27. return (random.Next(1,4)) switch
  28. {
  29. 1 => HealthCheckResult.Unhealthy("Unavailable"),
  30. 2 => HealthCheckResult.Degraded("Degraded"),
  31. _ => HealthCheckResult.Healthy("Normal")
  32. };
  33. }
  34. }
  35. }

对改写的内容体现以下几点:首先,为 Check 方法返回的表示健康检查结果的 HealthCheckResult 对象设置对应的描述性文字(Normal、Degraded 和 Unavailable);其次,在调用 IHealthChecksBuilder 接口的 AddCheck 方法注册相应的 IHealthCheck 对象时,指定了两个的标签(Tag),如针对服务 aaaIHealthCheck 对象的标签设置为 aaa1aaa2; 最后,在调用 IApplicationBuilder 接口的 UseHealthChecks 扩展方法注册 HealthCheckMiddleware 中间件时,指定了作为配置选项的 HealthCheckOptions 对象,并通过设置其 ResponseWriter 属性的方式完成了对健康报告的呈现。


HealthCheckOptionResponseWriter 属性返回的是一个 Func<HttpContext,HealthReport,Task> 对象,其中 HealthReport 对象是 HealthCheckMiddleware 中间件针对健康报告的表达。我们设置的委托对象应应对的方法为 ReportAsync,该方法会直接将指定的 HealthReport 对象序列化成 JSON 格式并作为响应主题内容。我们并没有设置相应的状态码,所以可以直接在浏览器种看到这份完整的健康报告。

过滤 IHealthCheck 对象

HealthCheckMiddleware 中间件提取注册的 IHealthCheck 对象完成具体的健康检查工作之前,我们可以做进一步过滤。对于 IHealthCheck 对象的过滤逻辑依然是利用 HealthCheckOptions 配置来进行实现,同时我们也需要设置它的 Predicate 属性,该属性返回一个 Func<HealthCheckRegistration, bool> 类型的委托对象,其中 HealthCheckRegistration 对象代表针对 IHealthCheck 对象的注册。


在如下代码中我们通过设置配置选项 HealthCheckOptions 对象的 Predicate 属性使之选择 Tag 前缀不为 cccIHealthCheck 对象

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var random = new Random();
  6. var options = new HealthCheckOptions
  7. {
  8. ResponseWriter = ReportAsync,
  9. Predicate = reg => reg.Tags.Any(tag => !tag.StartsWith("ccc", StringComparison.OrdinalIgnoreCase))
  10. };
  11. Host.CreateDefaultBuilder()
  12. .ConfigureWebHostDefaults(builder => builder
  13. .ConfigureServices(svcs => svcs
  14. .AddHealthChecks()
  15. .AddCheck("aaa", Check, new string[] { "aaa1", "bbb2" })
  16. .AddCheck("bbb", Check, new string[] { "bbb1", "bbb2" })
  17. .AddCheck("ccc", Check, new string[] { "ccc1", "ccc1" })
  18. )
  19. .Configure(app => app.UseHealthChecks("/healthcheck", options)))
  20. .Build()
  21. .Run();
  22. static Task ReportAsync(Microsoft.AspNetCore.Http.HttpContext content, HealthReport report)
  23. {
  24. content.Response.ContentType = "application/json";
  25. var settings = new JsonSerializerSettings();
  26. settings.Formatting = Formatting.Indented;
  27. settings.Converters.Add(new StringEnumConverter());
  28. return content.Response.WriteAsync(JsonConvert.SerializeObject(report, settings));
  29. }
  30. HealthCheckResult Check()
  31. {
  32. return (random.Next(1, 4)) switch
  33. {
  34. 1 => HealthCheckResult.Unhealthy("Unavailable"),
  35. 2 => HealthCheckResult.Degraded("Degraded"),
  36. _ => HealthCheckResult.Healthy("Normal")
  37. };
  38. }
  39. }
  40. }

由于我们这里过滤了 ccc 服务的健康检查,所以在浏览器中我们就看不了所对应的健康状态。

针对 Entity Framework Core 的健康检查

如果应用需要用到对数据库的访问,那么就需要通过健康检查判断数据库的可用性。Entity Framework Core作为我们最常用数据库的存取框架,就可以利用健康检查来确定 DbContext 是否可用。针对 DbContext 的健康检查是通过 DbContextHealthCheck<TContext> 这个内部类型完成的,该类型由 NuGet 包 Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 来提供。

基于 DbContext 的健康检查


下面通过简单的示例来介绍如何利用该注册 DbContextHealth<TContext> 对象来检查对 DbContext 的可用性。该类型所在的 NuGet 包 Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 的依赖。除此之外,我们的演示实例采用的数据库类型为 SQL Server ,所以还需要为演示程序添加针对 NuGet 包 Microsoft.EntityFrameworkCore.SqlServer 的依赖。在添加了上述两个 NuGet 包的依赖之后,我们定义了如下两个空的 DbContext 类型(FooContext 和 BarContext)。

  1. public class FooContext:DbContext
  2. {
  3. public FooContext(DbContextOptions<FooContext> options) : base(options)
  4. {}
  5. }
  6. public class BarContext : DbContext
  7. {
  8. public BarContext(DbContextOptions<BarContext> options) : base(options)
  9. {}
  10. }

在如下所演示程序中,我们调用 IServiceCollection 接口的 AddDbContext<TDbContext> 扩展方法注册针对 Entity Framework Core 的相关服务,并完成了针对上述两个自定义 DbContext 类型的注册。我们为 FooContextBarContext 分别指出了两个针对 SQL Server 的连接字符串,其中前者是有效的,后者是无效的。

  1. static void Main(string[] args)
  2. {
  3. var options = new HealthCheckOptions
  4. {
  5. ResponseWriter = ReportAsync
  6. };
  7. Host.CreateDefaultBuilder()
  8. .ConfigureWebHostDefaults(builder => builder
  9. .ConfigureServices(svcs => svcs
  10. .AddDbContext<FooContext>(options => options.UseSqlServer("<Connection String>"))
  11. .AddDbContext<BarContext>(options => options.UseSqlServer("<Connection String>"))
  12. .AddHealthChecks()
  13. .AddDbContextCheck<FooContext>()
  14. .AddDbContextCheck<BarContext>()
  15. )
  16. .Configure(app => app.UseHealthChecks("/healthcheck", options)))
  17. .Build()
  18. .Run();
  19. static Task ReportAsync(Microsoft.AspNetCore.Http.HttpContext content, HealthReport report)
  20. {
  21. var builder = new StringBuilder();
  22. builder.AppendLine($"Status: {report.Status}");
  23. foreach (var name in report.Entries.Keys)
  24. {
  25. builder.AppendLine($"{name}:{report.Entries[name].Status}");
  26. }
  27. return content.Response.WriteAsync(builder.ToString());
  28. }

在调用 IServiceCollection 接口的 AddHealthChecks 扩展方法得到 IHealthChecksBuilder 对象之后,我们针对两个 DbContext 类型(FooContent 和 BarContext)调用 AddDbContextCheck<TContext> 扩展方法,它们会创建并注册对应的 DbContextHealthCheck<TContext> 对象。为了得到针对两个 DbContext 类型的健康报告,我们依然在注册 HealthCheckMiddleware 中间件时指定了对应的配置选项,并通过指定其 ResponseWrite 属性将每个健康检查条目的状态呈现到响应内容中。如果直接利用浏览器发送健康检查请求,就会得到如下的健康报告。由于 FooContext 连接的数据库是可用的,所以针对它的状态为 Healthy.BarContext 采用的连接字符串是无效的,所以它对应的状态为 UnHealthy

我们基于上一次的序列化完整输出,如下图所示

发布健康报告

我们通过如下实例来介绍健康报告的定期发布。健康报告的发布是通过 IHealthCheck Publisher 服务来完成的。我们实现该接口的实现类型 ConsolePublisher 将健康报告输出到控制台上。如下所示的代码片段展示了如何利用 ConsolePublisher 对象将收集的健康报告以设定的时间间隔输出到控制台上。

  1. var random = new Random();
  2. var options = new HealthCheckOptions
  3. {
  4. ResponseWriter = ReportAsync
  5. };
  6. Host.CreateDefaultBuilder()
  7. .ConfigureWebHostDefaults(builder => builder
  8. .ConfigureServices(svcs => svcs
  9. .AddHealthChecks()
  10. .AddCheck("aaa", Check)
  11. .AddCheck("bbb", Check)
  12. .AddCheck("ccc", Check)
  13. .AddConsolePublisher()
  14. .ConfigurePublisher(options =>
  15. options.Period = TimeSpan.FromSeconds(5)))
  16. )
  17. .Configure(app => app.UseHealthChecks("/healthcheck", options)))
  18. .Build()
  19. .Run();
  20. static Task ReportAsync(Microsoft.AspNetCore.Http.HttpContext content, HealthReport report)
  21. {
  22. content.Response.ContentType = "application/json";
  23. var settings = new JsonSerializerSettings();
  24. settings.Formatting = Formatting.Indented;
  25. settings.Converters.Add(new StringEnumConverter());
  26. return content.Response.WriteAsync(JsonConvert.SerializeObject(report, settings));
  27. }
  28. HealthCheckResult Check()
  29. {
  30. return (random.Next(1, 4)) switch
  31. {
  32. 1 => HealthCheckResult.Unhealthy("Unavailable"),
  33. 2 => HealthCheckResult.Degraded("Degraded"),
  34. _ => HealthCheckResult.Healthy("Normal")
  35. };
  36. }

如上代码我们注册了3个 IHealthCheckBuilder 对象,它们会随机返回3种状态的健康状态。ConsolePublisher 对象的注册体现在针对 AddConsolePublisher 方法的调用上,这是专门为 IHealthCheckBuilder 接口定义的扩展方法。借助调用 ConfigurePublisher方法也是自定义扩展方法,我们利用它将健康报告间隔设置为5秒。

  1. public static class Extensions
  2. {
  3. public static IHealthChecksBuilder AddConsolePublisher(this IHealthChecksBuilder builder)
  4. {
  5. builder.Services.AddSingleton<IHealthCheckPublisher, ConsolePublisher>();
  6. return builder;
  7. }
  8. public static IHealthChecksBuilder ConfigurePublisher(this IHealthChecksBuilder builder, Action<HealthCheckPublisherOptions> configure)
  9. {
  10. builder.Services.Configure(configure);
  11. return builder;
  12. }
  13. }
  1. public class ConsolePublisher : IHealthCheckPublisher
  2. {
  3. private readonly ObjectPool<StringBuilder> _stringBuilderPool;
  4. public ConsolePublisher(ObjectPoolProvider provider)
  5. {
  6. _stringBuilderPool = provider.CreateStringBuilderPool();
  7. }
  8. public Task PublishAsync(HealthReport report, CancellationToken cancellationToken)
  9. {
  10. cancellationToken.ThrowIfCancellationRequested();
  11. var builder = _stringBuilderPool.Get();
  12. try
  13. {
  14. builder.AppendLine($"Status: {report.Status}[{ DateTimeOffset.Now.ToString("yy-MM-dd hh:mm:ss")}]");
  15. foreach (var name in report.Entries.Keys)
  16. {
  17. builder.AppendLine($" {name}: {report.Entries[name].Status}");
  18. }
  19. Console.WriteLine(builder);
  20. return Task.CompletedTask;
  21. }
  22. finally
  23. {
  24. _stringBuilderPool.Return(builder);
  25. }
  26. }
  27. }

健康检查(UI)

虽然官方为我们提供的运行检查库已经足够轻量和简单。但是为了避免重复造轮子,我们可以使用AspNetCore.Diagnostics.HealthChecks包,该项目包含了许多情况的检查,比如 Sql ServerMySqlElasticsearchRedisKafka等等。
并且还为我们提供一个UI界面,可供查看,通过 NuGet 包AspNetCore.HealthChecks.UI.Client提供客户端独特的输出格式,改动原有代码:

  1. static void LastPractice()
  2. {
  3. var random = new Random();
  4. var options = new HealthCheckOptions
  5. {
  6. Predicate = _ => true,
  7. ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse//ReportAsync
  8. };
  9. var options2 = new HealthCheckOptions
  10. {
  11. ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
  12. Predicate = reg => reg.Name == "ccc"
  13. };
  14. Host.CreateDefaultBuilder()
  15. .ConfigureWebHostDefaults(builder => builder
  16. .ConfigureServices(svcs => svcs
  17. .AddHealthChecks()
  18. .AddCheck("aaa", Check)
  19. .AddCheck("bbb", Check)
  20. .AddCheck("ccc", Check)
  21. .AddConsolePublisher()
  22. .ConfigurePublisher(option=>option.Period = TimeSpan.FromSeconds(5))
  23. )
  24. .Configure(app => {
  25. app.UseHealthChecks("/healthcheck", options);
  26. app.UseHealthChecks("/healthcheck2", options2);
  27. }))
  28. .Build()
  29. .Run();
  30. static Task ReportAsync(Microsoft.AspNetCore.Http.HttpContext content, HealthReport report)
  31. {
  32. content.Response.ContentType = "application/json";
  33. var settings = new JsonSerializerSettings();
  34. settings.Formatting = Formatting.Indented;
  35. settings.Converters.Add(new StringEnumConverter());
  36. return content.Response.WriteAsync(JsonConvert.SerializeObject(report, settings));
  37. }
  38. HealthCheckResult Check()
  39. {
  40. return (random.Next(1, 4)) switch
  41. {
  42. 1 => HealthCheckResult.Unhealthy("Unavailable"),
  43. 2 => HealthCheckResult.Degraded("Degraded"),
  44. _ => HealthCheckResult.Healthy("Normal")
  45. };
  46. }
  47. }

通过 IApplicationBuilder 接口的 UseHealthChecks 扩展方法去注册 2 个 HealthChecksMiddle 配置不一的中间件,同时也映射出两种不同的路径 /healthcheck/healthcheck2,前者包括所有注册的服务与插件可以进行健康检查,后者只能检查名为 ccc 的服务。


创建一个项目名为 HealthDashboardwebApi 网站,添加健康面板 AspNetCore.HealthChecks.UI 以及 AspNetCore.HealthChecks.UI.InMemory.Storage 依赖包。注册 HealthCheck 健康面板的相关服务,并映射相关路径,默认通过 /healthchecks-ui 即可访问。

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. services
  11. .AddHealthChecksUI()
  12. .AddInMemoryStorage();
  13. }
  14. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  15. {
  16. app
  17. .UseRouting()
  18. .UseEndpoints(config =>
  19. {
  20. config.MapHealthChecksUI();
  21. });
  22. }
  23. }

appsetting.json 我们也需要对其进行修改。主要是针对 HealthChecksUI 的配置,我们从中可以看到 HealthChecks 节点下添加了两个检测节点。接下来我们通过浏览器访问 /healthchecks-ui 查看二者的连接情况。

  1. {
  2. "HealthChecksUI": {
  3. "HealthChecks": [
  4. {
  5. "Name": "IHealthCheckConsole",
  6. "Uri": "http://localhost:5000/healthcheck"
  7. },
  8. {
  9. "Name": "IHealthCheckConsole-Only-CCC",
  10. "Uri": "http://localhost:5000/healthcheck2"
  11. }
  12. ],
  13. "Webhooks": [
  14. {
  15. "Name": "Default",
  16. "Uri": "",
  17. "Payload": "{\"text\":\"The HealthCheck [[LIVENESS]] is failing with the error message: [[FAILURE]]. [[DESCRIPTIONS]]. <http://yourappstatus|Click here> to get more details.\",\"channel\":\"#general\",\"link_names\": 1,\"username\":\"monkey-bot\",\"icon_emoji\":\":monkey_face:\"}",
  18. "RestoredPayload": "{\"text\":\"The HealthCheck [[LIVENESS]] is recovered. All is up and running\",\"channel\":\"#general\",\"link_names\": 1,\"username\":\"monkey-bot\",\"icon_emoji\":\":monkey_face:\"}"
  19. }
  20. ],
  21. "EvaluationTimeinSeconds": 10,
  22. "MinimumSecondsBetweenFailureNotifications": 60
  23. }
  24. }

我们从健康检测UI中直关的看到每个注册点下,服务和插件的运行情况。关于 appsettings.json 文件中的配置参数可以参考如下。

HealthChecks


默认情况下,HealthChecks 返回一个简单的状态码(200或503),而不包含 HealthReport 数据。如果您希望 HealthCheck-UI 显示来自 HealthCheckHealthReport 数据,则可以启用它以添加特定的 ResponseWriter。要在HealthCheck-UI中显示这些HealthCheck,必须通过HealthCheck-UI设置对其进行配置。同时也等同于如下代码:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services
  4. .AddHealthChecksUI(setup=> {
  5. setup.AddHealthCheckEndpoint("IHealthCheckConsole", "http://localhost:5000/healthcheck");
  6. setup.AddHealthCheckEndpoint("IHealthCheckConsole-Only-CCC", "http://localhost:5000/healthcheck2");
  7. })
  8. .AddInMemoryStorage();
  9. }

Webhooks


您可以使用IConfiguration提供程序(应用程序设置,用户机密,环境变量)配置这些Healthcheck和Webhooks,也可以使用AddHealthChecksUI(setupSettings:setup =>)方法。具体请参考 Webhooks 在这里等同于如下代码:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services
  4. .AddHealthChecksUI(setup=> {
  5. setup.AddHealthCheckEndpoint("IHealthCheckConsole", "http://localhost:5000/healthcheck");
  6. setup.AddHealthCheckEndpoint("IHealthCheckConsole-Only-CCC", "http://localhost:5000/healthcheck2");
  7. setup.AddWebhookNotification("Default", uri: "", payload: "{...}");
  8. })
  9. .AddInMemoryStorage();
  10. }

如果配置了WebHooks部分,则HealthCheck-UI会自动将新通知发布到webhook集合中。HealthCheckUI对webhook的Payload和RestorePayload属性中的值使用简单的替换方法。目前,我们支持两个书签:
[[LIVENESS]] 返回Down的活动的名称。
[[FAILURE]] 带有失败的详细消息。
[[DESCRIPTIONS]] 故障描述
Webhooks可以使用配置提供程序进行配置,也可以通过代码进行配置。使用代码可以进行更大程度的自定义,因为您可以设置自己的用户功能来自定义输出消息或配置是否将有效负载发送到给定的Webhook端点。

EvaluationTimeinSeconds

运行状况检查之间经过的秒数。

MinimumSecondsBetweenFailureNotifications

故障通知之间的最小秒数,以避免接收器满溢。

UI自定义样式表

UI通过使用自定义样式表和css变量支持自定义样式和品牌。要添加自定义样式表,请使用UI设置方法

添加示例文件以及样式

dotnet.css 样式如下

  1. :root {
  2. --primaryColor: #68217a;
  3. --secondaryColor: #f4f4f4;
  4. --bgMenuActive: #8e47a0;
  5. --bgButton: #68217a;
  6. --logoImageUrl: url('../../logo.png');
  7. --bgAside: var(--primaryColor);
  8. }

Startup.cs

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. app.UseStaticFiles();
  4. app
  5. .UseRouting()
  6. .UseEndpoints(config =>
  7. {
  8. config.MapHealthChecksUI(setup=> {
  9. setup.AddCustomStylesheet("wwwroot\\dotnet.css");
  10. });
  11. });
  12. }

HealthCheck 与 Kubernetes

https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/blob/master/doc/k8s-operator.md


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core中使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术