package elasticilm import ( "fmt" cfg "gitea.zjmud.xyz/phyer/tanya/config" // 导入你的 config 包 "os" "strings" "testing" "time" ) func loadConfig(t *testing.T) *cfg.Config { configPaths := []string{ "config/config.json", "../config/config.json", "../../config/config.json", } var config *cfg.Config var err error for _, path := range configPaths { config, err = cfg.LoadConfig(path) if err == nil { return config } } t.Fatalf("failed to load config after trying paths: %v. Tried paths: %v", err, configPaths) return nil // 不会到达这里 } // TestEnsureILMPolicy 测试 ensureILMPolicy 函数并生成warm阶段时间矩阵(CSV格式) func TestEnsureILMPolicy(t *testing.T) { // 定义时间框架 timeFrames := []string{"1m", "3m", "5m", "15m", "30m", "1H", "2H", "4H", "6H", "12H", "1D", "2D", "5D", "1W"} // 定义日期范围 startDate := time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC) endDate := time.Date(2025, 6, 1, 0, 0, 0, 0, time.UTC) currentDate := time.Date(2025, 4, 1, 0, 0, 0, 0, time.UTC) // 初始化HTML输出 var htmlOutput strings.Builder htmlOutput.WriteString(` ILM Warm Phase Matrix

ILM Warm Phase Duration Matrix

`) // 写入表头 for _, period := range timeFrames { htmlOutput.WriteString(fmt.Sprintf(``, period)) } htmlOutput.WriteString(``) // 遍历每个月 for d := startDate; !d.After(endDate); d = d.AddDate(0, 1, 0) { month := d.Format("2006-01") daysDiff := int(currentDate.Sub(d).Hours() / 24) htmlOutput.WriteString(``) config := loadConfig(t) // 遍历每个时间框架 for _, period := range timeFrames { // 默认配置 // 加载配置文件 // 尝试从不同层级加载配置 // 获取candle类型的冷却模型配置 coolingConfig := config.Elasticsearch.ILM.DataTypes["candle"].CoolingModelConfig // 计算warm阶段时间 warmDays, _, _ := NonLinearCoolingModel(daysDiff, period, coolingConfig) // 计算颜色 (0-255范围) 基于0-1800的范围 colorValue := int(float64(warmDays) / 2500 * 255) if colorValue > 255 { colorValue = 255 } bgColor := fmt.Sprintf("rgb(%d, 0, %d)", colorValue, 255-colorValue) htmlOutput.WriteString(fmt.Sprintf( ``, bgColor, warmDays, )) } htmlOutput.WriteString(``) } htmlOutput.WriteString(`
Month%s
` + month + `%d

ILM Cold Phase Duration Matrix

`) // 写入cold表头 for _, period := range timeFrames { htmlOutput.WriteString(fmt.Sprintf(``, period)) } htmlOutput.WriteString(``) // 遍历每个月,生成cold矩阵 for d := startDate; !d.After(endDate); d = d.AddDate(0, 1, 0) { month := d.Format("2006-01") daysDiff := int(currentDate.Sub(d).Hours() / 24) htmlOutput.WriteString(``) // 遍历每个时间框架 for _, period := range timeFrames { // 默认配置 config := map[string]float64{ "timeDecayFactor": 10, "baseRetention": 1, "periodGranularityFactor": 0.1, "warmPhaseMultiplier": 1.0, "coldPhaseMultiplier": 2.0, "deletePhaseMultiplier": 5.0, } // 计算cold阶段时间 _, coldDays, _ := NonLinearCoolingModel(daysDiff, period, config) // 计算颜色 (0-255范围) 基于0-2000的范围 colorValue := int(float64(coldDays) / 2000 * 255) if colorValue > 255 { colorValue = 255 } bgColor := fmt.Sprintf("rgb(%d, 0, %d)", colorValue, 255-colorValue) htmlOutput.WriteString(fmt.Sprintf( ``, bgColor, coldDays, )) } htmlOutput.WriteString(``) } htmlOutput.WriteString(`
Month%s
` + month + `%d

ILM Delete Phase Duration Matrix

`) // 写入delete表头 for _, period := range timeFrames { htmlOutput.WriteString(fmt.Sprintf(``, period)) } htmlOutput.WriteString(``) // 遍历每个月,生成delete矩阵 for d := startDate; !d.After(endDate); d = d.AddDate(0, 1, 0) { month := d.Format("2006-01") daysDiff := int(currentDate.Sub(d).Hours() / 24) htmlOutput.WriteString(``) // 遍历每个时间框架 for _, period := range timeFrames { // 默认配置 config := map[string]float64{ "timeDecayFactor": 10, "baseRetention": 1, "periodGranularityFactor": 0.1, "warmPhaseMultiplier": 1.0, "coldPhaseMultiplier": 2.0, "deletePhaseMultiplier": 5.0, } // 计算delete阶段时间 _, _, deleteDays := NonLinearCoolingModel(daysDiff, period, config) // 计算颜色 (0-255范围) 基于0-5000的范围 colorValue := int(float64(deleteDays) / 5000 * 255) if colorValue > 255 { colorValue = 255 } bgColor := fmt.Sprintf("rgb(%d, 0, %d)", colorValue, 255-colorValue) htmlOutput.WriteString(fmt.Sprintf( ``, bgColor, deleteDays, )) } htmlOutput.WriteString(``) } htmlOutput.WriteString(`
Month%s
` + month + `%d
`) // 写入到 warm.html 文件 if err := os.WriteFile("warm.html", []byte(htmlOutput.String()), 0644); err != nil { t.Fatalf("Failed to write HTML file: %v", err) } }