EDITORIAL
私たちのシステムが展開されているので、おそらく、異常終了システム原因サービスまたはその他の問題が健全な状態にある、この私たちは、保健システムを知っている必要があり、時間、およびヘルスチェックは、すぐにシステムが正常な状態にあるかどうかを判断するために私たちを助けることができます。通常の状況下で、我々は専門的な健康診断のためのオープンなHTTPインターフェースを提供します。
NETのコアは、健康スクリーニングライブラリはMicrosoft.Extensions.Diagnostics.HealthChecks.AbstractionsとMicrosoft.Extensions.Diagnostics.HealthChecksが含まれています。2つのライブラリは、一緒に主なコンポーネントは以下のとおりである後ろに、私たちはそうではありません私たちの延長に最も基本的なソリューションのヘルスチェックを提供します。
AspNetCore.HealthChecks.System
AspNetCore.HealthChecks.Network
AspNetCore.HealthChecks.SqlServer
AspNetCore.HealthChecks.MongoDb
AspNetCore.HealthChecks.Npgsql
AspNetCore.HealthChecks.Redis
AspNetCore.HealthChecks.AzureStorage
AspNetCore.HealthChecks.AzureServiceBus
AspNetCore.HealthChecks.MySql
AspNetCore.HealthChecks.DocumentDb
AspNetCore.HealthChecks.SqLite
AspNetCore.HealthChecks.Kafka
AspNetCore.HealthChecks.RabbitMQ
AspNetCore.HealthChecks.IdSvr
AspNetCore.HealthChecks.DynamoDB
AspNetCore.HealthChecks.Oracle
AspNetCore.HealthChecks.Uris
ソース探査
Microsoft.Extensions.Diagnostics.HealthChecks.Abstractionsは、私たちが、このライブラリの設計意図を見ることができる基礎となる.NETのコアのヘルスチェック、抽象化したものです。各状態は、バックオフィスサービス、データベースなどを含む部品検査アプリケーションを監視するためには、IHealthCheckインタフェース統一提供します。このインタフェースは、CheckHealthAsync唯一の方法であります
この方法は、1つのパラメータが実行されたときにヘルスチェックに関連付けられている現在のコンテキストオブジェクトを示しHealthCheckContext、あるている、その戻り値はHealthCheckResultが健康診断によって生成される電流成分の後に動作状態を監視示します。
ソースとして、次のとおりです。
1: パブリック インタフェース IHealthCheck
2: {
3: タスク<HealthCheckResult> CheckHealthAsync(HealthCheckContextコンテキスト、CancellationToken cancellationToken = デフォルト)。
4: }
HealthCheckRegistration
HealthCheckContext唯一のメンバーでありHealthCheckRegistrationのインスタンス。
そしてHealthCheckRegistrationは、それが使用された内部5つのプロパティに来るヘルスチェックにフォーカスし、注意を払う必要性を反映して非常に重要な課題は、次のとおりです。
- ヘルスチェックのロゴ名
- IHealthCheck例を作成します
- ヘルスチェックアウト時刻(なぜならヘルスチェックの私たちを防ぎ、あまりにも多くのリソースを占有します)
- 失敗した状態のロゴ
- ラベルセット(ヘルスチェックフィルタリングに使用することができます)
ソースコードに関連する5つの属性は次のとおりです。
1: 公共のFunc <IServiceProvider、IHealthCheck>工場
2: {
3: GET => _factory。
4: セット
5: {
6: もし(値 == NULL)
7: {
8: スロー 新しい例外ArgumentNullExceptionを(がNameOf(値));
9: }
10:
11: _factory = 値。
12: }
13: }
14:
15: 公共 HealthStatus FailureStatus {取得します。セット; }
16:
17: 公共のTimeSpanタイムアウト
18: {
19: GET => _timeout。
20: セット
21: {
22: もし(値 <= TimeSpan.Zero && 値!= System.Threading.Timeout.InfiniteTimeSpan)
23: {
24: スロー 新しい例外ArgumentOutOfRangeException(がNameOf(値));
25: }
26:
27: _timeout = 値。
28: }
29: }
30:
31: 公共の 文字列の名前
32: {
33: get => _name;
34: set
35: {
36: if (value == null)
37: {
38: throw new ArgumentNullException(nameof(value));
39: }
40:
41: _name = value;
42: }
43: }
44:
45: public ISet<string> Tags { get; }
HealthCheckResult
HealthCheckResult是一个结构体,可以看出这里更多的是基于承担数据存储和性能问题的考量。
HealthCheckResult用于表示健康检查的相关结果信息,同样的,通过该类,我们知道了健康检查需要关注的几个点:
- 组件的当前状态
- 异常信息
- 友好的描述信息(不管是异常还是正常)
- 额外可描述当前组件的键值对,这是一个开放式的属性,方面我们记录更多信息
该类含有四个公共属性,和三个方法,相关源码如下:
1: public struct HealthCheckResult
2: {
3: private static readonly IReadOnlyDictionary<string, object> _emptyReadOnlyDictionary = new Dictionary<string, object>();
4:
5: public HealthCheckResult(HealthStatus status, string description = null, Exception exception = null, IReadOnlyDictionary<string, object> data = null)
6: {
7: Status = status;
8: Description = description;
9: Exception = exception;
10: Data = data ?? _emptyReadOnlyDictionary;
11: }
12:
13: public IReadOnlyDictionary<string, object> Data { get; }
14:
15: public string Description { get; }
16:
17: public Exception Exception { get; }
18:
19: public HealthStatus Status { get; }
20:
21: public static HealthCheckResult Healthy(string description = null, IReadOnlyDictionary<string, object> data = null)
22: {
23: return new HealthCheckResult(status: HealthStatus.Healthy, description, exception: null, data);
24: }
25:
26: public static HealthCheckResult Degraded(string description = null, Exception exception = null, IReadOnlyDictionary<string, object> data = null)
27: {
28: return new HealthCheckResult(status: HealthStatus.Degraded, description, exception: exception, data);
29: }
30:
31: public static HealthCheckResult Unhealthy(string description = null, Exception exception = null, IReadOnlyDictionary<string, object> data = null)
32: {
33: return new HealthCheckResult(status: HealthStatus.Unhealthy, description, exception, data);
34: }
35: }
可以看出这个三个方法都是基于HealthStatus这个枚举而创建不同状态的HealthCheckResult实例,这个枚举表达了健康检查需要关注的几种状态,健康、异常以及降级。
HealthStatus的源码如下:
1: public enum HealthStatus
2: {
3: Unhealthy = 0,
4:
5: Degraded = 1,
6:
7: Healthy = 2,
8: }
IHealthCheckPublisher
健康检查功能本质上是一种轮询功能,需要定期执行,.NET Core 抽象定期执行的接口,即IHealthCheckPublisher,我们可以通过实现这个接口,并与我们自定义的定时功能相结合。
同时,作为一次健康检查,我们还需要关注相关的健康检查报告,那么我们需要关注那些点呢?
- 额外可描述当前组件的键值对,这是一个开放式的属性,方面我们记录更多信息
- 友好的描述信息(不管是异常还是正常)
- 组件的当前状态
- 异常信息
- 当前这次检查所耗费的时间
- 相关的标签信息
HealthReportEntry表示单个健康检查报告,HealthReport表示一组健康检查报告。HealthReport内部维护了一个HealthReportEntry的字典数据,HealthReport源码如下所示:
1: public sealed class HealthReport
2: {
3: public HealthReport(IReadOnlyDictionary<string, HealthReportEntry> entries, TimeSpan totalDuration)
4: {
5: Entries = entries;
6: Status = CalculateAggregateStatus(entries.Values);
7: TotalDuration = totalDuration;
8: }
9:
10: public IReadOnlyDictionary<string, HealthReportEntry> Entries { get; }
11:
12: public HealthStatus Status { get; }
13:
14: public TimeSpan TotalDuration { get; }
15:
16: private HealthStatus CalculateAggregateStatus(IEnumerable<HealthReportEntry> entries)
17: {
18: var currentValue = HealthStatus.Healthy;
19: foreach (var entry in entries)
20: {
21: if (currentValue > entry.Status)
22: {
23: currentValue = entry.Status;
24: }
25:
26: if (currentValue == HealthStatus.Unhealthy)
27: {
28: // Game over, man! Game over!
29: // (We hit the worst possible status, so there's no need to keep iterating)
30: return currentValue;
31: }
32: }
33:
34: return currentValue;
35: }
36: }
总结
通过以上内容,我们知道了,一个完整的健康检查需要关注健康检查上下文、健康状态的维护、健康检查结果、健康检查报告,同时,为了更好的维护健康检查,我们可以将健康检查发布抽象出来,并与外部的定时器相结合,共同守护健康检查程序。