减少TraceItem数据量较大时的性能浪费
智能大石头 authored at 2024-10-22 08:41:14
16.33 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 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>处理器。处理器时间,单位ms</summary>
    [DisplayName("处理器")]
    [Description("处理器。处理器时间,单位ms")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("ProcessorTime", "处理器。处理器时间,单位ms", "")]
    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 _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 Double _GCPause;
    /// <summary>GC暂停。时间占比,百分之一</summary>
    [DisplayName("GC暂停")]
    [Description("GC暂停。时间占比,百分之一")]
    [DataObjectField(false, false, false, 0)]
    [BindColumn("GCPause", "GC暂停。时间占比,百分之一", "")]
    public Double GCPause { get => _GCPause; set { if (OnPropertyChanging("GCPause", value)) { _GCPause = value; OnPropertyChanged("GCPause"); } } }

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

    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,
            "Source" => _Source,
            "Memory" => _Memory,
            "ProcessorTime" => _ProcessorTime,
            "CpuUsage" => _CpuUsage,
            "Threads" => _Threads,
            "WorkerThreads" => _WorkerThreads,
            "IOThreads" => _IOThreads,
            "Handles" => _Handles,
            "Connections" => _Connections,
            "GCPause" => _GCPause,
            "FullGC" => _FullGC,
            "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 "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 "Handles": _Handles = value.ToInt(); break;
                case "Connections": _Connections = value.ToInt(); break;
                case "GCPause": _GCPause = value.ToDouble(); break;
                case "FullGC": _FullGC = 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 关联映射
    #endregion

    #region 扩展查询
    #endregion

    #region 数据清理
    /// <summary>清理指定时间段内的数据</summary>
    /// <param name="start">开始时间。未指定时清理小于指定时间的所有数据</param>
    /// <param name="end">结束时间</param>
    /// <returns>清理行数</returns>
    public static Int32 DeleteWith(DateTime start, DateTime end)
    {
        return Delete(_.Id.Between(start, end, Meta.Factory.Snow));
    }
    #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>来源。数据来源,应用心跳、监控数据上报携带、远程发布后由StarAgent上报</summary>
        public static readonly Field Source = FindByName("Source");

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

        /// <summary>处理器。处理器时间,单位ms</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 Handles = FindByName("Handles");

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

        /// <summary>GC暂停。时间占比,百分之一</summary>
        public static readonly Field GCPause = FindByName("GCPause");

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

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

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

        /// <summary>处理器。处理器时间,单位ms</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 Handles = "Handles";

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

        /// <summary>GC暂停。时间占比,百分之一</summary>
        public const String GCPause = "GCPause";

        /// <summary>完全GC。周期时间内发生二代GC的次数</summary>
        public const String FullGC = "FullGC";

        /// <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
}