mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-10-17 19:51:27 +08:00
71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
package alertscustomstep
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
|
|
"go.signoz.io/signoz/pkg/query-service/rules"
|
|
"go.uber.org/multierr"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var Version = "0.47-alerts-custom-step"
|
|
|
|
func Migrate(conn *sqlx.DB) error {
|
|
ruleDB := rules.NewRuleDB(conn)
|
|
storedRules, err := ruleDB.GetStoredRules(context.Background())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, storedRule := range storedRules {
|
|
parsedRule, errs := rules.ParsePostableRule([]byte(storedRule.Data))
|
|
if len(errs) > 0 {
|
|
// this should not happen but if it does, we should not stop the migration
|
|
zap.L().Error("Error parsing rule", zap.Error(multierr.Combine(errs...)), zap.Int("rule", storedRule.Id))
|
|
continue
|
|
}
|
|
zap.L().Info("Rule parsed", zap.Int("rule", storedRule.Id))
|
|
updated := false
|
|
if parsedRule.RuleCondition != nil {
|
|
if parsedRule.RuleCondition.QueryType() == v3.QueryTypeBuilder {
|
|
if parsedRule.EvalWindow <= rules.Duration(6*time.Hour) {
|
|
for _, query := range parsedRule.RuleCondition.CompositeQuery.BuilderQueries {
|
|
if query.StepInterval > 60 {
|
|
updated = true
|
|
zap.L().Info("Updating step interval", zap.Int("rule", storedRule.Id), zap.Int64("old", query.StepInterval), zap.Int64("new", 60))
|
|
query.StepInterval = 60
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if !updated {
|
|
zap.L().Info("Rule not updated", zap.Int("rule", storedRule.Id))
|
|
continue
|
|
}
|
|
|
|
ruleJSON, jsonErr := json.Marshal(parsedRule)
|
|
if jsonErr != nil {
|
|
zap.L().Error("Error marshalling rule; skipping rule migration", zap.Error(jsonErr), zap.Int("rule", storedRule.Id))
|
|
continue
|
|
}
|
|
|
|
stmt, prepareError := conn.PrepareContext(context.Background(), `UPDATE rules SET data=$3 WHERE id=$4;`)
|
|
if prepareError != nil {
|
|
zap.L().Error("Error in preparing statement for UPDATE to rules", zap.Error(prepareError))
|
|
continue
|
|
}
|
|
defer stmt.Close()
|
|
|
|
if _, err := stmt.Exec(ruleJSON, storedRule.Id); err != nil {
|
|
zap.L().Error("Error in Executing prepared statement for UPDATE to rules", zap.Error(err))
|
|
}
|
|
}
|
|
return nil
|
|
}
|