[功能] 添加迁移遗留观察性列的功能,支持从 raw_json 填充 metadata_json

This commit is contained in:
ryan
2026-03-19 16:31:05 +08:00
parent dd49b2777d
commit f26fcd028e
10 changed files with 124 additions and 22 deletions
+48
View File
@@ -1,6 +1,7 @@
package model
import (
"encoding/json"
"fmt"
"github.com/glebarez/sqlite"
"gorm.io/driver/postgres"
@@ -149,6 +150,50 @@ func migrateTextColumns(db *gorm.DB, backend string) error {
return nil
}
func migrateObservabilityLegacyColumns(db *gorm.DB) error {
if db == nil {
return nil
}
if !db.Migrator().HasTable(&NodeHealthEvent{}) || !db.Migrator().HasColumn(&NodeHealthEvent{}, "raw_json") {
return nil
}
type legacyHealthEventRaw struct {
ID uint
RawJSON string
MetadataJSON string
}
type legacyHealthEventPayload struct {
Metadata map[string]string `json:"metadata"`
}
var rows []legacyHealthEventRaw
if err := db.Model(&NodeHealthEvent{}).
Select("id, raw_json, metadata_json").
Where("raw_json <> '' AND (metadata_json IS NULL OR metadata_json = '')").
Find(&rows).Error; err != nil {
return fmt.Errorf("query legacy node health event raw_json failed: %w", err)
}
for _, row := range rows {
var payload legacyHealthEventPayload
if err := json.Unmarshal([]byte(row.RawJSON), &payload); err != nil {
continue
}
if len(payload.Metadata) == 0 {
continue
}
metadataJSON, err := json.Marshal(payload.Metadata)
if err != nil {
continue
}
if err := db.Model(&NodeHealthEvent{}).
Where("id = ?", row.ID).
Update("metadata_json", string(metadataJSON)).Error; err != nil {
return fmt.Errorf("migrate node health event metadata_json failed: %w", err)
}
}
return nil
}
func isDatabaseEmpty(db *gorm.DB) (bool, error) {
for _, item := range registeredModels() {
var count int64
@@ -310,6 +355,9 @@ func InitDB() (err error) {
if err = migrateTextColumns(db, backend); err != nil {
return err
}
if err = migrateObservabilityLegacyColumns(db); err != nil {
return err
}
if err = migrateSQLiteDataIfNeeded(db, backend); err != nil {
return err
}