feat: AI预测分析接入真实后端数据 + 修复CloudBilling文件损坏
- AIPredictiveAnalytics: 替换3组硬编码mock为实时数据驱动预测 - 指标预测: 基于dashboard metrics时序数据(cpu/memory/disk)线性回归计算斜率与R² - 容量规划: 基于日均增长率推算阈值触及时间(天),动态生成AI扩容建议 - 异常预测: 基于告警规则阈值+当前趋势+事件频率计算异常触发概率 - 概览卡片数据驱动化(置信度基于R²拟合度,高风险/容量预警计数实时计算) - CloudBilling.tsx: 修复read_file导致的行号前缀损坏(501行全部含N|前缀)
This commit is contained in:
1 parent
0ebe22d142
commit
2da4f52209
17 files changed
+2299
-322
No files matched your search
@@ -70,6 +70,9 @@ func generateMockData(db *gorm.DB) error {
|
||||
if err := generateNavigations(db); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := generateBillings(db); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -564,6 +567,73 @@ func generateNavigations(db *gorm.DB) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateBillings(db *gorm.DB) error {
|
||||
accounts := []struct {
|
||||
ID uint
|
||||
Name string
|
||||
Provider string
|
||||
}{
|
||||
{1, "阿里云主账号", "aliyun"},
|
||||
{2, "腾讯云生产环境", "tencent"},
|
||||
{3, "AWS海外业务", "aws"},
|
||||
{4, "华为云政务云", "huawei"},
|
||||
}
|
||||
|
||||
services := map[string][]string{
|
||||
"aliyun": {"ECS云服务器", "RDS数据库", "OSS对象存储", "SLB负载均衡", "CDN加速"},
|
||||
"tencent": {"CVM云服务器", "CDB数据库", "COS对象存储", "CLB负载均衡", "CDN加速"},
|
||||
"aws": {"EC2", "RDS", "S3", "CloudFront", "Lambda"},
|
||||
"huawei": {"ECS弹性云服务器", "RDS数据库", "OBS对象存储", "ELB弹性负载均衡"},
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
var billings []models.CloudBilling
|
||||
|
||||
// 生成最近60天每天的账单
|
||||
for day := 59; day >= 0; day-- {
|
||||
date := now.AddDate(0, 0, -day).Format("2006-01-02")
|
||||
for _, acc := range accounts {
|
||||
// 每个账号每天 1-3 条记录(不同服务)
|
||||
svcs := services[acc.Provider]
|
||||
count := 1 + rand.Intn(3)
|
||||
for i := 0; i < count; i++ {
|
||||
svc := svcs[rand.Intn(len(svcs))]
|
||||
cost := 50 + rand.Float64()*500
|
||||
billings = append(billings, models.CloudBilling{
|
||||
CloudAccountID: &acc.ID,
|
||||
AccountName: acc.Name,
|
||||
Provider: acc.Provider,
|
||||
BillingDate: date,
|
||||
Cost: cost,
|
||||
Currency: "CNY",
|
||||
Service: svc,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for i := range billings {
|
||||
if err := db.Create(&billings[i]).Error; err != nil {
|
||||
// skip duplicates
|
||||
continue
|
||||
}
|
||||
}
|
||||
fmt.Println("Generated cloud billings:", len(billings))
|
||||
|
||||
// 生成预警规则
|
||||
rules := []models.BillingAlertRule{
|
||||
{Name: "每日总成本超500元", Metric: "daily", Threshold: 500, Operator: ">", Enabled: true},
|
||||
{Name: "阿里云日费用超300元", Provider: "aliyun", Metric: "daily", Threshold: 300, Operator: ">", Enabled: true},
|
||||
{Name: "月度总成本超1万元", Metric: "monthly", Threshold: 10000, Operator: ">", Enabled: true},
|
||||
}
|
||||
for i := range rules {
|
||||
db.Create(&rules[i])
|
||||
}
|
||||
fmt.Println("Generated billing alert rules:", len(rules))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func randomString(length int) string {
|
||||
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
b := make([]byte, length)
|
||||
|
||||
Reference in new issue
Block a user