Repository: jaegertracing/jaeger

Issue:
[Bug]: jaeger-v2 internal metrics has unexpected suffix
### What happened?

Run jaeger-v2 with Elasticsearch, its internal metrics are exposed on http://localhost:8888/metrics, has unexpected suffix `_total`
```
# HELP jaeger_storage_bulk_index_attempts_total_total 
# TYPE jaeger_storage_bulk_index_attempts_total_total counter
jaeger_storage_bulk_index_attempts_total_total{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore"} 15531
# HELP jaeger_storage_bulk_index_errors_total_total 
# TYPE jaeger_storage_bulk_index_errors_total_total counter
jaeger_storage_bulk_index_errors_total_total{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore"} 0
# HELP jaeger_storage_bulk_index_inserts_total_total 
# TYPE jaeger_storage_bulk_index_inserts_total_total counter
jaeger_storage_bulk_index_inserts_total_total{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore"} 15531
# HELP jaeger_storage_bulk_index_latency_ok_seconds 
# TYPE jaeger_storage_bulk_index_latency_ok_seconds histogram
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="0"} 0
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="5"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="10"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="25"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="50"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="75"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="100"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="250"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="500"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="750"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="1000"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="2500"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="5000"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="7500"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="10000"} 21
jaeger_storage_bulk_index_latency_ok_seconds_bucket{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore",le="+Inf"} 21
jaeger_storage_bulk_index_latency_ok_seconds_sum{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore"} 0.240925207
jaeger_storage_bulk_index_latency_ok_seconds_count{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore"} 21
# HELP jaeger_storage_spans_attempts_total_total 
# TYPE jaeger_storage_spans_attempts_total_total counter
jaeger_storage_spans_attempts_total_total{kind="elasticsearch",name="storage/elasticsearch",otel_scope_name="jaeger-v2",otel_scope_schema_url="",otel_scope_version="",role="tracestore"} 15476
```

### Steps to reproduce

run jaeger v2 with config:
```
exporters:
  jaeger_storage_exporter:
    trace_storage: storage/elasticsearch
extensions:
  jaeger_storage:
    backends:
      storage/elasticsearch:
        elasticsearch:
          server_urls:
            - http://127.0.0.1:9200
          create_mappings: false
          use_aliases: false
          use_ilm: false
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
service:
  telemetry:
    logs:
      level: "info"
    metrics:
      readers:
        - pull:
            exporter:
              prometheus:
                host: '0.0.0.0'
                port: 8888
  extensions:
    - jaeger_storage
  pipelines:
    traces:
      exporters:
        - jaeger_storage_exporter
      receivers:
        - otlp
```

send span by:
```
docker run --rm -it -e OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://ip:4317 \
jaegertracing/jaeger-tracegen -spans 10 -traces 1500 -services 5 -trace-exporter otlp-grpc
```

### Expected behavior

Jaeger-v2 exposes the right metrics format.

### Relevant log output

```shell

```

### Screenshot

<img width="1503" height="622" alt="Image" src="https://github.com/user-attachments/assets/161427e0-bc89-4635-90f1-a98453709096" />

### Additional context

_No response_

### Jaeger backend version

main(v2.9.0)

### SDK

_No response_

### Pipeline

_No response_

### Stogage backend

_No response_

### Operating system

_No response_

### Deployment model

_No response_

### Deployment configs

```shell

```

Hints from issue comments:
@yurishkuro: @pipiland2612 mind taking a look?@pipiland2612: Yes, I can have a look today or tomorrow. I have some initial thoughts on this might because of some metrics updated patch

Solution patch:
diff --git a/.github/actions/setup-go-tip/action.yml b/.github/actions/setup-go-tip/action.yml
index f155ba30..eff49650 100644
--- a/.github/actions/setup-go-tip/action.yml
+++ b/.github/actions/setup-go-tip/action.yml
@@ -1,51 +1,38 @@
 # Inspired by https://github.com/actions/setup-go/issues/21#issuecomment-997208686
 name: 'Install Go Tip'
 description: 'Install Go Tip toolchain'
+inputs:
+  gh_token:
+    description: 'The GitHub Token'
+    required: true
 runs:
   using: "composite"
   steps:
-    - name: Download Go Tip
+    - name: Download pre-built Go tip from grafana/gotip repo
       id: download
       shell: bash
       run: |
-        echo Download Go Tip
         set -euo pipefail
-        tip=$(git ls-remote https://github.com/golang/go.git HEAD | awk '{print $1;}')
-        echo "Go Tip version: ${tip}"
-        retries=3
-        wait_time=10
-        success=false
-        for ((i=1; i<=retries; i++)); do
-          url="https://storage.googleapis.com/go-build-snap/go/linux-amd64/${tip}.tar.gz"
-          if curl -fsSL -o gotip.tar.gz "$url"; then
-            success=true
-            break
-          fi
-          echo "Failed to download. Retrying in $wait_time seconds..."
-          sleep $wait_time
-        done
-        echo "success=${success}" >> $GITHUB_OUTPUT
-
-    - name: Unpack gotip bundle
-      if: steps.download.outputs.success == 'true'
-      shell: bash
-      run: |
-        echo Unpack gotip bundle
-        set -euo pipefail
-        echo "Downloaded bundle:"
-        ls -lah gotip.tar.gz
+        gh release download ubuntu-latest --repo grafana/gotip --pattern 'go.zip'
+        echo "::group::unzip"
+        unzip go.zip -d $HOME/sdk
+        echo "::endgroup::"
         export GOROOT="$HOME/sdk/gotip"
-        mkdir -p $GOROOT
-        tar -C $GOROOT -xzf gotip.tar.gz
         echo "GOROOT=$GOROOT" >> $GITHUB_ENV
+        echo "success=true" >> $GITHUB_OUTPUT
+      env:
+        GH_TOKEN: ${{ inputs.gh_token }}
 
     # If download failed, we will try to build tip from source.
     # This requires Go toolchain, so install it first.
+    # However, gotip is picky about the version of Go used to build it,
+    # sometimes it requires the latest version, so determine it dynamically.
     - name: Determine latest Go version
       if: steps.download.outputs.success == 'false'
       id: get_go_version
+      shell: bash
       run: |
-        LATEST_GO_VERSION=$(curl -s "https://go.dev/VERSION?m=text")
+        LATEST_GO_VERSION=$(curl -s "https://go.dev/VERSION?m=text" | grep go1 | sed 's/^go//g')
         echo "LATEST_GO_VERSION=$LATEST_GO_VERSION" >> $GITHUB_OUTPUT
 
     - name: Install Go toolchain
diff --git a/.github/workflows/ci-build-binaries.yml b/.github/workflows/ci-build-binaries.yml
index cb672d47..378913e6 100644
--- a/.github/workflows/ci-build-binaries.yml
+++ b/.github/workflows/ci-build-binaries.yml
@@ -50,7 +50,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Setup Node.js version
       uses: ./.github/actions/setup-node.js
diff --git a/.github/workflows/ci-comment.yml b/.github/workflows/ci-comment.yml
index 9d37ba58..6eb29160 100644
--- a/.github/workflows/ci-comment.yml
+++ b/.github/workflows/ci-comment.yml
@@ -21,7 +21,7 @@ jobs:
 
       - name: Download all metrics artifacts from triggering workflow
         id: download-artifacts
-        uses: actions/github-script@v7
+        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
         with:
           script: |
             const { owner, repo } = context.repo;
@@ -109,7 +109,7 @@ jobs:
 
       - name: Post PR comment with combined metrics summary
         if: steps.compare-metrics.outputs.DIFF_FOUND == 'true' && steps.download-artifacts.outputs.pr_number
-        uses: thollander/actions-comment-pull-request@v3
+        uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3
         with:
           file-path: ./.metrics/combined_summary.md
           github-token: '${{ secrets.GITHUB_TOKEN }}'
diff --git a/.github/workflows/ci-crossdock.yml b/.github/workflows/ci-crossdock.yml
index 339cac8e..cfb19125 100644
--- a/.github/workflows/ci-crossdock.yml
+++ b/.github/workflows/ci-crossdock.yml
@@ -35,7 +35,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - uses: ./.github/actions/setup-branch
 
diff --git a/.github/workflows/ci-docker-all-in-one.yml b/.github/workflows/ci-docker-all-in-one.yml
index 1c45e2b3..8c84404d 100644
--- a/.github/workflows/ci-docker-all-in-one.yml
+++ b/.github/workflows/ci-docker-all-in-one.yml
@@ -39,7 +39,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - uses: ./.github/actions/setup-node.js
 
diff --git a/.github/workflows/ci-docker-build.yml b/.github/workflows/ci-docker-build.yml
index 3af7ad36..89baf342 100644
--- a/.github/workflows/ci-docker-build.yml
+++ b/.github/workflows/ci-docker-build.yml
@@ -34,7 +34,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - uses: ./.github/actions/setup-node.js
 
diff --git a/.github/workflows/ci-docker-hotrod.yml b/.github/workflows/ci-docker-hotrod.yml
index 27982199..3dd444a1 100644
--- a/.github/workflows/ci-docker-hotrod.yml
+++ b/.github/workflows/ci-docker-hotrod.yml
@@ -40,7 +40,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - uses: ./.github/actions/setup-node.js
 
diff --git a/.github/workflows/ci-e2e-all.yml b/.github/workflows/ci-e2e-all.yml
index ee54a745..adf3e4f7 100644
--- a/.github/workflows/ci-e2e-all.yml
+++ b/.github/workflows/ci-e2e-all.yml
@@ -49,7 +49,7 @@ jobs:
         run: echo "${{ github.event.number }}" > pr_number.txt
       - name: Upload PR number artifact
         if: github.event_name == 'pull_request'
-        uses: actions/upload-artifact@v4
+        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
         with:
           name: pr_number
           path: pr_number.txt
\ No newline at end of file
diff --git a/.github/workflows/ci-e2e-badger.yaml b/.github/workflows/ci-e2e-badger.yaml
index e58c9c3f..19ef466a 100644
--- a/.github/workflows/ci-e2e-badger.yaml
+++ b/.github/workflows/ci-e2e-badger.yaml
@@ -27,7 +27,7 @@ jobs:
     - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run Badger storage integration tests
       run: |
diff --git a/.github/workflows/ci-e2e-cassandra.yml b/.github/workflows/ci-e2e-cassandra.yml
index 8464506f..5ac61d50 100644
--- a/.github/workflows/ci-e2e-cassandra.yml
+++ b/.github/workflows/ci-e2e-cassandra.yml
@@ -41,7 +41,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run cassandra integration tests
       id: test-execution
diff --git a/.github/workflows/ci-e2e-elasticsearch.yml b/.github/workflows/ci-e2e-elasticsearch.yml
index df687c4b..8ae8b7f9 100644
--- a/.github/workflows/ci-e2e-elasticsearch.yml
+++ b/.github/workflows/ci-e2e-elasticsearch.yml
@@ -46,7 +46,7 @@ jobs:
         
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: time settings
       run: |
diff --git a/.github/workflows/ci-e2e-grpc.yml b/.github/workflows/ci-e2e-grpc.yml
index 9cfa09c7..528a95cb 100644
--- a/.github/workflows/ci-e2e-grpc.yml
+++ b/.github/workflows/ci-e2e-grpc.yml
@@ -28,7 +28,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run gRPC storage integration tests
       run: |
diff --git a/.github/workflows/ci-e2e-kafka.yml b/.github/workflows/ci-e2e-kafka.yml
index f7b98c6a..8724a63f 100644
--- a/.github/workflows/ci-e2e-kafka.yml
+++ b/.github/workflows/ci-e2e-kafka.yml
@@ -30,7 +30,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run kafka integration tests
       id: test-execution
diff --git a/.github/workflows/ci-e2e-memory.yaml b/.github/workflows/ci-e2e-memory.yaml
index bbbef4ab..7fa3b482 100644
--- a/.github/workflows/ci-e2e-memory.yaml
+++ b/.github/workflows/ci-e2e-memory.yaml
@@ -24,7 +24,7 @@ jobs:
         
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run Memory storage integration tests
       run: |
diff --git a/.github/workflows/ci-e2e-opensearch.yml b/.github/workflows/ci-e2e-opensearch.yml
index 07bd8b4e..b0ae0636 100644
--- a/.github/workflows/ci-e2e-opensearch.yml
+++ b/.github/workflows/ci-e2e-opensearch.yml
@@ -43,7 +43,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
 
diff --git a/.github/workflows/ci-e2e-query.yml b/.github/workflows/ci-e2e-query.yml
index de96f5a0..6d9906b5 100644
--- a/.github/workflows/ci-e2e-query.yml
+++ b/.github/workflows/ci-e2e-query.yml
@@ -24,7 +24,7 @@ jobs:
         
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run Memory storage integration tests
       run: |
diff --git a/.github/workflows/ci-e2e-spm.yml b/.github/workflows/ci-e2e-spm.yml
index 1221a766..0a1e37b2 100644
--- a/.github/workflows/ci-e2e-spm.yml
+++ b/.github/workflows/ci-e2e-spm.yml
@@ -52,10 +52,11 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Setup Node.js version
       uses: ./.github/actions/setup-node.js
       
     - name: Run SPM Test
-      run:  bash scripts/e2e/spm.sh -b ${{ matrix.mode.binary }} -m ${{ matrix.mode.metricstore }}
\ No newline at end of file
+      run:  bash scripts/e2e/spm.sh -b ${{ matrix.mode.binary }} -m ${{ matrix.mode.metricstore }}
+
diff --git a/.github/workflows/ci-e2e-tailsampling.yml b/.github/workflows/ci-e2e-tailsampling.yml
index 6284eb51..427e693e 100644
--- a/.github/workflows/ci-e2e-tailsampling.yml
+++ b/.github/workflows/ci-e2e-tailsampling.yml
@@ -29,7 +29,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Run Tail Sampling Processor Integration Test
       run: |
diff --git a/.github/workflows/ci-lint-checks.yaml b/.github/workflows/ci-lint-checks.yaml
index e4b7cf0d..16529eb7 100644
--- a/.github/workflows/ci-lint-checks.yaml
+++ b/.github/workflows/ci-lint-checks.yaml
@@ -28,7 +28,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Print Jaeger version for no reason
       run: make echo-v1 echo-v2
@@ -100,7 +100,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Verify Protobuf types are up to date
       run: make proto && { if git status --porcelain | grep '??'; then exit 1; else git diff --name-status --exit-code; fi }
@@ -145,7 +145,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - name: Setup Node.js version
       uses: ./.github/actions/setup-node.js
diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml
index 9351a44e..5c1da562 100644
--- a/.github/workflows/ci-release.yml
+++ b/.github/workflows/ci-release.yml
@@ -63,7 +63,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
 
     - uses: ./.github/actions/setup-node.js
 
diff --git a/.github/workflows/ci-unit-tests-go-tip.yml b/.github/workflows/ci-unit-tests-go-tip.yml
index 06901325..7171a9cb 100644
--- a/.github/workflows/ci-unit-tests-go-tip.yml
+++ b/.github/workflows/ci-unit-tests-go-tip.yml
@@ -5,11 +5,17 @@ on:
   push:
     branches: [main]
 
+  # We normally don't want this workflow to run on PRs, only on main branch.
+  # But to allow testing of this workflow itself, add `run-all-workflows` label.
+  pull_request:
+    branches: [main]
+
 permissions:
   contents: read
 
 jobs:
   unit-tests-go-tip:
+    if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'run-all-workflows')
     permissions:
       checks: write
     runs-on: ubuntu-latest
@@ -23,6 +29,8 @@ jobs:
 
     - name: Install Go Tip
       uses: ./.github/actions/setup-go-tip
+      with:
+        gh_token: ${{ secrets.GITHUB_TOKEN }}
 
     - name: Install test deps
       # even though the same target runs from test-ci, running it separately makes for cleaner log in GH workflow
diff --git a/.github/workflows/ci-unit-tests.yml b/.github/workflows/ci-unit-tests.yml
index 4bd32c40..bc76f087 100644
--- a/.github/workflows/ci-unit-tests.yml
+++ b/.github/workflows/ci-unit-tests.yml
@@ -30,7 +30,7 @@ jobs:
 
     - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
       with:
-        go-version: 1.24.x
+        go-version: 1.25.x
         cache-dependency-path: ./go.sum
 
     # download dependencies separately to keep unit test step's output cleaner
diff --git a/.github/workflows/fossa.yml b/.github/workflows/fossa.yml
index 72a69d52..32188ba9 100644
--- a/.github/workflows/fossa.yml
+++ b/.github/workflows/fossa.yml
@@ -30,7 +30,7 @@ jobs:
 
       - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
         with:
-          go-version: 1.24.x
+          go-version: 1.25.x
 
       - name: Add GOPATH
         run: |
@@ -39,7 +39,7 @@ jobs:
           echo "$GOPATH/bin" >>"$GITHUB_PATH"
 
       - name: Run FOSSA scan and upload report
-        uses: fossa-contrib/fossa-action@v3.0.1
+        uses: fossa-contrib/fossa-action@3d2ef181b1820d6dcd1972f86a767d18167fa19b # v3.0.1
         with:
           # FOSSA Push-Only API Token
           fossa-api-key: 304657e2357ba57b416b94e6b119131b
diff --git a/.golangci.yml b/.golangci.yml
index 47df0cb4..8abbcc82 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -1,6 +1,6 @@
 version: "2"
 run:
-  go: "1.23"
+  go: "1.24"
 linters:
   enable:
     - asciicheck
diff --git a/docker-compose/monitor/docker-compose-opensearch.yml b/docker-compose/monitor/docker-compose-opensearch.yml
index 9a36b318..4d28d5c0 100644
--- a/docker-compose/monitor/docker-compose-opensearch.yml
+++ b/docker-compose/monitor/docker-compose-opensearch.yml
@@ -1,6 +1,6 @@
 services:
   opensearch:
-    image: opensearchproject/opensearch:3.1.0@sha256:2ddce3f8e2e00644f122cedeeb8b2e93d8a2dc587d3a1338bfe868ec56848afe
+    image: opensearchproject/opensearch:3.2.0@sha256:23297b8d8545e129dd58c254ed08d786dc552410ba772983ad2af31048d2f04b
     networks:
       - backend
     environment:
diff --git a/docker-compose/opensearch/v3/docker-compose.yml b/docker-compose/opensearch/v3/docker-compose.yml
index 3fe8cf9c..8825f48c 100644
--- a/docker-compose/opensearch/v3/docker-compose.yml
+++ b/docker-compose/opensearch/v3/docker-compose.yml
@@ -1,6 +1,6 @@
 services:
   opensearch:
-    image: opensearchproject/opensearch:3.1.0@sha256:2ddce3f8e2e00644f122cedeeb8b2e93d8a2dc587d3a1338bfe868ec56848afe
+    image: opensearchproject/opensearch:3.2.0@sha256:23297b8d8545e129dd58c254ed08d786dc552410ba772983ad2af31048d2f04b
     environment:
       - discovery.type=single-node
       - plugins.security.disabled=true
diff --git a/go.mod b/go.mod
index db6b67de..eea53113 100644
--- a/go.mod
+++ b/go.mod
@@ -1,12 +1,12 @@
 module github.com/jaegertracing/jaeger
 
-go 1.23.7
+go 1.24.6
 
-toolchain go1.24.5
+toolchain go1.25.0
 
 require (
-	github.com/ClickHouse/ch-go v0.66.1
-	github.com/ClickHouse/clickhouse-go/v2 v2.37.2
+	github.com/ClickHouse/ch-go v0.67.0
+	github.com/ClickHouse/clickhouse-go/v2 v2.40.1
 	github.com/HdrHistogram/hdrhistogram-go v1.1.2
 	github.com/Shopify/sarama v1.37.2
 	github.com/apache/thrift v0.22.0
@@ -109,7 +109,7 @@ require (
 	go.uber.org/zap v1.27.0
 	golang.org/x/net v0.43.0
 	golang.org/x/sys v0.35.0
-	google.golang.org/grpc v1.74.2
+	google.golang.org/grpc v1.75.0
 	google.golang.org/protobuf v1.36.7
 	gopkg.in/yaml.v3 v3.0.1
 )
diff --git a/go.sum b/go.sum
index 907930aa..04275d55 100644
--- a/go.sum
+++ b/go.sum
@@ -23,10 +23,10 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJ
 github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/ClickHouse/ch-go v0.66.1 h1:LQHFslfVYZsISOY0dnOYOXGkOUvpv376CCm8g7W74A4=
-github.com/ClickHouse/ch-go v0.66.1/go.mod h1:NEYcg3aOFv2EmTJfo4m2WF7sHB/YFbLUuIWv9iq76xY=
-github.com/ClickHouse/clickhouse-go/v2 v2.37.2 h1:wRLNKoynvHQEN4znnVHNLaYnrqVc9sGJmGYg+GGCfto=
-github.com/ClickHouse/clickhouse-go/v2 v2.37.2/go.mod h1:pH2zrBGp5Y438DMwAxXMm1neSXPPjSI7tD4MURVULw8=
+github.com/ClickHouse/ch-go v0.67.0 h1:18MQF6vZHj+4/hTRaK7JbS/TIzn4I55wC+QzO24uiqc=
+github.com/ClickHouse/ch-go v0.67.0/go.mod h1:2MSAeyVmgt+9a2k2SQPPG1b4qbTPzdGDpf1+bcHh+18=
+github.com/ClickHouse/clickhouse-go/v2 v2.40.1 h1:PbwsHBgqXRydU7jKULD1C8CHmifczffvQqmFvltM2W4=
+github.com/ClickHouse/clickhouse-go/v2 v2.40.1/go.mod h1:GDzSBLVhladVm8V01aEB36IoBOVLLICfyeuiIp/8Ezc=
 github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU=
 github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4=
 github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
@@ -137,8 +137,8 @@ github.com/digitalocean/godo v1.152.0 h1:WRgkPMogZSXEJK70IkZKTB/PsMn16hMQ+NI3wCI
 github.com/digitalocean/godo v1.152.0/go.mod h1:tYeiWY5ZXVpU48YaFv0M5irUFHXGorZpDNm7zzdWMzM=
 github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
 github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
-github.com/docker/docker v28.2.2+incompatible h1:CjwRSksz8Yo4+RmQ339Dp/D2tGO5JxwYeqtMOEe0LDw=
-github.com/docker/docker v28.2.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI=
+github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
 github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
 github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
@@ -1110,8 +1110,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 h1:
 google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0/go.mod h1:8ytArBbtOy2xfht+y2fqKd5DRDJRUQhqbyEnQ4bDChs=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM=
 google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
-google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
+google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
+google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
diff --git a/internal/metrics/otelmetrics/factory.go b/internal/metrics/otelmetrics/factory.go
index daf061b6..420efee9 100644
--- a/internal/metrics/otelmetrics/factory.go
+++ b/internal/metrics/otelmetrics/factory.go
@@ -32,8 +32,7 @@ func NewFactory(meterProvider metric.MeterProvider) metrics.Factory {
 }
 
 func (f *otelFactory) Counter(opts metrics.Options) metrics.Counter {
-	name := CounterNamingConvention(f.subScope(opts.Name))
-	counter, err := f.meter.Int64Counter(name)
+	counter, err := f.meter.Int64Counter(f.subScope(opts.Name))
 	if err != nil {
 		log.Printf("Error creating OTEL counter: %v", err)
 		return metrics.NullCounter
@@ -131,10 +130,3 @@ func attributeSetOption(tags map[string]string) metric.MeasurementOption {
 	}
 	return metric.WithAttributes(attributes...)
 }
-
-func CounterNamingConvention(name string) string {
-	if !strings.HasSuffix(name, "_total") {
-		name += "_total"
-	}
-	return name
-}
diff --git a/internal/tools/go.mod b/internal/tools/go.mod
index efccecb7..313404b3 100644
--- a/internal/tools/go.mod
+++ b/internal/tools/go.mod
@@ -1,6 +1,6 @@
 module github.com/jaegertracing/jaeger/internal/tools
 
-go 1.24.0
+go 1.25.0
 
 require (
 	github.com/golangci/golangci-lint/v2 v2.4.0
diff --git a/scripts/build/docker/debug/Dockerfile b/scripts/build/docker/debug/Dockerfile
index 8fddc8b9..38adc95b 100644
--- a/scripts/build/docker/debug/Dockerfile
+++ b/scripts/build/docker/debug/Dockerfile
@@ -1,7 +1,7 @@
 # Copyright (c) 2024 The Jaeger Authors.
 # SPDX-License-Identifier: Apache-2.0
 
-FROM golang:1.24.5-alpine@sha256:daae04ebad0c21149979cd8e9db38f565ecefd8547cf4a591240dc1972cf1399 AS build
+FROM golang:1.25.0-alpine@sha256:f18a072054848d87a8077455f0ac8a25886f2397f88bfdd222d6fafbb5bba440 AS build
 ARG TARGETARCH
 ENV GOPATH /go
 RUN apk add --update --no-cache ca-certificates make git build-base mailcap
@@ -16,7 +16,7 @@ RUN if [[ "$TARGETARCH" == "s390x" ||  "$TARGETARCH" == "ppc64le" ]] ; then \
         cd /go/src/debug-delve && go mod download && go build -o /go/bin/dlv github.com/go-delve/delve/cmd/dlv; \
     fi 
 
-FROM golang:1.24.5-alpine@sha256:daae04ebad0c21149979cd8e9db38f565ecefd8547cf4a591240dc1972cf1399
+FROM golang:1.25.0-alpine@sha256:f18a072054848d87a8077455f0ac8a25886f2397f88bfdd222d6fafbb5bba440
 COPY --from=build /go/bin/dlv /go/bin/dlv
 COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
 COPY --from=build /etc/mime.types /etc/mime.types
diff --git a/scripts/build/docker/debug/go.mod b/scripts/build/docker/debug/go.mod
index 800cb1b1..4ab0c601 100644
--- a/scripts/build/docker/debug/go.mod
+++ b/scripts/build/docker/debug/go.mod
@@ -1,6 +1,6 @@
 module debug-delve
 
-go 1.24.0
+go 1.25.0
 
 require github.com/go-delve/delve v1.25.1
 



Test patch:
diff --git a/internal/metrics/otelmetrics/factory_test.go b/internal/metrics/otelmetrics/factory_test.go
index a139b7e6..1e887481 100644
--- a/internal/metrics/otelmetrics/factory_test.go
+++ b/internal/metrics/otelmetrics/factory_test.go
@@ -27,7 +27,6 @@ func newTestFactory(t *testing.T, registry *promReg.Registry) metrics.Factory {
 	exporter, err := prometheus.New(
 		prometheus.WithRegisterer(registry),
 		prometheus.WithoutScopeInfo(),
-		prometheus.WithoutCounterSuffixes(),
 	)
 	require.NoError(t, err)
 	meterProvider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(exporter))
@@ -40,6 +39,7 @@ func findMetric(t *testing.T, registry *promReg.Registry, name string) *promMode
 
 	for _, mf := range metricFamilies {
 		t.Log(mf.GetName())
+		t.Log(name)
 		if mf.GetName() == name {
 			return mf
 		}
@@ -108,17 +108,6 @@ func TestCounter(t *testing.T) {
 	assert.Equal(t, expectedLabels, promLabelsToMap(metricData[0].GetLabel()))
 }
 
-func TestCounterNamingConvention(t *testing.T) {
-	input := "test_counter"
-	expected := "test_counter_total"
-
-	result := otelmetrics.CounterNamingConvention(input)
-
-	if result != expected {
-		t.Errorf("Expected %s, but got %s", expected, result)
-	}
-}
-
 func TestGauge(t *testing.T) {
 	registry := promReg.NewPedanticRegistry()
 	factory := newTestFactory(t, registry)