使用 OpenSearch 升级 Alauda Distributed Tracing

将基于 OpenSearch 的部署从 v2.0(Jaeger 2.16.0、Alauda Build of OpenTelemetry v2 Operator 0.147.0)升级到 v2.1(Jaeger 2.20.0、Operator 0.157.0)需要执行以下步骤:

  1. 安装 Alauda Build of Jaeger v2 集群插件
  2. 升级 Alauda Build of OpenTelemetry v2 Operator
  3. 更新 OpenTelemetry Collector
  4. 将索引管理迁移到 ISM
  5. 更新 Alauda Build of Jaeger v2
  6. 停用索引清理器
WARNING

此升级会更改索引布局。v2.0 部署每天写入一个带日期后缀的索引,例如 <prefix>-jaeger-span-2026-08-27,并使用 jaeger-es-index-cleaner CronJob 删除过期索引。v2.1 部署通过滚动别名写入编号索引,例如 <prefix>-jaeger-span-000001,并将滚动和保留操作交由 OpenSearch ISM 策略处理。

现有索引既不会重命名,也不会重新索引,但切换后,Jaeger 只会通过读取别名读取这些索引。步骤 4 会将这些索引关联到该别名,以确保仍可查询历史追踪数据。

先决条件

  • 已按照使用 OpenSearch 安装 Alauda Distributed Tracing 中的说明安装 Alauda Distributed Tracing v2.0 部署。
  • Alauda Container Platform Distributed Tracing(以前称为 Alauda Build of Jaeger v2)集群插件和 Alauda Container Platform Application Observability(以前称为 Alauda Build of OpenTelemetry v2)Operator 0.157.0 已发布到平台。
  • 由集群管理员通过 ACP CLI(kubectl)建立的有效会话,且该管理员在目标集群和 global 集群中都具有 cluster-admin 角色。
  • 请查看升级说明,了解此版本引入的行为变更。

设置环境变量

针对目标集群运行以下命令。系统会从正在运行的部署中读取 OpenSearch 端点、索引前缀和凭据,以确保这些值始终与部署一致:

# Namespace where the tracing components are deployed
export JAEGER_NS="jaeger-system"
# Name of the OpenTelemetryCollector resource that runs Jaeger
export JAEGER_INSTANCE_NAME="jaeger"

export OPENSEARCH_ENDPOINT=$(kubectl -n${JAEGER_NS} get opentelemetrycollector ${JAEGER_INSTANCE_NAME} \
  -o jsonpath='{.spec.config.extensions.jaeger_storage.backends.opensearch_storage.opensearch.server_urls[0]}')
export JAEGER_ES_INDEX_PREFIX=$(kubectl -n${JAEGER_NS} get opentelemetrycollector ${JAEGER_INSTANCE_NAME} \
  -o jsonpath='{.spec.config.extensions.jaeger_storage.backends.opensearch_storage.opensearch.indices.index_prefix}')
export OPENSEARCH_USER=$(kubectl -n${JAEGER_NS} get secret opensearch-credentials \
  -o jsonpath='{.data.OPENSEARCH_USER}' | base64 -d)
export OPENSEARCH_PASS=$(kubectl -n${JAEGER_NS} get secret opensearch-credentials \
  -o jsonpath='{.data.OPENSEARCH_PASS}' | base64 -d)

# Maximum expected duration of a single trace. Controls how far beyond the search
# window spans are looked up. The Jaeger default changed from 1h to 24h in v2.20.0.
export JAEGER_MAX_TRACE_DURATION="1h"

安装 Alauda Build of Jaeger v2 集群插件

从 v2.1 开始,链路追踪组件的容器镜像由 Alauda Build of Jaeger v2 集群插件提供,而不再由 Operator bundle 提供。安装该插件会将镜像同步到平台的内置 registry,并在目标集群的 cpaas-system 命名空间中创建 jaeger-cluster-plugin-manifest ConfigMap。后续步骤会从该 ConfigMap 中读取镜像地址。

通过 Web 控制台安装

  1. 在平台管理视图中,导航至 管理员 > Marketplace > 集群插件。
  2. 选择部署链路追踪组件的集群。
  3. 找到 Alauda Container Platform Distributed Tracing(对于重命名前发布的软件包,该名称显示为 Alauda Build of Jaeger v2),然后点击 安装。该插件无需安装参数。

通过 CLI 安装

无论插件的目标集群是哪一个,集群插件都需要通过在 global 集群中创建 ModuleInfo 资源来安装。

  1. 在 global 集群中运行以下命令,检查已发布的插件版本:

    kubectl get moduleconfigs -l cpaas.io/module-name=jaeger-cluster-plugin \
      -o custom-columns=NAME:.metadata.name,VERSION:.spec.version
  2. 在 global 集群中创建 ModuleInfo 资源。将 <target-cluster> 替换为部署链路追踪组件的集群名称,并将 <plugin-version> 替换为上一步中的某个版本:

    kubectl apply -f - <<EOF
    apiVersion: cluster.alauda.io/v1alpha1
    kind: ModuleInfo
    metadata:
      labels:
        cpaas.io/cluster-name: <target-cluster>
        cpaas.io/module-name: jaeger-cluster-plugin
        cpaas.io/module-type: plugin
      name: <target-cluster>-jaeger-cluster-plugin
    spec:
      config: {}
      version: <plugin-version>
    EOF
  3. 在 global 集群中验证安装结果。当 STATUS 列显示 Running 时,表示插件已成功安装:

    kubectl get moduleinfo -l cpaas.io/module-name=jaeger-cluster-plugin
    NOTE

    平台会为该资源分配生成的名称,因此请通过标签而不是清单中使用的名称查询 ModuleInfo。

读取镜像地址

针对目标集群运行以下命令。后续步骤会使用导出的变量:

export JAEGER_IMAGE=$(kubectl -ncpaas-system get configmap jaeger-cluster-plugin-manifest -o jsonpath='{.data.jaeger-image}')
export JAEGER_ES_ROLLOVER_IMAGE=$(kubectl -ncpaas-system get configmap jaeger-cluster-plugin-manifest -o jsonpath='{.data.jaeger-es-rollover-image}')
export JOAUTH2_PROXY_IMAGE=$(kubectl -ncpaas-system get configmap jaeger-cluster-plugin-manifest -o jsonpath='{.data.oauth2-proxy-image}')

echo "${JAEGER_IMAGE}"
echo "${JAEGER_ES_ROLLOVER_IMAGE}"
echo "${JOAUTH2_PROXY_IMAGE}"

升级 Alauda 构建的 OpenTelemetry v2 Operator

该 Operator 使用 Manual 审批策略订阅,因此必须显式批准升级。有关 Operator 升级的一般背景信息,请参阅 Operator。

通过 Web 控制台升级

选择以下一种方法:

  • 批量升级:导航至 平台管理 > 集群管理 > 集群 > 集群 > 功能组件,然后升级 Alauda Container Platform Application Observability(对于重命名前发布的软件包,此项显示为 Alauda Build of OpenTelemetry v2)。
  • 单独升级:导航至 管理员 > Marketplace > OperatorHub,打开 Alauda Container Platform Application Observability(对于重命名前发布的软件包,此项显示为 Alauda Build of OpenTelemetry v2),并批准待处理的升级请求。

通过 CLI 升级

  1. 确认订阅的频道中提供目标版本:

    kubectl -ncpaas-system get packagemanifest opentelemetry-operator2 \
      -o jsonpath='{range .status.channels[*]}{.name}{"\t"}{.currentCSV}{"\n"}{end}'
  2. 批准待处理的 InstallPlan:

    PLAN=$(kubectl -nopentelemetry-operator2 get subscription opentelemetry-operator2 \
      -o jsonpath='{.status.installPlanRef.name}')
    kubectl -nopentelemetry-operator2 patch installplan "${PLAN}" \
      --type=json -p='[{"op": "replace", "path": "/spec/approved", "value": true}]'
  3. 等待新的 ClusterServiceVersion 进入 Succeeded 阶段:

    kubectl -nopentelemetry-operator2 get csv

    输出示例

    NAME                                  DISPLAY                            VERSION      REPLACES                              PHASE
    opentelemetry-operator2.v0.157.0-r1   Alauda Build of OpenTelemetry v2   0.157.0-r1   opentelemetry-operator2.v0.147.0-r0   Succeeded
NOTE

Operator 升级会重启受其管理的 Collector。otel Collector 不会固定 spec.image,因此会立即使用新 Operator 随附的 Collector 版本,而 Jaeger 实例会继续使用 spec.image 中固定的镜像,直到步骤 5。重命名后的组件类型仍会作为已弃用的别名提供,因此 Collector 会继续运行,并且只会记录弃用警告,直到执行下一步。

更新 OpenTelemetry Collector

NOTE

Operator 会在升级期间重新签发其准入 Webhook 证书。在该时间段应用的补丁会被拒绝,并显示 failed calling webhook "mopentelemetrycollectorbeta.kb.io": ... x509: certificate signed by unknown authority。请等待几秒后重新应用。

操作步骤

  1. 创建名为 otel-upgrade-patch.yaml 的文件,内容如下:

    otel-upgrade-patch.yaml
    spec:
      config:
        exporters:
          otlp/traces: null
          otlp_grpc/traces:
            endpoint: "${JAEGER_INSTANCE_NAME}-collector.${JAEGER_NS}.svc.cluster.local:4317"
            tls:
              insecure: true
          prometheus:
            add_metric_suffixes: null
            translation_strategy: UnderscoreEscapingWithoutSuffixes
        service:
          pipelines:
            traces:
              exporters: [debug, otlp_grpc/traces]
          telemetry:
            metrics:
              readers:
                - pull:
                    exporter:
                      prometheus:
                        host: 0.0.0.0
                        port: 8888
    1. otlp exporter 类型已重命名为 otlp_grpc。将旧键设置为 null 会将其移除,而新键会使用相同的端点重新创建 exporter。
    2. add_metric_suffixes 已弃用,并会被静默忽略。translation_strategy: UnderscoreEscapingWithoutSuffixes 可使指标名称不带 Prometheus 风格的后缀。
    3. Prometheus reader 的 without_scope_info、without_type_suffix 和 without_units 设置现在默认值为 true,并会被移除。由于 readers 是一个列表,该补丁会整体替换它。公开的指标名称不会改变。
  2. 使用 envsubst 渲染补丁并应用:

    kubectl patch opentelemetrycollector otel -n ${JAEGER_NS} \
      --type=merge -p "$(envsubst < otel-upgrade-patch.yaml)"
  3. 等待 Collector 重启,并确认其启动时没有弃用警告:

    kubectl rollout status deployment/otel-collector -n ${JAEGER_NS} --timeout=180s
    sleep 3
    kubectl logs deployment/otel-collector -n ${JAEGER_NS} --tail=200 \
      | grep -i "deprecated" || echo "No deprecation warnings"

(可选)更新用于服务性能监控的 Collector

重命名将 span 路由至 Jaeger 层的 loadbalancing exporter。请紧接着前一个补丁应用此补丁:在两者之间,span 会通过直接 exporter 到达 Jaeger,而不是由 service 路由;如果 Jaeger 层运行多个副本,这会导致 RED 指标碎片化。

  1. 创建名为 otel-spm-upgrade-patch.yaml 的文件,内容如下:

    otel-spm-upgrade-patch.yaml
    spec:
      config:
        exporters:
          otlp_grpc/traces: null # not used when spans are routed through load_balancing
          loadbalancing: null
          load_balancing:
            routing_key: service
            protocol:
              otlp: # a configuration field of the load_balancing exporter, not a component type name
                tls:
                  insecure: true
            resolver:
              dns:
                hostname: ${JAEGER_INSTANCE_NAME}-collector-headless.${JAEGER_NS}.svc.cluster.local
                port: "4317"
        service:
          pipelines:
            traces:
              exporters: [debug, load_balancing]
  2. 使用 envsubst 渲染补丁并应用:

    kubectl patch opentelemetrycollector otel -n ${JAEGER_NS} \
      --type=merge -p "$(envsubst < otel-spm-upgrade-patch.yaml)"
    
    kubectl rollout status deployment/otel-collector -n ${JAEGER_NS} --timeout=180s

将索引管理迁移到 ISM

v2.0 部署每天都会让 Jaeger 计算新的索引名称,并依靠 jaeger-es-index-cleaner CronJob 执行保留策略。此步骤将准备基于别名的布局来替代原有方式:通过 ISM 策略滚动和删除索引,并创建 Jaeger 用于写入的别名和索引模板。

请在更新 Jaeger 配置之前执行此步骤。切换后,Jaeger 会立即通过写入别名写入,因此必须预先创建好别名。

操作步骤

  1. 创建 ISM 策略。初始化操作创建索引之前,必须先创建该策略,因为 OpenSearch 会通过策略本身声明的 ism_template 模式附加策略:

    curl -k -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" -X PUT \
      "${OPENSEARCH_ENDPOINT}/_plugins/_ism/policies/jaeger-ism-policy" \
      -H 'Content-Type: application/json' \
      --data-binary @- << EOF
    {
      "policy": {
        "description": "Jaeger index rollover and retention",
        "default_state": "hot",
        "states": [
          {
            "name": "hot",
            "actions": [
              {
                "rollover": {
                  "min_primary_shard_size": "50gb",
                  "min_index_age": "1d"
                }
              }
            ],
            "transitions": [
              {
                "state_name": "delete",
                "conditions": {
                  "min_index_age": "7d"
                }
              }
            ]
          },
          {
            "name": "delete",
            "actions": [
              {
                "delete": {}
              }
            ],
            "transitions": []
          }
        ],
        "ism_template": [
          { "index_patterns": ["${JAEGER_ES_INDEX_PREFIX}-jaeger-span-0*"], "priority": 100 },
          { "index_patterns": ["${JAEGER_ES_INDEX_PREFIX}-jaeger-service-0*"], "priority": 100 },
          { "index_patterns": ["${JAEGER_ES_INDEX_PREFIX}-jaeger-dependencies-0*"], "priority": 100 },
          { "index_patterns": ["${JAEGER_ES_INDEX_PREFIX}-jaeger-sampling-0*"], "priority": 100 }
        ]
      }
    }
    EOF

    将 transitions[0].conditions.min_index_age 设置为 jaeger-es-index-cleaner CronJob 当前应用的保留期限,确保升级前后保留期限不变。有关其他字段的含义,请参阅 ISM 支持。

    WARNING

    请在 ism_template 模式中保留 -0* 后缀。它仅匹配带编号的滚动索引,例如 -000001。更宽泛的模式(例如 -*)也会匹配此部署仍保留的日期后缀索引,而 ISM 无法滚动这些索引。

  2. 使用新镜像运行 jaeger-es-rollover 初始化操作。该操作会创建索引模板、-000001 索引以及读写别名:

    kubectl apply -n ${JAEGER_NS} -f - <<EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: jaeger-es-rollover-init
    spec:
      template:
        spec:
          containers:
          - name: es-rollover-init
            image: "${JAEGER_ES_ROLLOVER_IMAGE}"
            args:
              - init
              - "${OPENSEARCH_ENDPOINT}"
            env:
            - name: INDEX_PREFIX
              value: "${JAEGER_ES_INDEX_PREFIX}"
            - name: ES_USE_ILM
              value: "true"
            - name: ES_ILM_POLICY_NAME
              value: "jaeger-ism-policy"
            - name: ADAPTIVE_SAMPLING
              value: "true"
            - name: ES_TLS_ENABLED
              value: "true"
            - name: ES_TLS_SKIP_HOST_VERIFY
              value: "true"
            - name: ES_USERNAME
              valueFrom:
                secretKeyRef:
                  name: opensearch-credentials
                  key: OPENSEARCH_USER
            - name: ES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: opensearch-credentials
                  key: OPENSEARCH_PASS
          restartPolicy: Never
      backoffLimit: 3
    EOF
    
    kubectl wait --for=condition=complete job/jaeger-es-rollover-init -n ${JAEGER_NS} --timeout=180s
    kubectl delete job jaeger-es-rollover-init -n ${JAEGER_NS}

    初始化操作还会更新索引模板;Jaeger v2.20.0 需要这些模板来支持其写入的额外 span 字段,例如 scopeTags 和 references.traceState。

    WARNING

    请勿在此步骤与步骤 5之间重启 Jaeger 实例。实例仍在运行 v2.0 配置,其中 create_mappings 默认为 true,因此启动时会重新创建索引模板,并删除此步骤刚创建的读别名和 ISM 滚动别名。写入仍会成功,因此只有到首次滚动时才会发现此问题。如果实例确实重启,请随后重新运行此 Job 以恢复模板。

  3. 将现有的日期后缀索引附加到读别名。切换后,Jaeger 只会通过读别名解析读取请求,因此未附加的索引在 Jaeger UI 中将不可见:

    for TYPE in span service dependencies sampling; do
      curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" -X POST \
        "${OPENSEARCH_ENDPOINT}/_aliases" -H 'Content-Type: application/json' \
        -d "{\"actions\":[{\"add\":{\"index\":\"${JAEGER_ES_INDEX_PREFIX}-jaeger-${TYPE}-2*\",\"alias\":\"${JAEGER_ES_INDEX_PREFIX}-jaeger-${TYPE}-read\"}}]}"
      echo
    done

    -2* 模式匹配日期后缀索引(例如 -2026-08-27),但不会匹配上一步创建的 -000001 索引。对于从未生成过日期后缀索引的索引类型,命令会返回 index_not_found_exception;在大多数部署中,dependencies 和 sampling 出现这种情况是正常的。

    NOTE

    采用基于别名的轮转后,Jaeger 不再按 max_span_age 限制查询,因此 trace 查询以及服务和操作列表会扫描附加到读别名的所有索引。仅附加仍需要查询其 trace 的索引。索引清理器在步骤 6中删除索引时,这些索引会自动从别名中移除。

更新 Alauda Build of Jaeger v2

操作步骤

  1. 创建名为 jaeger-upgrade-patch.yaml 的文件,内容如下:

    jaeger-upgrade-patch.yaml
    spec:
      image: "${JAEGER_IMAGE}"
      config:
        extensions:
          jaeger_storage:
            backends:
              opensearch_storage:
                opensearch:
                  max_span_age: null
                  max_trace_duration: "${JAEGER_MAX_TRACE_DURATION}"
                  create_mappings: false
                  indices:
                    spans:
                      date_layout: null
                      rollover_frequency: null
                      rotation:
                        auto_rollover: {}
                    services:
                      date_layout: null
                      rollover_frequency: null
                      rotation:
                        auto_rollover: {}
                    dependencies:
                      date_layout: null
                      rollover_frequency: null
                      rotation:
                        auto_rollover: {}
                    sampling:
                      date_layout: null
                      rollover_frequency: null
                      rotation:
                        auto_rollover: {}
        service:
          telemetry:
            resource: null
            metrics:
              level: detailed
              readers:
                - pull:
                    exporter:
                      prometheus:
                        host: 0.0.0.0
                        port: 8888
    1. 在基于别名的轮转模式下,max_span_age 不再生效,因为 Jaeger 无法根据时间戳推导索引名称。移除它可以避免保留一个看似生效但实际会被忽略的设置。
    2. max_trace_duration 会扩大两侧的查询时间范围,因此仍可找到超出搜索窗口的 span。请参阅查询时间范围。
    3. create_mappings: false 会阻止 Jaeger 创建自己的索引模板,否则这些模板会覆盖初始化操作写入的模板,并从模板中移除读别名和 ISM 滚动别名。没有任何验证会捕获此问题,并且写入会一直成功,直到首次滚动;此后,新数据将无法读取。请参阅索引滚动。
    4. 必须移除已弃用的 date_layout 和 rollover_frequency 字段。合并补丁不会隐式移除这些字段,并且将它们与 rotation 结合使用会导致验证失败,并出现 cannot use both 'rotation' config and legacy 'date_layout'/'rollover_frequency' fields。
    5. rotation.auto_rollover 会选择由生命周期管理的滚动方式。其默认别名名称与初始化操作创建的别名匹配。将 auto_rollover.policy_name 保持为空:在 OpenSearch 上,策略通过 ism_template 模式绑定,而不是通过名称绑定。请参阅索引管理策略。
    6. Operator 会将 service.telemetry.resource 解析为字符串的扁平映射;如果不是这种格式,则会静默丢弃整个 service.telemetry 部分。Jaeger 已经报告自身的 service.name 和 service.version,因此应移除该块,而不是进行迁移。
    7. 对于 otel Collector,without_* 设置现在默认为 true,并通过替换 readers 列表将其移除。
  2. 使用 envsubst 渲染补丁,应用该补丁,并等待 Jaeger 重启:

    kubectl patch opentelemetrycollector ${JAEGER_INSTANCE_NAME} -n ${JAEGER_NS} \
      --type=merge -p "$(envsubst < jaeger-upgrade-patch.yaml)"
    
    kubectl rollout status deployment/${JAEGER_INSTANCE_NAME}-collector -n ${JAEGER_NS} --timeout=300s
  3. 更新 OAuth2 Proxy sidecar 镜像。由于 additionalContainers 是一个会被合并补丁整体替换的列表,因此使用单独的 JSON 补丁更新此容器:

    kubectl patch opentelemetrycollector ${JAEGER_INSTANCE_NAME} -n ${JAEGER_NS} --type=json \
      -p "[{\"op\": \"replace\", \"path\": \"/spec/additionalContainers/0/image\", \"value\": \"${JOAUTH2_PROXY_IMAGE}\"}]"
    
    kubectl rollout status deployment/${JAEGER_INSTANCE_NAME}-collector -n ${JAEGER_NS} --timeout=300s
    WARNING

    仅在完成上一步后应用此补丁。该操作会重启 Pod;如果重启时仍使用 v2.0 配置,Jaeger 会重新创建步骤 4中写入的索引模板,并从模板中移除读别名和 ISM 滚动别名。

(可选)更新用于服务性能监控的 Jaeger

  1. 创建名为 jaeger-spm-upgrade-patch.yaml 的文件,内容如下:

    jaeger-spm-upgrade-patch.yaml
    spec:
      config:
        connectors:
          spanmetrics: null
          span_metrics: {}
        exporters:
          prometheus:
            add_metric_suffixes: null
            translation_strategy: UnderscoreEscapingWithoutSuffixes
        service:
          pipelines:
            traces:
              exporters: [debug, jaeger_storage_exporter, span_metrics]
            metrics/spanmetrics:
              receivers: [span_metrics]
  2. 使用 envsubst 渲染补丁,应用该补丁,并等待 Jaeger 重启:

    kubectl patch opentelemetrycollector ${JAEGER_INSTANCE_NAME} -n ${JAEGER_NS} \
      --type=merge -p "$(envsubst < jaeger-spm-upgrade-patch.yaml)"
    
    kubectl rollout status deployment/${JAEGER_INSTANCE_NAME}-collector -n ${JAEGER_NS} --timeout=300s
NOTE

此重命名适用于 Jaeger distribution。独立的 OpenTelemetry Collector 只有从 Collector 0.152.0 开始才会注册 span_metrics,因此在前置 Collector 配置中重命名 connector 之前,请先确认 Collector 版本。

停用索引清理器

ISM 策略现在会滚动并删除编号索引,因此对于新数据不再需要 jaeger-es-index-cleaner CronJob。请一直保留该 CronJob,直到 v2.0 遗留的日期后缀索引过期:ISM 只管理与其 ism_template 模式匹配的索引,而这些模式会有意排除日期后缀索引。

保留该 CronJob 不会有问题。在默认模式下,它只匹配以 -YYYY-MM-DD 结尾的名称,并跳过已关联写别名的索引,因此绝不会删除编号索引。

  1. 检查是否还有日期后缀索引:

    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" \
      "${OPENSEARCH_ENDPOINT}/_cat/indices/${JAEGER_ES_INDEX_PREFIX}-jaeger-*-2*?h=index&s=index"
  2. 当命令不再返回任何内容后,删除 CronJob:

    kubectl delete cronjob ${JAEGER_INSTANCE_NAME}-es-index-cleaner -n ${JAEGER_NS}

验证

  1. 确认组件版本以及所有 Pod 均已就绪:

    kubectl -n${JAEGER_NS} get opentelemetrycollector
    kubectl -n${JAEGER_NS} get pods
  2. 确认 Jaeger 启动时没有弃用警告:

    kubectl logs deployment/${JAEGER_INSTANCE_NAME}-collector -n ${JAEGER_NS} \
      -c otc-container --tail=300 | grep -iE "warn|error" || echo "No warnings"
  3. 确认索引模板仍包含读别名和 ISM 滚动别名。结果为空表示 Jaeger 已覆盖这些别名,原因可能是它在 v2.0 配置仍生效时重启,或者缺少 create_mappings: false。重新运行将索引管理迁移到 ISM中的初始化 Job 以恢复这些别名:

    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" \
      "${OPENSEARCH_ENDPOINT}/_template/${JAEGER_ES_INDEX_PREFIX}-jaeger-span" \
      | grep -o "rollover_alias\|${JAEGER_ES_INDEX_PREFIX}-jaeger-span-read"
  4. 确认新 span 已写入编号索引,并且读别名仍涵盖日期后缀索引:

    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" \
      "${OPENSEARCH_ENDPOINT}/${JAEGER_ES_INDEX_PREFIX}-jaeger-span-000001/_count?pretty"
    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" \
      "${OPENSEARCH_ENDPOINT}/_cat/aliases/${JAEGER_ES_INDEX_PREFIX}-jaeger-span-*?v"
  5. 确认 ISM 已接管新索引。index.plugins.index_state_management.policy_id 字段应显示为 jaeger-ism-policy。ISM 会通过后台扫描发现新索引,因此可能需要几分钟:

    curl -k -sS -u "${OPENSEARCH_USER}:${OPENSEARCH_PASS}" \
      "${OPENSEARCH_ENDPOINT}/_plugins/_ism/explain/${JAEGER_ES_INDEX_PREFIX}-jaeger-span-000001?pretty"
  6. 生成示例 trace,并确认这些 trace 已存储且可查询,具体说明请参阅安装操作步骤中的验证部分。同时确认升级前最后一次上报的服务仍在列表中,这表明可通过读别名访问日期后缀索引。如果启用了 SPM,请在 Jaeger UI 中打开 Monitor 页签,并确认生成的服务显示了 RED 指标。