ilm 策略生成相关函数测试通过

This commit is contained in:
zhangkun9038@dingtalk.com 2025-03-30 19:32:12 +08:00
parent ac694e7c92
commit 14810ba8c0
6 changed files with 188 additions and 4930 deletions

View File

@ -44,12 +44,12 @@
"delete": 365
},
"cooling_model_config": {
"timeDecayFactor": 0.5, // Controls logarithmic growth rate
"baseRetention": 300.0, // Base retention multiplier
"periodGranularityFactor": 7, // Exponent for period scaling
"warmPhaseMultiplier": 10.0, // Kept for compatibility
"coldPhaseMultiplier": 20.0, // Kept for compatibility
"deletePhaseMultiplier": 40.0, // Kept for compatibility
"timeDecayFactor": 10,
"baseRetention": 1.0,
"periodGranularityFactor": 0.1,
"warmPhaseMultiplier": 1.0,
"coldPhaseMultiplier": 2.0,
"deletePhaseMultiplier": 5.0
}
},
"ma": {

View File

@ -50,15 +50,26 @@ func NonLinearCoolingModel(daysDiff int, period string, config map[string]float6
cfg = periodBaseConfig["1m"] // 默认配置
}
// 从配置获取参数,设置默认值
timeDecayFactor := 0.5
if td, ok := config["timeDecayFactor"]; ok {
timeDecayFactor = td
}
// 反转时间衰减因子:数据越新,保留时间越长
// 使用反比例函数1/(x+1) 确保新数据(小daysDiff)获得更大值
ageFactor := 1.0 / (float64(daysDiff)/365.0 + 1.0)
ageFactor := timeDecayFactor / (float64(daysDiff)/365.0 + 1.0)
// 计算基础保留时间(与时间框架相关)
base := cfg.Base
// 应用年龄因子 - 新数据获得更长保留时间
warm := int(float64(base) * (1.0 + ageFactor))
// 应用年龄因子和阶段乘数 - 新数据获得更长保留时间
warmPhaseMultiplier := 1.0
if wm, ok := config["warmPhaseMultiplier"]; ok {
warmPhaseMultiplier = wm
}
warm := int(float64(base) * warmPhaseMultiplier * (1.0 + ageFactor))
cold := warm * 2
delete := warm * 3
@ -73,6 +84,9 @@ func NonLinearCoolingModel(daysDiff int, period string, config map[string]float6
delete = warm * 3
}
// 打印计算结果
fmt.Printf("[Cooling Model] Period: %s, DaysDiff: %d => warm=%dd, cold=%dd, delete=%dd\n",
period, daysDiff, warm, cold, delete)
return warm, cold, delete
}

View File

@ -2,12 +2,33 @@ package elasticilm
import (
"fmt"
cfg "gitea.zjmud.xyz/phyer/tanya/config" // 导入你的 config 包
"os"
"strings"
// "math"
"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) {
// 定义时间框架
@ -15,7 +36,7 @@ func TestEnsureILMPolicy(t *testing.T) {
// 定义日期范围
startDate := time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC)
endDate := time.Date(2025, 3, 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输出
@ -50,21 +71,17 @@ func TestEnsureILMPolicy(t *testing.T) {
daysDiff := int(currentDate.Sub(d).Hours() / 24)
htmlOutput.WriteString(`<tr><td class="month">` + month + `</td>`)
config := loadConfig(t)
// 遍历每个时间框架
for _, period := range timeFrames {
// 默认配置
config := map[string]float64{
"timeDecayFactor": 0.3,
"periodGranularityFactor": 0.7,
"warmPhaseMultiplier": 1.0,
"coldPhaseMultiplier": 2.0,
"deletePhaseMultiplier": 3.0,
}
// 加载配置文件
// 尝试从不同层级加载配置
// 获取candle类型的冷却模型配置
coolingConfig := config.Elasticsearch.ILM.DataTypes["candle"].CoolingModelConfig
// 计算warm阶段时间
warmDays, _, _ := NonLinearCoolingModel(daysDiff, period, config)
warmDays, _, _ := NonLinearCoolingModel(daysDiff, period, coolingConfig)
// 计算颜色 (0-255范围) 基于0-1800的范围
colorValue := int(float64(warmDays) / 2500 * 255)
if colorValue > 255 {
@ -82,9 +99,113 @@ func TestEnsureILMPolicy(t *testing.T) {
}
htmlOutput.WriteString(`</table>
<h1>ILM Cold Phase Duration Matrix</h1>
<table>
<tr>
<th>Month</th>`)
// 写入cold表头
for _, period := range timeFrames {
htmlOutput.WriteString(fmt.Sprintf(`<th>%s</th>`, period))
}
htmlOutput.WriteString(`</tr>`)
// 遍历每个月生成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(`<tr><td class="month">` + month + `</td>`)
// 遍历每个时间框架
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(
`<td style="background-color: %s">%d</td>`,
bgColor,
coldDays,
))
}
htmlOutput.WriteString(`</tr>`)
}
htmlOutput.WriteString(`</table>
<h1>ILM Delete Phase Duration Matrix</h1>
<table>
<tr>
<th>Month</th>`)
// 写入delete表头
for _, period := range timeFrames {
htmlOutput.WriteString(fmt.Sprintf(`<th>%s</th>`, period))
}
htmlOutput.WriteString(`</tr>`)
// 遍历每个月生成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(`<tr><td class="month">` + month + `</td>`)
// 遍历每个时间框架
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(
`<td style="background-color: %s">%d</td>`,
bgColor,
deleteDays,
))
}
htmlOutput.WriteString(`</tr>`)
}
htmlOutput.WriteString(`</table>
</body>
</html>`)
// 打印HTML结果
fmt.Println(htmlOutput.String())
// 写入到 warm.html 文件
if err := os.WriteFile("warm.html", []byte(htmlOutput.String()), 0644); err != nil {
t.Fatalf("Failed to write HTML file: %v", err)
}
}

29
elasticilm/warm.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -80,7 +80,7 @@ import (
func TestCandleListI_CalculateCrossPair(t *testing.T) {
// 使用更早的时间范围来触发不同的phase
startTime := time.Date(2024, 3, 1, 0, 0, 0, 0, time.UTC)
endTime := time.Date(2024, 3, 31, 0, 0, 0, 0, time.UTC)
endTime := time.Date(2024, 3, 5, 0, 0, 0, 0, time.UTC)
// 打印测试时间范围
t.Logf("Test time range: %s to %s", startTime, endTime)