| 69 | } |
| 70 | |
| 71 | func (cmd *migrateConfigCmd) Run(_ *globalOptions) error { |
| 72 | var warnings []string |
| 73 | |
| 74 | // 1. Read YAML into generic map |
| 75 | m, err := readConfigMap(cmd.ConfigFile) |
| 76 | if err != nil { |
| 77 | return err |
| 78 | } |
| 79 | |
| 80 | // 2. Detect deployment mode |
| 81 | mode := detectMode(m, cmd.Mode, &warnings) |
| 82 | |
| 83 | // 3. Check for legacy overrides format |
| 84 | if err := detectLegacyOverrides(m); err != nil { |
| 85 | return err |
| 86 | } |
| 87 | |
| 88 | // 4. Delete removed 2.x blocks |
| 89 | deleteRemovedBlocks(m, &warnings) |
| 90 | |
| 91 | // 5. Add ingest/kafka blocks (microservices only) |
| 92 | if err := addIngestBlocks(m, mode, cmd.KafkaAddress, cmd.KafkaTopic); err != nil { |
| 93 | return err |
| 94 | } |
| 95 | |
| 96 | // 6. Modify overrides for parallel operation |
| 97 | modifyOverrides(m, &warnings) |
| 98 | |
| 99 | // 7. Clean metrics-generator local_blocks config |
| 100 | cleanLocalBlocks(m, &warnings) |
| 101 | |
| 102 | // 8. Validate through Tempo's 3.0 config |
| 103 | validationWarnings, err := validateMigratedConfig(m) |
| 104 | if err != nil { |
| 105 | return err |
| 106 | } |
| 107 | warnings = append(warnings, validationWarnings...) |
| 108 | |
| 109 | // 9. Output |
| 110 | for _, w := range warnings { |
| 111 | fmt.Fprintf(os.Stderr, "WARN: %s\n", w) |
| 112 | } |
| 113 | return outputMigratedConfig(m) |
| 114 | } |
| 115 | |
| 116 | // readConfigMap reads a YAML file into a normalized map[string]interface{}. |
| 117 | func readConfigMap(path string) (map[string]interface{}, error) { |