[Stardust] master 自动提交

This commit is contained in:
大石头 2025-07-24 08:02:25 +08:00
parent ea51b3bef5
commit 90bd82406e
38 changed files with 0 additions and 12905 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,40 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net461;net6.0;net7.0;net8.0</TargetFrameworks>
<AssemblyTitle>星尘发布</AssemblyTitle>
<Description>自动下载代码,编译后打包输出并推送发布中心。</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\Bin\DeployAgent</OutputPath>
<!--<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>-->
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\Doc\newlife.snk</AssemblyOriginatorKeyFile>
<IsPackable>False</IsPackable>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)'=='net8.0'">
<PublishAot>true</PublishAot>
<OptimizationPreference>Size</OptimizationPreference>
<InvariantGlobalization>true</InvariantGlobalization>
<StackTraceSupport>false</StackTraceSupport>
</PropertyGroup>
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

View File

@ -1,39 +0,0 @@
using NewLife;
using NewLife.Model;
using NewLife.Remoting.Clients;
using NewLife.Serialization;
using Stardust;
using Stardust.Models;
namespace DeployAgent;
public class DeployWorker : IHostedService
{
private readonly StarFactory _factory;
public DeployWorker(StarFactory factory)
{
_factory = factory;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_factory.App.RegisterCommand("deploy/compile", OnCompile);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
private String OnCompile(String args)
{
if (args.IsNullOrEmpty()) throw new ArgumentNullException(nameof(args));
var cmd = args.ToJsonEntity<CompileCommand>();
if (cmd == null || cmd.Repository.IsNullOrEmpty()) throw new ArgumentNullException(nameof(cmd.Repository));
//todo 拉取代码编译逻辑
return "OK";
}
}

View File

@ -1,23 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net40;net45;net5.0;net6.0;net7.0</TargetFrameworks>
<AssemblyTitle>安装器</AssemblyTitle>
<Description>安装辅助工具</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2023 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\Bin\Agent</OutputPath>
<!--<ImplicitUsings>enable</ImplicitUsings>-->
<LangVersion>latest</LangVersion>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>

View File

@ -1,30 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net45;netstandard2.0</TargetFrameworks>
<AssemblyTitle>MySql助手</AssemblyTitle>
<Description>监控MySql性能上报星尘平台</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\..\Bin\Agent</OutputPath>
<!--<GenerateDocumentationFile>True</GenerateDocumentationFile>-->
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<IsPackable>False</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.XCode" Version="11.16.2024.1005" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

View File

@ -1,26 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net45;netstandard2.0</TargetFrameworks>
<AssemblyTitle>网络监测</AssemblyTitle>
<Description>检测网络,如果长期不可用,则重启系统,主要应用于嵌入式工控机</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\..\Bin\Agent</OutputPath>
<!--<GenerateDocumentationFile>True</GenerateDocumentationFile>-->
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<IsPackable>False</IsPackable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

137
Readme.MD
View File

@ -1,137 +0,0 @@
# NewLife.Stardust - 星尘分布式平台
![GitHub top language](https://img.shields.io/github/languages/top/newlifex/stardust?logo=github)
![GitHub License](https://img.shields.io/github/license/newlifex/stardust?logo=github)
![Nuget Downloads](https://img.shields.io/nuget/dt/newlife.stardust?logo=nuget)
![Nuget](https://img.shields.io/nuget/v/newlife.stardust?logo=nuget)
![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/newlife.stardust?label=dev%20nuget&logo=nuget)
![Nuget Downloads](https://img.shields.io/nuget/dt/newlife.stardust.extensions?logo=nuget)
![Nuget](https://img.shields.io/nuget/v/newlife.stardust.extensions?logo=nuget)
![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/newlife.stardust.extensions?label=dev%20nuget&logo=nuget)
## 星尘
应用服务犹如宇宙中的尘埃,而作为应用服务承载体的计算机节点是为星星,星星与尘埃构成整个浩瀚星空,即为星尘!
![XCode](Doc/星尘分布式.png)
Stardust 星尘,轻量级分布式服务框架!
集群管理、配置中心、性能监控、远程发布、服务治理。服务自动注册和发现,负载均衡,动态伸缩,故障转移。
演示系统:[http://star.newlifex.com](http://star.newlifex.com)
## 核心功能
1. [x] 星尘代理。StarAgent部署在每台应用服务器作为系统服务负责守护本地应用及监控节点性能支持Windows/Linux/IoT
2. [x] 节点管理。中心化管理多机器上的海量StarAgent支持机房内服务器节点、远端桌面工控机以及物联网边缘计算节点
3. [x] 应用管理。为每个应用系统分配接入密钥,用于配置中心、应用监控、服务注册、服务发现等
4. [x] 配置中心。各应用从配置中心读取自己的配置信息,有利于应用的多实例部署以及集中管理
5. [x] 监控中心。各应用(服务提供者和服务消费者)向中心上报性能指标等监控数据
6. [x] 注册中心。各微服务应用(服务提供者)向注册中心上报自身服务信息
7. [x] 服务发现。各业务应用(服务消费者)从注册中心拉取指定服务的提供者信息,分布式调用(不经网关)
8. [x] 远程发布。在星尘控制台上发布应用包到多台安装有星尘代理的应用服务器或物联网边缘节点StarAgent负责拉起并守护进程
9. [x] 日志中心。各应用服务提供者和服务消费者向中心上报日志数据统一在星尘Web查看
### 监控中心
星尘监控介绍 [https://newlifex.com/blood/stardust_monitor](https://newlifex.com/blood/stardust_monitor)
应用监控
![XCode](Doc/应用监控.png)
物联网平台远程控制花园水泵的调用链 [传送门](http://star.newlifex.com/trace?id=ac15452e1649035594650011be21ec)
![XCode](Doc/调用链.png)
关系图
![XCode](Doc/关系图.png)
### 设计概要
提供者P向星尘S注册自己拥有的10个服务接口消费者C也登入星尘S得到访问令牌T查找到某个接口刚好是P提供于是得到了P的服务地址然后C直连P并使用访问令牌T表明身份
```sequence{theme="simple"}
提供者->星尘: Key登录
note over 星尘: key/secret
提供者-->>星尘: 注册服务
消费者->星尘: Key登录
星尘-->消费者: 访问令牌Token
note left of 消费者: 向提供者验明身份
消费者->星尘: 查询服务
星尘-->消费者: 服务所在提供者列表
消费者->提供者: Token令牌登录
提供者-->消费者: 登录成功
提供者-->>星尘: 汇报状态
消费者->提供者: 请求服务
提供者-->消费者: 响应数据
```
### ServiceMesh架构
Sidecar设计模式正在收到越来越多的关注和采用。作为Service Mesh的重要要素Sidecar模式对于构建高度高度可伸缩、有弹性、安全且可便于监控的微服务架构系统至关重要。它降低了与微服务架构相关的复杂性并提供了负载平衡、服务发现、流量管理、电路中断、遥测、故障注入等功能特性。
```sequence{theme="simple"}
消费者->本机代理: 初始化
本机代理->星尘: Key登录
星尘-->本机代理: 访问令牌Token
本机代理->星尘: 查询服务
星尘-->本机代理: 服务所在提供者列表
本机代理->提供者: Token令牌登录
提供者-->本机代理: 登录成功
本机代理-->>星尘: 汇报状态
消费者->本机代理: 请求服务
本机代理->提供者: 请求服务
提供者-->本机代理: 响应数据
本机代理-->消费者: 响应数据
```
## 新生命项目矩阵
各项目默认支持net7.0/netstandard2.1/netstandard2.0/net4.61旧版2022.1225支持net4.5/net4.0/net2.0
| 项目 | 年份 | 说明 |
| :--------------------------------------------------------------: | :---: | -------------------------------------------------------------------------------------- |
| 基础组件 | | 支撑其它中间件以及产品项目 |
| [NewLife.Core](https://github.com/NewLifeX/X) | 2002 | 核心库日志、配置、缓存、网络、序列化、APM性能追踪 |
| [NewLife.XCode](https://github.com/NewLifeX/NewLife.XCode) | 2005 | 大数据中间件单表百亿级MySql/SQLite/SqlServer/Oracle/TDengine/达梦,自动分表 |
| [NewLife.Net](https://github.com/NewLifeX/NewLife.Net) | 2005 | 网络库单机千万级吞吐率2266万tps单机百万级连接400万Tcp |
| [NewLife.Remoting](https://github.com/NewLifeX/NewLife.Remoting) | 2011 | RPC通信框架内网高吞吐或物联网硬件设备场景 |
| [NewLife.Cube](https://github.com/NewLifeX/NewLife.Cube) | 2010 | 魔方快速开发平台集成了用户权限、SSO登录、OAuth服务端等单表100亿级项目验证 |
| [NewLife.Agent](https://github.com/NewLifeX/NewLife.Agent) | 2008 | 服务管理组件把应用安装成为操作系统守护进程Windows服务、Linux的Systemd |
| [NewLife.Zero](https://github.com/NewLifeX/NewLife.Zero) | 2020 | Zero零代脚手架基于NewLife组件生态的项目模板Web、WebApi、Service |
| 中间件 | | 对接知名中间件平台 |
| [NewLife.Redis](https://github.com/NewLifeX/NewLife.Redis) | 2017 | Redis客户端微秒级延迟百万级吞吐丰富的消息队列百亿级数据量项目验证 |
| [NewLife.RocketMQ](https://github.com/NewLifeX/NewLife.RocketMQ) | 2018 | RocketMQ纯托管客户端支持Apache RocketMQ和阿里云消息队列十亿级项目验 |
| [NewLife.MQTT](https://github.com/NewLifeX/NewLife.MQTT) | 2019 | 物联网消息协议MqttClient/MqttServer客户端支持阿里云物联网 |
| [NewLife.IoT](https://github.com/NewLifeX/NewLife.IoT) | 2022 | IoT标准库定义物联网领域的各种通信协议标准规范 |
| [NewLife.Modbus](https://github.com/NewLifeX/NewLife.Modbus) | 2022 | ModbusTcp/ModbusRTU/ModbusASCII基于IoT标准库实现支持IoT平台和IoTEdge |
| [NewLife.Siemens](https://github.com/NewLifeX/NewLife.Siemens) | 2022 | 西门子PLC协议基于IoT标准库实现支持IoT平台和IoTEdge |
| [NewLife.Map](https://github.com/NewLifeX/NewLife.Map) | 2022 | 地图组件库,封装百度地图、高德地图和腾讯地图 |
| [NewLife.IP](https://github.com/NewLifeX/NewLife.IP) | 2022 | IP地址库IP地址转物理地址 |
| 产品平台 | | 产品平台级,编译部署即用,个性化自定义 |
| [AntJob](https://github.com/NewLifeX/AntJob) | 2019 | 蚂蚁调度,分布式大数据计算平台(实时/离线),蚂蚁搬家分片思想,万亿级数据量项目验证 |
| [Stardust](https://github.com/NewLifeX/Stardust) | 2018 | 星尘分布式服务平台节点管理、APM监控中心、配置中心、注册中心、发布中心 |
| [NewLife.ERP](https://github.com/NewLifeX/NewLife.ERP) | 2021 | 企业ERP产品管理、客户管理、销售管理、供应商管理 |
| [CrazyCoder](https://github.com/NewLifeX/XCoder) | 2006 | 码神工具众多开发者工具网络、串口、加解密、正则表达式、Modbus |
| [XProxy](https://github.com/NewLifeX/XProxy) | 2005 | 产品级反向代理NAT代理、Http代理 |
| [HttpMeter](https://github.com/NewLifeX/HttpMeter) | 2022 | Http压力测试工具 |
| [GitCandy](https://github.com/NewLifeX/GitCandy) | 2015 | Git源代码管理系统 |
| [SmartOS](https://github.com/NewLifeX/SmartOS) | 2014 | 嵌入式操作系统完全独立自主支持ARM Cortex-M芯片架构 |
| [SmartA2](https://github.com/NewLifeX/SmartA2) | 2019 | 嵌入式工业计算机,物联网边缘网关,高性能.NET6主机应用于工业、农业、交通、医疗 |
| 菲凡物联FIoT | 2020 | 物联网整体解决方案,建筑、环保、农业,软硬件及大数据分析一体化,单机十万级点位项目验证 |
| NewLife.UWB | 2020 | 厘米级10~20cm高精度室内定位软硬件一体化与其它系统联动大型展厅项目验证 |
## 新生命开发团队
![XCode](https://newlifex.com/logo.png)
新生命团队NewLife成立于2002年是新时代物联网行业解决方案提供者致力于提供软硬件应用方案咨询、系统架构规划与开发服务。
团队主导的开源NewLife系列组件已被广泛应用于各行业Nuget累计下载量高达60余万次。
团队开发的大数据核心组件NewLife.XCode、蚂蚁调度计算平台AntJob、星尘分布式平台Stardust、缓存队列组件NewLife.Redis以及物联网平台NewLife.IoT均成功应用于电力、高校、互联网、电信、交通、物流、工控、医疗、文博等行业为客户提供了大量先进、可靠、安全、高质量、易扩展的产品和系统集成服务。
我们将不断通过服务的持续改进成为客户长期信赖的合作伙伴通过不断的创新和发展成为国内优秀的IT服务供应商。
`新生命团队始于2002年部分开源项目具有20年以上漫长历史源码库保留有2010年以来所有修改记录`
网站https://newlifex.com
开源https://github.com/newlifex
QQ群1600800/1600838
微信公众号:
![智能大石头](https://newlifex.com/stone.jpg)

View File

@ -1,24 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\..\Bin\Samples\TestA</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.0.2024.1013-beta0746" />
</ItemGroup>
</Project>

View File

@ -1,24 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\..\Bin\Samples\TestB</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="11.0.2024.1013-beta0746" />
</ItemGroup>
</Project>

View File

@ -1,20 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>1.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\..\Bin\Samples\TestC</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -1,96 +0,0 @@
using System.Net.NetworkInformation;
using System.Reflection;
using NewLife;
using NewLife.Agent;
using NewLife.Agent.Command;
using NewLife.Data;
using NewLife.Log;
using NewLife.Reflection;
using Stardust;
namespace StarAgent.CommandHandler;
public class ShowMachineInfo : BaseCommandHandler
{
public ShowMachineInfo(ServiceBase service) : base(service)
{
Cmd = "-ShowMachineInfo";
Description = "服务器信息";
ShortcutKey = 't';
}
public override void Process(String[] args)
{
var service = (MyService)Service;
//foreach (var di in StarClient.GetDrives())
//{
// XTrace.WriteLine($"{di.Name}\tIsReady={di.IsReady} DriveType={di.DriveType} DriveFormat={di.DriveFormat} TotalSize={di.TotalSize} TotalFreeSpace={di.TotalFreeSpace}");
//}
XTrace.WriteLine("FullPath:{0}", ".".GetFullPath());
XTrace.WriteLine("BasePath:{0}", ".".GetBasePath());
XTrace.WriteLine("TempPath:{0}", Path.GetTempPath());
var mi = MachineInfo.Current ?? MachineInfo.RegisterAsync().Result;
mi.Refresh();
var pis = mi.GetType().GetProperties(true);
// 机器信息
foreach (var pi in pis)
{
var val = mi.GetValue(pi);
if (pi.Name.EndsWithIgnoreCase("Memory"))
val = val.ToLong().ToGMK();
else if (pi.Name.EndsWithIgnoreCase("Rate", "Battery"))
val = val.ToDouble().ToString("p2");
XTrace.WriteLine("{0}:\t{1}", pi.Name, val);
}
// 机器扩展
var ext = mi as IExtend;
foreach (var item in ext.Items)
{
XTrace.WriteLine("{0}:\t{1}", item.Key, item.Value);
}
var client = service._Client ?? new StarClient();
var ni = client.GetNodeInfo();
var pis2 = ni.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var pi in pis2)
{
if (pis.Any(e => e.Name == pi.Name)) continue;
var val = ni.GetValue(pi);
if (pi.Name.EndsWithIgnoreCase("Memory"))
val = val.ToLong().ToGMK();
else if (pi.Name.EndsWithIgnoreCase("Rate", "Battery"))
val = val.ToDouble().ToString("p2");
XTrace.WriteLine("{0}:\t{1}", pi.Name, val);
}
// 网络信息
XTrace.WriteLine("NetworkAvailable:{0}", NetworkInterface.GetIsNetworkAvailable());
foreach (var item in NetworkInterface.GetAllNetworkInterfaces())
{
//if (item.OperationalStatus != OperationalStatus.Up) continue;
if (item.NetworkInterfaceType is NetworkInterfaceType.Loopback or NetworkInterfaceType.Unknown or NetworkInterfaceType.Tunnel) continue;
XTrace.WriteLine("{0} {1} {2}", item.NetworkInterfaceType, item.OperationalStatus, item.Name);
XTrace.WriteLine("\tDescription:\t{0}", item.Description);
XTrace.WriteLine("\tMac:\t{0}", item.GetPhysicalAddress().GetAddressBytes().ToHex("-"));
var ipp = item.GetIPProperties();
if (ipp != null && ipp.UnicastAddresses.Any(e => e.Address.IsIPv4()))
{
XTrace.WriteLine("\tIP:\t{0}", ipp.UnicastAddresses.Where(e => e.Address.IsIPv4()).Join(",", e => e.Address));
if (ipp.GatewayAddresses.Any(e => e.Address.IsIPv4()))
XTrace.WriteLine("\tGateway:{0}", ipp.GatewayAddresses.Where(e => e.Address.IsIPv4()).Join(",", e => e.Address));
if (ipp.DnsAddresses.Any(e => e.IsIPv4()))
XTrace.WriteLine("\tDns:\t{0}", ipp.DnsAddresses.Where(e => e.IsIPv4()).Join());
}
}
}
}

View File

@ -1,40 +0,0 @@
using NewLife.Agent.Command;
using NewLife.Agent;
using NewLife;
using NewLife.Serialization;
namespace StarAgent.CommandHandler;
public class UseMicroService : BaseCommandHandler
{
public UseMicroService(ServiceBase service) : base(service)
{
Cmd = "-UseMicroService";
Description = "测试微服务";
ShortcutKey = 'w';
}
private String _lastService;
public override void Process(String[] args)
{
var service = (MyService)Service;
if (_lastService.IsNullOrEmpty())
Console.WriteLine("请输入要测试的微服务名称:");
else
Console.WriteLine("请输入要测试的微服务名称({0}", _lastService);
var serviceName = Console.ReadLine();
if (serviceName.IsNullOrEmpty()) serviceName = _lastService;
if (serviceName.IsNullOrEmpty()) return;
_lastService = serviceName;
service.StartFactory();
var models = service._factory.Service.ResolveAsync(serviceName).Result;
//if (models == null) models = _factory.Dust.ResolveAsync(new ConsumeServiceInfo { ServiceName = serviceName }).Result;
Console.WriteLine(models.ToJson(true));
}
}

View File

@ -1,206 +0,0 @@
using System.Diagnostics;
using NewLife;
using NewLife.Agent;
using NewLife.Log;
using NewLife.Remoting.Clients;
using NewLife.Remoting.Models;
using NewLife.Serialization;
using Stardust;
using Stardust.Models;
namespace StarAgent;
internal class MyStarClient : StarClient
{
#region
//public IHost Host { get; set; }
public ServiceBase Service { get; set; }
public StarAgentSetting AgentSetting { get; set; }
///// <summary>项目名。新节点默认所需要加入的项目</summary>
//public String Project { get; set; }
private Boolean InService
{
get
{
var inService = "-s".EqualIgnoreCase(Environment.GetCommandLineArgs());
if (inService) return true;
// 以服务方式运行时,重启服务,否则采取拉起进程的方式
if (Service != null && Service.Host is DefaultHost host && host.InService) return true;
return false;
}
}
#endregion
#region
public override void Open()
{
this.RegisterCommand("node/restart", Restart);
this.RegisterCommand("node/reboot", Reboot);
this.RegisterCommand("node/setchannel", SetChannel);
base.Open();
}
public override ILoginRequest BuildLoginRequest()
{
var set = AgentSetting;
var request = base.BuildLoginRequest();
if (request is LoginInfo req)
{
req.Project = set.Project;
var info = req.Node;
if (info != null && InService)
{
if (!set.Dpi.IsNullOrEmpty()) info.Dpi = set.Dpi;
if (!set.Resolution.IsNullOrEmpty()) info.Resolution = set.Resolution;
}
}
return request;
}
#endregion
#region
public override Task<IUpgradeInfo> Upgrade(String channel, CancellationToken cancellationToken = default)
{
if (channel.IsNullOrEmpty()) channel = AgentSetting.Channel;
return base.Upgrade(channel, cancellationToken);
}
protected override void Restart(Upgrade upgrade)
{
// 带有-s参数就算是服务中运行
var inService = "-s".EqualIgnoreCase(Environment.GetCommandLineArgs());
var pid = Process.GetCurrentProcess().Id;
// 以服务方式运行时,重启服务,否则采取拉起进程的方式
if (inService || Service.Host is DefaultHost host && host.InService)
{
this.WriteInfoEvent("Upgrade", "强制更新完成准备重启后台服务PID=" + pid);
// 使用外部命令重启服务
var rs = upgrade.Run("StarAgent", "-restart -upgrade");
//!! 这里不需要自杀,外部命令重启服务会结束当前进程
}
else
{
// 重新拉起进程
var rs = upgrade.Run("StarAgent", "-run -upgrade");
if (rs)
{
Service.StopWork("Upgrade");
this.WriteInfoEvent("Upgrade", "强制更新完成新进程已拉起准备退出当前进程PID=" + pid);
upgrade.KillSelf();
}
else
{
this.WriteInfoEvent("Upgrade", "强制更新完成,但拉起新进程失败");
}
}
}
#endregion
#region
/// <summary>重启应用服务</summary>
private String Restart(String argument)
{
// 异步执行,让方法调用返回结果给服务端
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
var upgrade = new Upgrade { Log = XTrace.Log };
// 带有-s参数就算是服务中运行
var inService = "-s".EqualIgnoreCase(Environment.GetCommandLineArgs());
// 以服务方式运行时,重启服务,否则采取拉起进程的方式
if (inService || Service.Host is DefaultHost host && host.InService)
{
// 使用外部命令重启服务
var rs = upgrade.Run("StarAgent", "-restart -delay");
//!! 这里不需要自杀,外部命令重启服务会结束当前进程
return rs + "";
}
else
{
// 重新拉起进程
var rs = upgrade.Run("StarAgent", "-run -delay");
if (rs)
{
Service.StopWork("Upgrade");
upgrade.KillSelf();
}
return rs + "";
}
});
return "success";
}
/// <summary>重启操作系统</summary>
private String Reboot(String argument)
{
var dic = argument.IsNullOrEmpty() ? null : JsonParser.Decode(argument);
var timeout = dic?["timeout"].ToInt();
// 异步执行,让方法调用返回结果给服务端
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
if (Runtime.Windows)
{
if (timeout > 0)
"shutdown".ShellExecute($"-r -t {timeout}");
else
"shutdown".ShellExecute($"-r");
Thread.Sleep(5000);
"shutdown".ShellExecute($"-r -f");
}
else if (Runtime.Linux)
{
// 多种方式重启Linux先使用温和的方式
"systemctl".ShellExecute("reboot");
Thread.Sleep(5000);
"shutdown".ShellExecute("-r now");
Thread.Sleep(5000);
"reboot".ShellExecute();
}
});
return "success";
}
/// <summary>设置通道</summary>
/// <param name="argument"></param>
/// <returns></returns>
private String SetChannel(String argument)
{
if (argument.IsNullOrEmpty()) return "参数为空";
var set = AgentSetting;
set.Channel = argument;
set.Save();
return "success " + argument;
}
#endregion
}

View File

@ -1,686 +0,0 @@
using System.Diagnostics;
using System.Reflection;
using NewLife;
using NewLife.Agent;
using NewLife.Log;
using NewLife.Model;
using NewLife.Reflection;
using NewLife.Remoting;
using NewLife.Remoting.Clients;
using NewLife.Threading;
using Stardust;
using Stardust.Deployment;
using Stardust.Managers;
using Stardust.Models;
using Stardust.Plugins;
using IHost = NewLife.Agent.IHost;
namespace StarAgent;
internal class Program
{
private static void Main(String[] args)
{
#if !NET40
// 用不到的配置不要输出
Runtime.CreateConfigOnMissing = false;
#endif
XTrace.UseConsole();
if ("-upgrade".EqualIgnoreCase(args))
{
XTrace.WriteLine("更新模式启动,等待{0}秒", 5_000);
Thread.Sleep(5_000);
}
else if ("-delay".EqualIgnoreCase(args))
{
XTrace.WriteLine("延迟启动,等待{0}秒", 5_000);
Thread.Sleep(5_000);
}
var set = StarSetting.Current;
if (set.IsNew)
{
#if DEBUG
set.Server = "http://localhost:6600";
#endif
set.Save();
}
// 用户模式存储配置,方便服务模式读取。因为服务模式无法读取用户和分辨率等信息
var set2 = StarAgentSetting.Current;
if (!"-s".EqualIgnoreCase(args)) ThreadPoolX.QueueUserWorkItem(() => LoadUser(set2));
var svc = new MyService
{
StarSetting = set,
AgentSetting = set2,
UseAutorun = set2.UseAutorun,
Log = XTrace.Log,
};
// 处理 -server 参数,建议在-start启动时添加
svc.SetServer(args);
#if !NET40
// 注册增强版机器信息提供者
MachineInfo.Provider = new MachineInfoProvider();
#endif
// Zip发布
if (svc.RunZipDeploy(args)) return;
// 修复
if ("-repair".EqualIgnoreCase(args))
{
svc.Repair();
return;
}
svc.Main(args);
}
/// <summary>用户模式存储配置,方便服务模式读取。因为服务模式无法读取用户和分辨率等信息</summary>
/// <param name="set"></param>
private static void LoadUser(StarAgentSetting set)
{
set.UserName = Environment.UserName;
var info = new NodeInfo();
if (Runtime.Windows) StarClient.FillOnWindows(info);
if (Runtime.Linux) StarClient.FillOnLinux(info);
set.Dpi = info.Dpi;
set.Resolution = info.Resolution;
set.Save();
}
}
/// <summary>服务类。名字可以自定义</summary>
internal class MyService : ServiceBase, IServiceProvider
{
public StarSetting StarSetting { get; set; }
public StarAgentSetting AgentSetting { get; set; }
/// <summary>宿主服务提供者</summary>
public IServiceProvider Provider { get; set; }
private IObjectContainer _container;
public MyService()
{
ServiceName = "StarAgent";
//// 控制应用服务。有些问题,只能控制当前进程管理的服务,而不能管理后台服务管理的应用
//AddMenu('z', "启动所有应用服务", () => _Manager?.StartAll());
//AddMenu('x', "停止所有应用服务", () => _Manager?.StopAll("菜单控制"));
MachineInfo.RegisterAsync();
_container = ObjectContainer.Current;
Provider = ObjectContainer.Provider;
}
#region
protected override void Init()
{
base.Init();
// 自定义Systemd工作模式
if (Host is Systemd sd)
{
var set = sd.Setting;
set.ServiceName = ServiceName;
// 无限重试启动
set.StartLimitInterval = 0;
// 只杀主进程StarAgent避免误杀应用进程
set.KillMode = "process";
set.KillSignal = "SIGINT";
// 禁止被OOM杀死
set.OOMScoreAdjust = -1000;
// 检查并修正旧版KillMode
FixKillMode(set);
}
}
private void FixKillMode(SystemdSetting set)
{
var servicePath = typeof(Systemd).GetValue("ServicePath") as String;
if (!servicePath.IsNullOrEmpty())
{
var file = servicePath.CombinePath($"{set.ServiceName}.service");
if (File.Exists(file) && !File.ReadAllText(file).Contains("KillMode"))
{
WriteLog("旧版service文件修正KillMode");
var exe = Process.GetCurrentProcess().MainModule.FileName;
// 兼容dotnet
var args = Environment.GetCommandLineArgs();
if (args.Length >= 1)
{
var fileName = Path.GetFileName(exe);
if (exe.Contains(' ')) exe = $"\"{exe}\"";
var dll = args[0].GetFullPath();
if (dll.Contains(' ')) dll = $"\"{dll}\"";
if (fileName.EqualIgnoreCase("dotnet", "dotnet.exe"))
exe += " " + dll;
else if (fileName.EqualIgnoreCase("mono", "mono.exe", "mono-sgen"))
exe = dll;
}
Host.Install(ServiceName, DisplayName, exe, "-s", Description);
}
}
}
#endregion
private ApiServer _server;
private TimerX _timer;
internal StarClient _Client;
internal StarFactory _factory;
private ServiceManager _Manager;
private PluginManager _PluginManager;
private String _lastVersion;
#region
/// <summary>服务启动</summary>
/// <remarks>
/// 安装Windows服务后服务启动会执行一次该方法。
/// 控制台菜单按5进入循环调试也会执行该方法。
/// </remarks>
public override void StartWork(String reason)
{
var set = AgentSetting;
StartFactory();
// 应用服务管理
var manager = new ServiceManager
{
Delay = set.Delay,
Tracer = _factory?.Tracer,
Log = XTrace.Log,
};
manager.SetServices(set.Services);
manager.ServiceChanged += OnServiceChanged;
_Manager = manager;
_container.AddSingleton(manager);
// 插件管理器
var pm = _PluginManager = new PluginManager
{
Identity = "StarAgent",
Provider = this,
Log = XTrace.Log,
};
_container.AddSingleton(pm);
// 监听端口,用于本地通信
if (set.LocalPort > 0) StartLocalServer(set.LocalPort);
// 启动星尘客户端,连接服务端
StartClient();
_Manager.Start();
StarAgentSetting.Provider.Changed += OnSettingChanged;
// 启动插件
WriteLog("启动插件[{0}]", pm.Identity);
pm.Load();
pm.Init();
foreach (var item in pm.Plugins)
{
if (item is IAgentPlugin plugin)
{
try
{
plugin.Start();
}
catch (Exception ex)
{
XTrace.WriteException(ex);
}
}
}
if (_Client != null) _Client.Plugins = pm.Plugins.Select(e => e.GetType().Name.TrimEnd("Plugin")).ToArray();
// 辅助任务清理数据
ThreadPoolX.QueueUserWorkItem(Fix);
base.StartWork(reason);
}
private void OnSettingChanged(Object sender, EventArgs eventArgs)
{
WriteLog("重新加载应用服务");
// 支持动态更新
//_Manager.Services = AgentSetting.Services;
_Manager.SetServices(AgentSetting.Services);
}
private void OnServiceChanged(Object sender, EventArgs eventArgs)
{
// 服务改变时,保存到配置文件
var set = AgentSetting;
set.Services = _Manager.Services.Select(e => e.Clone()).ToArray();
set.Save();
}
/// <summary>服务停止</summary>
/// <remarks>
/// 安装Windows服务后服务停止会执行该方法。
/// 控制台菜单按5进入循环调试任意键结束时也会执行该方法。
/// </remarks>
public override void StopWork(String reason)
{
base.StopWork(reason);
// 停止插件
WriteLog("停止插件[{0}]", _PluginManager.Identity);
foreach (var item in _PluginManager.Plugins)
{
if (item is IAgentPlugin plugin)
{
try
{
plugin.Stop(reason);
}
catch (Exception ex)
{
XTrace.WriteException(ex);
}
}
}
_timer.TryDispose();
_timer = null;
StarAgentSetting.Provider.Changed -= OnSettingChanged;
_Manager.Stop(reason);
//_Manager.TryDispose();
_Client?.Logout(reason);
//_Client.TryDispose();
_Client = null;
_factory = null;
_server.TryDispose();
_server = null;
}
#endregion
#region
public void StartClient()
{
var server = StarSetting.Server;
if (server.IsNullOrEmpty()) return;
WriteLog("初始化服务端地址:{0}", server);
var set = AgentSetting;
var client = new MyStarClient
{
Name = "Node",
Server = server,
Code = set.Code,
Secret = set.Secret,
ProductCode = "StarAgent",
Log = XTrace.Log,
//Manager = _Manager,
//Host = Host,
Service = this,
AgentSetting = AgentSetting,
};
// 登录后保存证书
client.OnLogined += (s, e) =>
{
var inf = e.Response;
if (inf != null && !inf.Code.IsNullOrEmpty())
{
set.Code = inf.Code;
set.Secret = inf.Secret;
set.Save();
}
};
// 服务迁移
client.OnMigration += (s, e) =>
{
var setStar = StarSetting;
var svr = e.NewServer;
if (!svr.IsNullOrEmpty() && !svr.EqualIgnoreCase(setStar.Server))
{
setStar.Server = svr;
setStar.Save();
e.Cancel = false;
}
else
{
e.Cancel = true;
}
};
// APM埋点。独立应用名
client.Tracer = _factory?.Tracer;
_Manager.Attach(client);
//// 使用跟踪
//client.UseTrace();
_Client = client;
_container.AddSingleton(client);
_container.AddSingleton<ICommandClient>(client);
_container.AddSingleton<IEventProvider>(client);
// 可能需要多次尝试
client.Open();
}
public void StartFactory()
{
if (_factory == null)
{
var server = StarSetting.Server;
if (!server.IsNullOrEmpty())
{
_factory = new StarFactory(server, "StarAgent", null);
_container.AddSingleton(_factory);
// 激活配置中心获取PluginServer
var config = _factory.GetConfig();
if (config != null) ThreadPoolX.QueueUserWorkItem(() => config.LoadAll());
}
}
}
public void StartLocalServer(Int32 port)
{
try
{
// 必须支持Udp因为需要支持局域网广播搜索功能
var svr = new ApiServer(port)
{
ReuseAddress = true,
Tracer = _factory?.Tracer,
Log = XTrace.Log,
EncoderLog = XTrace.Log,
};
svr.Register(new StarService
{
Provider = this,
//Host = Host,
Manager = _Manager,
//PluginManager = _PluginManager,
StarSetting = StarSetting,
AgentSetting = AgentSetting,
Log = XTrace.Log
}, null);
_server = svr;
_container.AddSingleton(svr);
svr.Start();
}
catch (Exception ex)
{
XTrace.WriteException(ex);
}
}
#endregion
#region
/// <summary>修复模式启动StarAgent以修复正式的StarAgent</summary>
public void Repair()
{
WriteLog("修复模式启动StarAgent以修复正式的StarAgent");
// 校验当前程序的MD5避免重复执行
var mf = "data/repair.md5".GetBasePath();
if (File.Exists(mf))
{
var old = File.ReadAllText(mf);
var md5 = Assembly.GetExecutingAssembly().Location.AsFile().MD5().ToHex();
if (old == md5) return;
File.WriteAllText(mf, md5);
}
// 查找正式目录
DirectoryInfo di = null;
// 初始化Host
Init();
var cfg = Host?.QueryConfig(ServiceName);
if (cfg != null && !cfg.FilePath.IsNullOrEmpty())
{
var str = cfg.FilePath;
var p = str.IndexOf(' ');
if (p > 0) str = str.Substring(0, p);
di = str.AsFile().Directory;
}
if (di == null || !di.Exists) di = "../agent".GetBasePath().AsDirectory();
if (!di.Exists) di = "../Agent".GetBasePath().AsDirectory();
if (!di.Exists) di = "../staragent".GetBasePath().AsDirectory();
if (!di.Exists) di = "../StarAgent".GetBasePath().AsDirectory();
if (!di.Exists)
{
WriteLog("目标不存在 {0}", di.FullName);
var cur = "./".GetBasePath().TrimEnd('/', '\\');
WriteLog("当前目录 {0}", cur);
// 遍历所有子目录,但跳过当前
foreach (var item in "../".GetBasePath().AsDirectory().GetDirectories())
{
WriteLog("检查 {0}", item.FullName);
if (item.FullName.TrimEnd('/', '\\').EqualIgnoreCase(cur)) continue;
var fi = item.GetFiles("StarAgent.dll").FirstOrDefault();
if (fi != null && fi.Exists)
{
di = fi.Directory;
break;
}
}
}
if (!di.Exists)
{
WriteLog("未能找到正式StarAgent所在修复失败");
Thread.Sleep(1_000);
return;
}
WriteLog("正式StarAgent所在目录{0}", di.FullName);
// 等待一会,拉起修复进程的进程,可能还有别的善后工作
Thread.Sleep(5_000);
WriteLog("停止服务……");
//Init();
Host.Stop(ServiceName);
//Process.Start("net", $"stop {ServiceName}");
Thread.Sleep(1_000);
// 拷贝当前目录所有dll/exe/runtime.json到正式目录
foreach (var fi in "./".GetBasePath().AsDirectory().GetAllFiles("*.dll;*.exe;*.runtimeconfig.json"))
{
try
{
WriteLog("复制 {0}", fi.Name);
var dst = di.FullName.CombinePath(fi.Name);
if (File.Exists(dst)) File.Move(dst, Path.GetTempFileName());
fi.CopyTo(dst, true);
}
catch (Exception ex)
{
Log?.Error(ex.Message);
}
}
WriteLog("启动服务……");
Host.Start(ServiceName);
//Process.Start("net", $"start {ServiceName}");
Thread.Sleep(1_000);
}
#endregion
#region
protected override void ShowMenu()
{
base.ShowMenu();
var set = StarSetting;
if (!set.Server.IsNullOrEmpty()) Console.WriteLine("服务端:{0}", set.Server);
Console.WriteLine();
}
public void SetServer(String[] args)
{
var set = StarSetting;
var set2 = AgentSetting;
// 处理 -server 参数,建议在-start启动时添加
if (args != null && args.Length > 0)
{
for (var i = 0; i < args.Length - 1; i++)
{
if (args[i].EqualIgnoreCase("-server"))
{
set.Server = args[i + 1];
set.Save();
XTrace.WriteLine("服务端修改为:{0}", set.Server);
break;
}
else if (args[i].EqualIgnoreCase("-project"))
{
set2.Project = args[i + 1];
set2.Save();
XTrace.WriteLine("项目修改为:{0}", set2.Project);
break;
}
}
}
}
/// <summary>运行Zip发布文件</summary>
/// <param name="args"></param>
/// <returns>是否成功运行</returns>
public Boolean RunZipDeploy(String[] args)
{
if (args == null || args.Length == 0) return false;
var file = args.FirstOrDefault(e => e.EndsWithIgnoreCase(".zip"));
if (file.IsNullOrEmpty()) return false;
XTrace.WriteLine("开始运行Zip发布文件 {0}", file);
var deploy = new ZipDeploy
{
Tracer = _factory?.Tracer,
Log = XTrace.Log
};
if (!deploy.Parse(args)) return false;
deploy.Execute();
return true;
}
#endregion
#region IServiceProvider
Object IServiceProvider.GetService(Type serviceType)
{
if (serviceType == typeof(ServiceManager)) return _Manager;
if (serviceType == typeof(StarClient)) return _Client;
if (serviceType == typeof(StarFactory)) return _factory;
if (serviceType == typeof(ApiServer)) return _server;
if (serviceType == typeof(ServiceBase)) return this;
if (serviceType == typeof(IHost)) return Host;
if (serviceType == typeof(ITracer)) return _factory?.Tracer;
return Provider?.GetService(serviceType);
}
#endregion
#region
/// <summary>清理历史版本文件</summary>
private void Fix()
{
foreach (var fi in "./".AsDirectory().GetFiles("*", SearchOption.TopDirectoryOnly))
{
var flag = false;
if (fi.Name.EndsWithIgnoreCase(".deps.json", ".runtimeconfig.json") && !fi.Name.StartsWithIgnoreCase("StarAgent"))
flag = true;
else if (fi.Name.EndsWithIgnoreCase(".tar.gz") && fi.LastAccessTime.AddMonths(1) < DateTime.Now)
flag = true;
else if (fi.Name.EndsWithIgnoreCase(".exe") && !Runtime.Windows && !Runtime.Mono)
flag = true;
if (flag)
{
try
{
_Client?.WriteInfoEvent("删除", fi.FullName);
XTrace.WriteLine("删除:{0}", fi.FullName);
fi.Delete();
}
catch (Exception ex)
{
_Client?.WriteErrorEvent("删除", ex.Message);
XTrace.Log.Error(ex.Message);
}
}
}
var di = "./runtimes".AsDirectory();
if (di.Exists)
{
try
{
_Client?.WriteInfoEvent("删除", di.FullName);
XTrace.WriteLine("删除:{0}", di.FullName);
di.Delete(true);
}
catch (Exception ex)
{
_Client?.WriteErrorEvent("删除", ex.Message);
XTrace.Log.Error(ex.Message);
}
}
}
#endregion
}

View File

@ -1,97 +0,0 @@
using System.ComponentModel;
using NewLife.Configuration;
using Stardust.Models;
namespace StarAgent;
/// <summary>配置</summary>
[Config("StarAgent")]
public class StarAgentSetting : Config<StarAgentSetting>
{
#region
/// <summary>调试开关。默认true</summary>
[Description("调试开关。默认true")]
public Boolean Debug { get; set; } = true;
/// <summary>证书</summary>
[Description("证书")]
public String Code { get; set; }
/// <summary>密钥</summary>
[Description("密钥")]
public String Secret { get; set; }
/// <summary>项目名。新节点默认所需要加入的项目</summary>
[Description("项目名。新节点默认所需要加入的项目")]
public String Project { get; set; }
///// <summary>本地服务。默认udp://127.0.0.1:5500</summary>
//[Description("本地服务。默认udp://127.0.0.1:5500")]
//public String LocalServer { get; set; } = "udp://127.0.0.1:5500";
/// <summary>本地端口。默认5500</summary>
[Description("本地端口。默认5500")]
public Int32 LocalPort { get; set; } = 5500;
/// <summary>更新通道。默认Release</summary>
[Description("更新通道。默认Release")]
public String Channel { get; set; } = "Release";
/// <summary>Windows自启动。自启动需要用户登录桌面默认false使用系统服务</summary>
[Description("Windows自启动。自启动需要用户登录桌面默认false使用系统服务")]
public Boolean UseAutorun { get; set; }
/// <summary>用户名称。用户模式存储,服务模式读取</summary>
[Description("用户名称。用户模式存储,服务模式读取")]
public String UserName { get; set; }
/// <summary>像素点。例如96*96。用户模式存储服务模式读取</summary>
[Description("像素点。例如96*96。用户模式存储服务模式读取")]
public String Dpi { get; set; }
/// <summary>分辨率。例如1024*768。用户模式存储服务模式读取</summary>
[Description("分辨率。例如1024*768。用户模式存储服务模式读取")]
public String Resolution { get; set; }
/// <summary>延迟时间。重启进程或服务的延迟时间默认3000ms</summary>
[Description("延迟时间。重启进程或服务的延迟时间默认3000ms")]
public Int32 Delay { get; set; } = 3000;
/// <summary>应用服务集合</summary>
[Description("应用服务集合")]
public ServiceInfo[] Services { get; set; }
#endregion
#region
#endregion
#region
protected override void OnLoaded()
{
if (Services == null || Services.Length == 0)
{
var si = new ServiceInfo
{
Name = "test",
FileName = "ping",
Arguments = "newlifex.com",
Enable = false,
};
var si2 = new ServiceInfo
{
Name = "test2",
FileName = "cube.zip",
Arguments = "urls=http://*:1080",
WorkingDirectory = "../sso/web/",
Enable = false,
};
Services = new[] { si, si2 };
}
base.OnLoaded();
}
#endregion
}

View File

@ -1,52 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;net5.0;net6.0;net45;net461;net7.0;net8.0</TargetFrameworks>
<AssemblyTitle>星尘代理</AssemblyTitle>
<Description>星尘,分布式资源调度,部署于每一个节点,连接服务端,支持节点监控、远程发布。</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>3.1</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\Bin\Agent</OutputPath>
<!--<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>-->
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<ApplicationManifest>app.manifest</ApplicationManifest>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\Doc\newlife.snk</AssemblyOriginatorKeyFile>
<IsPackable>False</IsPackable>
<NoWarn>1701;1702;NU5104;NETSDK1138;CS7035</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)'=='net8.0'">
<!--<ServerGarbageCollection>true</ServerGarbageCollection>-->
<!--<GarbageCollectionAdapatationMode>1</GarbageCollectionAdapatationMode>-->
<!--<PublishAot>true</PublishAot>-->
<!--<OptimizationPreference>Size</OptimizationPreference>-->
<!--<InvariantGlobalization>true</InvariantGlobalization>-->
<!--<StackTraceSupport>false</StackTraceSupport>-->
</PropertyGroup>
<ItemGroup>
<Compile Remove="StarService2.cs" />
</ItemGroup>
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Agent" Version="10.9.2024.1009-beta0729" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

View File

@ -1,358 +0,0 @@
using System.Collections.Concurrent;
using System.Diagnostics;
using NewLife;
using NewLife.Agent;
using NewLife.Log;
using NewLife.Model;
using NewLife.Net;
using NewLife.Remoting;
using NewLife.Remoting.Models;
using NewLife.Threading;
using Stardust;
using Stardust.Managers;
using Stardust.Models;
namespace StarAgent;
[Api(null)]
public class StarService : DisposeBase, IApi
{
#region
/// <summary>
/// 网络会话
/// </summary>
public IApiSession Session { get; set; }
///// <summary>服务对象</summary>
//public ServiceBase Service { get; set; }
///// <summary>服务主机</summary>
//public IHost Host { get; set; }
/// <summary>应用服务管理</summary>
public ServiceManager Manager { get; set; }
/// <summary>服务提供者</summary>
public IServiceProvider Provider { get; set; }
///// <summary>插件管理</summary>
//public PluginManager PluginManager { get; set; }
/// <summary>星尘设置</summary>
public StarSetting StarSetting { get; set; }
/// <summary>星尘代理设置</summary>
public StarAgentSetting AgentSetting { get; set; }
private AgentInfo _agentInfo;
private TimerX _timer;
#endregion
#region
public StarService()
{
// 获取本地进程名比较慢平均200ms有时候超过500ms
//Task.Run(() =>
//{
// _agentInfo = AgentInfo.GetLocal(true);
//});
_timer = new TimerX(DoRefreshLocal, null, 100, 5_000) { Async = true };
}
/// <summary>销毁</summary>
/// <param name="disposing"></param>
protected override void Dispose(Boolean disposing)
{
base.Dispose(disposing);
_timer.TryDispose();
}
#endregion
#region
/// <summary>信息</summary>
/// <returns></returns>
[Api(nameof(Info))]
public AgentInfo Info(AgentInfo info)
{
//XTrace.WriteLine("Info<={0}", info.ToJson());
var set = StarSetting;
var ai = _agentInfo ??= AgentInfo.GetLocal(true);
ai.Server = set.Server;
ai.Services = Manager?.Services.Where(e => e.Enable || !e.Name.EqualIgnoreCase("test", "test2")).Select(e => e.Name).ToArray();
ai.Code = AgentSetting.Code;
ai.IP = AgentInfo.GetIps();
// 返回插件服务器地址
var core = NewLife.Setting.Current;
if (!core.PluginServer.IsNullOrEmpty() && !core.PluginServer.Contains("x.newlifex.com"))
{
ai.PluginServer = core.PluginServer;
}
return ai;
}
/// <summary>本地心跳</summary>
/// <param name="info"></param>
/// <returns></returns>
[Api(nameof(Ping))]
public PingResponse Ping(LocalPingInfo info)
{
if (info != null && info.ProcessId > 0)
{
// 喂狗
if (info.WatchdogTimeout > 0) FeedDog(info.ProcessId, info.WatchdogTimeout);
}
return new PingResponse { ServerTime = DateTime.UtcNow.ToLong() };
}
/// <summary>设置星尘服务端地址</summary>
/// <returns></returns>
[Api(nameof(SetServer))]
public String SetServer(String server)
{
var set = StarSetting;
if (set.Server.IsNullOrEmpty() && !server.IsNullOrEmpty())
{
set.Server = server;
set.Save();
XTrace.WriteLine("StarAgent使用[{0}]送过来的星尘服务端地址:{1}", Session, server);
if (Provider?.GetService<ServiceBase>() is MyService svc)
{
ThreadPool.QueueUserWorkItem(s =>
{
Thread.Sleep(1000);
svc.StartFactory();
svc.StartClient();
});
}
}
return set.Server;
}
private void DoRefreshLocal(Object state)
{
var ai = AgentInfo.GetLocal(true);
if (ai != null)
{
//XTrace.WriteLine("IP: {0}", ai.IP);
_agentInfo = ai;
// 如果未取得本机IP则在较短时间内重新获取
if (_timer != null)
_timer.Period = ai.IP.IsNullOrEmpty() ? 5_000 : 60_000;
}
}
private void CheckLocal()
{
if (Session is INetSession ns && !ns.Remote.Address.IsLocal()) throw new InvalidOperationException("禁止非本机操作!");
}
///// <summary>杀死并启动进程</summary>
///// <param name="processId">进程</param>
///// <param name="delay">延迟结束的秒数</param>
///// <param name="fileName">文件名</param>
///// <param name="arguments">参数</param>
///// <param name="workingDirectory">工作目录</param>
///// <returns></returns>
//[Api(nameof(KillAndStart))]
//public Object KillAndStart(Int32 processId, Int32 delay, String fileName, String arguments, String workingDirectory)
//{
// CheckLocal();
// var p = Process.GetProcessById(processId);
// if (p == null) throw new InvalidOperationException($"无效进程Id[{processId}]");
// var name = p.ProcessName;
// var pid = 0;
// ThreadPool.QueueUserWorkItem(s =>
// {
// WriteLog("杀死进程 {0}/{1},等待 {2}秒", processId, p.ProcessName, delay);
// if (delay > 0) Thread.Sleep(delay * 1000);
// try
// {
// if (!p.HasExited)
// {
// p.Kill();
// p.WaitForExit(5_000);
// }
// }
// catch (Exception ex)
// {
// XTrace.WriteException(ex);
// }
// // 启动进程
// if (!fileName.IsNullOrEmpty())
// {
// WriteLog("启动进程:{0} {1} {2}", fileName, arguments, workingDirectory);
// var si = new ProcessStartInfo
// {
// FileName = fileName,
// Arguments = arguments,
// WorkingDirectory = workingDirectory,
// // false时目前控制台合并到当前控制台一起退出
// // true时目标控制台独立窗口不会一起退出
// UseShellExecute = true,
// };
// var p2 = Process.Start(si);
// pid = p2.Id;
// WriteLog("应用[{0}]启动成功 PID={1}", p2.ProcessName, p2.Id);
// }
// });
// return new { name, pid };
//}
///// <summary>安装应用服务(星尘代理守护)</summary>
///// <param name="service"></param>
///// <returns></returns>
//[Api(nameof(Install))]
//public ProcessInfo Install(ServiceInfo service)
//{
// XTrace.WriteLine("Install<={0}", service.ToJson());
// CheckLocal();
// var rs = Manager.Install(service);
// if (rs != null)
// {
// var set = Setting.Current;
// set.Services = Manager.Services;
// set.Save();
// }
// return rs;
//}
///// <summary>卸载应用服务</summary>
///// <param name="serviceName"></param>
///// <returns></returns>
//[Api(nameof(Uninstall))]
//public Boolean Uninstall(String serviceName)
//{
// XTrace.WriteLine("Uninstall<={0}", serviceName);
// CheckLocal();
// var rs = Manager.Uninstall(serviceName, "ServiceUninstall");
// if (rs)
// {
// var set = Setting.Current;
// set.Services = Manager.Services;
// set.Save();
// }
// return rs;
//}
#endregion
#region
static ConcurrentDictionary<Int32, DateTime> _dogs = new();
static TimerX _dogTimer;
void FeedDog(Int32 pid, Int32 timeout)
{
if (pid <= 0 || timeout <= 0) return;
using var span = DefaultTracer.Instance?.NewSpan(nameof(FeedDog), new { pid, timeout });
// 更新过期时间,超过该时间未收到心跳,将会重启本应用进程
_dogs[pid] = DateTime.Now.AddSeconds(timeout);
_dogTimer ??= new TimerX(CheckDog, Manager, 1000, 15000) { Async = true };
}
static void CheckDog(Object state)
{
var ks = new List<Int32>();
var ds = new List<Int32>();
foreach (var item in _dogs)
{
if (item.Value < DateTime.Now)
ks.Add(item.Key);
else
{
var p = GetProcessById(item.Key);
if (p == null || p.GetHasExited())
ds.Add(item.Key);
}
}
if (ks.Count == 0 && ds.Count == 0) return;
using var span = DefaultTracer.Instance?.NewSpan(nameof(CheckDog));
// 重启超时的进程
foreach (var item in ks)
{
try
{
var p = GetProcessById(item);
if (p == null || p.GetHasExited())
_dogs.Remove(item);
else
{
XTrace.WriteLine("进程[{0}/{1}]超过一定时间没有心跳,可能已经假死,准备重启。", p.ProcessName, p.Id);
span?.AppendTag($"SafetyKill {p.ProcessName}/{p.Id}");
p.SafetyKill();
//todo 启动应用。暂时不需要因为StarAgent会自动启动
if (state is ServiceManager manager) manager.CheckNow();
}
}
catch (Exception ex)
{
_dogs.Remove(item);
XTrace.WriteException(ex);
}
}
// 删除不存在的进程
foreach (var item in ds)
{
_dogs.Remove(item);
}
}
static Process GetProcessById(Int32 processId)
{
try
{
return Process.GetProcessById(processId);
}
catch { }
return null;
}
#endregion
#region
/// <summary>链路追踪</summary>
public ITracer Tracer { get; set; }
/// <summary>日志</summary>
public ILog Log { get; set; }
/// <summary>写日志</summary>
/// <param name="format"></param>
/// <param name="args"></param>
public void WriteLog(String format, params Object[] args) => Log?.Info(format, args);
#endregion
}

View File

@ -1,56 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks>
<AssemblyName>staragent</AssemblyName>
<AssemblyTitle>星尘代理</AssemblyTitle>
<Description>星尘,分布式资源调度,部署于每一个节点,连接服务端,支持节点监控、远程发布。</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2022 NewLife</Copyright>
<VersionPrefix>2.5</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\Bin\AgentTool</OutputPath>
<!--<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>-->
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<PackAsTool>true</PackAsTool>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\Doc\newlife.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
<PropertyGroup>
<PackageId>$(AssemblyName)</PackageId>
<Authors>$(Company)</Authors>
<ProjectUrl>https://github.com/NewLifeX</ProjectUrl>
<PackageIconUrl>http://newlifex.com/favicon.ico</PackageIconUrl>
<RepositoryUrl>https://github.com/NewLifeX/Stardust</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
<PackageReleaseNotes>支持APM跟踪</PackageReleaseNotes>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\StarAgent\Program.cs" Link="Program.cs" />
<Compile Include="..\StarAgent\Setting.cs" Link="Setting.cs" />
<Compile Include="..\StarAgent\StarService.cs" Link="StarService.cs" />
</ItemGroup>
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NewLife.Agent" Version="10.1.2022.1201" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

View File

@ -1,35 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<AssemblyTitle>星尘网关</AssemblyTitle>
<Description>星尘网关,转发网络请求,实现路由切换。</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2024 NewLife</Copyright>
<VersionPrefix>3.0</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
<AssemblyVersion>$(VersionPrefix).*</AssemblyVersion>
<Deterministic>false</Deterministic>
<OutputPath>..\Bin\Gateway</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<IsPackable>False</IsPackable>
<NoWarn>1701;1702;NU5104;NETSDK1138;CS7035</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<DefineConstants>$(DefineConstants);DEBUG</DefineConstants>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Stardust.Data\Stardust.Data.csproj" />
<ProjectReference Include="..\Stardust\Stardust.csproj" />
</ItemGroup>
</Project>

View File

@ -1,161 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using NewLife;
using NewLife.Log;
using XCode;
using XCode.Membership;
namespace Stardust.Data.Configs
{
/// <summary>应用规则。针对应用设置的规则比如根据IP段设置作用域</summary>
public partial class AppRule : Entity<AppRule>
{
#region
static AppRule()
{
// 累加字段,生成 Update xx Set Count=Count+1234 Where xxx
//var df = Meta.Factory.AdditionalFields;
//df.Add(nameof(Priority));
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<UserModule>();
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
}
/// <summary>首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法</summary>
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void InitData()
{
// InitData一般用于当数据表没有数据时添加一些默认数据该实体类的任何第一次数据库操作都会触发该方法默认异步调用
if (Meta.Count > 0) return;
if (XTrace.Debug) XTrace.WriteLine("开始初始化AppRule[应用规则]数据……");
var entity = new AppRule
{
Rule = "IP=*",
Result = "Scope=dev",
Priority = -1,
Remark = "全局默认开发",
};
entity.Insert();
entity = new AppRule
{
Rule = "IP=172.*,10.*",
Result = "Scope=pro",
Priority = 10,
Remark = "正式环境",
};
entity.Insert();
//entity = new AppRule
//{
// Rule = "IP=192.*",
// Result = "Scope=test",
// Priority = 20,
// Remark = "测试环境",
//};
//entity.Insert();
entity = new AppRule
{
Rule = "LocalIP=127.*,::1,192.*",
Result = "Scope=dev",
Priority = 20,
Remark = "本机开发",
};
entity.Insert();
if (XTrace.Debug) XTrace.WriteLine("完成初始化AppRule[应用规则]数据!");
}
#endregion
#region
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppRule FindById(Int32 id)
{
if (id <= 0) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.Id == id);
}
#endregion
#region
// Select Count(Id) as Id,Category From AppRule Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20
//static readonly FieldCache<AppRule> _CategoryCache = new FieldCache<AppRule>(nameof(Category))
//{
//Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
//};
///// <summary>获取类别列表字段缓存10分钟分组统计数据最多的前20种用于魔方前台下拉选择</summary>
///// <returns></returns>
//public static IDictionary<String, String> GetCategoryList() => _CategoryCache.FindAllName();
#endregion
#region
/// <summary>计算作用域</summary>
/// <param name="appid"></param>
/// <param name="ip">远程IP地址</param>
/// <param name="localIp">本地IP地址</param>
/// <returns></returns>
public static String CheckScope(Int32 appid, String ip, String localIp)
{
if (ip.IsNullOrEmpty() && localIp.IsNullOrEmpty()) return null;
var list = Meta.Cache.Entities.FindAll(e => e.Enable);
list = list.Where(e =>
!e.Rule.IsNullOrEmpty() && /*e.Rule.StartsWithIgnoreCase("IP=") &&*/
!e.Result.IsNullOrEmpty() && e.Result.StartsWithIgnoreCase("Scope="))
.OrderByDescending(e => e.Priority)
.ToList();
if (list.Count == 0) return null;
var rule = list.Where(e => e.Match(ip, localIp)).OrderByDescending(e => e.Priority).ThenByDescending(e => e.Id).FirstOrDefault();
if (rule == null) return null;
var dic = rule.Result.SplitAsDictionary("=", ";");
if (dic.TryGetValue("Scope", out var str)) return str;
return null;
}
/// <summary>匹配规则</summary>
/// <param name="ip">远程IP地址</param>
/// <param name="localIp">本地IP地址</param>
/// <returns></returns>
public Boolean Match(String ip, String localIp)
{
var dic = Rule.SplitAsDictionary("=", ";");
var rules = dic.ToDictionary(e => e.Key, e => e.Value.Split(","), StringComparer.OrdinalIgnoreCase);
// 没有使用该规则,直接过
if (rules.TryGetValue("ip", out var vs))
{
if (ip.IsNullOrEmpty() || !vs.Any(e => e.IsMatch(ip))) return false;
}
if (rules.TryGetValue("localIp", out vs))
{
if (localIp.IsNullOrEmpty() || !vs.Any(e => e.IsMatch(localIp))) return false;
}
return true;
}
#endregion
}
}

View File

@ -1,201 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<EntityModel xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="https://newlifex.com https://newlifex.com/Model202407.xsd" Document="https://newlifex.com/xcode/model" xmlns="https://newlifex.com/Model202407.xsd">
<Option>
<!--类名模板。其中{name}替换为Table.Name如{name}Model/I{name}Dto等-->
<ClassNameTemplate />
<!--显示名模板。其中{displayName}替换为Table.DisplayName-->
<DisplayNameTemplate />
<!--基类。可能包含基类和接口,其中{name}替换为Table.Name-->
<BaseClass>Entity</BaseClass>
<!--命名空间-->
<Namespace>Stardust.Data.Deployment</Namespace>
<!--输出目录-->
<Output>.\</Output>
<!--是否使用中文文件名。默认false-->
<ChineseFileName>False</ChineseFileName>
<!--用于生成Copy函数的参数类型。例如{name}或I{name}-->
<ModelNameForCopy />
<!--带有索引器。实现IModel接口-->
<HasIModel>False</HasIModel>
<!--可为null上下文。生成String?等-->
<Nullable>False</Nullable>
<!--数据库连接名-->
<ConnName>Stardust</ConnName>
<!--模型类模版。设置后生成模型类,用于接口数据传输,例如{name}Model-->
<ModelClass />
<!--模型类输出目录。默认当前目录的Models子目录-->
<ModelsOutput>.\Models\</ModelsOutput>
<!--模型接口模版。设置后生成模型接口用于约束模型类和实体类例如I{name}-->
<ModelInterface />
<!--模型接口输出目录。默认当前目录的Interfaces子目录-->
<InterfacesOutput>.\Interfaces\</InterfacesOutput>
<!--用户实体转为模型类的模型类。例如{name}或{name}DTO-->
<ModelNameForToModel />
<!--命名格式。Default/Upper/Lower/Underline-->
<NameFormat>Default</NameFormat>
<!--魔方区域显示名-->
<DisplayName />
<!--魔方控制器输出目录-->
<CubeOutput>../../Stardust.Web/Areas/Deployment</CubeOutput>
</Option>
<Tables>
<Table Name="AppDeploy" Description="应用部署。应用部署配置单应用可有多个部署集合例如分别是arm和x64。发布时新增版本拉取代码编译并上传zip应用包再到部署节点里发布">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="ProjectId" DataType="Int32" Map="Stardust.Data.Platform.GalaxyProject@Id@Name" Description="项目。资源归属的团队" />
<Column Name="AppId" DataType="Int32" Description="应用。对应StarApp" />
<Column Name="Category" DataType="String" Description="类别" />
<Column Name="Name" DataType="String" Master="True" Description="名称。应用名" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Nodes" DataType="Int32" Description="节点。该应用部署集所拥有的节点数" />
<Column Name="Version" DataType="String" Description="版本。应用正在使用的版本号" />
<Column Name="MultiVersion" DataType="Boolean" Description="多版本。支持多运行时版本,此时只认可部署版本中符合运行时要求的最新可用版本" />
<Column Name="AutoPublish" DataType="Boolean" Description="自动发布。应用版本后自动发布到启用节点,加快发布速度" />
<Column Name="PackageName" DataType="String" Description="包名。用于判断上传包名是否正确,避免错误上传其它应用包,支持*模糊匹配" />
<Column Name="Repository" DataType="String" ItemType="url" Length="200" Description="代码库。下载代码的位置" Category="编译参数" />
<Column Name="Branch" DataType="String" DefaultValue="master" Description="分支。默认master" Category="编译参数" />
<Column Name="ProjectPath" DataType="String" Description="项目路径。需要编译的项目路径" Category="编译参数" />
<Column Name="ProjectKind" DataType="Int32" DefaultValue="1" Description="项目类型。默认dotnet" Type="Stardust.Models.ProjectKinds" Category="编译参数" />
<Column Name="PackageFilters" DataType="String" Description="打包过滤器。需要打包哪些文件,支持通配符,多项分号隔开" Category="编译参数" />
<Column Name="FileName" DataType="String" Description="文件。应用启动文件可直接使用zip包" Category="发布参数" />
<Column Name="Arguments" DataType="String" Length="500" Description="参数。启动应用的参数" Category="发布参数" />
<Column Name="WorkingDirectory" DataType="String" Length="200" Description="工作目录。应用根目录" Category="发布参数" />
<Column Name="UserName" DataType="String" Description="用户名。以该用户执行应用" Category="发布参数" />
<Column Name="Environments" DataType="String" Length="500" Description="环境变量。启动应用前设置的环境变量" Category="发布参数" />
<Column Name="MaxMemory" DataType="Int32" Description="最大内存。单位M超过上限时自动重启应用默认0不限制" Category="发布参数" />
<Column Name="Mode" DataType="Int32" Description="工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip" Type="Stardust.Models.ServiceModes" Category="发布参数" />
<Column Name="AutoStop" DataType="Boolean" Description="自动停止。随着宿主的退出,同时停止该应用进程" Category="发布参数" />
<Column Name="ReloadOnChange" DataType="Boolean" Description="检测变动。当文件发生改变时,自动重启应用" Category="发布参数" />
<Column Name="CreateUserId" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUserId" DataType="Int32" Description="更新者" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
<Index Columns="ProjectId" />
</Indexes>
</Table>
<Table Name="AppDeployNode" Description="应用节点。应用部署集和节点服务器的依赖关系一个应用可有多个部署集如arm和x64在目标节点上发布该部署集对应的应用zip包">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="DeployName" DataType="String" Description="发布名。默认为空,使用部署集上名字。可用于单节点多发布场景" />
<Column Name="DeployId" ColumnName="AppId" DataType="Int32" Map="AppDeploy@Id@$" Description="应用部署集。对应AppDeploy" />
<Column Name="NodeId" DataType="Int32" Description="节点。节点服务器" />
<Column Name="IP" DataType="String" Description="IP地址。节点所在内网IP地址" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="FileName" DataType="String" Description="文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置" Category="发布参数" />
<Column Name="Arguments" DataType="String" Length="500" Description="参数。启动应用的参数,为空时使用应用集配置" Category="发布参数" />
<Column Name="WorkingDirectory" DataType="String" Length="200" Description="工作目录。应用根目录,为空时使用应用集配置" Category="发布参数" />
<Column Name="Environments" DataType="String" Length="500" Description="环境变量。启动应用前设置的环境变量" Category="发布参数" />
<Column Name="Mode" DataType="Int32" Description="工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置" Type="Stardust.Models.ServiceModes" Category="发布参数" />
<Column Name="Delay" DataType="Int32" Description="延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒" Category="发布参数" />
<Column Name="ProcessId" DataType="Int32" Description="进程" Category="状态" />
<Column Name="UserName" DataType="String" Description="用户名。启动该进程的用户名" Category="状态" />
<Column Name="ProcessName" DataType="String" Length="200" Description="进程名称" Category="状态" />
<Column Name="StartTime" DataType="DateTime" Description="进程时间" Category="状态" />
<Column Name="Version" DataType="String" Description="版本。客户端" Category="状态" />
<Column Name="Compile" DataType="DateTime" Description="编译时间。客户端" Category="状态" />
<Column Name="Listens" DataType="String" Length="200" Description="监听端口。网络端口监听信息" Category="状态" />
<Column Name="LastActive" DataType="DateTime" Description="最后活跃。最后一次上报心跳的时间" Category="状态" />
<Column Name="LastUpload" DataType="DateTime" Description="最后上传。最后一次上传客户端配置的时间" Category="状态" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateUserId" DataType="Int32" Description="创建人" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUserId" DataType="Int32" Description="更新者" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="DeployId" />
<Index Columns="NodeId" />
</Indexes>
</Table>
<Table Name="AppDeployVersion" Description="部署版本。应用的多个可发布版本,主要管理应用程序包,支持随时切换使用不同版本,来自上传或自动编译">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="DeployId" ColumnName="AppId" DataType="Int32" Map="AppDeploy@Id@$" Description="应用部署集。对应AppDeploy" />
<Column Name="Version" DataType="String" Master="True" Nullable="False" Description="版本。如2.3.2022.0911,字符串比较大小" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Url" DataType="String" ItemType="file" Length="500" Description="资源地址。一般打包为Zip包StarAgent下载后解压缩覆盖" />
<Column Name="Overwrite" DataType="String" Length="100" Description="覆盖文件。需要拷贝覆盖已存在的文件或子目录,支持*模糊匹配,多文件分号隔开。如果目标文件不存在,配置文件等自动拷贝" />
<Column Name="Mode" DataType="Int32" Description="发布模式。1部分包仅覆盖2标准包清空可执行文件再覆盖3完整包清空所有文件" Type="Stardust.Models.DeployModes" />
<Column Name="Size" DataType="Int64" ItemType="GMK" Description="文件大小" />
<Column Name="Hash" DataType="String" Description="文件哈希。MD5散列避免下载的文件有缺失" />
<Column Name="Runtime" DataType="Int32" Description="运行时。RID是运行时标识符用于标识应用程序运行所在的目标平台。如win-x64/linux-arm" Type="Stardust.Models.RuntimeIdentifier" />
<Column Name="Progress" DataType="String" Description="进度。发布进度" />
<Column Name="CommitId" DataType="String" Description="提交标识" Category="编译参数" />
<Column Name="CommitLog" DataType="String" Description="提交记录" Category="编译参数" />
<Column Name="CommitTime" DataType="DateTime" Description="提交时间" Category="编译参数" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateUserId" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUserId" DataType="Int32" Description="更新者" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="DeployId,Version" Unique="True" />
</Indexes>
</Table>
<Table Name="AppDeployHistory" Description="部署历史。记录应用集部署历史" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="DeployId" ColumnName="AppId" DataType="Int32" Map="AppDeploy@Id@$" Description="应用部署集。对应AppDeploy" />
<Column Name="NodeId" DataType="Int32" Map="Stardust.Data.Nodes.Node@ID@Name" Description="节点。节点服务器" />
<Column Name="Action" DataType="String" Nullable="False" Description="操作" />
<Column Name="Success" DataType="Boolean" Description="成功" />
<Column Name="Remark" DataType="String" Length="2000" Description="内容" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateUserId" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="DeployId,Id" />
<Index Columns="DeployId,Action,Id" />
<Index Columns="NodeId,Id" />
</Indexes>
</Table>
<Table Name="Attachment" Description="附件。用于记录各系统模块使用的文件可以是Local/NAS/OSS等对应魔方附件表" ConnName="Cube">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="Category" DataType="String" Description="业务分类" />
<Column Name="Key" DataType="String" Description="业务主键" />
<Column Name="Title" DataType="String" Length="200" Description="标题。业务内容作为附件标题,便于查看管理" />
<Column Name="FileName" DataType="String" Master="True" Length="200" Nullable="False" Description="文件名。原始文件名" />
<Column Name="Extension" DataType="String" Description="扩展名" />
<Column Name="Size" DataType="Int64" ItemType="GMK" Description="文件大小" />
<Column Name="ContentType" DataType="String" Length="200" Description="内容类型。用于Http响应" />
<Column Name="FilePath" DataType="String" Length="200" Description="路径。本地相对路径或OSS路径本地相对路径加上附件目录的配置方便整体转移附件" />
<Column Name="Hash" DataType="String" Description="哈希。MD5" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="UploadTime" DataType="DateTime" Description="上传时间。附件上传时间,可用于构造文件存储路径" />
<Column Name="Url" DataType="String" Length="500" Description="网址。链接到附件所在信息页的地址" />
<Column Name="Source" DataType="String" Length="500" Description="来源。用于远程抓取的附件来源地址,本地文件不存在时自动依次抓取" />
<Column Name="TraceId" DataType="String" Description="追踪。链路追踪用于APM性能追踪定位还原该事件的调用链" Category="扩展" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建用户" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新用户" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Category,Key" />
<Index Columns="FilePath" />
<Index Columns="Extension" />
</Indexes>
</Table>
</Tables>
</EntityModel>

File diff suppressed because it is too large Load Diff

View File

@ -1,555 +0,0 @@
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.Deployment;
/// <summary>应用节点。应用部署集和节点服务器的依赖关系一个应用可有多个部署集如arm和x64在目标节点上发布该部署集对应的应用zip包</summary>
[Serializable]
[DataObject]
[Description("应用节点。应用部署集和节点服务器的依赖关系一个应用可有多个部署集如arm和x64在目标节点上发布该部署集对应的应用zip包")]
[BindIndex("IX_AppDeployNode_DeployId", false, "DeployId")]
[BindIndex("IX_AppDeployNode_NodeId", false, "NodeId")]
[BindTable("AppDeployNode", Description = "应用节点。应用部署集和节点服务器的依赖关系一个应用可有多个部署集如arm和x64在目标节点上发布该部署集对应的应用zip包", ConnName = "Stardust", DbType = DatabaseType.None)]
public partial class AppDeployNode
{
#region
private Int32 _Id;
/// <summary>编号</summary>
[DisplayName("编号")]
[Description("编号")]
[DataObjectField(true, true, false, 0)]
[BindColumn("Id", "编号", "")]
public Int32 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } }
private String _DeployName;
/// <summary>发布名。默认为空,使用部署集上名字。可用于单节点多发布场景</summary>
[DisplayName("发布名")]
[Description("发布名。默认为空,使用部署集上名字。可用于单节点多发布场景")]
[DataObjectField(false, false, true, 50)]
[BindColumn("DeployName", "发布名。默认为空,使用部署集上名字。可用于单节点多发布场景", "")]
public String DeployName { get => _DeployName; set { if (OnPropertyChanging("DeployName", value)) { _DeployName = value; OnPropertyChanged("DeployName"); } } }
private Int32 _DeployId;
/// <summary>应用部署集。对应AppDeploy</summary>
[DisplayName("应用部署集")]
[Description("应用部署集。对应AppDeploy")]
[DataObjectField(false, false, false, 0)]
[BindColumn("AppId", "应用部署集。对应AppDeploy", "")]
public Int32 DeployId { get => _DeployId; set { if (OnPropertyChanging("DeployId", value)) { _DeployId = value; OnPropertyChanged("DeployId"); } } }
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 _IP;
/// <summary>IP地址。节点所在内网IP地址</summary>
[DisplayName("IP地址")]
[Description("IP地址。节点所在内网IP地址")]
[DataObjectField(false, false, true, 50)]
[BindColumn("IP", "IP地址。节点所在内网IP地址", "")]
public String IP { get => _IP; set { if (OnPropertyChanging("IP", value)) { _IP = value; OnPropertyChanged("IP"); } } }
private Boolean _Enable;
/// <summary>启用</summary>
[DisplayName("启用")]
[Description("启用")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Enable", "启用", "")]
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private String _FileName;
/// <summary>文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置</summary>
[Category("发布参数")]
[DisplayName("文件")]
[Description("文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置")]
[DataObjectField(false, false, true, 50)]
[BindColumn("FileName", "文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置", "")]
public String FileName { get => _FileName; set { if (OnPropertyChanging("FileName", value)) { _FileName = value; OnPropertyChanged("FileName"); } } }
private String _Arguments;
/// <summary>参数。启动应用的参数,为空时使用应用集配置</summary>
[Category("发布参数")]
[DisplayName("参数")]
[Description("参数。启动应用的参数,为空时使用应用集配置")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Arguments", "参数。启动应用的参数,为空时使用应用集配置", "")]
public String Arguments { get => _Arguments; set { if (OnPropertyChanging("Arguments", value)) { _Arguments = value; OnPropertyChanged("Arguments"); } } }
private String _WorkingDirectory;
/// <summary>工作目录。应用根目录,为空时使用应用集配置</summary>
[Category("发布参数")]
[DisplayName("工作目录")]
[Description("工作目录。应用根目录,为空时使用应用集配置")]
[DataObjectField(false, false, true, 200)]
[BindColumn("WorkingDirectory", "工作目录。应用根目录,为空时使用应用集配置", "")]
public String WorkingDirectory { get => _WorkingDirectory; set { if (OnPropertyChanging("WorkingDirectory", value)) { _WorkingDirectory = value; OnPropertyChanged("WorkingDirectory"); } } }
private String _Environments;
/// <summary>环境变量。启动应用前设置的环境变量</summary>
[Category("发布参数")]
[DisplayName("环境变量")]
[Description("环境变量。启动应用前设置的环境变量")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Environments", "环境变量。启动应用前设置的环境变量", "")]
public String Environments { get => _Environments; set { if (OnPropertyChanging("Environments", value)) { _Environments = value; OnPropertyChanged("Environments"); } } }
private Stardust.Models.ServiceModes _Mode;
/// <summary>工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置</summary>
[Category("发布参数")]
[DisplayName("工作模式")]
[Description("工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Mode", "工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置", "")]
public Stardust.Models.ServiceModes Mode { get => _Mode; set { if (OnPropertyChanging("Mode", value)) { _Mode = value; OnPropertyChanged("Mode"); } } }
private Int32 _Delay;
/// <summary>延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒</summary>
[Category("发布参数")]
[DisplayName("延迟")]
[Description("延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Delay", "延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒", "")]
public Int32 Delay { get => _Delay; set { if (OnPropertyChanging("Delay", value)) { _Delay = value; OnPropertyChanged("Delay"); } } }
private Int32 _ProcessId;
/// <summary>进程</summary>
[Category("状态")]
[DisplayName("进程")]
[Description("进程")]
[DataObjectField(false, false, false, 0)]
[BindColumn("ProcessId", "进程", "")]
public Int32 ProcessId { get => _ProcessId; set { if (OnPropertyChanging("ProcessId", value)) { _ProcessId = value; OnPropertyChanged("ProcessId"); } } }
private String _UserName;
/// <summary>用户名。启动该进程的用户名</summary>
[Category("状态")]
[DisplayName("用户名")]
[Description("用户名。启动该进程的用户名")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UserName", "用户名。启动该进程的用户名", "")]
public String UserName { get => _UserName; set { if (OnPropertyChanging("UserName", value)) { _UserName = value; OnPropertyChanged("UserName"); } } }
private String _ProcessName;
/// <summary>进程名称</summary>
[Category("状态")]
[DisplayName("进程名称")]
[Description("进程名称")]
[DataObjectField(false, false, true, 200)]
[BindColumn("ProcessName", "进程名称", "")]
public String ProcessName { get => _ProcessName; set { if (OnPropertyChanging("ProcessName", value)) { _ProcessName = value; OnPropertyChanged("ProcessName"); } } }
private DateTime _StartTime;
/// <summary>进程时间</summary>
[Category("状态")]
[DisplayName("进程时间")]
[Description("进程时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("StartTime", "进程时间", "")]
public DateTime StartTime { get => _StartTime; set { if (OnPropertyChanging("StartTime", value)) { _StartTime = value; OnPropertyChanged("StartTime"); } } }
private String _Version;
/// <summary>版本。客户端</summary>
[Category("状态")]
[DisplayName("版本")]
[Description("版本。客户端")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Version", "版本。客户端", "")]
public String Version { get => _Version; set { if (OnPropertyChanging("Version", value)) { _Version = value; OnPropertyChanged("Version"); } } }
private DateTime _Compile;
/// <summary>编译时间。客户端</summary>
[Category("状态")]
[DisplayName("编译时间")]
[Description("编译时间。客户端")]
[DataObjectField(false, false, true, 0)]
[BindColumn("Compile", "编译时间。客户端", "")]
public DateTime Compile { get => _Compile; set { if (OnPropertyChanging("Compile", value)) { _Compile = value; OnPropertyChanged("Compile"); } } }
private String _Listens;
/// <summary>监听端口。网络端口监听信息</summary>
[Category("状态")]
[DisplayName("监听端口")]
[Description("监听端口。网络端口监听信息")]
[DataObjectField(false, false, true, 200)]
[BindColumn("Listens", "监听端口。网络端口监听信息", "")]
public String Listens { get => _Listens; set { if (OnPropertyChanging("Listens", value)) { _Listens = value; OnPropertyChanged("Listens"); } } }
private DateTime _LastActive;
/// <summary>最后活跃。最后一次上报心跳的时间</summary>
[Category("状态")]
[DisplayName("最后活跃")]
[Description("最后活跃。最后一次上报心跳的时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("LastActive", "最后活跃。最后一次上报心跳的时间", "")]
public DateTime LastActive { get => _LastActive; set { if (OnPropertyChanging("LastActive", value)) { _LastActive = value; OnPropertyChanged("LastActive"); } } }
private DateTime _LastUpload;
/// <summary>最后上传。最后一次上传客户端配置的时间</summary>
[Category("状态")]
[DisplayName("最后上传")]
[Description("最后上传。最后一次上传客户端配置的时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("LastUpload", "最后上传。最后一次上传客户端配置的时间", "")]
public DateTime LastUpload { get => _LastUpload; set { if (OnPropertyChanging("LastUpload", value)) { _LastUpload = value; OnPropertyChanged("LastUpload"); } } }
private String _TraceId;
/// <summary>追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递</summary>
[Category("扩展")]
[DisplayName("追踪")]
[Description("追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递")]
[DataObjectField(false, false, true, 50)]
[BindColumn("TraceId", "追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递", "")]
public String TraceId { get => _TraceId; set { if (OnPropertyChanging("TraceId", value)) { _TraceId = value; OnPropertyChanged("TraceId"); } } }
private Int32 _CreateUserId;
/// <summary>创建人</summary>
[Category("扩展")]
[DisplayName("创建人")]
[Description("创建人")]
[DataObjectField(false, false, false, 0)]
[BindColumn("CreateUserId", "创建人", "")]
public Int32 CreateUserId { get => _CreateUserId; set { if (OnPropertyChanging("CreateUserId", value)) { _CreateUserId = value; OnPropertyChanged("CreateUserId"); } } }
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"); } } }
private Int32 _UpdateUserId;
/// <summary>更新者</summary>
[Category("扩展")]
[DisplayName("更新者")]
[Description("更新者")]
[DataObjectField(false, false, false, 0)]
[BindColumn("UpdateUserId", "更新者", "")]
public Int32 UpdateUserId { get => _UpdateUserId; set { if (OnPropertyChanging("UpdateUserId", value)) { _UpdateUserId = value; OnPropertyChanged("UpdateUserId"); } } }
private DateTime _UpdateTime;
/// <summary>更新时间</summary>
[Category("扩展")]
[DisplayName("更新时间")]
[Description("更新时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("UpdateTime", "更新时间", "")]
public DateTime UpdateTime { get => _UpdateTime; set { if (OnPropertyChanging("UpdateTime", value)) { _UpdateTime = value; OnPropertyChanged("UpdateTime"); } } }
private String _UpdateIP;
/// <summary>更新地址</summary>
[Category("扩展")]
[DisplayName("更新地址")]
[Description("更新地址")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UpdateIP", "更新地址", "")]
public String UpdateIP { get => _UpdateIP; set { if (OnPropertyChanging("UpdateIP", value)) { _UpdateIP = value; OnPropertyChanged("UpdateIP"); } } }
private String _Remark;
/// <summary>备注</summary>
[Category("扩展")]
[DisplayName("备注")]
[Description("备注")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Remark", "备注", "")]
public String Remark { get => _Remark; set { if (OnPropertyChanging("Remark", value)) { _Remark = value; OnPropertyChanged("Remark"); } } }
#endregion
#region /
/// <summary>获取/设置 字段值</summary>
/// <param name="name">字段名</param>
/// <returns></returns>
public override Object this[String name]
{
get => name switch
{
"Id" => _Id,
"DeployName" => _DeployName,
"DeployId" => _DeployId,
"NodeId" => _NodeId,
"IP" => _IP,
"Enable" => _Enable,
"FileName" => _FileName,
"Arguments" => _Arguments,
"WorkingDirectory" => _WorkingDirectory,
"Environments" => _Environments,
"Mode" => _Mode,
"Delay" => _Delay,
"ProcessId" => _ProcessId,
"UserName" => _UserName,
"ProcessName" => _ProcessName,
"StartTime" => _StartTime,
"Version" => _Version,
"Compile" => _Compile,
"Listens" => _Listens,
"LastActive" => _LastActive,
"LastUpload" => _LastUpload,
"TraceId" => _TraceId,
"CreateUserId" => _CreateUserId,
"CreateTime" => _CreateTime,
"CreateIP" => _CreateIP,
"UpdateUserId" => _UpdateUserId,
"UpdateTime" => _UpdateTime,
"UpdateIP" => _UpdateIP,
"Remark" => _Remark,
_ => base[name]
};
set
{
switch (name)
{
case "Id": _Id = value.ToInt(); break;
case "DeployName": _DeployName = Convert.ToString(value); break;
case "DeployId": _DeployId = value.ToInt(); break;
case "NodeId": _NodeId = value.ToInt(); break;
case "IP": _IP = Convert.ToString(value); break;
case "Enable": _Enable = value.ToBoolean(); break;
case "FileName": _FileName = Convert.ToString(value); break;
case "Arguments": _Arguments = Convert.ToString(value); break;
case "WorkingDirectory": _WorkingDirectory = Convert.ToString(value); break;
case "Environments": _Environments = Convert.ToString(value); break;
case "Mode": _Mode = (Stardust.Models.ServiceModes)value.ToInt(); break;
case "Delay": _Delay = value.ToInt(); break;
case "ProcessId": _ProcessId = value.ToInt(); break;
case "UserName": _UserName = Convert.ToString(value); break;
case "ProcessName": _ProcessName = Convert.ToString(value); break;
case "StartTime": _StartTime = value.ToDateTime(); break;
case "Version": _Version = Convert.ToString(value); break;
case "Compile": _Compile = value.ToDateTime(); break;
case "Listens": _Listens = Convert.ToString(value); break;
case "LastActive": _LastActive = value.ToDateTime(); break;
case "LastUpload": _LastUpload = value.ToDateTime(); break;
case "TraceId": _TraceId = Convert.ToString(value); break;
case "CreateUserId": _CreateUserId = value.ToInt(); break;
case "CreateTime": _CreateTime = value.ToDateTime(); break;
case "CreateIP": _CreateIP = Convert.ToString(value); break;
case "UpdateUserId": _UpdateUserId = value.ToInt(); break;
case "UpdateTime": _UpdateTime = value.ToDateTime(); break;
case "UpdateIP": _UpdateIP = Convert.ToString(value); break;
case "Remark": _Remark = Convert.ToString(value); break;
default: base[name] = value; break;
}
}
}
#endregion
#region
/// <summary>应用部署集</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public AppDeploy Deploy => Extends.Get(nameof(Deploy), k => AppDeploy.FindById(DeployId));
#endregion
#region
#endregion
#region
/// <summary>取得应用节点字段信息的快捷方式</summary>
public partial class _
{
/// <summary>编号</summary>
public static readonly Field Id = FindByName("Id");
/// <summary>发布名。默认为空,使用部署集上名字。可用于单节点多发布场景</summary>
public static readonly Field DeployName = FindByName("DeployName");
/// <summary>应用部署集。对应AppDeploy</summary>
public static readonly Field DeployId = FindByName("DeployId");
/// <summary>节点。节点服务器</summary>
public static readonly Field NodeId = FindByName("NodeId");
/// <summary>IP地址。节点所在内网IP地址</summary>
public static readonly Field IP = FindByName("IP");
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置</summary>
public static readonly Field FileName = FindByName("FileName");
/// <summary>参数。启动应用的参数,为空时使用应用集配置</summary>
public static readonly Field Arguments = FindByName("Arguments");
/// <summary>工作目录。应用根目录,为空时使用应用集配置</summary>
public static readonly Field WorkingDirectory = FindByName("WorkingDirectory");
/// <summary>环境变量。启动应用前设置的环境变量</summary>
public static readonly Field Environments = FindByName("Environments");
/// <summary>工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置</summary>
public static readonly Field Mode = FindByName("Mode");
/// <summary>延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒</summary>
public static readonly Field Delay = FindByName("Delay");
/// <summary>进程</summary>
public static readonly Field ProcessId = FindByName("ProcessId");
/// <summary>用户名。启动该进程的用户名</summary>
public static readonly Field UserName = FindByName("UserName");
/// <summary>进程名称</summary>
public static readonly Field ProcessName = FindByName("ProcessName");
/// <summary>进程时间</summary>
public static readonly Field StartTime = FindByName("StartTime");
/// <summary>版本。客户端</summary>
public static readonly Field Version = FindByName("Version");
/// <summary>编译时间。客户端</summary>
public static readonly Field Compile = FindByName("Compile");
/// <summary>监听端口。网络端口监听信息</summary>
public static readonly Field Listens = FindByName("Listens");
/// <summary>最后活跃。最后一次上报心跳的时间</summary>
public static readonly Field LastActive = FindByName("LastActive");
/// <summary>最后上传。最后一次上传客户端配置的时间</summary>
public static readonly Field LastUpload = FindByName("LastUpload");
/// <summary>追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递</summary>
public static readonly Field TraceId = FindByName("TraceId");
/// <summary>创建人</summary>
public static readonly Field CreateUserId = FindByName("CreateUserId");
/// <summary>创建时间</summary>
public static readonly Field CreateTime = FindByName("CreateTime");
/// <summary>创建地址</summary>
public static readonly Field CreateIP = FindByName("CreateIP");
/// <summary>更新者</summary>
public static readonly Field UpdateUserId = FindByName("UpdateUserId");
/// <summary>更新时间</summary>
public static readonly Field UpdateTime = FindByName("UpdateTime");
/// <summary>更新地址</summary>
public static readonly Field UpdateIP = FindByName("UpdateIP");
/// <summary>备注</summary>
public static readonly Field Remark = FindByName("Remark");
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 DeployName = "DeployName";
/// <summary>应用部署集。对应AppDeploy</summary>
public const String DeployId = "DeployId";
/// <summary>节点。节点服务器</summary>
public const String NodeId = "NodeId";
/// <summary>IP地址。节点所在内网IP地址</summary>
public const String IP = "IP";
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>文件。应用启动文件可直接使用zip包支持差异定制为空时使用应用集配置</summary>
public const String FileName = "FileName";
/// <summary>参数。启动应用的参数,为空时使用应用集配置</summary>
public const String Arguments = "Arguments";
/// <summary>工作目录。应用根目录,为空时使用应用集配置</summary>
public const String WorkingDirectory = "WorkingDirectory";
/// <summary>环境变量。启动应用前设置的环境变量</summary>
public const String Environments = "Environments";
/// <summary>工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip。为空时使用应用集配置</summary>
public const String Mode = "Mode";
/// <summary>延迟。批量发布时,需要延迟执行的时间,用于滚动发布,单位秒</summary>
public const String Delay = "Delay";
/// <summary>进程</summary>
public const String ProcessId = "ProcessId";
/// <summary>用户名。启动该进程的用户名</summary>
public const String UserName = "UserName";
/// <summary>进程名称</summary>
public const String ProcessName = "ProcessName";
/// <summary>进程时间</summary>
public const String StartTime = "StartTime";
/// <summary>版本。客户端</summary>
public const String Version = "Version";
/// <summary>编译时间。客户端</summary>
public const String Compile = "Compile";
/// <summary>监听端口。网络端口监听信息</summary>
public const String Listens = "Listens";
/// <summary>最后活跃。最后一次上报心跳的时间</summary>
public const String LastActive = "LastActive";
/// <summary>最后上传。最后一次上传客户端配置的时间</summary>
public const String LastUpload = "LastUpload";
/// <summary>追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递</summary>
public const String TraceId = "TraceId";
/// <summary>创建人</summary>
public const String CreateUserId = "CreateUserId";
/// <summary>创建时间</summary>
public const String CreateTime = "CreateTime";
/// <summary>创建地址</summary>
public const String CreateIP = "CreateIP";
/// <summary>更新者</summary>
public const String UpdateUserId = "UpdateUserId";
/// <summary>更新时间</summary>
public const String UpdateTime = "UpdateTime";
/// <summary>更新地址</summary>
public const String UpdateIP = "UpdateIP";
/// <summary>备注</summary>
public const String Remark = "Remark";
}
#endregion
}

View File

@ -1,605 +0,0 @@
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.Deployment;
/// <summary>应用部署。应用部署配置单应用可有多个部署集合例如分别是arm和x64。发布时新增版本拉取代码编译并上传zip应用包再到部署节点里发布</summary>
[Serializable]
[DataObject]
[Description("应用部署。应用部署配置单应用可有多个部署集合例如分别是arm和x64。发布时新增版本拉取代码编译并上传zip应用包再到部署节点里发布")]
[BindIndex("IU_AppDeploy_Name", true, "Name")]
[BindIndex("IX_AppDeploy_ProjectId", false, "ProjectId")]
[BindTable("AppDeploy", Description = "应用部署。应用部署配置单应用可有多个部署集合例如分别是arm和x64。发布时新增版本拉取代码编译并上传zip应用包再到部署节点里发布", ConnName = "Stardust", DbType = DatabaseType.None)]
public partial class AppDeploy
{
#region
private Int32 _Id;
/// <summary>编号</summary>
[DisplayName("编号")]
[Description("编号")]
[DataObjectField(true, true, false, 0)]
[BindColumn("Id", "编号", "")]
public Int32 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } }
private Int32 _ProjectId;
/// <summary>项目。资源归属的团队</summary>
[DisplayName("项目")]
[Description("项目。资源归属的团队")]
[DataObjectField(false, false, false, 0)]
[BindColumn("ProjectId", "项目。资源归属的团队", "")]
public Int32 ProjectId { get => _ProjectId; set { if (OnPropertyChanging("ProjectId", value)) { _ProjectId = value; OnPropertyChanged("ProjectId"); } } }
private Int32 _AppId;
/// <summary>应用。对应StarApp</summary>
[DisplayName("应用")]
[Description("应用。对应StarApp")]
[DataObjectField(false, false, false, 0)]
[BindColumn("AppId", "应用。对应StarApp", "")]
public Int32 AppId { get => _AppId; set { if (OnPropertyChanging("AppId", value)) { _AppId = value; OnPropertyChanged("AppId"); } } }
private String _Category;
/// <summary>类别</summary>
[DisplayName("类别")]
[Description("类别")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Category", "类别", "")]
public String Category { get => _Category; set { if (OnPropertyChanging("Category", value)) { _Category = value; OnPropertyChanged("Category"); } } }
private String _Name;
/// <summary>名称。应用名</summary>
[DisplayName("名称")]
[Description("名称。应用名")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Name", "名称。应用名", "", Master = true)]
public String Name { get => _Name; set { if (OnPropertyChanging("Name", value)) { _Name = value; OnPropertyChanged("Name"); } } }
private Boolean _Enable;
/// <summary>启用</summary>
[DisplayName("启用")]
[Description("启用")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Enable", "启用", "")]
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private Int32 _Nodes;
/// <summary>节点。该应用部署集所拥有的节点数</summary>
[DisplayName("节点")]
[Description("节点。该应用部署集所拥有的节点数")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Nodes", "节点。该应用部署集所拥有的节点数", "")]
public Int32 Nodes { get => _Nodes; set { if (OnPropertyChanging("Nodes", value)) { _Nodes = value; OnPropertyChanged("Nodes"); } } }
private String _Version;
/// <summary>版本。应用正在使用的版本号</summary>
[DisplayName("版本")]
[Description("版本。应用正在使用的版本号")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Version", "版本。应用正在使用的版本号", "")]
public String Version { get => _Version; set { if (OnPropertyChanging("Version", value)) { _Version = value; OnPropertyChanged("Version"); } } }
private Boolean _MultiVersion;
/// <summary>多版本。支持多运行时版本,此时只认可部署版本中符合运行时要求的最新可用版本</summary>
[DisplayName("多版本")]
[Description("多版本。支持多运行时版本,此时只认可部署版本中符合运行时要求的最新可用版本")]
[DataObjectField(false, false, false, 0)]
[BindColumn("MultiVersion", "多版本。支持多运行时版本,此时只认可部署版本中符合运行时要求的最新可用版本", "")]
public Boolean MultiVersion { get => _MultiVersion; set { if (OnPropertyChanging("MultiVersion", value)) { _MultiVersion = value; OnPropertyChanged("MultiVersion"); } } }
private Boolean _AutoPublish;
/// <summary>自动发布。应用版本后自动发布到启用节点,加快发布速度</summary>
[DisplayName("自动发布")]
[Description("自动发布。应用版本后自动发布到启用节点,加快发布速度")]
[DataObjectField(false, false, false, 0)]
[BindColumn("AutoPublish", "自动发布。应用版本后自动发布到启用节点,加快发布速度", "")]
public Boolean AutoPublish { get => _AutoPublish; set { if (OnPropertyChanging("AutoPublish", value)) { _AutoPublish = value; OnPropertyChanged("AutoPublish"); } } }
private String _PackageName;
/// <summary>包名。用于判断上传包名是否正确,避免错误上传其它应用包,支持*模糊匹配</summary>
[DisplayName("包名")]
[Description("包名。用于判断上传包名是否正确,避免错误上传其它应用包,支持*模糊匹配")]
[DataObjectField(false, false, true, 50)]
[BindColumn("PackageName", "包名。用于判断上传包名是否正确,避免错误上传其它应用包,支持*模糊匹配", "")]
public String PackageName { get => _PackageName; set { if (OnPropertyChanging("PackageName", value)) { _PackageName = value; OnPropertyChanged("PackageName"); } } }
private String _Repository;
/// <summary>代码库。下载代码的位置</summary>
[Category("编译参数")]
[DisplayName("代码库")]
[Description("代码库。下载代码的位置")]
[DataObjectField(false, false, true, 200)]
[BindColumn("Repository", "代码库。下载代码的位置", "", ItemType = "url")]
public String Repository { get => _Repository; set { if (OnPropertyChanging("Repository", value)) { _Repository = value; OnPropertyChanged("Repository"); } } }
private String _Branch;
/// <summary>分支。默认master</summary>
[Category("编译参数")]
[DisplayName("分支")]
[Description("分支。默认master")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Branch", "分支。默认master", "", DefaultValue = "master")]
public String Branch { get => _Branch; set { if (OnPropertyChanging("Branch", value)) { _Branch = value; OnPropertyChanged("Branch"); } } }
private String _ProjectPath;
/// <summary>项目路径。需要编译的项目路径</summary>
[Category("编译参数")]
[DisplayName("项目路径")]
[Description("项目路径。需要编译的项目路径")]
[DataObjectField(false, false, true, 50)]
[BindColumn("ProjectPath", "项目路径。需要编译的项目路径", "")]
public String ProjectPath { get => _ProjectPath; set { if (OnPropertyChanging("ProjectPath", value)) { _ProjectPath = value; OnPropertyChanged("ProjectPath"); } } }
private Stardust.Models.ProjectKinds _ProjectKind;
/// <summary>项目类型。默认dotnet</summary>
[Category("编译参数")]
[DisplayName("项目类型")]
[Description("项目类型。默认dotnet")]
[DataObjectField(false, false, false, 0)]
[BindColumn("ProjectKind", "项目类型。默认dotnet", "", DefaultValue = "1")]
public Stardust.Models.ProjectKinds ProjectKind { get => _ProjectKind; set { if (OnPropertyChanging("ProjectKind", value)) { _ProjectKind = value; OnPropertyChanged("ProjectKind"); } } }
private String _PackageFilters;
/// <summary>打包过滤器。需要打包哪些文件,支持通配符,多项分号隔开</summary>
[Category("编译参数")]
[DisplayName("打包过滤器")]
[Description("打包过滤器。需要打包哪些文件,支持通配符,多项分号隔开")]
[DataObjectField(false, false, true, 50)]
[BindColumn("PackageFilters", "打包过滤器。需要打包哪些文件,支持通配符,多项分号隔开", "")]
public String PackageFilters { get => _PackageFilters; set { if (OnPropertyChanging("PackageFilters", value)) { _PackageFilters = value; OnPropertyChanged("PackageFilters"); } } }
private String _FileName;
/// <summary>文件。应用启动文件可直接使用zip包</summary>
[Category("发布参数")]
[DisplayName("文件")]
[Description("文件。应用启动文件可直接使用zip包")]
[DataObjectField(false, false, true, 50)]
[BindColumn("FileName", "文件。应用启动文件可直接使用zip包", "")]
public String FileName { get => _FileName; set { if (OnPropertyChanging("FileName", value)) { _FileName = value; OnPropertyChanged("FileName"); } } }
private String _Arguments;
/// <summary>参数。启动应用的参数</summary>
[Category("发布参数")]
[DisplayName("参数")]
[Description("参数。启动应用的参数")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Arguments", "参数。启动应用的参数", "")]
public String Arguments { get => _Arguments; set { if (OnPropertyChanging("Arguments", value)) { _Arguments = value; OnPropertyChanged("Arguments"); } } }
private String _WorkingDirectory;
/// <summary>工作目录。应用根目录</summary>
[Category("发布参数")]
[DisplayName("工作目录")]
[Description("工作目录。应用根目录")]
[DataObjectField(false, false, true, 200)]
[BindColumn("WorkingDirectory", "工作目录。应用根目录", "")]
public String WorkingDirectory { get => _WorkingDirectory; set { if (OnPropertyChanging("WorkingDirectory", value)) { _WorkingDirectory = value; OnPropertyChanged("WorkingDirectory"); } } }
private String _UserName;
/// <summary>用户名。以该用户执行应用</summary>
[Category("发布参数")]
[DisplayName("用户名")]
[Description("用户名。以该用户执行应用")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UserName", "用户名。以该用户执行应用", "")]
public String UserName { get => _UserName; set { if (OnPropertyChanging("UserName", value)) { _UserName = value; OnPropertyChanged("UserName"); } } }
private String _Environments;
/// <summary>环境变量。启动应用前设置的环境变量</summary>
[Category("发布参数")]
[DisplayName("环境变量")]
[Description("环境变量。启动应用前设置的环境变量")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Environments", "环境变量。启动应用前设置的环境变量", "")]
public String Environments { get => _Environments; set { if (OnPropertyChanging("Environments", value)) { _Environments = value; OnPropertyChanged("Environments"); } } }
private Int32 _MaxMemory;
/// <summary>最大内存。单位M超过上限时自动重启应用默认0不限制</summary>
[Category("发布参数")]
[DisplayName("最大内存")]
[Description("最大内存。单位M超过上限时自动重启应用默认0不限制")]
[DataObjectField(false, false, false, 0)]
[BindColumn("MaxMemory", "最大内存。单位M超过上限时自动重启应用默认0不限制", "")]
public Int32 MaxMemory { get => _MaxMemory; set { if (OnPropertyChanging("MaxMemory", value)) { _MaxMemory = value; OnPropertyChanged("MaxMemory"); } } }
private Stardust.Models.ServiceModes _Mode;
/// <summary>工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip</summary>
[Category("发布参数")]
[DisplayName("工作模式")]
[Description("工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Mode", "工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip", "")]
public Stardust.Models.ServiceModes Mode { get => _Mode; set { if (OnPropertyChanging("Mode", value)) { _Mode = value; OnPropertyChanged("Mode"); } } }
private Boolean _AutoStop;
/// <summary>自动停止。随着宿主的退出,同时停止该应用进程</summary>
[Category("发布参数")]
[DisplayName("自动停止")]
[Description("自动停止。随着宿主的退出,同时停止该应用进程")]
[DataObjectField(false, false, false, 0)]
[BindColumn("AutoStop", "自动停止。随着宿主的退出,同时停止该应用进程", "")]
public Boolean AutoStop { get => _AutoStop; set { if (OnPropertyChanging("AutoStop", value)) { _AutoStop = value; OnPropertyChanged("AutoStop"); } } }
private Boolean _ReloadOnChange;
/// <summary>检测变动。当文件发生改变时,自动重启应用</summary>
[Category("发布参数")]
[DisplayName("检测变动")]
[Description("检测变动。当文件发生改变时,自动重启应用")]
[DataObjectField(false, false, false, 0)]
[BindColumn("ReloadOnChange", "检测变动。当文件发生改变时,自动重启应用", "")]
public Boolean ReloadOnChange { get => _ReloadOnChange; set { if (OnPropertyChanging("ReloadOnChange", value)) { _ReloadOnChange = value; OnPropertyChanged("ReloadOnChange"); } } }
private Int32 _CreateUserId;
/// <summary>创建者</summary>
[Category("扩展")]
[DisplayName("创建者")]
[Description("创建者")]
[DataObjectField(false, false, false, 0)]
[BindColumn("CreateUserId", "创建者", "")]
public Int32 CreateUserId { get => _CreateUserId; set { if (OnPropertyChanging("CreateUserId", value)) { _CreateUserId = value; OnPropertyChanged("CreateUserId"); } } }
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"); } } }
private Int32 _UpdateUserId;
/// <summary>更新者</summary>
[Category("扩展")]
[DisplayName("更新者")]
[Description("更新者")]
[DataObjectField(false, false, false, 0)]
[BindColumn("UpdateUserId", "更新者", "")]
public Int32 UpdateUserId { get => _UpdateUserId; set { if (OnPropertyChanging("UpdateUserId", value)) { _UpdateUserId = value; OnPropertyChanged("UpdateUserId"); } } }
private DateTime _UpdateTime;
/// <summary>更新时间</summary>
[Category("扩展")]
[DisplayName("更新时间")]
[Description("更新时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("UpdateTime", "更新时间", "")]
public DateTime UpdateTime { get => _UpdateTime; set { if (OnPropertyChanging("UpdateTime", value)) { _UpdateTime = value; OnPropertyChanged("UpdateTime"); } } }
private String _UpdateIP;
/// <summary>更新地址</summary>
[Category("扩展")]
[DisplayName("更新地址")]
[Description("更新地址")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UpdateIP", "更新地址", "")]
public String UpdateIP { get => _UpdateIP; set { if (OnPropertyChanging("UpdateIP", value)) { _UpdateIP = value; OnPropertyChanged("UpdateIP"); } } }
private String _Remark;
/// <summary>备注</summary>
[Category("扩展")]
[DisplayName("备注")]
[Description("备注")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Remark", "备注", "")]
public String Remark { get => _Remark; set { if (OnPropertyChanging("Remark", value)) { _Remark = value; OnPropertyChanged("Remark"); } } }
#endregion
#region /
/// <summary>获取/设置 字段值</summary>
/// <param name="name">字段名</param>
/// <returns></returns>
public override Object this[String name]
{
get => name switch
{
"Id" => _Id,
"ProjectId" => _ProjectId,
"AppId" => _AppId,
"Category" => _Category,
"Name" => _Name,
"Enable" => _Enable,
"Nodes" => _Nodes,
"Version" => _Version,
"MultiVersion" => _MultiVersion,
"AutoPublish" => _AutoPublish,
"PackageName" => _PackageName,
"Repository" => _Repository,
"Branch" => _Branch,
"ProjectPath" => _ProjectPath,
"ProjectKind" => _ProjectKind,
"PackageFilters" => _PackageFilters,
"FileName" => _FileName,
"Arguments" => _Arguments,
"WorkingDirectory" => _WorkingDirectory,
"UserName" => _UserName,
"Environments" => _Environments,
"MaxMemory" => _MaxMemory,
"Mode" => _Mode,
"AutoStop" => _AutoStop,
"ReloadOnChange" => _ReloadOnChange,
"CreateUserId" => _CreateUserId,
"CreateTime" => _CreateTime,
"CreateIP" => _CreateIP,
"UpdateUserId" => _UpdateUserId,
"UpdateTime" => _UpdateTime,
"UpdateIP" => _UpdateIP,
"Remark" => _Remark,
_ => base[name]
};
set
{
switch (name)
{
case "Id": _Id = value.ToInt(); break;
case "ProjectId": _ProjectId = value.ToInt(); break;
case "AppId": _AppId = value.ToInt(); break;
case "Category": _Category = Convert.ToString(value); break;
case "Name": _Name = Convert.ToString(value); break;
case "Enable": _Enable = value.ToBoolean(); break;
case "Nodes": _Nodes = value.ToInt(); break;
case "Version": _Version = Convert.ToString(value); break;
case "MultiVersion": _MultiVersion = value.ToBoolean(); break;
case "AutoPublish": _AutoPublish = value.ToBoolean(); break;
case "PackageName": _PackageName = Convert.ToString(value); break;
case "Repository": _Repository = Convert.ToString(value); break;
case "Branch": _Branch = Convert.ToString(value); break;
case "ProjectPath": _ProjectPath = Convert.ToString(value); break;
case "ProjectKind": _ProjectKind = (Stardust.Models.ProjectKinds)value.ToInt(); break;
case "PackageFilters": _PackageFilters = Convert.ToString(value); break;
case "FileName": _FileName = Convert.ToString(value); break;
case "Arguments": _Arguments = Convert.ToString(value); break;
case "WorkingDirectory": _WorkingDirectory = Convert.ToString(value); break;
case "UserName": _UserName = Convert.ToString(value); break;
case "Environments": _Environments = Convert.ToString(value); break;
case "MaxMemory": _MaxMemory = value.ToInt(); break;
case "Mode": _Mode = (Stardust.Models.ServiceModes)value.ToInt(); break;
case "AutoStop": _AutoStop = value.ToBoolean(); break;
case "ReloadOnChange": _ReloadOnChange = value.ToBoolean(); break;
case "CreateUserId": _CreateUserId = value.ToInt(); break;
case "CreateTime": _CreateTime = value.ToDateTime(); break;
case "CreateIP": _CreateIP = Convert.ToString(value); break;
case "UpdateUserId": _UpdateUserId = value.ToInt(); break;
case "UpdateTime": _UpdateTime = value.ToDateTime(); break;
case "UpdateIP": _UpdateIP = Convert.ToString(value); break;
case "Remark": _Remark = Convert.ToString(value); break;
default: base[name] = value; break;
}
}
}
#endregion
#region
/// <summary>项目</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public Stardust.Data.Platform.GalaxyProject Project => Extends.Get(nameof(Project), k => Stardust.Data.Platform.GalaxyProject.FindById(ProjectId));
/// <summary>项目</summary>
[Map(nameof(ProjectId), typeof(Stardust.Data.Platform.GalaxyProject), "Id")]
public String ProjectName => Project?.Name;
#endregion
#region
#endregion
#region
/// <summary>取得应用部署字段信息的快捷方式</summary>
public partial class _
{
/// <summary>编号</summary>
public static readonly Field Id = FindByName("Id");
/// <summary>项目。资源归属的团队</summary>
public static readonly Field ProjectId = FindByName("ProjectId");
/// <summary>应用。对应StarApp</summary>
public static readonly Field AppId = FindByName("AppId");
/// <summary>类别</summary>
public static readonly Field Category = FindByName("Category");
/// <summary>名称。应用名</summary>
public static readonly Field Name = FindByName("Name");
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>节点。该应用部署集所拥有的节点数</summary>
public static readonly Field Nodes = FindByName("Nodes");
/// <summary>版本。应用正在使用的版本号</summary>
public static readonly Field Version = FindByName("Version");
/// <summary>多版本。支持多运行时版本,此时只认可部署版本中符合运行时要求的最新可用版本</summary>
public static readonly Field MultiVersion = FindByName("MultiVersion");
/// <summary>自动发布。应用版本后自动发布到启用节点,加快发布速度</summary>
public static readonly Field AutoPublish = FindByName("AutoPublish");
/// <summary>包名。用于判断上传包名是否正确,避免错误上传其它应用包,支持*模糊匹配</summary>
public static readonly Field PackageName = FindByName("PackageName");
/// <summary>代码库。下载代码的位置</summary>
public static readonly Field Repository = FindByName("Repository");
/// <summary>分支。默认master</summary>
public static readonly Field Branch = FindByName("Branch");
/// <summary>项目路径。需要编译的项目路径</summary>
public static readonly Field ProjectPath = FindByName("ProjectPath");
/// <summary>项目类型。默认dotnet</summary>
public static readonly Field ProjectKind = FindByName("ProjectKind");
/// <summary>打包过滤器。需要打包哪些文件,支持通配符,多项分号隔开</summary>
public static readonly Field PackageFilters = FindByName("PackageFilters");
/// <summary>文件。应用启动文件可直接使用zip包</summary>
public static readonly Field FileName = FindByName("FileName");
/// <summary>参数。启动应用的参数</summary>
public static readonly Field Arguments = FindByName("Arguments");
/// <summary>工作目录。应用根目录</summary>
public static readonly Field WorkingDirectory = FindByName("WorkingDirectory");
/// <summary>用户名。以该用户执行应用</summary>
public static readonly Field UserName = FindByName("UserName");
/// <summary>环境变量。启动应用前设置的环境变量</summary>
public static readonly Field Environments = FindByName("Environments");
/// <summary>最大内存。单位M超过上限时自动重启应用默认0不限制</summary>
public static readonly Field MaxMemory = FindByName("MaxMemory");
/// <summary>工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip</summary>
public static readonly Field Mode = FindByName("Mode");
/// <summary>自动停止。随着宿主的退出,同时停止该应用进程</summary>
public static readonly Field AutoStop = FindByName("AutoStop");
/// <summary>检测变动。当文件发生改变时,自动重启应用</summary>
public static readonly Field ReloadOnChange = FindByName("ReloadOnChange");
/// <summary>创建者</summary>
public static readonly Field CreateUserId = FindByName("CreateUserId");
/// <summary>创建时间</summary>
public static readonly Field CreateTime = FindByName("CreateTime");
/// <summary>创建地址</summary>
public static readonly Field CreateIP = FindByName("CreateIP");
/// <summary>更新者</summary>
public static readonly Field UpdateUserId = FindByName("UpdateUserId");
/// <summary>更新时间</summary>
public static readonly Field UpdateTime = FindByName("UpdateTime");
/// <summary>更新地址</summary>
public static readonly Field UpdateIP = FindByName("UpdateIP");
/// <summary>备注</summary>
public static readonly Field Remark = FindByName("Remark");
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 ProjectId = "ProjectId";
/// <summary>应用。对应StarApp</summary>
public const String AppId = "AppId";
/// <summary>类别</summary>
public const String Category = "Category";
/// <summary>名称。应用名</summary>
public const String Name = "Name";
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>节点。该应用部署集所拥有的节点数</summary>
public const String Nodes = "Nodes";
/// <summary>版本。应用正在使用的版本号</summary>
public const String Version = "Version";
/// <summary>多版本。支持多运行时版本,此时只认可部署版本中符合运行时要求的最新可用版本</summary>
public const String MultiVersion = "MultiVersion";
/// <summary>自动发布。应用版本后自动发布到启用节点,加快发布速度</summary>
public const String AutoPublish = "AutoPublish";
/// <summary>包名。用于判断上传包名是否正确,避免错误上传其它应用包,支持*模糊匹配</summary>
public const String PackageName = "PackageName";
/// <summary>代码库。下载代码的位置</summary>
public const String Repository = "Repository";
/// <summary>分支。默认master</summary>
public const String Branch = "Branch";
/// <summary>项目路径。需要编译的项目路径</summary>
public const String ProjectPath = "ProjectPath";
/// <summary>项目类型。默认dotnet</summary>
public const String ProjectKind = "ProjectKind";
/// <summary>打包过滤器。需要打包哪些文件,支持通配符,多项分号隔开</summary>
public const String PackageFilters = "PackageFilters";
/// <summary>文件。应用启动文件可直接使用zip包</summary>
public const String FileName = "FileName";
/// <summary>参数。启动应用的参数</summary>
public const String Arguments = "Arguments";
/// <summary>工作目录。应用根目录</summary>
public const String WorkingDirectory = "WorkingDirectory";
/// <summary>用户名。以该用户执行应用</summary>
public const String UserName = "UserName";
/// <summary>环境变量。启动应用前设置的环境变量</summary>
public const String Environments = "Environments";
/// <summary>最大内存。单位M超过上限时自动重启应用默认0不限制</summary>
public const String MaxMemory = "MaxMemory";
/// <summary>工作模式。0默认exe/zip1仅解压2解压后运行3仅运行一次4多实例exe/zip</summary>
public const String Mode = "Mode";
/// <summary>自动停止。随着宿主的退出,同时停止该应用进程</summary>
public const String AutoStop = "AutoStop";
/// <summary>检测变动。当文件发生改变时,自动重启应用</summary>
public const String ReloadOnChange = "ReloadOnChange";
/// <summary>创建者</summary>
public const String CreateUserId = "CreateUserId";
/// <summary>创建时间</summary>
public const String CreateTime = "CreateTime";
/// <summary>创建地址</summary>
public const String CreateIP = "CreateIP";
/// <summary>更新者</summary>
public const String UpdateUserId = "UpdateUserId";
/// <summary>更新时间</summary>
public const String UpdateTime = "UpdateTime";
/// <summary>更新地址</summary>
public const String UpdateIP = "UpdateIP";
/// <summary>备注</summary>
public const String Remark = "Remark";
}
#endregion
}

View File

@ -1,446 +0,0 @@
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.Deployment;
/// <summary>部署版本。应用的多个可发布版本,主要管理应用程序包,支持随时切换使用不同版本,来自上传或自动编译</summary>
[Serializable]
[DataObject]
[Description("部署版本。应用的多个可发布版本,主要管理应用程序包,支持随时切换使用不同版本,来自上传或自动编译")]
[BindIndex("IU_AppDeployVersion_DeployId_Version", true, "DeployId,Version")]
[BindTable("AppDeployVersion", Description = "部署版本。应用的多个可发布版本,主要管理应用程序包,支持随时切换使用不同版本,来自上传或自动编译", ConnName = "Stardust", DbType = DatabaseType.None)]
public partial class AppDeployVersion
{
#region
private Int32 _Id;
/// <summary>编号</summary>
[DisplayName("编号")]
[Description("编号")]
[DataObjectField(true, true, false, 0)]
[BindColumn("Id", "编号", "")]
public Int32 Id { get => _Id; set { if (OnPropertyChanging("Id", value)) { _Id = value; OnPropertyChanged("Id"); } } }
private Int32 _DeployId;
/// <summary>应用部署集。对应AppDeploy</summary>
[DisplayName("应用部署集")]
[Description("应用部署集。对应AppDeploy")]
[DataObjectField(false, false, false, 0)]
[BindColumn("AppId", "应用部署集。对应AppDeploy", "")]
public Int32 DeployId { get => _DeployId; set { if (OnPropertyChanging("DeployId", value)) { _DeployId = value; OnPropertyChanged("DeployId"); } } }
private String _Version;
/// <summary>版本。如2.3.2022.0911,字符串比较大小</summary>
[DisplayName("版本")]
[Description("版本。如2.3.2022.0911,字符串比较大小")]
[DataObjectField(false, false, false, 50)]
[BindColumn("Version", "版本。如2.3.2022.0911,字符串比较大小", "", Master = true)]
public String Version { get => _Version; set { if (OnPropertyChanging("Version", value)) { _Version = value; OnPropertyChanged("Version"); } } }
private Boolean _Enable;
/// <summary>启用</summary>
[DisplayName("启用")]
[Description("启用")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Enable", "启用", "")]
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private String _Url;
/// <summary>资源地址。一般打包为Zip包StarAgent下载后解压缩覆盖</summary>
[DisplayName("资源地址")]
[Description("资源地址。一般打包为Zip包StarAgent下载后解压缩覆盖")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Url", "资源地址。一般打包为Zip包StarAgent下载后解压缩覆盖", "", ItemType = "file")]
public String Url { get => _Url; set { if (OnPropertyChanging("Url", value)) { _Url = value; OnPropertyChanged("Url"); } } }
private String _Overwrite;
/// <summary>覆盖文件。需要拷贝覆盖已存在的文件或子目录,支持*模糊匹配,多文件分号隔开。如果目标文件不存在,配置文件等自动拷贝</summary>
[DisplayName("覆盖文件")]
[Description("覆盖文件。需要拷贝覆盖已存在的文件或子目录,支持*模糊匹配,多文件分号隔开。如果目标文件不存在,配置文件等自动拷贝")]
[DataObjectField(false, false, true, 100)]
[BindColumn("Overwrite", "覆盖文件。需要拷贝覆盖已存在的文件或子目录,支持*模糊匹配,多文件分号隔开。如果目标文件不存在,配置文件等自动拷贝", "")]
public String Overwrite { get => _Overwrite; set { if (OnPropertyChanging("Overwrite", value)) { _Overwrite = value; OnPropertyChanged("Overwrite"); } } }
private Stardust.Models.DeployModes _Mode;
/// <summary>发布模式。1部分包仅覆盖2标准包清空可执行文件再覆盖3完整包清空所有文件</summary>
[DisplayName("发布模式")]
[Description("发布模式。1部分包仅覆盖2标准包清空可执行文件再覆盖3完整包清空所有文件")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Mode", "发布模式。1部分包仅覆盖2标准包清空可执行文件再覆盖3完整包清空所有文件", "")]
public Stardust.Models.DeployModes Mode { get => _Mode; set { if (OnPropertyChanging("Mode", value)) { _Mode = value; OnPropertyChanged("Mode"); } } }
private Int64 _Size;
/// <summary>文件大小</summary>
[DisplayName("文件大小")]
[Description("文件大小")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Size", "文件大小", "", ItemType = "GMK")]
public Int64 Size { get => _Size; set { if (OnPropertyChanging("Size", value)) { _Size = value; OnPropertyChanged("Size"); } } }
private String _Hash;
/// <summary>文件哈希。MD5散列避免下载的文件有缺失</summary>
[DisplayName("文件哈希")]
[Description("文件哈希。MD5散列避免下载的文件有缺失")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Hash", "文件哈希。MD5散列避免下载的文件有缺失", "")]
public String Hash { get => _Hash; set { if (OnPropertyChanging("Hash", value)) { _Hash = value; OnPropertyChanged("Hash"); } } }
private Stardust.Models.RuntimeIdentifier _Runtime;
/// <summary>运行时。RID是运行时标识符用于标识应用程序运行所在的目标平台。如win-x64/linux-arm</summary>
[DisplayName("运行时")]
[Description("运行时。RID是运行时标识符用于标识应用程序运行所在的目标平台。如win-x64/linux-arm")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Runtime", "运行时。RID是运行时标识符用于标识应用程序运行所在的目标平台。如win-x64/linux-arm", "")]
public Stardust.Models.RuntimeIdentifier Runtime { get => _Runtime; set { if (OnPropertyChanging("Runtime", value)) { _Runtime = value; OnPropertyChanged("Runtime"); } } }
private String _Progress;
/// <summary>进度。发布进度</summary>
[DisplayName("进度")]
[Description("进度。发布进度")]
[DataObjectField(false, false, true, 50)]
[BindColumn("Progress", "进度。发布进度", "")]
public String Progress { get => _Progress; set { if (OnPropertyChanging("Progress", value)) { _Progress = value; OnPropertyChanged("Progress"); } } }
private String _CommitId;
/// <summary>提交标识</summary>
[Category("编译参数")]
[DisplayName("提交标识")]
[Description("提交标识")]
[DataObjectField(false, false, true, 50)]
[BindColumn("CommitId", "提交标识", "")]
public String CommitId { get => _CommitId; set { if (OnPropertyChanging("CommitId", value)) { _CommitId = value; OnPropertyChanged("CommitId"); } } }
private String _CommitLog;
/// <summary>提交记录</summary>
[Category("编译参数")]
[DisplayName("提交记录")]
[Description("提交记录")]
[DataObjectField(false, false, true, 50)]
[BindColumn("CommitLog", "提交记录", "")]
public String CommitLog { get => _CommitLog; set { if (OnPropertyChanging("CommitLog", value)) { _CommitLog = value; OnPropertyChanged("CommitLog"); } } }
private DateTime _CommitTime;
/// <summary>提交时间</summary>
[Category("编译参数")]
[DisplayName("提交时间")]
[Description("提交时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("CommitTime", "提交时间", "")]
public DateTime CommitTime { get => _CommitTime; set { if (OnPropertyChanging("CommitTime", value)) { _CommitTime = value; OnPropertyChanged("CommitTime"); } } }
private String _TraceId;
/// <summary>追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递</summary>
[Category("扩展")]
[DisplayName("追踪")]
[Description("追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递")]
[DataObjectField(false, false, true, 50)]
[BindColumn("TraceId", "追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递", "")]
public String TraceId { get => _TraceId; set { if (OnPropertyChanging("TraceId", value)) { _TraceId = value; OnPropertyChanged("TraceId"); } } }
private Int32 _CreateUserId;
/// <summary>创建者</summary>
[Category("扩展")]
[DisplayName("创建者")]
[Description("创建者")]
[DataObjectField(false, false, false, 0)]
[BindColumn("CreateUserId", "创建者", "")]
public Int32 CreateUserId { get => _CreateUserId; set { if (OnPropertyChanging("CreateUserId", value)) { _CreateUserId = value; OnPropertyChanged("CreateUserId"); } } }
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"); } } }
private Int32 _UpdateUserId;
/// <summary>更新者</summary>
[Category("扩展")]
[DisplayName("更新者")]
[Description("更新者")]
[DataObjectField(false, false, false, 0)]
[BindColumn("UpdateUserId", "更新者", "")]
public Int32 UpdateUserId { get => _UpdateUserId; set { if (OnPropertyChanging("UpdateUserId", value)) { _UpdateUserId = value; OnPropertyChanged("UpdateUserId"); } } }
private DateTime _UpdateTime;
/// <summary>更新时间</summary>
[Category("扩展")]
[DisplayName("更新时间")]
[Description("更新时间")]
[DataObjectField(false, false, true, 0)]
[BindColumn("UpdateTime", "更新时间", "")]
public DateTime UpdateTime { get => _UpdateTime; set { if (OnPropertyChanging("UpdateTime", value)) { _UpdateTime = value; OnPropertyChanged("UpdateTime"); } } }
private String _UpdateIP;
/// <summary>更新地址</summary>
[Category("扩展")]
[DisplayName("更新地址")]
[Description("更新地址")]
[DataObjectField(false, false, true, 50)]
[BindColumn("UpdateIP", "更新地址", "")]
public String UpdateIP { get => _UpdateIP; set { if (OnPropertyChanging("UpdateIP", value)) { _UpdateIP = value; OnPropertyChanged("UpdateIP"); } } }
private String _Remark;
/// <summary>备注</summary>
[Category("扩展")]
[DisplayName("备注")]
[Description("备注")]
[DataObjectField(false, false, true, 500)]
[BindColumn("Remark", "备注", "")]
public String Remark { get => _Remark; set { if (OnPropertyChanging("Remark", value)) { _Remark = value; OnPropertyChanged("Remark"); } } }
#endregion
#region /
/// <summary>获取/设置 字段值</summary>
/// <param name="name">字段名</param>
/// <returns></returns>
public override Object this[String name]
{
get => name switch
{
"Id" => _Id,
"DeployId" => _DeployId,
"Version" => _Version,
"Enable" => _Enable,
"Url" => _Url,
"Overwrite" => _Overwrite,
"Mode" => _Mode,
"Size" => _Size,
"Hash" => _Hash,
"Runtime" => _Runtime,
"Progress" => _Progress,
"CommitId" => _CommitId,
"CommitLog" => _CommitLog,
"CommitTime" => _CommitTime,
"TraceId" => _TraceId,
"CreateUserId" => _CreateUserId,
"CreateTime" => _CreateTime,
"CreateIP" => _CreateIP,
"UpdateUserId" => _UpdateUserId,
"UpdateTime" => _UpdateTime,
"UpdateIP" => _UpdateIP,
"Remark" => _Remark,
_ => base[name]
};
set
{
switch (name)
{
case "Id": _Id = value.ToInt(); break;
case "DeployId": _DeployId = value.ToInt(); break;
case "Version": _Version = Convert.ToString(value); break;
case "Enable": _Enable = value.ToBoolean(); break;
case "Url": _Url = Convert.ToString(value); break;
case "Overwrite": _Overwrite = Convert.ToString(value); break;
case "Mode": _Mode = (Stardust.Models.DeployModes)value.ToInt(); break;
case "Size": _Size = value.ToLong(); break;
case "Hash": _Hash = Convert.ToString(value); break;
case "Runtime": _Runtime = (Stardust.Models.RuntimeIdentifier)value.ToInt(); break;
case "Progress": _Progress = Convert.ToString(value); break;
case "CommitId": _CommitId = Convert.ToString(value); break;
case "CommitLog": _CommitLog = Convert.ToString(value); break;
case "CommitTime": _CommitTime = value.ToDateTime(); break;
case "TraceId": _TraceId = Convert.ToString(value); break;
case "CreateUserId": _CreateUserId = value.ToInt(); break;
case "CreateTime": _CreateTime = value.ToDateTime(); break;
case "CreateIP": _CreateIP = Convert.ToString(value); break;
case "UpdateUserId": _UpdateUserId = value.ToInt(); break;
case "UpdateTime": _UpdateTime = value.ToDateTime(); break;
case "UpdateIP": _UpdateIP = Convert.ToString(value); break;
case "Remark": _Remark = Convert.ToString(value); break;
default: base[name] = value; break;
}
}
}
#endregion
#region
/// <summary>应用部署集</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public AppDeploy Deploy => Extends.Get(nameof(Deploy), k => AppDeploy.FindById(DeployId));
/// <summary>应用部署集</summary>
[Map(nameof(DeployId), typeof(AppDeploy), "Id")]
public String DeployName => Deploy?.ToString();
#endregion
#region
/// <summary>根据应用部署集查找</summary>
/// <param name="deployId">应用部署集</param>
/// <returns>实体列表</returns>
public static IList<AppDeployVersion> FindAllByDeployId(Int32 deployId)
{
if (deployId < 0) return [];
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.DeployId == deployId);
return FindAll(_.DeployId == deployId);
}
#endregion
#region
/// <summary>取得部署版本字段信息的快捷方式</summary>
public partial class _
{
/// <summary>编号</summary>
public static readonly Field Id = FindByName("Id");
/// <summary>应用部署集。对应AppDeploy</summary>
public static readonly Field DeployId = FindByName("DeployId");
/// <summary>版本。如2.3.2022.0911,字符串比较大小</summary>
public static readonly Field Version = FindByName("Version");
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>资源地址。一般打包为Zip包StarAgent下载后解压缩覆盖</summary>
public static readonly Field Url = FindByName("Url");
/// <summary>覆盖文件。需要拷贝覆盖已存在的文件或子目录,支持*模糊匹配,多文件分号隔开。如果目标文件不存在,配置文件等自动拷贝</summary>
public static readonly Field Overwrite = FindByName("Overwrite");
/// <summary>发布模式。1部分包仅覆盖2标准包清空可执行文件再覆盖3完整包清空所有文件</summary>
public static readonly Field Mode = FindByName("Mode");
/// <summary>文件大小</summary>
public static readonly Field Size = FindByName("Size");
/// <summary>文件哈希。MD5散列避免下载的文件有缺失</summary>
public static readonly Field Hash = FindByName("Hash");
/// <summary>运行时。RID是运行时标识符用于标识应用程序运行所在的目标平台。如win-x64/linux-arm</summary>
public static readonly Field Runtime = FindByName("Runtime");
/// <summary>进度。发布进度</summary>
public static readonly Field Progress = FindByName("Progress");
/// <summary>提交标识</summary>
public static readonly Field CommitId = FindByName("CommitId");
/// <summary>提交记录</summary>
public static readonly Field CommitLog = FindByName("CommitLog");
/// <summary>提交时间</summary>
public static readonly Field CommitTime = FindByName("CommitTime");
/// <summary>追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递</summary>
public static readonly Field TraceId = FindByName("TraceId");
/// <summary>创建者</summary>
public static readonly Field CreateUserId = FindByName("CreateUserId");
/// <summary>创建时间</summary>
public static readonly Field CreateTime = FindByName("CreateTime");
/// <summary>创建地址</summary>
public static readonly Field CreateIP = FindByName("CreateIP");
/// <summary>更新者</summary>
public static readonly Field UpdateUserId = FindByName("UpdateUserId");
/// <summary>更新时间</summary>
public static readonly Field UpdateTime = FindByName("UpdateTime");
/// <summary>更新地址</summary>
public static readonly Field UpdateIP = FindByName("UpdateIP");
/// <summary>备注</summary>
public static readonly Field Remark = FindByName("Remark");
static Field FindByName(String name) => Meta.Table.FindByName(name);
}
/// <summary>取得部署版本字段名称的快捷方式</summary>
public partial class __
{
/// <summary>编号</summary>
public const String Id = "Id";
/// <summary>应用部署集。对应AppDeploy</summary>
public const String DeployId = "DeployId";
/// <summary>版本。如2.3.2022.0911,字符串比较大小</summary>
public const String Version = "Version";
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>资源地址。一般打包为Zip包StarAgent下载后解压缩覆盖</summary>
public const String Url = "Url";
/// <summary>覆盖文件。需要拷贝覆盖已存在的文件或子目录,支持*模糊匹配,多文件分号隔开。如果目标文件不存在,配置文件等自动拷贝</summary>
public const String Overwrite = "Overwrite";
/// <summary>发布模式。1部分包仅覆盖2标准包清空可执行文件再覆盖3完整包清空所有文件</summary>
public const String Mode = "Mode";
/// <summary>文件大小</summary>
public const String Size = "Size";
/// <summary>文件哈希。MD5散列避免下载的文件有缺失</summary>
public const String Hash = "Hash";
/// <summary>运行时。RID是运行时标识符用于标识应用程序运行所在的目标平台。如win-x64/linux-arm</summary>
public const String Runtime = "Runtime";
/// <summary>进度。发布进度</summary>
public const String Progress = "Progress";
/// <summary>提交标识</summary>
public const String CommitId = "CommitId";
/// <summary>提交记录</summary>
public const String CommitLog = "CommitLog";
/// <summary>提交时间</summary>
public const String CommitTime = "CommitTime";
/// <summary>追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递</summary>
public const String TraceId = "TraceId";
/// <summary>创建者</summary>
public const String CreateUserId = "CreateUserId";
/// <summary>创建时间</summary>
public const String CreateTime = "CreateTime";
/// <summary>创建地址</summary>
public const String CreateIP = "CreateIP";
/// <summary>更新者</summary>
public const String UpdateUserId = "UpdateUserId";
/// <summary>更新时间</summary>
public const String UpdateTime = "UpdateTime";
/// <summary>更新地址</summary>
public const String UpdateIP = "UpdateIP";
/// <summary>备注</summary>
public const String Remark = "Remark";
}
#endregion
}

View File

@ -1,292 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<EntityModel xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="https://newlifex.com https://newlifex.com/Model202407.xsd" Document="https://newlifex.com/xcode/model" xmlns="https://newlifex.com/Model202407.xsd">
<Option>
<!--类名模板。其中{name}替换为Table.Name如{name}Model/I{name}Dto等-->
<ClassNameTemplate />
<!--显示名模板。其中{displayName}替换为Table.DisplayName-->
<DisplayNameTemplate />
<!--基类。可能包含基类和接口,其中{name}替换为Table.Name-->
<BaseClass />
<!--命名空间-->
<Namespace>Stardust.Data</Namespace>
<!--输出目录-->
<Output>.\</Output>
<!--是否使用中文文件名。默认false-->
<ChineseFileName>False</ChineseFileName>
<!--用于生成Copy函数的参数类型。例如{name}或I{name}-->
<ModelNameForCopy />
<!--带有索引器。实现IModel接口-->
<HasIModel>False</HasIModel>
<!--可为null上下文。生成String?等-->
<Nullable>False</Nullable>
<!--数据库连接名-->
<ConnName>Stardust</ConnName>
<!--模型类模版。设置后生成模型类,用于接口数据传输,例如{name}Model-->
<ModelClass />
<!--模型类输出目录。默认当前目录的Models子目录-->
<ModelsOutput>.\Models\</ModelsOutput>
<!--模型接口模版。设置后生成模型接口用于约束模型类和实体类例如I{name}-->
<ModelInterface />
<!--模型接口输出目录。默认当前目录的Interfaces子目录-->
<InterfacesOutput>.\Interfaces\</InterfacesOutput>
<!--用户实体转为模型类的模型类。例如{name}或{name}DTO-->
<ModelNameForToModel />
<!--命名格式。Default/Upper/Lower/Underline-->
<NameFormat>Default</NameFormat>
<!--魔方区域显示名-->
<DisplayName />
<!--魔方控制器输出目录-->
<CubeOutput>../../Stardust.Web/Areas/Registry</CubeOutput>
</Option>
<Tables>
<Table Name="App" TableName="StarApp" Description="应用系统。服务提供者和消费者">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="ProjectId" DataType="Int32" Map="Stardust.Data.Platform.GalaxyProject@Id@Name" Description="项目。资源归属的团队" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Secret" DataType="String" Description="密钥" />
<Column Name="Category" DataType="String" Description="类别" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="AutoActive" DataType="Boolean" Description="自动激活。自动激活启用该应用在注册中心提供的服务,供其它消费者使用" />
<Column Name="Version" DataType="String" Description="版本。多版本实例使用时,仅记录最大版本" />
<Column Name="Compile" DataType="DateTime" Description="编译时间。最大版本应用的编译时间" />
<Column Name="Period" DataType="Int32" Description="采样周期。应用定期采样并上报性能数据默认60秒" />
<Column Name="Singleton" DataType="Boolean" Description="单例。每个节点只部署一个实例多节点多实例此时使用本地IP作为唯一标识便于管理实例" />
<Column Name="WhiteIPs" DataType="String" Description="IP白名单。符合条件的来源IP才允许访问支持*通配符,多个逗号隔开" Category="安全告警" />
<Column Name="BlackIPs" DataType="String" Description="IP黑名单。符合条件的来源IP禁止访问支持*通配符,多个逗号隔开" Category="安全告警" />
<Column Name="WebHook" DataType="String" Length="500" Description="告警机器人。钉钉、企业微信等" Category="安全告警" />
<Column Name="AlarmOnOffline" DataType="Boolean" Description="下线告警。节点下线时,发送告警" Category="安全告警" />
<Column Name="LastLogin" DataType="DateTime" Description="最后登录" />
<Column Name="LastIP" DataType="String" Description="最后IP" />
<Column Name="AllowControlNodes" DataType="String" Description="节点控制。安全性设计,允许该应用发指令控制的目标节点编码或目标应用名称,多节点逗号分隔,*表示全部节点" Category="安全告警" />
<Column Name="Remark" DataType="String" Length="500" Description="内容" Category="扩展" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新者" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
<Index Columns="ProjectId" />
</Indexes>
</Table>
<Table Name="AppOnline" Description="应用在线。一个应用有多个部署,每个在线会话对应一个服务地址" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="ProjectId" DataType="Int32" Map="Stardust.Data.Platform.GalaxyProject@Id@Name" Description="项目。资源归属的团队" />
<Column Name="Category" DataType="String" Description="类别" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Name" DataType="String" Master="True" Description="名称。应用名称" />
<Column Name="NodeId" DataType="Int32" Description="节点。节点服务器" />
<Column Name="Client" DataType="String" Description="客户端。IP加进程不同应用的Client可能相同但几率很低暂不考虑" />
<Column Name="Scope" DataType="String" Description="作用域" />
<Column Name="Version" DataType="String" Description="版本。客户端" />
<Column Name="Compile" DataType="DateTime" Description="编译时间。客户端" />
<Column Name="PingCount" DataType="Int32" Description="心跳" />
<Column Name="WorkerId" DataType="Int32" Description="雪花标识。应用内唯一标识该节点" />
<Column Name="WebSocket" DataType="Boolean" Description="长连接。WebSocket长连接" />
<Column Name="ProcessId" DataType="Int32" Description="进程" />
<Column Name="ProcessName" DataType="String" Length="200" Description="进程名称" />
<Column Name="CommandLine" DataType="String" Length="500" Description="命令行" />
<Column Name="UserName" DataType="String" Description="用户名。启动该进程的用户名" />
<Column Name="MachineName" DataType="String" Description="机器名" />
<Column Name="StartTime" DataType="DateTime" Description="进程时间" />
<Column Name="IP" DataType="String" Length="200" Description="本地IP。节点本地IP地址" />
<Column Name="Listens" DataType="String" Length="200" Description="监听端口。网络端口监听信息" />
<Column Name="Token" DataType="String" Length="500" Description="令牌" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="Creator" DataType="String" Description="创建者。服务端节点" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Client" Unique="True" />
<Index Columns="ProjectId" />
<Index Columns="AppId,IP" />
<Index Columns="Token" />
<Index Columns="IP" />
<Index Columns="UpdateTime" />
</Indexes>
</Table>
<Table Name="AppHistory" Description="应用历史" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Client" DataType="String" Description="客户端。IP加进程" />
<Column Name="Version" DataType="String" Description="版本。客户端实例版本" />
<Column Name="Action" DataType="String" Description="操作" />
<Column Name="Success" DataType="Boolean" Description="成功" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="Creator" DataType="String" Description="创建者。服务端节点" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="2000" Description="内容" />
</Columns>
<Indexes>
<Index Columns="AppId,Client" />
<Index Columns="AppId,Action" />
<Index Columns="Action,Success" />
</Indexes>
</Table>
<Table Name="AppCommand" Description="应用命令" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Command" DataType="String" Master="True" Description="命令" />
<Column Name="Argument" DataType="String" Length="500" Description="参数" />
<Column Name="StartTime" DataType="DateTime" Description="开始执行时间。用于提前下发指令后延期执行,暂时不支持取消" />
<Column Name="Expire" DataType="DateTime" Description="过期时间。未指定时表示不限制" />
<Column Name="Status" DataType="Int32" Description="状态。命令状态" Type="NewLife.Remoting.Models.CommandStatus" />
<Column Name="Times" DataType="Int32" Description="次数。一共执行多少次超过10次后取消" />
<Column Name="Result" DataType="String" Length="500" Description="结果" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新者" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" DataScale="time" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="AppId,Command" />
<Index Columns="UpdateTime,AppId,Command" />
</Indexes>
</Table>
<Table Name="AppMeter" Description="应用性能。保存应用上报的性能数据如CPU、内存、线程、句柄等" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="ClientId" DataType="String" Description="实例。应用可能多实例部署ip@proccessid" />
<Column Name="Source" DataType="String" Description="来源。数据来源应用心跳、监控数据上报携带、远程发布后由StarAgent上报" />
<Column Name="Memory" DataType="Int32" Description="内存。单位M" />
<Column Name="ProcessorTime" DataType="Int32" Description="处理器。处理器时间单位ms" />
<Column Name="CpuUsage" DataType="Double" ItemType="percent" Description="CPU负载。处理器时间除以物理时间的占比" />
<Column Name="Threads" DataType="Int32" Description="线程数" />
<Column Name="WorkerThreads" DataType="Int32" Description="工作线程。线程池可用工作线程数主要是Task使用" />
<Column Name="IOThreads" DataType="Int32" Description="IO线程。线程池可用IO线程数主要是网络接收所用" />
<Column Name="Handles" DataType="Int32" Description="句柄数" />
<Column Name="Connections" DataType="Int32" Description="连接数" />
<Column Name="GCPause" DataType="Double" Description="GC暂停。时间占比百分之一" />
<Column Name="FullGC" DataType="Int32" Description="完全GC。周期时间内发生二代GC的次数" />
<Column Name="Time" DataType="DateTime" Description="采集时间" />
<Column Name="Creator" DataType="String" Description="创建者。服务端节点" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="AppId,ClientId,Id" />
</Indexes>
</Table>
<Table Name="Service" Description="服务信息。服务提供者发布的服务">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="ProjectId" DataType="Int32" Map="Stardust.Data.Platform.GalaxyProject@Id@Name" Description="项目。资源归属的团队" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称。服务名,提供一个地址,包含多个接口" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Category" DataType="String" Description="类别" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Extranet" DataType="Boolean" Description="外网。外网服务使用提供者公网地址进行注册" />
<Column Name="Singleton" DataType="Boolean" Description="单例。每个节点只部署一个实例多节点多实例此时使用本地IP作为唯一标识便于设置权重" />
<Column Name="UseScope" DataType="Boolean" Description="作用域。使用作用域隔离后,消费者只能使用本作用域内的服务" />
<Column Name="Address" DataType="String" Description="服务地址模版。固定的网关地址或地址模版如http://{IP}:{Port},默认不填写,自动识别地址" />
<Column Name="HealthCheck" DataType="Boolean" Description="健康监测。定时检测服务是否可用" />
<Column Name="HealthAddress" DataType="String" Description="监测地址。健康监测接口地址,相对地址或绝对地址" />
<Column Name="Providers" DataType="Int32" Description="提供者。数量" />
<Column Name="Consumers" DataType="Int32" Description="消费者。数量" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新者" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="内容" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
<Index Columns="ProjectId" />
</Indexes>
</Table>
<Table Name="AppService" Description="应用服务。应用提供的服务">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="AppId" DataType="Int32" Description="应用。提供服务的应用程序" />
<Column Name="ServiceId" DataType="Int32" Description="服务" />
<Column Name="ServiceName" DataType="String" Description="服务名" />
<Column Name="Client" DataType="String" Description="客户端。由该应用实例提供服务IP加端口" />
<Column Name="NodeId" DataType="Int32" Description="节点。节点服务器" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="PingCount" DataType="Int32" Description="心跳。应用程序定期向注册中心更新服务状态" />
<Column Name="Version" DataType="String" Description="版本。应用程序版本号" />
<Column Name="Address" DataType="String" Length="500" Description="地址。经地址模版处理后对外服务的地址默认是本地局域网服务地址如http://127.0.0.1:1234" />
<Column Name="OriginAddress" DataType="String" Length="500" Description="原始地址。客户端上报地址,需要经服务端处理后才能对外提供服务" />
<Column Name="Weight" DataType="Int32" Description="权重。多实例提供服务时,通过权重系数调节客户端调用各实例服务的比例" />
<Column Name="Scope" DataType="String" Description="作用域。根据配置中心应用规则计算,禁止跨域访问服务" />
<Column Name="Tag" DataType="String" Description="标签。带有指定特性,逗号分隔" />
<Column Name="CheckTimes" DataType="Int32" Description="监测次数。健康监测次数" />
<Column Name="Healthy" DataType="Boolean" Description="健康。无需健康监测,或监测后服务可用" />
<Column Name="LastCheck" DataType="DateTime" Description="监测时间。最后一次监测时间,一段时间监测失败后禁用" />
<Column Name="CheckResult" DataType="String" Length="2000" Description="监测结果。检测结果,错误信息等" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="AppId" />
<Index Columns="ServiceId" />
<Index Columns="UpdateTime" />
</Indexes>
</Table>
<Table Name="AppConsume" Description="应用消费。应用消费的服务">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="AppId" DataType="Int32" Description="应用。提供服务的应用程序" />
<Column Name="ServiceId" DataType="Int32" Description="服务" />
<Column Name="ServiceName" DataType="String" Description="服务名" />
<Column Name="Client" DataType="String" Description="客户端。由该应用实例提供服务IP加端口" />
<Column Name="NodeId" DataType="Int32" Description="节点。节点服务器" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="PingCount" DataType="Int32" Description="心跳。应用程序定期向注册中心更新服务状态" />
<Column Name="MinVersion" DataType="String" Description="最低版本。要求返回大于等于该版本的服务提供者" />
<Column Name="Scope" DataType="String" Description="作用域。根据配置中心应用规则计算,禁止跨域访问服务" />
<Column Name="Tag" DataType="String" Description="标签。带有指定特性,逗号分隔" />
<Column Name="Address" DataType="String" Length="500" Description="地址。最终消费得到的地址" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="AppId" />
<Index Columns="ServiceId" />
<Index Columns="UpdateTime" />
</Indexes>
</Table>
<Table Name="AppClientLog" Description="应用日志" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="AppId" DataType="Int32" Master="True" Description="应用" />
<Column Name="ClientId" DataType="String" Master="True" Description="客户端" />
<Column Name="Time" DataType="String" Description="时间" />
<Column Name="ThreadId" DataType="String" Description="线程" />
<Column Name="Kind" DataType="String" Description="类型" />
<Column Name="Name" DataType="String" Description="名称" />
<Column Name="Message" DataType="String" Length="-1" Description="内容" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="AppId,ClientId,ThreadId,Id" />
<Index Columns="AppId,Id" />
</Indexes>
</Table>
</Tables>
</EntityModel>

File diff suppressed because it is too large Load Diff

View File

@ -1,163 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using XCode;
using XCode.Membership;
namespace Stardust.Data;
/// <summary>应用历史</summary>
public partial class AppHistory : Entity<AppHistory>
{
#region
static AppHistory()
{
Meta.Factory.Table.DataTable.InsertOnly = true;
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<UserModule>();
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
}
/// <summary>验证并修补数据,通过抛出异常的方式提示验证失败。</summary>
/// <param name="isNew">是否插入</param>
public override void Valid(Boolean isNew)
{
// 如果没有脏数据,则不需要进行任何处理
if (!HasDirty) return;
var len = _.Remark.Length;
if (len > 0 && !Remark.IsNullOrEmpty() && Remark.Length > len) Remark = Remark[..len];
// 建议先调用基类方法,基类方法会做一些统一处理
base.Valid(isNew);
if (TraceId.IsNullOrEmpty()) TraceId = DefaultSpan.Current?.TraceId;
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public App App => Extends.Get(nameof(App), k => App.FindById(AppId));
/// <summary>应用</summary>
[Map(__.AppId, typeof(App), "Id")]
public String AppName => App?.Name;
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppHistory FindById(Int64 id)
{
if (id <= 0) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.ID == id);
}
/// <summary>根据应用、客户端查找</summary>
/// <param name="appId">应用</param>
/// <param name="client">客户端</param>
/// <returns>实体列表</returns>
public static IList<AppHistory> FindAllByAppIdAndClient(Int32 appId, String client)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId && e.Client.EqualIgnoreCase(client));
return FindAll(_.AppId == appId & _.Client == client);
}
/// <summary>根据应用、操作查找</summary>
/// <param name="appId">应用</param>
/// <param name="action">操作</param>
/// <returns>实体列表</returns>
public static IList<AppHistory> FindAllByAppIdAndAction(Int32 appId, String action)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId && e.Action.EqualIgnoreCase(action));
return FindAll(_.AppId == appId & _.Action == action);
}
#endregion
#region
/// <summary>查询</summary>
/// <param name="appId"></param>
/// <param name="client"></param>
/// <param name="action"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="key"></param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<AppHistory> Search(Int32 appId, String client, String action, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (appId >= 0) exp &= _.AppId == appId;
if (!client.IsNullOrEmpty()) exp &= _.Client == client;
if (!action.IsNullOrEmpty()) exp &= _.Action == action;
exp &= _.Id.Between(start, end, Meta.Factory.Snow);
if (!key.IsNullOrEmpty()) exp &= _.Action == key | _.Client.StartsWith(key);
return FindAll(exp, page);
}
#endregion
#region
/// <summary>创建历史</summary>
/// <param name="app"></param>
/// <param name="action"></param>
/// <param name="success"></param>
/// <param name="remark"></param>
/// <param name="version"></param>
/// <param name="creator"></param>
/// <param name="ip"></param>
/// <returns></returns>
public static AppHistory Create(App app, String action, Boolean success, String remark, String version, String creator, String ip)
{
app ??= new App();
if (version.IsNullOrEmpty()) version = app.Version;
var history = new AppHistory
{
AppId = app.Id,
Action = action,
Success = success,
Version = version,
Remark = remark,
TraceId = DefaultSpan.Current?.TraceId,
Creator = creator,
CreateTime = DateTime.Now,
CreateIP = ip,
};
//history.SaveAsync();
return history;
}
/// <summary>删除指定日期之前的数据</summary>
/// <param name="date"></param>
/// <returns></returns>
public static Int32 DeleteBefore(DateTime date) => Delete(_.Id < Meta.Factory.Snow.GetId(date));
#endregion
}

View File

@ -1,320 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Reflection;
using Stardust.Data.Nodes;
using Stardust.Models;
using XCode;
using XCode.Membership;
namespace Stardust.Data;
/// <summary>应用在线。一个应用有多个部署,每个在线会话对应一个服务地址</summary>
public partial class AppOnline : Entity<AppOnline>
{
#region
static AppOnline()
{
var df = Meta.Factory.AdditionalFields;
df.Add(__.PingCount);
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
// 单对象缓存
var sc = Meta.SingleCache;
sc.FindSlaveKeyMethod = k => Find(_.Client == k);
sc.GetSlaveKeyMethod = e => e.Client;
}
/// <summary>验证数据,通过抛出异常的方式提示验证失败。</summary>
/// <param name="isNew">是否插入</param>
public override void Valid(Boolean isNew)
{
if (!Version.IsNullOrEmpty() && !Dirtys[nameof(Compile)])
{
var dt = AssemblyX.GetCompileTime(Version);
if (dt.Year > 2000) Compile = dt;
}
if (TraceId.IsNullOrEmpty()) TraceId = DefaultSpan.Current?.TraceId;
var len = _.IP.Length;
if (len > 0 && !IP.IsNullOrEmpty() && IP.Length > len) IP = IP[..len];
len = _.ProcessName.Length;
if (len > 0 && !ProcessName.IsNullOrEmpty() && ProcessName.Length > len) ProcessName = ProcessName[..len];
len = _.CommandLine.Length;
if (len > 0 && !CommandLine.IsNullOrEmpty() && CommandLine.Length > len) CommandLine = CommandLine[..len];
len = _.Listens.Length;
if (len > 0 && !Listens.IsNullOrEmpty() && Listens.Length > len) Listens = Listens[..len];
base.Valid(isNew);
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public App App => Extends.Get(nameof(App), k => App.FindById(AppId));
/// <summary>应用</summary>
[Map(__.AppId, typeof(App), "Id")]
public String AppName => App?.Name;
/// <summary>节点</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public Node Node => Extends.Get(nameof(Node), k => Node.FindByID(NodeId));
/// <summary>节点</summary>
[Map(__.NodeId)]
public String NodeName => Node?.Name;
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppOnline FindById(Int32 id)
{
if (id <= 0) return null;
//// 实体缓存
//if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.ID == id);
}
///// <summary>根据会话查找</summary>
///// <param name="client">会话</param>
///// <param name="cache">是否走缓存</param>
///// <returns></returns>
//public static AppOnline FindByClient(String client, Boolean cache = true)
//{
// if (client.IsNullOrEmpty()) return null;
// if (!cache) return Find(_.Client == client);
// return Meta.SingleCache.GetItemWithSlaveKey(client) as AppOnline;
//}
/// <summary>根据令牌查找</summary>
/// <param name="token">令牌</param>
/// <returns>实体对象</returns>
public static AppOnline FindByToken(String token)
{
if (token.IsNullOrEmpty()) return null;
//// 实体缓存
//if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Token == token);
return Find(_.Token == token);
}
/// <summary>根据应用查找所有在线记录</summary>
/// <param name="appId"></param>
/// <returns></returns>
public static IList<AppOnline> FindAllByApp(Int32 appId)
{
if (appId == 0) return new List<AppOnline>();
return FindAll(_.AppId == appId);
}
/// <summary>根据IP查找所有在线记录</summary>
/// <param name="ip"></param>
/// <returns></returns>
public static IList<AppOnline> FindAllByIP(String ip)
{
if (ip.IsNullOrEmpty()) return new List<AppOnline>();
return FindAll(_.IP == ip);
}
/// <summary>根据应用和本地IP查找在线记录</summary>
/// <param name="appId"></param>
/// <param name="localIp"></param>
/// <returns></returns>
public static IList<AppOnline> FindAllByAppAndIP(Int32 appId, String localIp)
{
if (appId == 0) return new List<AppOnline>();
if (localIp.IsNullOrEmpty()) return new List<AppOnline>();
return FindAll(_.AppId == appId & _.IP == localIp);
}
/// <summary>根据应用、本地IP查找</summary>
/// <param name="appId">应用</param>
/// <param name="ip">本地IP</param>
/// <returns>实体列表</returns>
public static IList<AppOnline> FindAllByAppIdAndIP(Int32 appId, String ip)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId && e.IP.EqualIgnoreCase(ip));
return FindAll(_.AppId == appId & _.IP == ip);
}
/// <summary>根据令牌查找</summary>
/// <param name="token">令牌</param>
/// <returns>实体列表</returns>
public static IList<AppOnline> FindAllByToken(String token)
{
if (token.IsNullOrEmpty()) return new List<AppOnline>();
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.Token.EqualIgnoreCase(token));
return FindAll(_.Token == token);
}
/// <summary>根据项目查找</summary>
/// <param name="projectId">项目</param>
/// <returns>实体列表</returns>
public static IList<AppOnline> FindAllByProjectId(Int32 projectId)
{
if (projectId <= 0) return new List<AppOnline>();
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ProjectId == projectId);
return FindAll(_.ProjectId == projectId);
}
#endregion
#region
/// <summary>高级搜索</summary>
/// <param name="appId"></param>
/// <param name="nodeId"></param>
/// <param name="category"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="key"></param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<AppOnline> Search(Int32 projectId, Int32 appId, Int32 nodeId, String category, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (projectId >= 0) exp &= _.ProjectId == projectId;
if (appId >= 0) exp &= _.AppId == appId;
if (nodeId >= 0) exp &= _.NodeId == nodeId;
if (!category.IsNullOrEmpty()) exp &= _.Category == category;
exp &= _.UpdateTime.Between(start, end);
if (!key.IsNullOrEmpty()) exp &= _.Name.Contains(key) | _.Client.Contains(key) | _.Version.Contains(key) | _.ProcessName.Contains(key);
return FindAll(exp, page);
}
#endregion
#region
/// <summary>获取 或 创建 会话</summary>
/// <param name="client"></param>
/// <returns></returns>
public static AppOnline GetOrAddClient(String client)
{
if (client.IsNullOrEmpty()) return null;
return GetOrAdd(client, FindByClient, k => new AppOnline { Client = k, Creator = Environment.MachineName });
}
/// <summary>
/// 获取 或 创建 会话
/// </summary>
/// <param name="ip"></param>
/// <param name="token"></param>
/// <returns></returns>
public static AppOnline GetOrAddClient(String ip, String token)
{
var key = token.GetBytes().Crc16().GetBytes().ToHex();
var client = $"{ip}#{key}";
return GetOrAddClient(client);
}
/// <summary>更新信息</summary>
/// <param name="app"></param>
/// <param name="info"></param>
public void Fill(App app, AppInfo info)
{
if (app != null)
{
ProjectId = app.ProjectId;
AppId = app.Id;
Name = app.ToString();
Category = app.Category;
if (info != null && !info.Version.IsNullOrEmpty())
{
if (app.Version.IsNullOrEmpty())
app.Version = info.Version;
// 比较版本,只要最新版
else if (new Version(info.Version) > new Version(app.Version))
app.Version = info.Version;
if (Version.IsNullOrEmpty()) Version = info.Version;
}
}
if (info != null)
{
//Name = info.MachineName;
Version = info.Version;
UserName = info.UserName;
MachineName = info.MachineName;
ProcessId = info.Id;
ProcessName = info.Name;
CommandLine = info.CommandLine;
Listens = info.Listens;
StartTime = info.StartTime;
}
}
/// <summary>删除过期,指定过期时间</summary>
/// <param name="expire">超时时间</param>
/// <param name="expire2">大颗粒超时时间,为单例应用准备</param>
/// <returns></returns>
public static IList<AppOnline> ClearExpire(TimeSpan expire, TimeSpan expire2)
{
if (Meta.Count == 0) return null;
// 10分钟不活跃将会被删除
var end = DateTime.Now.Subtract(expire);
var exp = _.UpdateTime < end;
var list = FindAll(exp, null, null, 0, 0);
// 单例应用使用大颗粒超时时间
var end2 = DateTime.Now.Subtract(expire2);
var list2 = new List<AppOnline>();
foreach (var item in list.OrderByDescending(e => e.UpdateTime))
{
if (item.App == null || !item.App.Singleton || item.IP.IsNullOrEmpty())
list2.Add(item);
else if (item.UpdateTime < end2)
list2.Add(item);
//else
//{
// // 单例应用,又没有达到最大时间,如果有活跃,则删除当前
// var list3 = FindAllByApp(item.AppId);
// if (list3.Any(e => e.IP == item.IP && e.UpdateIP == item.UpdateIP && e.UpdateTime >= end))
// list2.Add(item);
//}
}
list2.Delete();
return list2;
}
#endregion
}

View File

@ -1,208 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Caching;
using NewLife.Data;
using NewLife.Serialization;
using Stardust.Models;
using XCode;
using XCode.Membership;
namespace Stardust.Data;
/// <summary>应用性能。保存应用上报的性能数据如CPU、内存、线程、句柄等</summary>
public partial class AppMeter : Entity<AppMeter>
{
#region
static AppMeter()
{
Meta.Factory.Table.DataTable.InsertOnly = true;
// 累加字段,生成 Update xx Set Count=Count+1234 Where xxx
//var df = Meta.Factory.AdditionalFields;
//df.Add(nameof(AppId));
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
}
/// <summary>验证并修补数据,通过抛出异常的方式提示验证失败。</summary>
/// <param name="isNew">是否插入</param>
public override void Valid(Boolean isNew)
{
// 如果没有脏数据,则不需要进行任何处理
if (!HasDirty) return;
// 建议先调用基类方法,基类方法会做一些统一处理
base.Valid(isNew);
// 在新插入数据或者修改了指定字段时进行修正
//if (isNew && !Dirtys[nameof(CreateTime)]) CreateTime = DateTime.Now;
//if (isNew && !Dirtys[nameof(CreateIP)]) CreateIP = ManageProvider.UserHost;
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public App App => Extends.Get(nameof(App), k => App.FindById(AppId));
/// <summary>应用</summary>
[Map(__.AppId, typeof(App), "Id")]
public String AppName => App?.Name;
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppMeter FindById(Int64 id)
{
if (id <= 0) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.Id == id);
}
/// <summary>根据应用、编号查找</summary>
/// <param name="appId">应用</param>
/// <param name="id">编号</param>
/// <returns>实体列表</returns>
public static IList<AppMeter> FindAllByAppIdAndId(Int32 appId, Int64 id)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId && e.Id == id);
return FindAll(_.AppId == appId & _.Id == id);
}
/// <summary>根据应用、实例查找</summary>
/// <param name="appId">应用</param>
/// <param name="clientId">实例</param>
/// <returns>实体列表</returns>
public static IList<AppMeter> FindAllByAppIdAndClientId(Int32 appId, String clientId)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId && e.ClientId.EqualIgnoreCase(clientId));
return FindAll(_.AppId == appId & _.ClientId == clientId);
}
#endregion
#region
/// <summary>高级查询</summary>
/// <param name="appId">应用</param>
/// <param name="clientId">客户端标识</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, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (appId >= 0) exp &= _.AppId == appId;
if (!clientId.IsNullOrEmpty() && clientId != "null") exp &= _.ClientId == clientId;
exp &= _.Id.Between(start, end, Meta.Factory.Snow);
if (!key.IsNullOrEmpty()) exp &= _.ClientId.Contains(key) | _.Creator.Contains(key) | _.CreateIP.Contains(key);
return FindAll(exp, page);
}
private static readonly ICache _cache = new MemoryCache { Expire = 600 };
/// <summary>获取某个应用下的客户端数</summary>
/// <param name="appId"></param>
/// <returns></returns>
public static IDictionary<String, String> GetClientIds(Int32 appId)
{
var dic = new Dictionary<String, String>();
if (appId <= 0) return dic;
// TryGet能够扛缓存穿透即使没有数据也写入空数据
var key = $"field:{appId}";
if (_cache.TryGetValue<IDictionary<String, String>>(key, out var value)) return value;
// 计算应用的ClientIds时采取Id降序较新活跃的客户端在前面
var exp = new WhereExpression();
exp &= _.AppId == appId & _.Id >= Meta.Factory.Snow.GetId(DateTime.Today.AddMonths(-1));
var list = FindAll(exp.GroupBy(_.ClientId), null, _.Id.Count() & _.ClientId);
value = list.OrderByDescending(e => e.Id).ToDictionary(e => e.ClientId ?? "null", e => $"{e.ClientId}({e.Id})");
_cache.Set(key, value);
return value;
}
// Select Count(Id) as Id,Category From AppMeter Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20
//static readonly FieldCache<AppMeter> _CategoryCache = new FieldCache<AppMeter>(nameof(Category))
//{
//Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
//};
///// <summary>获取类别列表字段缓存10分钟分组统计数据最多的前20种用于魔方前台下拉选择</summary>
///// <returns></returns>
//public static IDictionary<String, String> GetCategoryList() => _CategoryCache.FindAllName();
#endregion
#region
/// <summary>更新信息</summary>
/// <param name="app"></param>
/// <param name="info"></param>
/// <param name="clientId"></param>
/// <param name="ip"></param>
public static void WriteData(App app, AppInfo info, String source, String clientId, String ip)
{
// 兼容旧版时间
var dt = DateTime.Now;
if (info.Time > 0) dt = info.Time.ToDateTime().ToLocalTime();
// 插入节点数据
var data = new AppMeter
{
AppId = app.Id,
ClientId = clientId,
Source = source,
Memory = (Int32)(info.WorkingSet / 1024 / 1024),
ProcessorTime = info.ProcessorTime,
CpuUsage = Math.Round(info.CpuUsage, 4),
Threads = info.Threads,
WorkerThreads = info.WorkerThreads,
IOThreads = info.IOThreads,
Handles = info.Handles,
Connections = info.Connections,
GCPause = Math.Round(info.GCPause, 4),
FullGC = info.FullGC,
Time = dt,
//Data = info.ToJson(),
CreateTime = DateTime.Now,
Creator = Environment.MachineName,
CreateIP = ip,
};
if (info.Time > 0 && dt.Year > 2000)
{
data.Id = AppMeter.Meta.Factory.Snow.NewId(dt, app.Id);
}
data.SaveAsync();
}
/// <summary>删除指定日期之前的数据</summary>
/// <param name="date"></param>
/// <returns></returns>
public static Int32 DeleteBefore(DateTime date) => Delete(_.Id < Meta.Factory.Snow.GetId(date));
#endregion
}

View File

@ -1,365 +0,0 @@
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
}

View File

@ -1,189 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using XCode;
using XCode.Membership;
using XCode.Shards;
namespace Stardust.Data
{
/// <summary>应用日志</summary>
public partial class AppClientLog : Entity<AppClientLog>
{
#region
static AppClientLog()
{
// 分表分库
Meta.ShardPolicy = new TimeShardPolicy(nameof(Id), Meta.Factory)
{
ConnPolicy = "{0}_{1:yyyyMM}",
TablePolicy = "{0}_{1:yyyyMMdd}",
};
// 累加字段,生成 Update xx Set Count=Count+1234 Where xxx
//var df = Meta.Factory.AdditionalFields;
//df.Add(nameof(AppId));
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
//// 分表分库
//Meta.ShardConnName = e => $"AppLog_{e.CreateTime:yyyyMM}";
//Meta.ShardTableName = e => $"AppLog_{e.CreateTime:yyyyMMdd}";
}
/// <summary>验证并修补数据,通过抛出异常的方式提示验证失败。</summary>
/// <param name="isNew">是否插入</param>
public override void Valid(Boolean isNew)
{
// 如果没有脏数据,则不需要进行任何处理
if (!HasDirty) return;
// 建议先调用基类方法,基类方法会做一些统一处理
base.Valid(isNew);
// 在新插入数据或者修改了指定字段时进行修正
//if (isNew && !Dirtys[nameof(CreateTime)]) CreateTime = DateTime.Now;
//if (isNew && !Dirtys[nameof(CreateIP)]) CreateIP = ManageProvider.UserHost;
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore, IgnoreDataMember]
//[ScriptIgnore]
public App App => Extends.Get(nameof(App), k => App.FindById(AppId));
/// <summary>应用</summary>
[XmlIgnore, IgnoreDataMember]
//[ScriptIgnore]
[DisplayName("应用")]
[Map(nameof(AppId), typeof(App), "ID")]
public String AppName => App?.Name;
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppClientLog FindById(Int64 id)
{
if (id <= 0) return null;
// 分表
using var split = Meta.CreateShard(id);
return Find(_.Id == id);
}
/// <summary>根据应用、编号查找</summary>
/// <param name="appId">应用</param>
/// <param name="id">编号</param>
/// <returns>实体列表</returns>
public static IList<AppClientLog> FindAllByAppIdAndId(Int32 appId, Int64 id)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId && e.Id == id);
return FindAll(_.AppId == appId & _.Id == id);
}
/// <summary>根据应用查找</summary>
/// <param name="appId">应用</param>
/// <returns>实体列表</returns>
public static IList<AppClientLog> FindAllByAppId(Int32 appId)
{
if (appId <= 0) return new List<AppClientLog>();
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId);
return FindAll(_.AppId == appId);
}
#endregion
#region
/// <summary>高级查询</summary>
/// <param name="appId">应用</param>
/// <param name="clientId">客户端</param>
/// <param name="threadId">线程</param>
/// <param name="start">开始时间</param>
/// <param name="end">结束时间</param>
/// <param name="key">关键字</param>
/// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
/// <returns>实体列表</returns>
public static IList<AppClientLog> Search(Int32 appId, String clientId, Int32 threadId, DateTime start, DateTime end, String key, PageParameter page)
{
//if (appId <= 0) throw new ArgumentNullException(nameof(appId));
//if (start.Year < 2000) throw new ArgumentNullException(nameof(start));
//if (end.Year < 2000) throw new ArgumentNullException(nameof(end));
if (appId <= 0 || start.Year < 2000) return new List<AppClientLog>();
// 分表
//using var split = Meta.CreateSplit($"AppLog_{start:yyyyMMdd}", $"AppLog_{appId}");
//using var split = Meta.AutoSplit(new AppLog { AppId = appId, CreateTime = start });
var exp = new WhereExpression();
//// 按天分表,只有具体时间才过滤
//if (start == start.Date) start = DateTime.MinValue;
exp &= _.Id.Between(start, end, Meta.Factory.Snow);
if (appId >= 0) exp &= _.AppId == appId;
if (!clientId.IsNullOrEmpty()) exp &= _.ClientId == clientId;
if (threadId > 0) exp &= _.ThreadId == threadId;
if (!key.IsNullOrEmpty()) exp &= _.Message.Contains(key) | _.ClientId == key;
return FindAll(exp, page);
}
// Select Count(Id) as Id,Category From AppLog Where CreateTime>'2020-01-24 00:00:00' Group By Category Order By Id Desc limit 20
//static readonly FieldCache<AppLog> _CategoryCache = new FieldCache<AppLog>(nameof(Category))
//{
//Where = _.CreateTime > DateTime.Today.AddDays(-30) & Expression.Empty
//};
///// <summary>获取类别列表字段缓存10分钟分组统计数据最多的前20种用于魔方前台下拉选择</summary>
///// <returns></returns>
//public static IDictionary<String, String> GetCategoryList() => _CategoryCache.FindAllName();
#endregion
#region
/// <summary>创建日志</summary>
/// <param name="appId"></param>
/// <param name="clientId"></param>
/// <param name="ss"></param>
/// <param name="message"></param>
/// <param name="ip"></param>
/// <returns></returns>
public static AppClientLog Create(Int32 appId, String clientId, String[] ss, String message, String ip)
{
var log = new AppClientLog
{
AppId = appId,
ClientId = clientId,
Time = ss[0],
ThreadId = ss[1],
Kind = ss[2],
Name = ss[3],
Message = message,
CreateTime = DateTime.Now,
CreateIP = ip
};
//// 分表
//using var split = Meta.CreateSplit($"AppLog_{log.CreateTime:yyyyMMdd}", $"AppLog_{appId}");
log.SaveAsync();
//log.Insert();
return log;
}
#endregion
}
}

View File

@ -1,226 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using Stardust.Data.Nodes;
using Stardust.Models;
using XCode;
using XCode.Membership;
namespace Stardust.Data
{
/// <summary>应用服务。应用提供的服务</summary>
public partial class AppService : Entity<AppService>
{
#region
static AppService()
{
var df = Meta.Factory.AdditionalFields;
df.Add(__.PingCount);
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
}
/// <summary>验证数据</summary>
/// <param name="isNew"></param>
public override void Valid(Boolean isNew)
{
//var len = _.CheckResult.Length;
//if (len > 0 && !CheckResult.IsNullOrEmpty() && CheckResult.Length > len) CheckResult = CheckResult[..len];
this.TrimExtraLong(_.Address, _.CheckResult);
base.Valid(isNew);
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public App App => Extends.Get(nameof(App), k => App.FindById(AppId));
/// <summary>应用</summary>
[Map(__.AppId, typeof(App), "Id")]
public String AppName => App?.Name;
/// <summary>服务</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public Service Service => Extends.Get(nameof(Service), k => Service.FindById(ServiceId));
/// <summary>节点</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public Node Node => Extends.Get(nameof(Node), k => Node.FindByID(NodeId));
/// <summary>节点</summary>
[Map(__.NodeId)]
public String NodeName => Node?.Name;
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppService FindById(Int32 id)
{
if (id <= 0) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.ID == id);
}
/// <summary>根据应用查找</summary>
/// <param name="appId">应用</param>
/// <returns>实体对象</returns>
public static IList<AppService> FindAllByAppId(Int32 appId)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId);
return FindAll(_.AppId == appId);
}
/// <summary>根据服务名查找</summary>
/// <param name="serviceName">服务</param>
/// <returns>实体对象</returns>
public static IList<AppService> FindAllByService(String serviceName)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ServiceName == serviceName);
return FindAll(_.ServiceName == serviceName);
}
/// <summary>根据服务查找</summary>
/// <param name="serviceId">服务</param>
/// <returns>实体对象</returns>
public static IList<AppService> FindAllByService(Int32 serviceId)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ServiceId == serviceId);
return FindAll(_.ServiceId == serviceId);
}
/// <summary>根据服务查找</summary>
/// <param name="serviceId">服务</param>
/// <returns>实体列表</returns>
public static IList<AppService> FindAllByServiceId(Int32 serviceId)
{
if (serviceId <= 0) return new List<AppService>();
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ServiceId == serviceId);
return FindAll(_.ServiceId == serviceId);
}
#endregion
#region
/// <summary>高级搜索</summary>
/// <param name="appId"></param>
/// <param name="serviceId"></param>
/// <param name="enable"></param>
/// <param name="key"></param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<AppService> Search(Int32 appId, Int32 serviceId, String client, Boolean? enable, String key, PageParameter page)
{
var exp = new WhereExpression();
if (appId >= 0) exp &= _.AppId == appId;
if (serviceId > 0) exp &= _.ServiceId == serviceId;
if (!client.IsNullOrEmpty()) exp &= _.Client == client;
if (enable != null) exp &= _.Enable == enable;
if (!key.IsNullOrEmpty()) exp &= _.ServiceName.Contains(key) | _.Client.Contains(key) | _.Address.Contains(key) | _.Tag.Contains(key);
return FindAll(exp, page);
}
#endregion
#region
/// <summary>匹配版本和数据标签</summary>
/// <param name="minVersion"></param>
/// <param name="scope"></param>
/// <param name="tags"></param>
/// <returns></returns>
public Boolean Match(String minVersion, String scope, String[] tags)
{
if (!minVersion.IsNullOrEmpty() && String.Compare(Version, minVersion) < 0) return false;
// 应用服务没有Scope时谁都可以消费否则必须匹配
if (Service != null && Service.UseScope && !Scope.IsNullOrEmpty() && Scope != scope) return false;
if (tags != null && tags.Length > 0)
{
if (Tag.IsNullOrEmpty()) return false;
var ts = Tag.Split(",");
if (tags.Any(e => !ts.Contains(e))) return false;
}
return true;
}
/// <summary>删除过期,指定过期时间</summary>
/// <param name="expire">超时时间,秒</param>
/// <returns></returns>
public static IList<AppService> ClearExpire(TimeSpan expire)
{
if (Meta.Count == 0) return null;
{
// 短时间不活跃设置为禁用
var exp = _.UpdateTime < DateTime.Now.Subtract(TimeSpan.FromMinutes(5));
var list = FindAll(exp, null, null, 0, 0);
foreach (var item in list)
{
item.Enable = false;
}
list.Save();
}
{
// 长时间不活跃将会被删除
var exp = _.UpdateTime < DateTime.Now.Subtract(expire);
var list = FindAll(exp, null, null, 0, 0);
list.Delete();
return list;
}
}
/// <summary>
/// 转为服务模型
/// </summary>
/// <returns></returns>
public ServiceModel ToModel()
{
return new ServiceModel
{
ServiceName = ServiceName,
DisplayName = Service?.DisplayName,
Client = Client,
Version = Version,
Address = Address,
//Address2 = Address2,
Scope = Scope,
Tag = Tag,
Weight = Weight,
CreateTime = CreateTime,
UpdateTime = UpdateTime,
};
}
#endregion
}
}

View File

@ -1,155 +0,0 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using Stardust.Data.Nodes;
using XCode;
using XCode.Membership;
namespace Stardust.Data
{
/// <summary>应用消费。应用消费的服务</summary>
public partial class AppConsume : Entity<AppConsume>
{
#region
static AppConsume()
{
var df = Meta.Factory.AdditionalFields;
df.Add(__.PingCount);
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
}
#endregion
#region
/// <summary>应用</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public App App => Extends.Get(nameof(App), k => App.FindById(AppId));
/// <summary>应用</summary>
[Map(__.AppId, typeof(App), "Id")]
public String AppName => App?.Name;
/// <summary>节点</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public Node Node => Extends.Get(nameof(Node), k => Node.FindByID(NodeId));
/// <summary>节点</summary>
[Map(__.NodeId)]
public String NodeName => Node?.Name;
/// <summary>服务</summary>
[XmlIgnore, IgnoreDataMember, ScriptIgnore]
public Service Service => Extends.Get(nameof(Service), k => Service.FindById(ServiceId));
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static AppConsume FindById(Int32 id)
{
if (id <= 0) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.ID == id);
}
/// <summary>根据应用查找</summary>
/// <param name="appId">应用</param>
/// <returns>实体对象</returns>
public static IList<AppConsume> FindAllByAppId(Int32 appId)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.AppId == appId);
return FindAll(_.AppId == appId);
}
/// <summary>根据服务名查找</summary>
/// <param name="serviceName">服务</param>
/// <returns>实体对象</returns>
public static IList<AppConsume> FindAllByService(String serviceName)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ServiceName == serviceName);
return FindAll(_.ServiceName == serviceName);
}
/// <summary>根据服务查找</summary>
/// <param name="serviceId">服务</param>
/// <returns>实体对象</returns>
public static IList<AppConsume> FindAllByService(Int32 serviceId)
{
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ServiceId == serviceId);
return FindAll(_.ServiceId == serviceId);
}
/// <summary>根据服务查找</summary>
/// <param name="serviceId">服务</param>
/// <returns>实体列表</returns>
public static IList<AppConsume> FindAllByServiceId(Int32 serviceId)
{
if (serviceId <= 0) return new List<AppConsume>();
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ServiceId == serviceId);
return FindAll(_.ServiceId == serviceId);
}
#endregion
#region
/// <summary>高级搜索</summary>
/// <param name="appId"></param>
/// <param name="serviceId"></param>
/// <param name="enable"></param>
/// <param name="key"></param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<AppConsume> Search(Int32 appId, Int32 serviceId, String client, Boolean? enable, String key, PageParameter page)
{
var exp = new WhereExpression();
if (appId >= 0) exp &= _.AppId == appId;
if (serviceId > 0) exp &= _.ServiceId == serviceId;
if (!client.IsNullOrEmpty()) exp &= _.Client == client;
if (enable != null) exp &= _.Enable == enable;
if (!key.IsNullOrEmpty()) exp &= _.ServiceName.Contains(key) | _.Client.Contains(key) | _.Tag.Contains(key);
return FindAll(exp, page);
}
#endregion
#region
/// <summary>删除过期,指定过期时间</summary>
/// <param name="expire">超时时间,秒</param>
/// <returns></returns>
public static IList<AppConsume> ClearExpire(TimeSpan expire)
{
if (Meta.Count == 0) return null;
// 10分钟不活跃将会被删除
var exp = _.UpdateTime < DateTime.Now.Subtract(expire);
var list = FindAll(exp, null, null, 0, 0);
list.Delete();
return list;
}
#endregion
}
}

View File

@ -1,282 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife;
using NewLife.Data;
using NewLife.Reflection;
using Stardust.Monitors;
using XCode;
using XCode.Cache;
namespace Stardust.Data;
/// <summary>应用系统。服务提供者和消费者</summary>
[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
public partial class App : Entity<App>
{
#region
static App()
{
// 累加字段
//var df = Meta.Factory.AdditionalFields;
//df.Add(__.Services);
// 过滤器 UserModule、TimeModule、IPModule
Meta.Modules.Add<UserModule>();
Meta.Modules.Add<TimeModule>();
Meta.Modules.Add<IPModule>();
// 单对象缓存
var sc = Meta.SingleCache;
sc.FindSlaveKeyMethod = k => Find(__.Name, k);
sc.GetSlaveKeyMethod = e => e.Name;
}
/// <summary>验证数据,通过抛出异常的方式提示验证失败。</summary>
/// <param name="isNew">是否插入</param>
public override void Valid(Boolean isNew)
{
// 如果没有脏数据,则不需要进行任何处理
if (!HasDirty) return;
// 这里验证参数范围,建议抛出参数异常,指定参数名,前端用户界面可以捕获参数异常并聚焦到对应的参数输入框
if (Name.IsNullOrEmpty()) throw new ArgumentNullException(nameof(Name), "名称不能为空!");
if (isNew && !Dirtys[__.AutoActive]) AutoActive = true;
if (Period == 0) Period = 60;
if (!Version.IsNullOrEmpty() && !Dirtys[nameof(Compile)])
{
var dt = AssemblyX.GetCompileTime(Version);
if (dt.Year > 2000) Compile = dt;
}
base.Valid(isNew);
}
protected override App CreateInstance(Boolean forEdit = false)
{
// 默认单例
var entity = base.CreateInstance(forEdit);
if (forEdit) entity.Singleton = true;
return entity;
}
/// <summary>
/// 初始化数据
/// </summary>
protected override void InitData()
{
if (Meta.Count > 0) return;
var entity = new App
{
Name = "StarServer",
Enable = true,
};
entity.Insert();
entity = new App
{
Name = "StarWeb",
Enable = true,
AllowControlNodes = "*",
};
entity.Insert();
}
/// <summary>
/// 已重载。显示友好名称
/// </summary>
/// <returns></returns>
public override String ToString() => !DisplayName.IsNullOrEmpty() ? DisplayName : Name;
#endregion
#region
/// <summary>服务提供者</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public IList<AppService> Providers => Extends.Get(nameof(Providers), k => AppService.FindAllByAppId(Id));
/// <summary>服务消费者</summary>
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public IList<AppConsume> Consumers => Extends.Get(nameof(Consumers), k => AppConsume.FindAllByAppId(Id));
#endregion
#region
/// <summary>根据编号查找</summary>
/// <param name="id">编号</param>
/// <returns>实体对象</returns>
public static App FindById(Int32 id)
{
if (id <= 0) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Id == id);
// 单对象缓存
return Meta.SingleCache[id];
//return Find(_.ID == id);
}
/// <summary>根据名称查找</summary>
/// <param name="name">名称</param>
/// <returns>实体对象</returns>
public static App FindByName(String name)
{
if (name.IsNullOrEmpty()) return null;
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.Find(e => e.Name.EqualIgnoreCase(name));
// 单对象缓存
//return Meta.SingleCache.GetItemWithSlaveKey(name) as App;
return Find(_.Name == name);
}
/// <summary>根据项目查找</summary>
/// <param name="projectId">项目</param>
/// <returns>实体列表</returns>
public static IList<App> FindAllByProjectId(Int32 projectId)
{
if (projectId <= 0) return new List<App>();
// 实体缓存
if (Meta.Session.Count < 1000) return Meta.Cache.FindAll(e => e.ProjectId == projectId);
return FindAll(_.ProjectId == projectId);
}
#endregion
#region
/// <summary>高级搜索</summary>
/// <param name="category"></param>
/// <param name="start"></param>
/// <param name="enable"></param>
/// <param name="end"></param>
/// <param name="key"></param>
/// <param name="page"></param>
/// <returns></returns>
public static IList<App> Search(Int32 projectId, String category, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (projectId >= 0) exp &= _.ProjectId == projectId;
if (!category.IsNullOrEmpty()) exp &= _.Category == category;
if (enable != null) exp &= _.Enable == enable;
exp &= _.UpdateTime.Between(start, end);
if (!key.IsNullOrEmpty()) exp &= _.Name.Contains(key) | _.DisplayName.Contains(key);
return FindAll(exp, page);
}
/// <summary>类别名实体缓存异步缓存10分钟</summary>
private static readonly Lazy<FieldCache<App>> CategoryCache = new(() => new FieldCache<App>(__.Category)
{
Where = _.UpdateTime > DateTime.Today.AddDays(-30) & Expression.Empty,
MaxRows = 50
});
/// <summary>获取所有类别名称</summary>
/// <returns></returns>
public static IDictionary<String, String> FindAllCategory() => CategoryCache.Value.FindAllName().OrderByDescending(e => e.Key).ToDictionary(e => e.Key, e => e.Value);
public static IList<App> SearchGroupByProject()
{
var selects = _.Id.Count("total") & _.ProjectId;
var exp = new WhereExpression();
return FindAll(exp.GroupBy(_.ProjectId), null, selects);
}
#endregion
#region
/// <summary>更新信息</summary>
/// <param name="model"></param>
/// <param name="ip"></param>
public static void WriteMeter(TraceModel model, String ip)
{
// 修复数据
var app = FindByName(model.AppId);
app ??= new App { Name = model.AppId, DisplayName = model.AppName, Enable = true };
if (app.DisplayName.IsNullOrEmpty() || app.DisplayName == app.Name) app.DisplayName = model.AppName;
app.Save();
// 更新应用信息
if (app != null && model.Info != null)
{
//// 严格来说应该采用公网IP+内外IP+进程ID才能够保证比较高的唯一性这里为了简单直接使用公网IP
//// 同时还可能存在多层NAT网络的情况很难保证绝对唯一
//var clientId = ip;
//var ss = model.ClientId.Split('@');
//if (ss.Length >= 2) clientId = $"{ip}@{ss[1]}";
//var online = Data.AppOnline.GetOrAddClient(clientId);
//online.Category = app.Category;
//online.PingCount++;
//online.Version = model.Version;
//if (online.CreateIP.IsNullOrEmpty()) online.CreateIP = ip;
//online.UpdateInfo(app, model.Info);
//// 优先使用clientId内部的内网本机IP作为跟踪数据客户端实例
//var clientId = model.ClientId;
//if (!clientId.IsNullOrEmpty())
//{
// var p = clientId.IndexOf('@');
// if (p > 0) clientId = clientId[..p];
//}
// 直接使用ClientId来唯一标识应用实例用于应用性能数据存储
var clientId = model.ClientId;
AppMeter.WriteData(app, model.Info, "Trace", clientId, ip);
}
}
/// <summary>写应用历史</summary>
/// <param name="action"></param>
/// <param name="success"></param>
/// <param name="remark"></param>
/// <param name="version"></param>
/// <param name="ip"></param>
/// <param name="clientId"></param>
public void WriteHistory(String action, Boolean success, String remark, String version = null, String ip = null, String clientId = null)
{
var history = AppHistory.Create(this, action, success, remark, version ?? Version, Environment.MachineName, ip);
history.Client = clientId;
//history.SaveAsync();
history.Insert();
}
/// <summary>获取 或 创建</summary>
/// <param name="name"></param>
/// <returns></returns>
public static App GetOrAdd(String name) => GetOrAdd(name, FindByName, k => new App { Name = name });
/// <summary>检查IP白名单黑名单</summary>
/// <param name="ip"></param>
/// <returns></returns>
public Boolean MatchIp(String ip)
{
if (ip.IsNullOrEmpty()) return false;
if (WhiteIPs.IsNullOrEmpty() && BlackIPs.IsNullOrEmpty()) return true;
// 黑名单优先,黑名单里面有的,直接拒绝
var bs = (BlackIPs + "").Split(",", ";");
if (bs.Length > 0 && bs.Any(e => e.IsMatch(ip))) return false;
// 白名单里面有的,直接通过
var ws = (WhiteIPs + "").Split(",", ";");
if (ws.Length > 0)
{
return ws.Any(e => e.IsMatch(ip));
}
// 未设置白名单,黑名单里面没有的,直接通过
return true;
}
#endregion
}

View File

@ -1,384 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<EntityModel xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="https://newlifex.com https://newlifex.com/Model202407.xsd" Document="https://newlifex.com/xcode/model" xmlns="https://newlifex.com/Model202407.xsd">
<Option>
<!--类名模板。其中{name}替换为Table.Name如{name}Model/I{name}Dto等-->
<ClassNameTemplate />
<!--显示名模板。其中{displayName}替换为Table.DisplayName-->
<DisplayNameTemplate />
<!--基类。可能包含基类和接口,其中{name}替换为Table.Name-->
<BaseClass>Entity</BaseClass>
<!--命名空间-->
<Namespace>Stardust.Data.Monitors</Namespace>
<!--输出目录-->
<Output>.\</Output>
<!--是否使用中文文件名。默认false-->
<ChineseFileName>False</ChineseFileName>
<!--用于生成Copy函数的参数类型。例如{name}或I{name}-->
<ModelNameForCopy />
<!--带有索引器。实现IModel接口-->
<HasIModel>False</HasIModel>
<!--可为null上下文。生成String?等-->
<Nullable>False</Nullable>
<!--数据库连接名-->
<ConnName>Stardust</ConnName>
<!--模型类模版。设置后生成模型类,用于接口数据传输,例如{name}Model-->
<ModelClass />
<!--模型类输出目录。默认当前目录的Models子目录-->
<ModelsOutput>.\Models\</ModelsOutput>
<!--模型接口模版。设置后生成模型接口用于约束模型类和实体类例如I{name}-->
<ModelInterface />
<!--模型接口输出目录。默认当前目录的Interfaces子目录-->
<InterfacesOutput>.\Interfaces\</InterfacesOutput>
<!--用户实体转为模型类的模型类。例如{name}或{name}DTO-->
<ModelNameForToModel />
<!--命名格式。Default/Upper/Lower/Underline-->
<NameFormat>Default</NameFormat>
<!--魔方区域显示名-->
<DisplayName>监控中心</DisplayName>
<!--魔方控制器输出目录-->
<CubeOutput>../../Stardust.Web/Areas/Monitors/</CubeOutput>
</Option>
<Tables>
<Table Name="AppTracer" Description="应用跟踪器。负责追踪的应用管理和参数设置">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="ProjectId" DataType="Int32" Map="Stardust.Data.Platform.GalaxyProject@Id@Name" Description="项目。资源归属的团队" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Category" DataType="String" Description="类别。同步自注册中心的应用分组,同时匹配告警分组,该应用未设置告警机器人时,采用告警分组的机器人设置" />
<Column Name="ItemCount" DataType="Int32" Description="跟踪项。共有多少个埋点" />
<Column Name="Days" DataType="Int32" Description="天数。共统计了多少天" />
<Column Name="Total" DataType="Int64" Description="总次数。累计埋点采样次数" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Mode" DataType="Int32" Description="跟踪模式。仅针对api类型过滤被扫描的数据" Type="TraceModes" />
<Column Name="Period" DataType="Int32" Description="采样周期。单位秒" />
<Column Name="MaxSamples" DataType="Int32" Description="正常数。最大正常采样数,采样周期内,最多只记录指定数量的正常事件,用于绘制依赖关系" />
<Column Name="MaxErrors" DataType="Int32" Description="异常数。最大异常采样数采样周期内最多只记录指定数量的异常事件默认10" />
<Column Name="EnableMeter" DataType="Boolean" Description="性能收集。收集应用性能信息,数量较大的客户端可以不必收集应用性能信息" />
<Column Name="WhiteList" DataType="String" Length="200" Description="白名单。要过滤Api操作名时的白名单支持*模糊匹配如/Cube/*,支持^开头的正则表达式如^/Admin/" />
<Column Name="Excludes" DataType="String" Length="200" Description="排除项。要排除的操作名,支持*模糊匹配" />
<Column Name="Timeout" DataType="Int32" Description="超时时间。超过该时间时强制采样默认5000毫秒" />
<Column Name="MaxTagLength" DataType="Int32" Description="最长标签。超过该长度时将截断默认1024字符" />
<Column Name="VipClients" DataType="String" Description="Vip客户端。高频次大样本采样10秒100次逗号分割支持*模糊匹配" />
<Column Name="AlarmThreshold" DataType="Int32" Description="告警阈值。错误数达到该值时触发告警0表示不启用阈值和率值满足其一" Category="告警" />
<Column Name="AlarmErrorRate" DataType="Double" Description="告警错误率。错误率达到该值时触发告警0表示不启用阈值和率值满足其一" Category="告警" />
<Column Name="ItemAlarmThreshold" DataType="Int32" Description="单项阈值。下级跟踪项错误数达到该值时触发告警0表示不启用阈值和率值必须同时满足" Category="告警" />
<Column Name="ItemAlarmErrorRate" DataType="Double" Description="单项错误率。下级跟踪项错误率达到该值时触发告警0表示不启用阈值和率值必须同时满足" Category="告警" />
<Column Name="AlarmRobot" DataType="String" Length="500" Description="告警机器人。钉钉、企业微信等" Category="告警" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新人" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
<Index Columns="ProjectId" />
<Index Columns="AppId" />
</Indexes>
</Table>
<Table Name="TraceItem" Description="跟踪项。应用下的多个埋点">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Kind" DataType="String" Description="种类" />
<Column Name="Name" DataType="String" Master="True" Length="200" Description="操作名。接口名或埋点名" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Rules" DataType="String" Length="200" Description="规则。支持多个埋点操作按照规则聚合成为一个跟踪项,用于处理多变的操作名,支持*模糊匹配多个规则逗号隔开多组规则分号隔开。如name=*/check*,*/ping*;clientId=10.10.*" />
<Column Name="Cloned" DataType="Boolean" Description="克隆。根据规则匹配,把跟踪数据克隆一份,形成另一个维度的统计数据" />
<Column Name="Timeout" DataType="Int32" Description="超时时间。超过该时间时标记为异常默认0表示不判断超时" />
<Column Name="Days" DataType="Int32" Description="天数。共统计了多少天" />
<Column Name="Total" DataType="Int64" Description="总次数。累计埋点采样次数" />
<Column Name="Errors" DataType="Int64" Description="错误数" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。总耗时除以总次数,单位毫秒" />
<Column Name="AlarmThreshold" DataType="Int32" Description="告警阈值。错误数达到该值时触发告警0表示不启用阈值和率值必须同时满足" Category="告警" />
<Column Name="AlarmErrorRate" DataType="Double" Description="告警错误率。错误率达到该值时触发告警0表示不启用阈值和率值必须同时满足" Category="告警" />
<Column Name="MaxRingRate" DataType="Double" Description="最大环比。环比昨日超过该率时触发告警一般大于1如1.2表示超20%0表示不启用" Category="告警" />
<Column Name="MinRingRate" DataType="Double" Description="最小环比。环比昨日小于该率时触发告警一般小于1如0.7表示低30%0表示不启用" Category="告警" />
<Column Name="AlarmGroup" DataType="String" Description="告警组。使用告警组中指定的机器人" Category="告警" />
<Column Name="AlarmRobot" DataType="String" Length="500" Description="告警机器人。钉钉、企业微信等" Category="告警" />
<Column Name="TraceId" DataType="String" Length="200" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新人" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="AppId,Name" Unique="True" />
</Indexes>
</Table>
<Table Name="TraceRule" Description="跟踪规则。全局黑白名单,白名单放行,黑名单拦截">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Rule" DataType="String" Length="200" Description="规则。支持*模糊匹配(不区分大小写),如/cube/*。支持正则(区分大小写)" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="IsWhite" DataType="Boolean" Description="白名单。否则是黑名单" />
<Column Name="IsRegex" DataType="Boolean" Description="正则。是否使用正则表达式,此时区分大小写" />
<Column Name="Priority" DataType="Int32" Description="优先级。越大越在前面" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新人" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
<Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
</Columns>
</Table>
<Table Name="TraceData" Description="跟踪数据。应用定时上报采样得到的埋点追踪原始数据,应用端已完成初步统计,后端将再次向上汇总" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="timeShard:yyyyMMdd" Description="编号" />
<Column Name="StatDate" DataType="DateTime" Description="统计日期" />
<Column Name="StatHour" DataType="DateTime" Description="统计小时" />
<Column Name="StatMinute" DataType="DateTime" Description="统计分钟" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="NodeId" DataType="Int32" Description="节点" />
<Column Name="ClientId" DataType="String" Description="实例。应用可能多实例部署ip@proccessid" />
<Column Name="ItemId" DataType="Int32" Description="跟踪项" />
<Column Name="Name" DataType="String" Master="True" Length="200" Description="操作名。原始接口名或埋点名" />
<Column Name="StartTime" DataType="Int64" Description="开始时间。Unix毫秒" />
<Column Name="EndTime" DataType="Int64" Description="结束时间。Unix毫秒" />
<Column Name="Total" DataType="Int32" Description="总次数" />
<Column Name="Errors" DataType="Int32" Description="错误数" />
<Column Name="TotalCost" DataType="Int64" Description="总耗时。单位毫秒" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。总耗时除以总次数" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。单位毫秒" />
<Column Name="MinCost" DataType="Int32" Description="最小耗时。单位毫秒" />
<Column Name="TotalValue" DataType="Int64" Description="总数值。用户自定义标量" />
<Column Name="Samples" DataType="Int32" Description="正常采样" />
<Column Name="ErrorSamples" DataType="Int32" Description="异常采样" />
<Column Name="LinkId" DataType="Int64" Description="关联项。当前跟踪数据为克隆数据时,采用数据落在关联项所指定的跟踪数据之下" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="StatDate,AppId,ItemId,StartTime" />
<Index Columns="StatHour,AppId,ItemId" />
<Index Columns="StatMinute,AppId,ItemId" />
<Index Columns="AppId,StatMinute" />
<Index Columns="AppId,ClientId" />
</Indexes>
</Table>
<Table Name="SampleData" Description="采样数据。具体调用或异常详情,每次追踪统计携带少量样板,用于链路分析以及异常追踪" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="timeShard:yyyyMMdd" Description="编号" />
<Column Name="DataId" DataType="Int64" Description="数据" />
<Column Name="ItemId" DataType="Int32" Description="跟踪项" />
<Column Name="Success" DataType="Boolean" Description="正常" />
<Column Name="StartTime" DataType="Int64" Description="开始时间。Unix毫秒" />
<Column Name="EndTime" DataType="Int64" Description="结束时间。Unix毫秒" />
<Column Name="Cost" DataType="Int32" Description="耗时。毫秒" />
<Column Name="Value" DataType="Int64" Description="数值。用户自定义标量" />
<Column Name="ClientId" DataType="String" Description="实例。应用可能多实例部署ip@proccessid" />
<Column Name="TraceId" DataType="String" Description="追踪。可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" />
<Column Name="SpanId" DataType="String" Description="唯一标识。随线程上下文、Http、Rpc传递作为内部片段的父级" />
<Column Name="ParentId" DataType="String" Description="父级标识" />
<Column Name="Tag" DataType="String" Length="2000" Description="数据标签。记录一些附加数据" />
<Column Name="Error" DataType="String" Length="2000" Description="错误信息" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="DataId" />
<Index Columns="TraceId" />
</Indexes>
</Table>
<Table Name="SampleData2" Description="采样数据2。采样备份用于链路分析以及异常追踪" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="DataId" DataType="Int64" Description="数据" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="ItemId" DataType="Int32" Description="跟踪项" />
<Column Name="Name" DataType="String" Master="True" Length="200" Description="操作名。接口名或埋点名" />
<Column Name="Success" DataType="Boolean" Description="正常" />
<Column Name="StartTime" DataType="Int64" Description="开始时间。Unix毫秒" />
<Column Name="EndTime" DataType="Int64" Description="结束时间。Unix毫秒" />
<Column Name="Cost" DataType="Int32" Description="耗时。毫秒" />
<Column Name="Value" DataType="Int64" Description="数值。用户自定义标量" />
<Column Name="ClientId" DataType="String" Description="实例。应用可能多实例部署ip@proccessid" />
<Column Name="TraceId" DataType="String" Description="追踪。可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" />
<Column Name="SpanId" DataType="String" Description="唯一标识。随线程上下文、Http、Rpc传递作为内部片段的父级" />
<Column Name="ParentId" DataType="String" Description="父级标识" />
<Column Name="Tag" DataType="String" Length="2000" Description="数据标签。记录一些附加数据" />
<Column Name="Error" DataType="String" Length="2000" Description="错误信息" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="TraceId" />
</Indexes>
</Table>
<Table Name="TraceDayStat" Description="跟踪每日统计。每应用每接口每日统计,用于分析接口健康状况">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="StatDate" DataType="DateTime" DataScale="time:yyyy-MM-dd" Description="统计日期" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="ItemId" DataType="Int32" Description="跟踪项" />
<Column Name="Name" DataType="String" Master="True" Length="200" Description="操作名。接口名或埋点名" />
<Column Name="Type" DataType="String" Description="种类。Api/Http/Db/Mq/Redis/Other" />
<Column Name="Total" DataType="Int64" Description="总次数" />
<Column Name="RingRate" DataType="Double" Description="环比。今天与昨天相比" />
<Column Name="Errors" DataType="Int64" Description="错误数" />
<Column Name="ErrorRate" DataType="Double" Description="错误率。错误数除以总次数" />
<Column Name="TotalCost" DataType="Int64" Description="总耗时。单位毫秒" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。逼近TP99总耗时去掉最大值后除以总次数单位毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。单位毫秒" />
<Column Name="MinCost" DataType="Int32" Description="最小耗时。单位毫秒" />
<Column Name="TotalValue" DataType="Int64" Description="总数值。用户自定义标量" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="StatDate,AppId,Type" />
<Index Columns="StatDate,AppId,ItemId" />
<Index Columns="AppId,ItemId,Id" />
<Index Columns="AppId,Type,StatDate" />
</Indexes>
</Table>
<Table Name="TraceHourStat" Description="跟踪小时统计。每应用每接口每小时统计,用于分析接口健康状况" ConnName="StardustData">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="StatTime" DataType="DateTime" DataScale="time:yyyy-MM-dd HH" Description="统计小时" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="ItemId" DataType="Int32" Description="跟踪项" />
<Column Name="Name" DataType="String" Master="True" Length="200" Description="操作名。接口名或埋点名" />
<Column Name="Total" DataType="Int64" Description="总次数" />
<Column Name="RingRate" DataType="Double" Description="环比。今天与昨天同期相比" />
<Column Name="Errors" DataType="Int64" Description="错误数" />
<Column Name="ErrorRate" DataType="Double" Description="错误率。错误数除以总次数" />
<Column Name="TotalCost" DataType="Int64" Description="总耗时。单位毫秒" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。逼近TP99总耗时去掉最大值后除以总次数单位毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。单位毫秒" />
<Column Name="MinCost" DataType="Int32" Description="最小耗时。单位毫秒" />
<Column Name="TotalValue" DataType="Int64" Description="总数值。用户自定义标量" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="StatTime,AppId,ItemId" />
<Index Columns="AppId,ItemId,Id" />
</Indexes>
</Table>
<Table Name="TraceMinuteStat" Description="跟踪分钟统计。每应用每接口每5分钟统计用于分析接口健康状况" ConnName="StardustData">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="StatTime" DataType="DateTime" DataScale="time:yyyy-MM-dd HH:mm" Description="统计分钟" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="ItemId" DataType="Int32" Description="跟踪项" />
<Column Name="Name" DataType="String" Master="True" Length="200" Description="操作名。接口名或埋点名" />
<Column Name="Total" DataType="Int64" Description="总次数" />
<Column Name="Errors" DataType="Int64" Description="错误数" />
<Column Name="ErrorRate" DataType="Double" Description="错误率。错误数除以总次数" />
<Column Name="TotalCost" DataType="Int64" Description="总耗时。单位毫秒" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。逼近TP99总耗时去掉最大值后除以总次数单位毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。单位毫秒" />
<Column Name="MinCost" DataType="Int32" Description="最小耗时。单位毫秒" />
<Column Name="TotalValue" DataType="Int64" Description="总数值。用户自定义标量" />
<Column Name="TraceId" DataType="String" Description="追踪。最新一次查看采样可用于关联多个片段建立依赖关系随线程上下文、Http、Rpc传递" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="StatTime,AppId,ItemId" />
<Index Columns="AppId,ItemId,Id" />
</Indexes>
</Table>
<Table Name="AppDayStat" Description="应用每日统计。每应用每日统计,用于分析应用健康状况">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="StatDate" DataType="DateTime" DataScale="time:yyyy-MM-dd" Description="统计日期" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Names" DataType="Int32" Description="埋点数" />
<Column Name="Total" DataType="Int64" Description="总次数" />
<Column Name="RingRate" DataType="Double" Description="环比。今天与昨天相比" />
<Column Name="Errors" DataType="Int64" Description="错误数" />
<Column Name="ErrorRate" DataType="Double" Description="错误率。错误数除以总次数" />
<Column Name="TotalCost" DataType="Int64" Description="总耗时。单位毫秒" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。逼近TP99总耗时去掉最大值后除以总次数单位毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。单位毫秒" />
<Column Name="MinCost" DataType="Int32" Description="最小耗时。单位毫秒" />
<Column Name="Apis" DataType="Int64" Description="接口数" />
<Column Name="Https" DataType="Int64" Description="Http请求" />
<Column Name="Dbs" DataType="Int64" Description="数据库" />
<Column Name="Mqs" DataType="Int64" Description="消息队列" />
<Column Name="Redis" DataType="Int64" Description="Redis" />
<Column Name="Others" DataType="Int64" Description="其它" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="StatDate,AppId" Unique="True" />
</Indexes>
</Table>
<Table Name="AppMinuteStat" Description="应用分钟统计。每应用每5分钟统计用于分析应用健康状况" ConnName="StardustData">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="StatTime" DataType="DateTime" DataScale="time:yyyy-MM-dd HH:mm" Description="统计分钟" />
<Column Name="AppId" DataType="Int32" Description="应用" />
<Column Name="Total" DataType="Int64" Description="总次数" />
<Column Name="Errors" DataType="Int64" Description="错误数" />
<Column Name="ErrorRate" DataType="Double" Description="错误率。错误数除以总次数" />
<Column Name="TotalCost" DataType="Int64" Description="总耗时。单位毫秒" />
<Column Name="Cost" DataType="Int32" Description="平均耗时。逼近TP99总耗时去掉最大值后除以总次数单位毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。单位毫秒" />
<Column Name="MinCost" DataType="Int32" Description="最小耗时。单位毫秒" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="StatTime,AppId" Unique="True" />
<Index Columns="AppId,Id" />
</Indexes>
</Table>
<Table Name="AlarmGroup" Description="告警组。按照项目组设置告警,便于管理多节点和多应用,节点和应用的分类名对应组名">
<Columns>
<Column Name="Id" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="ProjectId" DataType="Int32" Map="Stardust.Data.Platform.GalaxyProject@Id@Name" Description="项目。资源归属的团队" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="WebHook" DataType="String" Length="500" Description="告警机器人。钉钉、企业微信等" />
<Column Name="Content" DataType="String" Description="内容。用于测试机器人的模版内容" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
<Column Name="CreateIP" DataType="String" Description="创建地址" Category="扩展" />
<Column Name="UpdateUser" DataType="String" Description="更新者" Category="扩展" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新人" Category="扩展" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Category="扩展" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
<Index Columns="ProjectId" />
</Indexes>
</Table>
<Table Name="AlarmHistory" Description="告警历史。记录告警内容" ConnName="StardustData">
<Columns>
<Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="GroupId" DataType="Int32" Description="告警组" />
<Column Name="Category" DataType="String" Description="类别。钉钉、企业微信" />
<Column Name="Action" DataType="String" Description="操作" />
<Column Name="Success" DataType="Boolean" Description="成功" />
<Column Name="Content" DataType="String" Length="2000" Description="内容" />
<Column Name="Error" DataType="String" Length="500" Description="错误" />
<Column Name="Creator" DataType="String" Description="创建者。服务端节点" Category="扩展" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" Category="扩展" />
</Columns>
<Indexes>
<Index Columns="GroupId,Id" />
</Indexes>
</Table>
</Tables>
</EntityModel>

File diff suppressed because it is too large Load Diff