节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
22.09 KiB
Stardust
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using XCode;
using XCode.Cache;
using XCode.Configuration;
using XCode.DataAccessLayer;

namespace Stardust.Data;

/// <summary>应用性能。保存应用上报的性能数据,如CPU、内存、线程、句柄等</summary>
[Serializable]
[DataObject]
[Description("应用性能。保存应用上报的性能数据,如CPU、内存、线程、句柄等")]
[BindIndex("IX_AppMeter_AppId_ClientId_Id", false, "AppId,ClientId,Id")]
[BindTable("AppMeter", Description = "应用性能。保存应用上报的性能数据,如CPU、内存、线程、句柄等", ConnName = "StardustData", DbType = DatabaseType.None)]
public partial class AppMeter
{
    #region 属性
    private Int64 _Id;
    /// <summary>编号</summary>
    [DisplayName("编号")]
    [Description("编号")]
    [DataObjectField(true, false, false, 0)]
    [BindColumn("Id", "编号", "", DataScale = "time")]
    public Int64 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } }

    private Int32 _AppId;
    /// <summary>应用</summary>
    [DisplayName("应用")]
    [Description("应用")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("AppId", "应用", "")]
    public Int32 AppId { get => _AppId; set { if (OnPropertyChanging("AppId", value)) { _AppId = value; OnPropertyChanged("AppId"); } } }

    private String _ClientId;
    /// <summary>实例。应用可能多实例部署,ip@proccessid</summary>
    [DisplayName("实例")]
    [Description("实例。应用可能多实例部署,ip@proccessid")]
    [DataObjectField(false, false, true, 50)]
    [BindColumn("ClientId", "实例。应用可能多实例部署,ip@proccessid", "")]
    public String ClientId { get => _ClientId; set { if (OnPropertyChanging("ClientId", value)) { _ClientId = value; OnPropertyChanged("ClientId"); } } }

    private Int32 _NodeId;
    /// <summary>节点。节点服务器</summary>
    [DisplayName("节点")]
    [Description("节点。节点服务器")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("NodeId", "节点。节点服务器", "")]
    public Int32 NodeId { get => _NodeId; set { if (OnPropertyChanging("NodeId", value)) { _NodeId = value; OnPropertyChanged("NodeId"); } } }

    private String _Source;
    /// <summary>来源。数据来源,应用心跳、监控数据上报携带、远程发布后由StarAgent上报</summary>
    [DisplayName("来源")]
    [Description("来源。数据来源,应用心跳、监控数据上报携带、远程发布后由StarAgent上报")]
    [DataObjectField(false, false, true, 50)]
    [BindColumn("Source", "来源。数据来源,应用心跳、监控数据上报携带、远程发布后由StarAgent上报", "")]
    public String Source { get => _Source; set { if (OnPropertyChanging("Source", value)) { _Source = value; OnPropertyChanged("Source"); } } }

    private Int32 _Memory;
    /// <summary>内存。单位M</summary>
    [DisplayName("内存")]
    [Description("内存。单位M")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("Memory", "内存。单位M", "")]
    public Int32 Memory { get => _Memory; set { if (OnPropertyChanging("Memory", value)) { _Memory = value; OnPropertyChanged("Memory"); } } }

    private Int32 _ProcessorTime;
    /// <summary>处理器。处理器时间,单位s</summary>
    [DisplayName("处理器")]
    [Description("处理器。处理器时间,单位s")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("ProcessorTime", "处理器。处理器时间,单位s", "", ItemType = "TimeSpan")]
    public Int32 ProcessorTime { get => _ProcessorTime; set { if (OnPropertyChanging("ProcessorTime", value)) { _ProcessorTime = value; OnPropertyChanged("ProcessorTime"); } } }

    private Double _CpuUsage;
    /// <summary>CPU负载。处理器时间除以物理时间的占比</summary>
    [DisplayName("CPU负载")]
    [Description("CPU负载。处理器时间除以物理时间的占比")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("CpuUsage", "CPU负载。处理器时间除以物理时间的占比", "", ItemType = "percent")]
    public Double CpuUsage { get => _CpuUsage; set { if (OnPropertyChanging("CpuUsage", value)) { _CpuUsage = value; OnPropertyChanged("CpuUsage"); } } }

    private Int32 _Threads;
    /// <summary>线程数</summary>
    [DisplayName("线程数")]
    [Description("线程数")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("Threads", "线程数", "")]
    public Int32 Threads { get => _Threads; set { if (OnPropertyChanging("Threads", value)) { _Threads = value; OnPropertyChanged("Threads"); } } }

    private Int32 _WorkerThreads;
    /// <summary>工作线程。线程池可用工作线程数,主要是Task使用</summary>
    [DisplayName("工作线程")]
    [Description("工作线程。线程池可用工作线程数,主要是Task使用")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("WorkerThreads", "工作线程。线程池可用工作线程数,主要是Task使用", "")]
    public Int32 WorkerThreads { get => _WorkerThreads; set { if (OnPropertyChanging("WorkerThreads", value)) { _WorkerThreads = value; OnPropertyChanged("WorkerThreads"); } } }

    private Int32 _IOThreads;
    /// <summary>IO线程。线程池可用IO线程数,主要是网络接收所用</summary>
    [DisplayName("IO线程")]
    [Description("IO线程。线程池可用IO线程数,主要是网络接收所用")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("IOThreads", "IO线程。线程池可用IO线程数,主要是网络接收所用", "")]
    public Int32 IOThreads { get => _IOThreads; set { if (OnPropertyChanging("IOThreads", value)) { _IOThreads = value; OnPropertyChanged("IOThreads"); } } }

    private Int32 _AvailableThreads;
    /// <summary>活跃线程。线程池活跃线程数,辅助分析线程饥渴问题</summary>
    [DisplayName("活跃线程")]
    [Description("活跃线程。线程池活跃线程数,辅助分析线程饥渴问题")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("AvailableThreads", "活跃线程。线程池活跃线程数,辅助分析线程饥渴问题", "")]
    public Int32 AvailableThreads { get => _AvailableThreads; set { if (OnPropertyChanging("AvailableThreads", value)) { _AvailableThreads = value; OnPropertyChanged("AvailableThreads"); } } }

    private Int64 _PendingItems;
    /// <summary>挂起任务。线程池挂起任务数,辅助分析线程饥渴问题</summary>
    [DisplayName("挂起任务")]
    [Description("挂起任务。线程池挂起任务数,辅助分析线程饥渴问题")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("PendingItems", "挂起任务。线程池挂起任务数,辅助分析线程饥渴问题", "")]
    public Int64 PendingItems { get => _PendingItems; set { if (OnPropertyChanging("PendingItems", value)) { _PendingItems = value; OnPropertyChanged("PendingItems"); } } }

    private Int64 _CompletedItems;
    /// <summary>完成任务。线程池已完成任务数,辅助分析线程饥渴问题</summary>
    [DisplayName("完成任务")]
    [Description("完成任务。线程池已完成任务数,辅助分析线程饥渴问题")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("CompletedItems", "完成任务。线程池已完成任务数,辅助分析线程饥渴问题", "")]
    public Int64 CompletedItems { get => _CompletedItems; set { if (OnPropertyChanging("CompletedItems", value)) { _CompletedItems = value; OnPropertyChanged("CompletedItems"); } } }

    private Int32 _Handles;
    /// <summary>句柄数</summary>
    [DisplayName("句柄数")]
    [Description("句柄数")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("Handles", "句柄数", "")]
    public Int32 Handles { get => _Handles; set { if (OnPropertyChanging("Handles", value)) { _Handles = value; OnPropertyChanged("Handles"); } } }

    private Int32 _Connections;
    /// <summary>连接数</summary>
    [DisplayName("连接数")]
    [Description("连接数")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("Connections", "连接数", "")]
    public Int32 Connections { get => _Connections; set { if (OnPropertyChanging("Connections", value)) { _Connections = value; OnPropertyChanged("Connections"); } } }

    private Int32 _GCCount;
    /// <summary>GC次数。周期时间内发生GC的次数</summary>
    [DisplayName("GC次数")]
    [Description("GC次数。周期时间内发生GC的次数")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("GCCount", "GC次数。周期时间内发生GC的次数", "")]
    public Int32 GCCount { get => _GCCount; set { if (OnPropertyChanging("GCCount", value)) { _GCCount = value; OnPropertyChanged("GCCount"); } } }

    private Int32 _HeapSize;
    /// <summary>堆内存。单位M</summary>
    [DisplayName("堆内存")]
    [Description("堆内存。单位M")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("HeapSize", "堆内存。单位M", "")]
    public Int32 HeapSize { get => _HeapSize; set { if (OnPropertyChanging("HeapSize", value)) { _HeapSize = value; OnPropertyChanged("HeapSize"); } } }

    private DateTime _Time;
    /// <summary>采集时间</summary>
    [DisplayName("采集时间")]
    [Description("采集时间")]
    [DataObjectField(false, false, true, 0)]
    [BindColumn("Time", "采集时间", "")]
    public DateTime Time { get => _Time; set { if (OnPropertyChanging("Time", value)) { _Time = value; OnPropertyChanged("Time"); } } }

    private String _Creator;
    /// <summary>创建者。服务端节点</summary>
    [Category("扩展")]
    [DisplayName("创建者")]
    [Description("创建者。服务端节点")]
    [DataObjectField(false, false, true, 50)]
    [BindColumn("Creator", "创建者。服务端节点", "")]
    public String Creator { get => _Creator; set { if (OnPropertyChanging("Creator", value)) { _Creator = value; OnPropertyChanged("Creator"); } } }

    private DateTime _CreateTime;
    /// <summary>创建时间</summary>
    [Category("扩展")]
    [DisplayName("创建时间")]
    [Description("创建时间")]
    [DataObjectField(false, false, true, 0)]
    [BindColumn("CreateTime", "创建时间", "")]
    public DateTime CreateTime { get => _CreateTime; set { if (OnPropertyChanging("CreateTime", value)) { _CreateTime = value; OnPropertyChanged("CreateTime"); } } }

    private String _CreateIP;
    /// <summary>创建地址</summary>
    [Category("扩展")]
    [DisplayName("创建地址")]
    [Description("创建地址")]
    [DataObjectField(false, false, true, 50)]
    [BindColumn("CreateIP", "创建地址", "")]
    public String CreateIP { get => _CreateIP; set { if (OnPropertyChanging("CreateIP", value)) { _CreateIP = value; OnPropertyChanged("CreateIP"); } } }
    #endregion

    #region 获取/设置 字段值
    /// <summary>获取/设置 字段值</summary>
    /// <param name="name">字段名</param>
    /// <returns></returns>
    public override Object this[String name]
    {
        get => name switch
        {
            "Id" => _Id,
            "AppId" => _AppId,
            "ClientId" => _ClientId,
            "NodeId" => _NodeId,
            "Source" => _Source,
            "Memory" => _Memory,
            "ProcessorTime" => _ProcessorTime,
            "CpuUsage" => _CpuUsage,
            "Threads" => _Threads,
            "WorkerThreads" => _WorkerThreads,
            "IOThreads" => _IOThreads,
            "AvailableThreads" => _AvailableThreads,
            "PendingItems" => _PendingItems,
            "CompletedItems" => _CompletedItems,
            "Handles" => _Handles,
            "Connections" => _Connections,
            "GCCount" => _GCCount,
            "HeapSize" => _HeapSize,
            "Time" => _Time,
            "Creator" => _Creator,
            "CreateTime" => _CreateTime,
            "CreateIP" => _CreateIP,
            _ => base[name]
        };
        set
        {
            switch (name)
            {
                case "Id": _Id = value.ToLong(); break;
                case "AppId": _AppId = value.ToInt(); break;
                case "ClientId": _ClientId = Convert.ToString(value); break;
                case "NodeId": _NodeId = value.ToInt(); break;
                case "Source": _Source = Convert.ToString(value); break;
                case "Memory": _Memory = value.ToInt(); break;
                case "ProcessorTime": _ProcessorTime = value.ToInt(); break;
                case "CpuUsage": _CpuUsage = value.ToDouble(); break;
                case "Threads": _Threads = value.ToInt(); break;
                case "WorkerThreads": _WorkerThreads = value.ToInt(); break;
                case "IOThreads": _IOThreads = value.ToInt(); break;
                case "AvailableThreads": _AvailableThreads = value.ToInt(); break;
                case "PendingItems": _PendingItems = value.ToLong(); break;
                case "CompletedItems": _CompletedItems = value.ToLong(); break;
                case "Handles": _Handles = value.ToInt(); break;
                case "Connections": _Connections = value.ToInt(); break;
                case "GCCount": _GCCount = value.ToInt(); break;
                case "HeapSize": _HeapSize = value.ToInt(); break;
                case "Time": _Time = value.ToDateTime(); break;
                case "Creator": _Creator = Convert.ToString(value); break;
                case "CreateTime": _CreateTime = value.ToDateTime(); break;
                case "CreateIP": _CreateIP = Convert.ToString(value); break;
                default: base[name] = value; break;
            }
        }
    }
    #endregion

    #region 关联映射
    /// <summary>应用</summary>
    [XmlIgnore, IgnoreDataMember, ScriptIgnore]
    public Stardust.Data.App App => Extends.Get(nameof(App), k => Stardust.Data.App.FindById(AppId));

    /// <summary>应用</summary>
    [Map(nameof(AppId), typeof(Stardust.Data.App), "Id")]
    public String AppName => App?.Name;

    /// <summary>节点</summary>
    [XmlIgnore, IgnoreDataMember, ScriptIgnore]
    public Stardust.Data.Nodes.Node Node => Extends.Get(nameof(Node), k => Stardust.Data.Nodes.Node.FindByID(NodeId));

    /// <summary>节点</summary>
    [Map(nameof(NodeId), typeof(Stardust.Data.Nodes.Node), "ID")]
    public String NodeName => Node?.Name;

    #endregion

    #region 扩展查询
    #endregion

    #region 高级查询
    /// <summary>高级查询</summary>
    /// <param name="appId">应用</param>
    /// <param name="clientId">实例。应用可能多实例部署,ip@proccessid</param>
    /// <param name="nodeId">节点。节点服务器</param>
    /// <param name="start">编号开始</param>
    /// <param name="end">编号结束</param>
    /// <param name="key">关键字</param>
    /// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
    /// <returns>实体列表</returns>
    public static IList<AppMeter> Search(Int32 appId, String clientId, Int32 nodeId, DateTime start, DateTime end, String key, PageParameter page)
    {
        var exp = new WhereExpression();

        if (appId >= 0) exp &= _.AppId == appId;
        if (!clientId.IsNullOrEmpty()) exp &= _.ClientId == clientId;
        if (nodeId >= 0) exp &= _.NodeId == nodeId;
        exp &= _.Id.Between(start, end, Meta.Factory.Snow);
        if (!key.IsNullOrEmpty()) exp &= SearchWhereByKeys(key);

        return FindAll(exp, page);
    }
    #endregion

    #region 数据清理
    /// <summary>清理指定时间段内的数据</summary>
    /// <param name="start">开始时间。未指定时清理小于指定时间的所有数据</param>
    /// <param name="end">结束时间</param>
    /// <param name="maximumRows">最大删除行数。清理历史数据时,避免一次性删除过多导致数据库IO跟不上,0表示所有</param>
    /// <returns>清理行数</returns>
    public static Int32 DeleteWith(DateTime start, DateTime end, Int32 maximumRows = 0)
    {
        return Delete(_.Id.Between(start, end, Meta.Factory.Snow), maximumRows);
    }
    #endregion

    #region 字段名
    /// <summary>取得应用性能字段信息的快捷方式</summary>
    public partial class _
    {
        /// <summary>编号</summary>
        public static readonly Field Id = FindByName("Id");

        /// <summary>应用</summary>
        public static readonly Field AppId = FindByName("AppId");

        /// <summary>实例。应用可能多实例部署,ip@proccessid</summary>
        public static readonly Field ClientId = FindByName("ClientId");

        /// <summary>节点。节点服务器</summary>
        public static readonly Field NodeId = FindByName("NodeId");

        /// <summary>来源。数据来源,应用心跳、监控数据上报携带、远程发布后由StarAgent上报</summary>
        public static readonly Field Source = FindByName("Source");

        /// <summary>内存。单位M</summary>
        public static readonly Field Memory = FindByName("Memory");

        /// <summary>处理器。处理器时间,单位s</summary>
        public static readonly Field ProcessorTime = FindByName("ProcessorTime");

        /// <summary>CPU负载。处理器时间除以物理时间的占比</summary>
        public static readonly Field CpuUsage = FindByName("CpuUsage");

        /// <summary>线程数</summary>
        public static readonly Field Threads = FindByName("Threads");

        /// <summary>工作线程。线程池可用工作线程数,主要是Task使用</summary>
        public static readonly Field WorkerThreads = FindByName("WorkerThreads");

        /// <summary>IO线程。线程池可用IO线程数,主要是网络接收所用</summary>
        public static readonly Field IOThreads = FindByName("IOThreads");

        /// <summary>活跃线程。线程池活跃线程数,辅助分析线程饥渴问题</summary>
        public static readonly Field AvailableThreads = FindByName("AvailableThreads");

        /// <summary>挂起任务。线程池挂起任务数,辅助分析线程饥渴问题</summary>
        public static readonly Field PendingItems = FindByName("PendingItems");

        /// <summary>完成任务。线程池已完成任务数,辅助分析线程饥渴问题</summary>
        public static readonly Field CompletedItems = FindByName("CompletedItems");

        /// <summary>句柄数</summary>
        public static readonly Field Handles = FindByName("Handles");

        /// <summary>连接数</summary>
        public static readonly Field Connections = FindByName("Connections");

        /// <summary>GC次数。周期时间内发生GC的次数</summary>
        public static readonly Field GCCount = FindByName("GCCount");

        /// <summary>堆内存。单位M</summary>
        public static readonly Field HeapSize = FindByName("HeapSize");

        /// <summary>采集时间</summary>
        public static readonly Field Time = FindByName("Time");

        /// <summary>创建者。服务端节点</summary>
        public static readonly Field Creator = FindByName("Creator");

        /// <summary>创建时间</summary>
        public static readonly Field CreateTime = FindByName("CreateTime");

        /// <summary>创建地址</summary>
        public static readonly Field CreateIP = FindByName("CreateIP");

        static Field FindByName(String name) => Meta.Table.FindByName(name);
    }

    /// <summary>取得应用性能字段名称的快捷方式</summary>
    public partial class __
    {
        /// <summary>编号</summary>
        public const String Id = "Id";

        /// <summary>应用</summary>
        public const String AppId = "AppId";

        /// <summary>实例。应用可能多实例部署,ip@proccessid</summary>
        public const String ClientId = "ClientId";

        /// <summary>节点。节点服务器</summary>
        public const String NodeId = "NodeId";

        /// <summary>来源。数据来源,应用心跳、监控数据上报携带、远程发布后由StarAgent上报</summary>
        public const String Source = "Source";

        /// <summary>内存。单位M</summary>
        public const String Memory = "Memory";

        /// <summary>处理器。处理器时间,单位s</summary>
        public const String ProcessorTime = "ProcessorTime";

        /// <summary>CPU负载。处理器时间除以物理时间的占比</summary>
        public const String CpuUsage = "CpuUsage";

        /// <summary>线程数</summary>
        public const String Threads = "Threads";

        /// <summary>工作线程。线程池可用工作线程数,主要是Task使用</summary>
        public const String WorkerThreads = "WorkerThreads";

        /// <summary>IO线程。线程池可用IO线程数,主要是网络接收所用</summary>
        public const String IOThreads = "IOThreads";

        /// <summary>活跃线程。线程池活跃线程数,辅助分析线程饥渴问题</summary>
        public const String AvailableThreads = "AvailableThreads";

        /// <summary>挂起任务。线程池挂起任务数,辅助分析线程饥渴问题</summary>
        public const String PendingItems = "PendingItems";

        /// <summary>完成任务。线程池已完成任务数,辅助分析线程饥渴问题</summary>
        public const String CompletedItems = "CompletedItems";

        /// <summary>句柄数</summary>
        public const String Handles = "Handles";

        /// <summary>连接数</summary>
        public const String Connections = "Connections";

        /// <summary>GC次数。周期时间内发生GC的次数</summary>
        public const String GCCount = "GCCount";

        /// <summary>堆内存。单位M</summary>
        public const String HeapSize = "HeapSize";

        /// <summary>采集时间</summary>
        public const String Time = "Time";

        /// <summary>创建者。服务端节点</summary>
        public const String Creator = "Creator";

        /// <summary>创建时间</summary>
        public const String CreateTime = "CreateTime";

        /// <summary>创建地址</summary>
        public const String CreateIP = "CreateIP";
    }
    #endregion
}