ilm 策略生成相关函数测试通过
This commit is contained in:
parent
ac694e7c92
commit
14810ba8c0
@ -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": {
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
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
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user