Upgrading Alauda Distributed Tracing with OpenSearch
Upgrading an OpenSearch-backed deployment from v2.0 (Jaeger 2.16.0, Alauda Build of OpenTelemetry v2 Operator 0.147.0) to v2.1 (Jaeger 2.20.0, Operator 0.157.0) involves the following steps:
- Installing the Alauda Build of Jaeger v2 cluster plugin
- Upgrading the Alauda Build of OpenTelemetry v2 Operator
- Updating the OpenTelemetry Collector
- Migrating index management to ISM
- Updating the Alauda Build of Jaeger v2
- Retiring the index cleaner
This upgrade changes the index layout. A v2.0 deployment writes one date-suffixed index per day, such as <prefix>-jaeger-span-2026-08-27, and deletes expired indices with the jaeger-es-index-cleaner CronJob. A v2.1 deployment writes through a rollover alias into numbered indices, such as <prefix>-jaeger-span-000001, and delegates rollover and retention to an OpenSearch ISM policy.
Existing indices are neither renamed nor reindexed, but Jaeger reads them only through the read alias after the switch. Step 4 attaches them to that alias, which keeps historical traces queryable.
Prerequisites
- An Alauda Distributed Tracing v2.0 deployment installed as described in Installing Alauda Distributed Tracing with OpenSearch.
- The Alauda Build of Jaeger v2 cluster plugin and the Alauda Build of OpenTelemetry v2 Operator 0.157.0 are published to the platform.
- An active ACP CLI (
kubectl) session by a cluster administrator with thecluster-adminrole, for both the target cluster and theglobalcluster. - Review the Upgrade Notes for the behavior changes introduced by this release.
Setting environment variables
Run the following commands against the target cluster. The OpenSearch endpoint, the index prefix, and the credentials are read back from the running deployment so that they always match it:
TOC
Installing the Alauda Build of Jaeger v2 Cluster PluginInstalling via the web consoleInstalling via the CLIReading the image addressesUpgrading the Alauda Build of OpenTelemetry v2 OperatorUpgrading via the web consoleUpgrading via the CLIUpdating the OpenTelemetry Collector(Optional) Updating the Collector for Service Performance MonitoringMigrating Index Management to ISMUpdating the Alauda Build of Jaeger v2(Optional) Updating Jaeger for Service Performance MonitoringRetiring the Index CleanerVerificationInstalling the Alauda Build of Jaeger v2 Cluster Plugin
Starting with v2.1, the container images of the tracing components are delivered by the Alauda Build of Jaeger v2 cluster plugin instead of the Operator bundle. Installing the plugin synchronizes the images to the platform's built-in registry and creates the jaeger-cluster-plugin-manifest ConfigMap in the cpaas-system namespace of the target cluster. The remaining steps read the image addresses from that ConfigMap.
Installing via the web console
- In the platform management view, navigate to Administrator > Marketplace > Cluster Plugins.
- Select the cluster where the tracing components are deployed.
- Find Alauda Build of Jaeger v2 and click Install. The plugin requires no installation parameters.
Installing via the CLI
Cluster plugins are installed by creating a ModuleInfo resource in the global cluster, regardless of which cluster the plugin targets.
-
Run the following command in the
globalcluster to check the published plugin versions: -
Create a
ModuleInforesource in theglobalcluster. Replace<target-cluster>with the name of the cluster where the tracing components are deployed, and<plugin-version>with a version from the previous step: -
Verify the installation in the
globalcluster. The plugin is installed successfully when theSTATUScolumn showsRunning:NOTEThe platform assigns the resource a generated name, so query the
ModuleInfoby label rather than by the name used in the manifest.
Reading the image addresses
Run the following commands against the target cluster. The exported variables are used in the later steps:
Upgrading the Alauda Build of OpenTelemetry v2 Operator
The Operator is subscribed with the Manual approval strategy, so the upgrade must be approved explicitly. For general background on Operator upgrades, see Operator.
Upgrading via the web console
Choose one of the following methods:
- Batch upgrade: navigate to Platform Management > Cluster Management > Clusters > cluster > Functional Components, and upgrade Alauda Build of OpenTelemetry v2.
- Individual upgrade: navigate to Administrator > Marketplace > OperatorHub, open Alauda Build of OpenTelemetry v2, and approve the pending upgrade request.
Upgrading via the CLI
-
Confirm that the target version is available in the subscribed channel:
-
Approve the pending
InstallPlan: -
Wait until the new
ClusterServiceVersionreaches theSucceededphase:Example output
The Operator upgrade restarts the managed collectors. The otel Collector does not pin spec.image, so it immediately picks up the Collector version shipped with the new Operator, while the Jaeger instance stays on the image pinned in spec.image until step 5. The renamed component types remain available as deprecated aliases, so the Collector keeps running and only logs deprecation warnings until the next step.
Updating the OpenTelemetry Collector
The Operator reissues its admission webhook certificate during the upgrade. A patch applied in that window is rejected with failed calling webhook "mopentelemetrycollectorbeta.kb.io": ... x509: certificate signed by unknown authority. Wait a few seconds and apply it again.
Procedure
-
Create a file named
otel-upgrade-patch.yamlwith the following content:- The
otlpexporter type is renamed tootlp_grpc. Setting the old key tonullremoves it, and the new key recreates the exporter with the same endpoint. add_metric_suffixesis deprecated and silently ignored.translation_strategy: UnderscoreEscapingWithoutSuffixeskeeps the metric names free of Prometheus-style suffixes.- The
without_scope_info,without_type_suffix, andwithout_unitssettings of the Prometheus reader now default totrueand are dropped. Becausereadersis a list, the patch replaces it as a whole. The exposed metric names are unchanged.
- The
-
Render the patch with
envsubstand apply it: -
Wait for the Collector to restart, and confirm that it starts without deprecation warnings:
(Optional) Updating the Collector for Service Performance Monitoring
Rename the loadbalancing exporter that routes spans to the Jaeger tier. Apply this patch right after the previous one: in between, spans reach Jaeger through the direct exporter instead of being routed by service, which fragments the RED metrics if the Jaeger tier runs with more than one replica.
-
Create a file named
otel-spm-upgrade-patch.yamlwith the following content: -
Render the patch with
envsubstand apply it:
Migrating Index Management to ISM
A v2.0 deployment lets Jaeger compute a new index name every day and relies on the jaeger-es-index-cleaner CronJob for retention. This step prepares the alias-based layout that replaces it: an ISM policy that rolls over and deletes indices, and the aliases and index templates that Jaeger writes through.
Perform this step before updating the Jaeger configuration. Jaeger writes through the write alias as soon as it is switched over, so the aliases must already exist.
Procedure
-
Create the ISM policy. It must exist before the initialization creates the indices, because OpenSearch attaches a policy through the
ism_templatepatterns declared in the policy itself:Set
transitions[0].conditions.min_index_ageto the retention that thejaeger-es-index-cleanerCronJob currently applies, so that retention does not change across the upgrade. For the meaning of the other fields, see ISM Support.WARNINGKeep the
-0*suffix in theism_templatepatterns. It matches only the numbered rollover indices, such as-000001. A broader pattern such as-*also matches the date-suffixed indices that this deployment still holds, which ISM cannot roll over. -
Run the
jaeger-es-rolloverinitialization with the new image. It creates the index templates, the-000001indices, and the read and write aliases:The initialization also updates the index templates, which Jaeger v2.20.0 needs for the additional span fields it writes, such as
scopeTagsandreferences.traceState.WARNINGDo not restart the Jaeger instance between this step and step 5. It still runs the v2.0 configuration, in which
create_mappingsdefaults totrue, so on startup it recreates the index templates and drops the read alias and the ISM rollover alias that this step has just written. Writes keep succeeding, so the loss is only noticed at the first rollover. If the instance does restart, re-run this Job afterwards to restore the templates. -
Attach the existing date-suffixed indices to the read alias. After the switch, Jaeger resolves reads through the read alias only, so indices that are not attached become invisible to the Jaeger UI:
The
-2*pattern matches the date-suffixed indices, such as-2026-08-27, without matching the-000001indices that the previous step created. An index type that has never produced a date-suffixed index returnsindex_not_found_exception, which is expected fordependenciesandsamplingin most deployments.NOTEUnder alias-based rotation, Jaeger no longer limits queries by
max_span_age, so trace lookups and the service and operation lists scan every index attached to the read alias. Attach only the indices whose traces you still need. They are removed from the alias automatically when the index cleaner deletes them in step 6.
Updating the Alauda Build of Jaeger v2
Procedure
-
Create a file named
jaeger-upgrade-patch.yamlwith the following content:max_span_ageno longer takes effect under alias-based rotation, because Jaeger cannot derive an index name from a timestamp. Removing it avoids a setting that looks active but is ignored.max_trace_durationwidens the query time range on both sides so that spans extending beyond the search window are still found. See Query Time Range.create_mappings: falsestops Jaeger from creating its own index templates, which would overwrite the templates written by the initialization and drop the read alias and the ISM rollover alias from them. No validation catches this, and writes keep succeeding until the first rollover, after which new data is no longer readable. See Index Rollover.- The deprecated
date_layoutandrollover_frequencyfields must be removed. A merge patch does not remove them implicitly, and combining them withrotationfails validation withcannot use both 'rotation' config and legacy 'date_layout'/'rollover_frequency' fields. rotation.auto_rolloverselects lifecycle-managed rollover. Its default alias names match the aliases created by the initialization. Leaveauto_rollover.policy_nameempty: on OpenSearch the policy is bound by theism_templatepatterns, not by name. See Index Management Strategies.- The Operator parses
service.telemetry.resourceas a flat map of strings and silently discards the wholeservice.telemetrysection if it is not. Jaeger already reports its ownservice.nameandservice.version, so the block is removed rather than migrated. - As for the
otelCollector, thewithout_*settings now default totrueand are dropped by replacing thereaderslist.
-
Render the patch with
envsubst, apply it, and wait for Jaeger to restart: -
Update the OAuth2 Proxy sidecar image. Because
additionalContainersis a list that a merge patch would replace as a whole, this container is updated with a JSON patch of its own:WARNINGApply this patch only after the previous step. It restarts the Pod, and a restart that still picks up the v2.0 configuration lets Jaeger recreate the index templates written in step 4, dropping the read alias and the ISM rollover alias from them.
(Optional) Updating Jaeger for Service Performance Monitoring
-
Create a file named
jaeger-spm-upgrade-patch.yamlwith the following content: -
Render the patch with
envsubst, apply it, and wait for Jaeger to restart:
This rename applies to the Jaeger distribution. A standalone OpenTelemetry Collector only registers span_metrics from Collector 0.152.0 onwards, so verify the Collector version before renaming the connector in a front Collector configuration.
Retiring the Index Cleaner
The ISM policy now rolls over and deletes the numbered indices, so the jaeger-es-index-cleaner CronJob is no longer needed for new data. Keep it running until the date-suffixed indices left over from v2.0 have expired: ISM manages only the indices its ism_template patterns match, and those patterns deliberately exclude the date-suffixed ones.
The CronJob is safe to leave in place. In its default mode it matches only names ending in -YYYY-MM-DD, and it skips indices attached to a write alias, so it never deletes a numbered index.
-
Check whether any date-suffixed index is left:
-
Once the command returns nothing, delete the CronJob:
Verification
-
Confirm the component versions and that all Pods are ready:
-
Confirm that Jaeger starts without deprecation warnings:
-
Confirm that the index templates still carry the read alias and the ISM rollover alias. An empty result means that Jaeger has overwritten them, because it restarted while the v2.0 configuration was still in effect or because
create_mappings: falseis missing. Re-run the initialization Job from Migrating Index Management to ISM to restore them: -
Confirm that new spans are written to the numbered index, and that the read alias still spans the date-suffixed indices:
-
Confirm that ISM has taken the new indices over. The
index.plugins.index_state_management.policy_idfield should readjaeger-ism-policy. ISM discovers new indices with a background sweep, so this can take several minutes: -
Generate sample traces and confirm that they are stored and queryable, as described in the Verification section of the installation procedure. Also confirm that a service which last reported before the upgrade is still listed, which shows that the date-suffixed indices are reachable through the read alias. If SPM is enabled, open the Monitor tab in the Jaeger UI and confirm that RED metrics are shown for the generated service.