{"record":{"id":"95a93e34f41824f5","repo":"jaegertracing/jaeger","slug":"deprecated-es-rotation-flags-s-are-no-longer-su","errorCode":null,"errorMessage":"deprecated ES rotation flags (%s) are no longer supported; migrate to 'indices.<type>.rotation' config (see https://github.com/jaegertracing/jaeger/pull/8823); to temporarily disable this check, use --feature-gates=-jaeger.es.config.rejectLegacyRotationFlags","messagePattern":"deprecated ES rotation flags \\((.+?)\\) are no longer supported; migrate to 'indices\\.<type>\\.rotation' config \\(see https://github\\.com/jaegertracing/jaeger/pull/8823\\); to temporarily disable this check, use --feature-gates=-jaeger\\.es\\.config\\.rejectLegacyRotationFlags","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/elasticsearch/config/config.go","lineNumber":479,"sourceCode":"\t\t\t\"the client performs no client-side health check\")\n\t}\n\tif c.SendGetBodyAs.HasValue() {\n\t\treturn rejectUnwiredKey(\"send_get_body_as\",\n\t\t\t\"the client sends each request with a fixed HTTP verb\")\n\t}\n\tif c.BulkProcessing.MaxActions.HasValue() {\n\t\treturn rejectUnwiredKey(\"bulk_processing.max_actions\",\n\t\t\t\"the bulk indexer flushes only on a byte threshold ('bulk_processing.max_bytes') \"+\n\t\t\t\t\"or a time interval ('bulk_processing.flush_interval'), so an action count has no effect\")\n\t}\n\n\t// Validate rotation config for each index type\n\tif err := c.validateRotationConfig(); err != nil {\n\t\treturn err\n\t}\n\n\tif RejectLegacyRotationFlags.IsEnabled() && c.hasAnyLegacyRotationFlags() {\n\t\treturn fmt.Errorf(\n\t\t\t\"deprecated ES rotation flags (%s) \"+\n\t\t\t\t\"are no longer supported; migrate to 'indices.<type>.rotation' config \"+\n\t\t\t\t\"(see https://github.com/jaegertracing/jaeger/pull/8823); \"+\n\t\t\t\t\"to temporarily disable this check, use --feature-gates=-jaeger.es.config.rejectLegacyRotationFlags\",\n\t\t\tlegacyRotationFlagsList,\n\t\t)\n\t}\n\n\tif c.getUseILM() && !c.getUseReadWriteAliases() {\n\t\treturn errors.New(\"UseILM must always be used in conjunction with UseReadWriteAliases to ensure ES writers and readers refer to the single index mapping\")\n\t}\n\tif c.CreateIndexTemplates && c.getUseILM() {\n\t\treturn errors.New(\"when UseILM is set true, CreateIndexTemplates must be set to false and index templates must be created by init process of es-rollover app\")\n\t}\n\n\thasAnyExplicitAlias := c.getSpanReadAlias() != \"\" || c.getSpanWriteAlias() != \"\" ||\n\t\tc.getServiceReadAlias() != \"\" || c.getServiceWriteAlias() != \"\"\n","sourceCodeStart":461,"sourceCodeEnd":497,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/internal/storage/elasticsearch/config/config.go#L461-L497","documentation":"Configuration.Validate rejects the deprecated top-level ES index rotation flags (e.g. es.index-cleaner/rollover legacy rotation options) when the rejectLegacyRotationFlags feature gate is enabled. Rotation must now be configured per index type under indices.<type>.rotation. The gate exists so operators can temporarily opt out during migration.","triggerScenarios":"Supplying legacy rotation settings (old es.* rotation flags/env vars) in the storage config while the jaeger.es.config.rejectLegacyRotationFlags feature gate is on; starting Jaeger with a config file converted from an older version without moving rotation under indices.*.","commonSituations":"Upgrading Jaeger after PR #8823 with an old YAML/env config; infrastructure-as-code templates still emitting es.index rotation flags; operators using the feature-gate opt-out past the deprecation window.","solutions":["Migrate each legacy rotation flag to indices.<type>.rotation (e.g. indices.spans.rotation, indices.services.rotation, indices.dependencies.rotation) in your config.","If you must start immediately, disable the check with --feature-gates=-jaeger.es.config.rejectLegacyRotationFlags, but plan the migration.","Diff your config against the new schema docs and remove the flags listed in legacyRotationFlagsList.","Update deployment templates/Helm values that still render the old es.* rotation options.","Test the migrated config with jaeger 'start' and confirm log-archive/index rotation behavior is unchanged."],"exampleFix":"# before\nes:\n  index-rotation: daily\n# after\nes:\n  indices:\n    spans:\n      rotation: daily\n    services:\n      rotation: daily\n    dependencies:\n      rotation: daily","handlingStrategy":"validation","validationCode":"// fail fast in CI before deploying legacy flags\nlegacy := []string{\"es.index-rotation\", \"es.index-rollover\", \"es.use-aliases-rotation\"}\nfor _, k := range legacy {\n    if os.Getenv(strings.ToUpper(strings.ReplaceAll(k, \".\", \"_\"))) != \"\" {\n        log.Printf(\"legacy flag %s detected; migrate to indices.<type>.rotation\", k)\n        os.Exit(1)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := cfg.Validate(); err != nil {\n    if strings.Contains(err.Error(), \"deprecated ES rotation flags\") {\n        // either migrate config or, temporarily:\n        // --feature-gates=-jaeger.es.config.rejectLegacyRotationFlags\n        return fmt.Errorf(\"config migration required: %w\", err)\n    }\n    return err\n}","preventionTips":["Move all rotation config under indices.<type>.rotation now; don't rely on the opt-out gate.","Grep deployment templates/Helm values for legacy es.* rotation keys each upgrade.","Validate configs in CI with the feature gate enabled so drift is caught pre-deploy.","Read the PR #8823 migration notes when upgrading."],"tags":["elasticsearch","configuration","deprecation","rotation","feature-gate"],"backgroundTag":"deprecated-config-flag","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}