using Dpz.Core.Entity.Base;

namespace Dpz.Core.Public.Entity;

public class HealthCheck : BaseEntity
{
    #region 基础属性

    /// <summary>
    /// 服务名称(必需)
    /// </summary>
    public required string Name { get; set; }

    /// <summary>
    /// 检测地址(必需)
    /// </summary>
    public required string Endpoint { get; set; }

    /// <summary>
    /// 协议类型(扩展)
    /// </summary>
    public ProtocolType Protocol { get; set; }

    /// <summary>
    /// 检测间隔(必需)
    /// </summary>
    public required TimeSpan Interval { get; set; }

    /// <summary>
    /// 当前健康状态
    /// </summary>
    public HealthStatus Status { get; set; }

    /// <summary>
    /// 上次检测时间
    /// </summary>
    public DateTime LastCheckTime { get; set; }

    #endregion

    #region 重试配置

    /// <summary>
    /// 失败重试次数(默认3)
    /// </summary>
    public int RetryCount { get; set; } = 3;

    /// <summary>
    /// 超时时间(默认5s)
    /// </summary>
    public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(5);

    #endregion

    #region 状态追踪

    /// <summary>
    /// 最后检测耗时
    /// </summary>
    public TimeSpan? LastCheckDuration { get; set; }

    /// <summary>
    /// 错误信息
    /// </summary>
    public string? ErrorMessage { get; set; }

    // 配置属性

    /// <summary>
    /// 是否启用检测
    /// </summary>
    public bool IsEnabled { get; set; } = true;

    /// <summary>
    /// 服务描述
    /// </summary>
    public string? Description { get; set; }

    #endregion

    #region 分类管理

    /// <summary>
    /// 检测优先级(1-5)
    /// </summary>
    public int Priority { get; set; } = 1;

    /// <summary>
    /// 分类标签
    /// </summary>
    public List<string> Tags { get; set; } = [];

    #endregion
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

概述 该类表示一个“健康检查(Health Check)”实体,用于描述对某个服务或端点的周期性可用性/健康检测的配置信息与运行时状态。通常用于监控/心跳系统,保存要检测的服务名称、地址、协议、检测间隔、重试与超时策略,以及最近一次检测的状态与耗时等信息。

各部分与主要属性说明

  • 继承

    • 继承自 BaseEntity(来自 Dpz.Core.Entity.Base)。通常 BaseEntity 会包含通用字段如 Id、创建/更新时间等(代码中未给出,推测如此)。
  • 基础属性

    • required string Name:服务名称,使用 C# 11 的 required,表示初始化对象时必须赋值。
    • required string Endpoint:检测地址,同样必须赋值(通常是 URL 或主机:端口)。
    • ProtocolType Protocol:协议类型枚举(如 HTTP, TCP, ICMP 等),代码中未给出枚举定义。
    • required TimeSpan Interval:检测间隔,必须设置,表示多久进行一次检测。
    • HealthStatus Status:当前健康状态(枚举,可能包含 Up/Down/Unknown 等)。
    • DateTime LastCheckTime:上次检测时间(非 nullable,默认值为 DateTime.MinValue,表示可能从未检测过)。
  • 重试配置

    • int RetryCount = 3:失败重试次数,默认 3 次。
    • TimeSpan Timeout = TimeSpan.FromSeconds(5):每次检测的超时时间,默认 5 秒。
  • 状态追踪

    • TimeSpan? LastCheckDuration:最后一次检测耗时,可为空(若未检测过则为 null)。
    • string? ErrorMessage:错误信息,可为空。
    • bool IsEnabled = true:是否启用该健康检测,默认启用。
    • string? Description:服务描述,可为空。
  • 分类管理

    • int Priority = 1:检测优先级(注释说明是 1-5),默认 1。
    • List Tags = []:标签集合,用于分类标记(注意:此处初始化写法有问题,详见下文)。

注意与改进建议

  • required 关键字:表示这些属性在对象初始化时必须被赋值(C# 11 特性)。如果不赋值,编译器会警告/错误。
  • Tags 初始化问题:代码中写成 List Tags { get; set; } = []; 这在 C# 中不是合法语法,应改为 new List():
    • public List Tags { get; set; } = new List();
  • LastCheckTime 如果想表示“尚未检测过”,建议改为 nullable(DateTime? LastCheckTime)或使用 DateTimeOffset?,以区分默认的 DateTime.MinValue 与“无值”:
    • DateTimeOffset 更适合保存带时区的时间戳。
  • Endpoint 类型:若主要用于 URL,考虑使用 Uri 类型以获得更严格的校验。
  • Priority 校验:注释写 1-5,但代码未校验,建议在 setter 或构造/验证逻辑中添加范围校验。
  • 线程安全与集合类型:如果并发访问 Tags,考虑使用线程安全集合或在外部做好同步;如果不打算修改标签,考虑用 IReadOnlyList 替代 List。
  • 状态枚举与行为:HealthStatus、ProtocolType 未显示,实际使用时需定义清楚状态值与转换规则(比如从 Up->Down 的阈值、失败重试策略如何影响 Status 等)。

典型使用场景

  • 监控系统的配置实体:保存要周期性检测的服务列表与策略。
  • 健康聚合展示:前端或 API 拉取这些实体展示服务健康仪表盘。
  • 调度器/检测器读取这些配置并执行检测逻辑(依据 Interval、RetryCount、Timeout、Protocol 等执行网络调用并更新 Status、LastCheckTime、LastCheckDuration、ErrorMessage)。

如果需要,我可以:

  • 帮你修正代码中的语法错误并给出改进后的实现;
  • 提供一个示例枚举(ProtocolType、HealthStatus)与简单的检测逻辑示例。
评论加载中...