测试ilm策略
This commit is contained in:
parent
78fd73aec0
commit
321e6a2402
@ -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
56
elasticilm/ilm_test.go
Normal 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
1236
elasticilm/warmDay.txt
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user