测试ilm策略

This commit is contained in:
zhangkun9038@dingtalk.com 2025-03-29 21:16:29 +08:00
parent 78fd73aec0
commit 321e6a2402
3 changed files with 1336 additions and 15 deletions

View File

@ -24,25 +24,47 @@ type DefaultRetentionCalculator struct {
MinRetention int
}
// Calculate 计算保留时间(天)
func (c DefaultRetentionCalculator) Calculate(daysDiff int, period string) int {
// NonLinearCoolingModel 非线性冷却模型
func NonLinearCoolingModel(daysDiff int, period string, config map[string]float64) (int, int, int) {
minutes := periodToMinutes(period)
maxRetention := c.MaxRetention[period]
if maxRetention == 0 {
maxRetention = c.MaxRetention["default"]
}
// 非线性衰减公式
timeFactor := 1 - math.Sqrt(float64(daysDiff))/50 // 距今时间因子
// 可配置的系数
timeDecayFactor := config["timeDecayFactor"] // 距今时间因子
periodGranularityFactor := config["periodGranularityFactor"] // 时间框架粒度因子
warmPhaseMultiplier := config["warmPhaseMultiplier"] // warm阶段乘数
coldPhaseMultiplier := config["coldPhaseMultiplier"] // cold阶段乘数
deletePhaseMultiplier := config["deletePhaseMultiplier"] // delete阶段乘数
// 距今时间因子:越久远,冷却越快
timeFactor := 1 - math.Pow(float64(daysDiff), timeDecayFactor)/100
if timeFactor < 0 {
timeFactor = 0
}
periodFactor := math.Sqrt(float64(minutes)) / math.Sqrt(43200) // 时间框架因子
retention := float64(maxRetention) * timeFactor * periodFactor
if retention < float64(c.MinRetention) {
return c.MinRetention
// 时间框架因子:粒度越细,冷却越快
periodFactor := math.Pow(float64(minutes), periodGranularityFactor) / math.Pow(43200, periodGranularityFactor)
// 计算各个阶段的时间
warmDays := int(float64(daysDiff) * warmPhaseMultiplier * timeFactor * periodFactor)
coldDays := int(float64(daysDiff) * coldPhaseMultiplier * timeFactor * periodFactor)
deleteDays := int(float64(daysDiff) * deletePhaseMultiplier * timeFactor * periodFactor)
return warmDays, coldDays, deleteDays
}
// Calculate 使用非线性冷却模型计算保留时间
func (c DefaultRetentionCalculator) Calculate(daysDiff int, period string) int {
// 默认配置
config := map[string]float64{
"timeDecayFactor": 0.5,
"periodGranularityFactor": 0.5,
"warmPhaseMultiplier": 1.0,
"coldPhaseMultiplier": 2.0,
"deletePhaseMultiplier": 3.0,
}
return int(retention)
_, _, deleteDays := NonLinearCoolingModel(daysDiff, period, config)
return deleteDays
}
// periodToMinutes 将时间框架转换为分钟数
@ -96,7 +118,7 @@ func getPhase(daysDiff, retentionDays int) string {
fmt.Printf("[ILM Phase] 数据在7天到2年之间判定为warm阶段。daysDiff: %d\n", daysDiff)
return "warm"
}
func ensureAlias(client *http.Client, esConfig cfg.ElasticsearchConfig, alias, period, dataType, coinPair string, indexTime time.Time) error {
func ensureAlias(client *http.Client, esConfig cfg.ElasticsearchConfig, alias, period, dataType, coinPair string, indexTime time.Time, dataConfig cfg.DataTypeConfig, daysDiff int) error {
// 获取当前别名关联的索引
getAliasURL := fmt.Sprintf("%s/_alias/%s", esConfig.URL, alias)
req, err := http.NewRequest("GET", getAliasURL, nil)
@ -242,6 +264,13 @@ func ensureAlias(client *http.Client, esConfig cfg.ElasticsearchConfig, alias, p
return err
}
defer resp.Body.Close()
// 加载冷却模型配置
coolingConfig := dataConfig.CoolingModelConfig // Ensure this matches the actual field name
// 使用非线性冷却模型计算各个阶段的时间
warmDays, coldDays, deleteDays := NonLinearCoolingModel(daysDiff, period, coolingConfig)
fmt.Printf("[ILM Policy] Calculated phases: warm=%dd, cold=%dd, delete=%dd\n", warmDays, coldDays, deleteDays)
if resp.StatusCode != http.StatusOK {
body, _ := io.ReadAll(resp.Body)
@ -341,7 +370,7 @@ func ConfigureILM(client *http.Client, config *cfg.Config, dataType, period, coi
// 设置别名,确保每次调用时传入正确的 aliasName 和 indexTime
//
if err := ensureAlias(client, esConfig, aliasName, period, dataType, coinPair, indexTime); err != nil {
if err := ensureAlias(client, esConfig, aliasName, period, dataType, coinPair, indexTime, dataConfig, daysDiff); err != nil {
return fmt.Errorf("failed to ensure alias: %v", err)
}

56
elasticilm/ilm_test.go Normal file
View File

@ -0,0 +1,56 @@
package elasticilm
import (
"fmt"
// "math"
"testing"
"time"
)
// TestEnsureILMPolicy 测试 ensureILMPolicy 函数并生成退化阶段时间矩阵
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, 3, 1, 0, 0, 0, 0, time.UTC)
currentDate := time.Date(2025, 4, 1, 0, 0, 0, 0, time.UTC)
// 初始化结果矩阵
results := make([][]string, 0)
// 遍历每个时间框架
for _, period := range timeFrames {
row := make([]string, 0)
// 遍历每个月
for d := startDate; !d.After(endDate); d = d.AddDate(0, 1, 0) {
daysDiff := int(currentDate.Sub(d).Hours() / 24)
// 默认配置
config := map[string]float64{
"timeDecayFactor": 0.5,
"periodGranularityFactor": 0.5,
"warmPhaseMultiplier": 1.0,
"coldPhaseMultiplier": 2.0,
"deletePhaseMultiplier": 3.0,
}
// 使用非线性冷却模型计算各个阶段的时间
warmDays, coldDays, deleteDays := NonLinearCoolingModel(daysDiff, period, config)
// 格式化结果
result := fmt.Sprintf("Warm: %d, Cold: %d, Delete: %d", warmDays, coldDays, deleteDays)
row = append(row, result)
}
results = append(results, row)
}
// 打印结果矩阵
for i, period := range timeFrames {
fmt.Printf("Time Frame: %s\n", period)
for j, result := range results[i] {
fmt.Printf(" Month: %s - %s\n", startDate.AddDate(0, j, 0).Format("2006-01"), result)
}
}
}

1236
elasticilm/warmDay.txt Normal file

File diff suppressed because it is too large Load Diff