diff --git a/.github/workflows/auto-update-otel-sdk.yml b/.github/workflows/auto-update-otel-sdk.yml index 73ad15101c5c..dd93624bd0c2 100644 --- a/.github/workflows/auto-update-otel-sdk.yml +++ b/.github/workflows/auto-update-otel-sdk.yml @@ -14,7 +14,7 @@ jobs: latest-version: ${{ steps.check-versions.outputs.latest-version }} already-opened: ${{ steps.check-versions.outputs.already-opened }} steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - id: check-versions name: Check versions @@ -52,7 +52,7 @@ jobs: needs: - check-versions steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Update version env: @@ -66,7 +66,7 @@ jobs: run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 174610a2164b..e1828cf17020 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -21,7 +21,7 @@ jobs: exit 1 fi - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: # history is needed to run git cherry-pick below fetch-depth: 0 diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 86292048ae94..2793f7dd6010 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -26,13 +26,13 @@ jobs: spotless: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -52,20 +52,20 @@ jobs: gradle-wrapper-validation: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: gradle/actions/wrapper-validation@d156388eb19639ec20ade50009f3d199ce1e2808 # v4.1.0 license-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -105,7 +105,7 @@ jobs: extra-dependency-management-enforcement: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Dependency check run: | @@ -128,13 +128,13 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -211,34 +211,34 @@ jobs: - vm: ${{ inputs.skip-openj9-tests && 'openj9' || '' }} fail-fast: false steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - id: setup-test-java name: Set up JDK ${{ matrix.test-java-version }}-${{ matrix.vm }} for running tests - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: # using zulu because new releases get published quickly distribution: ${{ matrix.vm == 'hotspot' && 'zulu' || 'adopt-openj9'}} java-version: ${{ matrix.test-java-version }} - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version # vaadin 14 tests fail with node 18 - name: Set up Node - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: node-version: 16 # vaadin tests use pnpm - name: Cache pnpm modules - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: ~/.pnpm-store key: ${{ runner.os }}-test-cache-pnpm-modules @@ -334,13 +334,13 @@ jobs: run: git config --system core.longpaths true if: matrix.os == 'windows-latest' - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -387,13 +387,13 @@ jobs: gradle-plugins: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -410,13 +410,13 @@ jobs: examples: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3579ed40ef07..2cfab3a80ffb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,13 +61,13 @@ jobs: # skipping release branches because the versions in those branches are not snapshots if: github.ref_name == 'main' && github.repository == 'open-telemetry/opentelemetry-java-instrumentation' steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/codeql-daily.yml b/.github/workflows/codeql-daily.yml index 1a927041e177..80c753de2267 100644 --- a/.github/workflows/codeql-daily.yml +++ b/.github/workflows/codeql-daily.yml @@ -18,19 +18,19 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up Java 17 - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version - name: Initialize CodeQL - uses: github/codeql-action/init@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 + uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 with: languages: java # using "latest" helps to keep up with the latest Kotlin support @@ -45,7 +45,7 @@ jobs: run: ./gradlew assemble -x javadoc --no-build-cache --no-daemon - name: Perform CodeQL analysis - uses: github/codeql-action/analyze@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 + uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 workflow-notification: needs: diff --git a/.github/workflows/issue-management-feedback-label.yml b/.github/workflows/issue-management-feedback-label.yml index 8d3f809e2292..00d849d2f1ee 100644 --- a/.github/workflows/issue-management-feedback-label.yml +++ b/.github/workflows/issue-management-feedback-label.yml @@ -11,7 +11,7 @@ jobs: github.event.comment.user.login == github.event.issue.user.login runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Remove labels env: diff --git a/.github/workflows/overhead-benchmark-daily.yml b/.github/workflows/overhead-benchmark-daily.yml index 464349ed0d81..7805ff719af8 100644 --- a/.github/workflows/overhead-benchmark-daily.yml +++ b/.github/workflows/overhead-benchmark-daily.yml @@ -9,9 +9,9 @@ jobs: run-overhead-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: gh-pages path: gh-pages diff --git a/.github/workflows/owasp-dependency-check-daily.yml b/.github/workflows/owasp-dependency-check-daily.yml index 35345e015be2..bcc7a41de283 100644 --- a/.github/workflows/owasp-dependency-check-daily.yml +++ b/.github/workflows/owasp-dependency-check-daily.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/pr-smoke-test-early-jdk8-images.yml b/.github/workflows/pr-smoke-test-early-jdk8-images.yml index 59591d9ef50d..4447b58cbd2d 100644 --- a/.github/workflows/pr-smoke-test-early-jdk8-images.yml +++ b/.github/workflows/pr-smoke-test-early-jdk8-images.yml @@ -13,13 +13,13 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/pr-smoke-test-fake-backend-images.yml b/.github/workflows/pr-smoke-test-fake-backend-images.yml index fe55a210b349..877e69842c9f 100644 --- a/.github/workflows/pr-smoke-test-fake-backend-images.yml +++ b/.github/workflows/pr-smoke-test-fake-backend-images.yml @@ -13,13 +13,13 @@ jobs: buildLinux: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -43,10 +43,10 @@ jobs: - name: Support long paths run: git config --system core.longpaths true - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/pr-smoke-test-quarkus-images.yml b/.github/workflows/pr-smoke-test-quarkus-images.yml index b61064fb00e2..e36da5ecd82b 100644 --- a/.github/workflows/pr-smoke-test-quarkus-images.yml +++ b/.github/workflows/pr-smoke-test-quarkus-images.yml @@ -15,5 +15,6 @@ jobs: with: project: ":smoke-tests:images:quarkus" cache-read-only: true - # Quarkus 2.0+ does not support Java 8 + # Quarkus 3.7+ requires Java 17+ skip-java-8: true + skip-java-11: true diff --git a/.github/workflows/pr-smoke-test-servlet-images.yml b/.github/workflows/pr-smoke-test-servlet-images.yml index 69a66bb99195..8da3f88d1cfa 100644 --- a/.github/workflows/pr-smoke-test-servlet-images.yml +++ b/.github/workflows/pr-smoke-test-servlet-images.yml @@ -31,13 +31,13 @@ jobs: run: git config --system core.longpaths true if: matrix.os == 'windows-latest' - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/prepare-patch-release.yml b/.github/workflows/prepare-patch-release.yml index 436f257e23c7..8b8f7c182e9b 100644 --- a/.github/workflows/prepare-patch-release.yml +++ b/.github/workflows/prepare-patch-release.yml @@ -6,7 +6,7 @@ jobs: prepare-patch-release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - run: | if [[ ! $GITHUB_REF_NAME =~ ^release/v[0-9]+\.[0-9]+\.x$ ]]; then diff --git a/.github/workflows/prepare-release-branch.yml b/.github/workflows/prepare-release-branch.yml index 44904db30bbb..615ad5c3f4e3 100644 --- a/.github/workflows/prepare-release-branch.yml +++ b/.github/workflows/prepare-release-branch.yml @@ -6,7 +6,7 @@ jobs: prereqs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Verify prerequisites run: | @@ -25,7 +25,7 @@ jobs: needs: - prereqs steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Create release branch run: | @@ -78,7 +78,7 @@ jobs: needs: - prereqs steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set environment variables run: | diff --git a/.github/workflows/publish-petclinic-benchmark-image.yml b/.github/workflows/publish-petclinic-benchmark-image.yml index 220f188f1fa9..9e4ba43fc9e3 100644 --- a/.github/workflows/publish-petclinic-benchmark-image.yml +++ b/.github/workflows/publish-petclinic-benchmark-image.yml @@ -14,7 +14,7 @@ jobs: packages: write contents: read steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 diff --git a/.github/workflows/publish-smoke-test-early-jdk8-images.yml b/.github/workflows/publish-smoke-test-early-jdk8-images.yml index e65543b86f9e..d62f1be93580 100644 --- a/.github/workflows/publish-smoke-test-early-jdk8-images.yml +++ b/.github/workflows/publish-smoke-test-early-jdk8-images.yml @@ -13,13 +13,13 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/publish-smoke-test-fake-backend-images.yml b/.github/workflows/publish-smoke-test-fake-backend-images.yml index 4143515fcebe..302aa1e0f39d 100644 --- a/.github/workflows/publish-smoke-test-fake-backend-images.yml +++ b/.github/workflows/publish-smoke-test-fake-backend-images.yml @@ -13,13 +13,13 @@ jobs: publishLinux: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -49,10 +49,10 @@ jobs: - name: Support long paths run: git config --system core.longpaths true - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/publish-smoke-test-quarkus-images.yml b/.github/workflows/publish-smoke-test-quarkus-images.yml index 0334e136a3d4..f6f2c6eac4b1 100644 --- a/.github/workflows/publish-smoke-test-quarkus-images.yml +++ b/.github/workflows/publish-smoke-test-quarkus-images.yml @@ -15,8 +15,9 @@ jobs: with: project: ":smoke-tests:images:quarkus" publish: true - # Quarkus 2.0+ does not support Java 8 + # Quarkus 3.7+ requires Java 17+ skip-java-8: true + skip-java-11: true workflow-notification: needs: diff --git a/.github/workflows/publish-smoke-test-servlet-images.yml b/.github/workflows/publish-smoke-test-servlet-images.yml index e33e60942324..6f7caaee85c5 100644 --- a/.github/workflows/publish-smoke-test-servlet-images.yml +++ b/.github/workflows/publish-smoke-test-servlet-images.yml @@ -47,14 +47,14 @@ jobs: run: git config --system core.longpaths true if: matrix.os == 'windows-latest' - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space if: matrix.os != 'windows-latest' run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/release-update-cloudfoundry-index.yml b/.github/workflows/release-update-cloudfoundry-index.yml index cfa1e347e347..f3c108f0f693 100644 --- a/.github/workflows/release-update-cloudfoundry-index.yml +++ b/.github/workflows/release-update-cloudfoundry-index.yml @@ -17,12 +17,12 @@ jobs: update-cloudfoundry-index-yml: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Use CLA approved github bot run: .github/scripts/use-cla-approved-github-bot.sh - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: 'cloudfoundry' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cd32512034c6..2b112aa68513 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,7 +29,7 @@ jobs: exit 1 fi - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set environment variables run: | @@ -58,7 +58,7 @@ jobs: # check out main branch to verify there won't be problems with merging the change log # at the end of this workflow - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: main @@ -73,7 +73,7 @@ jobs: fi # back to the release branch - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: # tags are needed for the generate-release-contributors.sh script fetch-depth: 0 @@ -81,7 +81,7 @@ jobs: - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + - uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -185,7 +185,7 @@ jobs: needs: - release steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Copy change log section from release branch env: @@ -194,7 +194,7 @@ jobs: sed -n "0,/^## Version $VERSION /d;/^## Version /q;p" CHANGELOG.md \ > /tmp/changelog-section.md - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: main @@ -241,7 +241,7 @@ jobs: needs: - release steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: ref: main diff --git a/.github/workflows/reusable-markdown-link-check.yml b/.github/workflows/reusable-markdown-link-check.yml index 542457896c70..edc997bf55e6 100644 --- a/.github/workflows/reusable-markdown-link-check.yml +++ b/.github/workflows/reusable-markdown-link-check.yml @@ -10,7 +10,7 @@ jobs: markdown-link-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install markdown-link-check # https://github.com/tcort/markdown-link-check/issues/297 diff --git a/.github/workflows/reusable-markdown-lint-check.yml b/.github/workflows/reusable-markdown-lint-check.yml index f99a623ddc75..eeb9f91ef1e2 100644 --- a/.github/workflows/reusable-markdown-lint-check.yml +++ b/.github/workflows/reusable-markdown-lint-check.yml @@ -10,7 +10,7 @@ jobs: markdown-lint-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install mardkdownlint run: npm install -g markdownlint-cli diff --git a/.github/workflows/reusable-misspell-check.yml b/.github/workflows/reusable-misspell-check.yml index 5a75c620276e..d34945bc0a04 100644 --- a/.github/workflows/reusable-misspell-check.yml +++ b/.github/workflows/reusable-misspell-check.yml @@ -10,7 +10,7 @@ jobs: misspell-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install misspell run: | diff --git a/.github/workflows/reusable-muzzle.yml b/.github/workflows/reusable-muzzle.yml index 5a592e88a84d..a8138bd6d7b0 100644 --- a/.github/workflows/reusable-muzzle.yml +++ b/.github/workflows/reusable-muzzle.yml @@ -22,13 +22,13 @@ jobs: - ":instrumentation:muzzle4" fail-fast: false steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version diff --git a/.github/workflows/reusable-native-tests.yml b/.github/workflows/reusable-native-tests.yml index 4502548c4d47..afdf1957bb2a 100644 --- a/.github/workflows/reusable-native-tests.yml +++ b/.github/workflows/reusable-native-tests.yml @@ -15,7 +15,7 @@ jobs: if: "!inputs.skip-native-tests" runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - id: read-java run: echo "version=$(cat .java-version)" >> "$GITHUB_OUTPUT" - uses: graalvm/setup-graalvm@6f327093bb6a42fe5eac053d21b168c46aa46f22 # v1.2.4.1 diff --git a/.github/workflows/reusable-shell-script-check.yml b/.github/workflows/reusable-shell-script-check.yml index 074e7aabca82..4e5f51e0fe35 100644 --- a/.github/workflows/reusable-shell-script-check.yml +++ b/.github/workflows/reusable-shell-script-check.yml @@ -10,7 +10,7 @@ jobs: shell-script-check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install shell check run: wget -qO- "https://github.com/koalaman/shellcheck/releases/download/stable/shellcheck-stable.linux.x86_64.tar.xz" | tar -xJv diff --git a/.github/workflows/reusable-smoke-test-images.yml b/.github/workflows/reusable-smoke-test-images.yml index 2006dc6fcae5..8f3857460494 100644 --- a/.github/workflows/reusable-smoke-test-images.yml +++ b/.github/workflows/reusable-smoke-test-images.yml @@ -22,6 +22,9 @@ on: skip-java-8: type: boolean required: false + skip-java-11: + type: boolean + required: false skip-java-17: type: boolean required: false @@ -38,13 +41,13 @@ jobs: permissions: packages: write # for publishing docker image to github packages steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -70,6 +73,7 @@ jobs: run: ./gradlew ${{ inputs.project }}:${{ inputs.publish && 'jib' || 'jibDockerBuild' }} -Ptag=${{ env.TAG }} -PtargetJDK=8 -Djib.httpTimeout=120000 -Djib.console=plain - name: Build Java 11 Docker image + if: "!inputs.skip-java-11" run: ./gradlew ${{ inputs.project }}:${{ inputs.publish && 'jib' || 'jibDockerBuild' }} -Ptag=${{ env.TAG }} -PtargetJDK=11 -Djib.httpTimeout=120000 -Djib.console=plain - name: Build Java 17 Docker image diff --git a/.github/workflows/reusable-test-indy.yml b/.github/workflows/reusable-test-indy.yml index ee34c7648bef..e0010814c8fe 100644 --- a/.github/workflows/reusable-test-indy.yml +++ b/.github/workflows/reusable-test-indy.yml @@ -29,13 +29,13 @@ jobs: - 3 fail-fast: false steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -46,13 +46,13 @@ jobs: # vaadin 14 tests fail with node 18 - name: Set up Node - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 with: node-version: 16 # vaadin tests use pnpm - name: Cache pnpm modules - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: ~/.pnpm-store key: ${{ runner.os }}-test-latest-cache-pnpm-modules diff --git a/.github/workflows/reusable-test-latest-deps.yml b/.github/workflows/reusable-test-latest-deps.yml index 56bb77a0b6e8..c24c79f56e90 100644 --- a/.github/workflows/reusable-test-latest-deps.yml +++ b/.github/workflows/reusable-test-latest-deps.yml @@ -29,13 +29,13 @@ jobs: - 3 fail-fast: false steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Free disk space run: .github/scripts/gha-free-disk-space.sh - name: Set up JDK for running Gradle - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4.4.0 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4.5.0 with: distribution: temurin java-version-file: .java-version @@ -46,7 +46,7 @@ jobs: # vaadin tests use pnpm - name: Cache pnpm modules - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: ~/.pnpm-store key: ${{ runner.os }}-test-latest-cache-pnpm-modules diff --git a/.github/workflows/reusable-workflow-notification.yml b/.github/workflows/reusable-workflow-notification.yml index 892cbfd8778b..f337f8d15269 100644 --- a/.github/workflows/reusable-workflow-notification.yml +++ b/.github/workflows/reusable-workflow-notification.yml @@ -13,7 +13,7 @@ jobs: workflow-notification: runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Open issue or add comment if issue already open env: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 2395d1ed5cf1..bf6161762dfa 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false @@ -64,6 +64,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 + uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 with: sarif_file: results.sarif diff --git a/CHANGELOG.md b/CHANGELOG.md index d34915588364..92e019ebd390 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- Update azure-core-tracing-opentelemetry version and improve HTTP suppression to back off + when Azure SDK tracing was disabled. + ([#12489](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12489)) + ## Version 2.9.0 (2024-10-17) ### 📈 Enhancements diff --git a/benchmark-overhead-jmh/build.gradle.kts b/benchmark-overhead-jmh/build.gradle.kts index 43b99ad974e6..80f2ccad9f43 100644 --- a/benchmark-overhead-jmh/build.gradle.kts +++ b/benchmark-overhead-jmh/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } dependencies { - jmhImplementation("org.springframework.boot:spring-boot-starter-web:3.3.4") + jmhImplementation("org.springframework.boot:spring-boot-starter-web:3.3.5") } tasks { diff --git a/conventions/build.gradle.kts b/conventions/build.gradle.kts index 437d38177fde..4db87e42c9c4 100644 --- a/conventions/build.gradle.kts +++ b/conventions/build.gradle.kts @@ -57,10 +57,10 @@ dependencies { implementation("com.diffplug.spotless:spotless-plugin-gradle:6.25.0") implementation("com.google.guava:guava:33.3.1-jre") implementation("gradle.plugin.com.google.protobuf:protobuf-gradle-plugin:0.8.18") - implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.3") + implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.4") implementation("org.apache.httpcomponents:httpclient:4.5.14") implementation("com.gradle.develocity:com.gradle.develocity.gradle.plugin:3.18.1") - implementation("org.owasp:dependency-check-gradle:11.0.0") + implementation("org.owasp:dependency-check-gradle:11.1.0") implementation("ru.vyarus:gradle-animalsniffer-plugin:1.7.1") implementation("org.spdx:spdx-gradle-plugin:0.8.0") // When updating, also update dependencyManagement/build.gradle.kts diff --git a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts index 6ca5aadc8e85..fd9591490727 100644 --- a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts @@ -434,7 +434,7 @@ codenarc { checkstyle { configFile = rootProject.file("buildscripts/checkstyle.xml") // this version should match the version of google_checks.xml used as basis for above configuration - toolVersion = "10.18.2" + toolVersion = "10.19.0" maxWarnings = 0 } diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index fdd5c48f86d4..810cba39831f 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -27,7 +27,7 @@ val groovyVersion = "4.0.23" // configurations.testRuntimeClasspath.resolutionStrategy.force "com.google.guava:guava:19.0" val DEPENDENCY_BOMS = listOf( - "com.fasterxml.jackson:jackson-bom:2.18.0", + "com.fasterxml.jackson:jackson-bom:2.18.1", "com.squareup.okio:okio-bom:3.9.1", // see https://github.com/open-telemetry/opentelemetry-java/issues/5637 "com.google.guava:guava-bom:33.3.1-jre", "org.apache.groovy:groovy-bom:${groovyVersion}", @@ -40,13 +40,13 @@ val DEPENDENCY_BOMS = listOf( val autoServiceVersion = "1.1.1" val autoValueVersion = "1.11.0" -val errorProneVersion = "2.34.0" +val errorProneVersion = "2.35.1" val byteBuddyVersion = "1.15.7" val asmVersion = "9.7.1" val jmhVersion = "1.37" val mockitoVersion = "4.11.0" val slf4jVersion = "2.0.16" -val semConvVersion = "1.25.0-alpha" +val semConvVersion = "1.28.0-alpha" val CORE_DEPENDENCIES = listOf( "io.opentelemetry.semconv:opentelemetry-semconv:${semConvVersion}", @@ -87,7 +87,7 @@ val DEPENDENCIES = listOf( "com.github.stefanbirkner:system-lambda:1.2.1", "com.github.stefanbirkner:system-rules:1.19.0", "uk.org.webcompere:system-stubs-jupiter:2.0.3", - "com.uber.nullaway:nullaway:0.12.0", + "com.uber.nullaway:nullaway:0.12.1", "commons-beanutils:commons-beanutils:1.9.4", "commons-cli:commons-cli:1.9.0", "commons-codec:commons-codec:1.17.1", diff --git a/examples/distro/build.gradle b/examples/distro/build.gradle index 9f343d69f1df..a632a143cc3f 100644 --- a/examples/distro/build.gradle +++ b/examples/distro/build.gradle @@ -13,7 +13,7 @@ buildscript { } dependencies { classpath "com.diffplug.spotless:spotless-plugin-gradle:6.25.0" - classpath "com.gradleup.shadow:shadow-gradle-plugin:8.3.3" + classpath "com.gradleup.shadow:shadow-gradle-plugin:8.3.4" classpath "io.opentelemetry.instrumentation:gradle-plugins:2.10.0-alpha-SNAPSHOT" } } diff --git a/examples/distro/smoke-tests/build.gradle b/examples/distro/smoke-tests/build.gradle index 61b112268c29..3ded281cc290 100644 --- a/examples/distro/smoke-tests/build.gradle +++ b/examples/distro/smoke-tests/build.gradle @@ -4,13 +4,13 @@ plugins { dependencies { testImplementation("org.testcontainers:testcontainers:1.20.3") - testImplementation("com.fasterxml.jackson.core:jackson-databind:2.18.0") - testImplementation("com.google.protobuf:protobuf-java-util:3.25.5") + testImplementation("com.fasterxml.jackson.core:jackson-databind:2.18.1") + testImplementation("com.google.protobuf:protobuf-java-util:4.28.3") testImplementation("com.squareup.okhttp3:okhttp:4.12.0") testImplementation("io.opentelemetry.proto:opentelemetry-proto:1.3.2-alpha") testImplementation("io.opentelemetry:opentelemetry-api") - testImplementation("ch.qos.logback:logback-classic:1.5.11") + testImplementation("ch.qos.logback:logback-classic:1.5.12") } tasks.test { diff --git a/examples/extension/build.gradle b/examples/extension/build.gradle index 4ae471455c3d..fb91c10a37d2 100644 --- a/examples/extension/build.gradle +++ b/examples/extension/build.gradle @@ -10,7 +10,7 @@ plugins { into a single jar. See https://imperceptiblethoughts.com/shadow/ for more details about Shadow plugin. */ - id "com.gradleup.shadow" version "8.3.3" + id "com.gradleup.shadow" version "8.3.4" id "com.diffplug.spotless" version "6.25.0" id "io.opentelemetry.instrumentation.muzzle-generation" version "2.10.0-alpha-SNAPSHOT" @@ -100,15 +100,15 @@ dependencies { //All dependencies below are only for tests testImplementation("org.testcontainers:testcontainers:1.20.3") - testImplementation("com.fasterxml.jackson.core:jackson-databind:2.18.0") - testImplementation("com.google.protobuf:protobuf-java-util:3.25.5") + testImplementation("com.fasterxml.jackson.core:jackson-databind:2.18.1") + testImplementation("com.google.protobuf:protobuf-java-util:4.28.3") testImplementation("com.squareup.okhttp3:okhttp:4.12.0") testImplementation("io.opentelemetry:opentelemetry-api") testImplementation("io.opentelemetry.proto:opentelemetry-proto:1.3.2-alpha") testImplementation("org.junit.jupiter:junit-jupiter-api:${versions.junit}") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${versions.junit}") - testRuntimeOnly("ch.qos.logback:logback-classic:1.5.11") + testRuntimeOnly("ch.qos.logback:logback-classic:1.5.12") //Otel Java instrumentation that we use and extend during integration tests otel("io.opentelemetry.javaagent:opentelemetry-javaagent:${versions.opentelemetryJavaagent}") diff --git a/gradle-plugins/build.gradle.kts b/gradle-plugins/build.gradle.kts index 64ac86d2c4ab..b638acd678d4 100644 --- a/gradle-plugins/build.gradle.kts +++ b/gradle-plugins/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { implementation("org.eclipse.aether:aether-transport-http:${aetherVersion}") implementation("org.apache.maven:maven-aether-provider:3.3.9") - implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.3") + implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.4") testImplementation("org.assertj:assertj-core:3.26.3") @@ -56,13 +56,13 @@ tasks { withType().configureEach { with(options) { - release.set(8) + release.set(11) } } withType(KotlinCompile::class).configureEach { kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "11" } } } diff --git a/instrumentation-api-incubator/build.gradle.kts b/instrumentation-api-incubator/build.gradle.kts index 00d887da1b25..81c90c90748d 100644 --- a/instrumentation-api-incubator/build.gradle.kts +++ b/instrumentation-api-incubator/build.gradle.kts @@ -40,4 +40,17 @@ tasks { sourcesJar { dependsOn("generateJflex") } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + val testBothSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database/dup") + } + + check { + dependsOn(testStableSemconv) + dependsOn(testBothSemconv) + } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java index 09c8fbc72570..279f3171d192 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; /** * Extractor of // copied from DbIncubatingAttributes private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); + private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); + private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); + private static final AttributeKey DB_OPERATION_NAME = + AttributeKey.stringKey("db.operation.name"); /** Creates the database client attributes extractor with default configuration. */ public static AttributesExtractor create( @@ -42,7 +47,13 @@ public static AttributesExtractor create( public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { super.onStart(attributes, parentContext, request); - internalSet(attributes, DB_STATEMENT, getter.getStatement(request)); - internalSet(attributes, DB_OPERATION, getter.getOperation(request)); + if (SemconvStability.emitStableDatabaseSemconv()) { + internalSet(attributes, DB_QUERY_TEXT, getter.getDbQueryText(request)); + internalSet(attributes, DB_OPERATION_NAME, getter.getDbOperationName(request)); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + internalSet(attributes, DB_STATEMENT, getter.getDbQueryText(request)); + internalSet(attributes, DB_OPERATION, getter.getDbOperationName(request)); + } } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java index 0d924b3dcfbf..ddf9f8f07a1a 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java @@ -20,9 +20,33 @@ */ public interface DbClientAttributesGetter extends DbClientCommonAttributesGetter { + /** + * @deprecated Use {@link #getDbQueryText(REQUEST)} instead. + */ + @Deprecated @Nullable - String getStatement(REQUEST request); + default String getStatement(REQUEST request) { + return null; + } + // TODO: make this required to implement @Nullable - String getOperation(REQUEST request); + default String getDbQueryText(REQUEST request) { + return getStatement(request); + } + + /** + * @deprecated Use {@link #getDbOperationName(REQUEST)} instead. + */ + @Deprecated + @Nullable + default String getOperation(REQUEST request) { + return null; + } + + // TODO: make this required to implement + @Nullable + default String getDbOperationName(REQUEST request) { + return getOperation(request); + } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java index e3a6614c7660..9cbf4fb97895 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; import javax.annotation.Nullable; @@ -21,6 +22,7 @@ abstract class DbClientCommonAttributesExtractor< // copied from DbIncubatingAttributes private static final AttributeKey DB_NAME = AttributeKey.stringKey("db.name"); + private static final AttributeKey DB_NAMESPACE = AttributeKey.stringKey("db.namespace"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); private static final AttributeKey DB_CONNECTION_STRING = @@ -32,12 +34,18 @@ abstract class DbClientCommonAttributesExtractor< this.getter = getter; } + @SuppressWarnings("deprecation") // until old db semconv are dropped @Override public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { - internalSet(attributes, DB_SYSTEM, getter.getSystem(request)); - internalSet(attributes, DB_USER, getter.getUser(request)); - internalSet(attributes, DB_NAME, getter.getName(request)); - internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request)); + internalSet(attributes, DB_SYSTEM, getter.getDbSystem(request)); + if (SemconvStability.emitStableDatabaseSemconv()) { + internalSet(attributes, DB_NAMESPACE, getter.getDbNamespace(request)); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + internalSet(attributes, DB_USER, getter.getUser(request)); + internalSet(attributes, DB_NAME, getter.getDbNamespace(request)); + internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request)); + } } @Override diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java index 430be029cb0c..bc9a335f4e76 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java @@ -10,15 +10,38 @@ /** An interface for getting attributes common to database clients. */ public interface DbClientCommonAttributesGetter { + @Deprecated @Nullable - String getSystem(REQUEST request); + default String getSystem(REQUEST request) { + return null; + } + // TODO: make this required to implement + @Nullable + default String getDbSystem(REQUEST request) { + return getSystem(request); + } + + @Deprecated @Nullable String getUser(REQUEST request); + /** + * @deprecated Use {@link #getDbNamespace(Object)} instead. + */ + @Deprecated + @Nullable + default String getName(REQUEST request) { + return null; + } + + // TODO: make this required to implement @Nullable - String getName(REQUEST request); + default String getDbNamespace(REQUEST request) { + return getName(request); + } + @Deprecated @Nullable String getConnectionString(REQUEST request); } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java index 534db4a2a49e..58eb91b08b09 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java @@ -13,8 +13,9 @@ public abstract class DbClientSpanNameExtractor implements SpanNameExtr * Returns a {@link SpanNameExtractor} that constructs the span name according to DB semantic * conventions: {@code }. * - * @see DbClientAttributesGetter#getOperation(Object) used to extract {@code }. - * @see DbClientAttributesGetter#getName(Object) used to extract {@code }. + * @see DbClientAttributesGetter#getDbOperationName(Object) used to extract {@code + * }. + * @see DbClientAttributesGetter#getDbNamespace(Object) used to extract {@code }. */ public static SpanNameExtractor create( DbClientAttributesGetter getter) { @@ -26,7 +27,7 @@ public static SpanNameExtractor create( * conventions: {@code .}. * * @see SqlStatementInfo#getOperation() used to extract {@code }. - * @see DbClientAttributesGetter#getName(Object) used to extract {@code }. + * @see DbClientAttributesGetter#getDbNamespace(Object) used to extract {@code }. * @see SqlStatementInfo#getMainIdentifier() used to extract {@code } or stored * procedure name. */ @@ -72,9 +73,9 @@ private GenericDbClientSpanNameExtractor(DbClientAttributesGetter gette @Override public String extract(REQUEST request) { - String dbName = getter.getName(request); - String operation = getter.getOperation(request); - return computeSpanName(dbName, operation, null); + String namespace = getter.getDbNamespace(request); + String operationName = getter.getDbOperationName(request); + return computeSpanName(namespace, operationName, null); } } @@ -92,10 +93,10 @@ private SqlClientSpanNameExtractor(SqlClientAttributesGetter getter) { @Override public String extract(REQUEST request) { - String dbName = getter.getName(request); - SqlStatementInfo sanitizedStatement = sanitizer.sanitize(getter.getRawStatement(request)); + String namespace = getter.getDbNamespace(request); + SqlStatementInfo sanitizedStatement = sanitizer.sanitize(getter.getRawQueryText(request)); return computeSpanName( - dbName, sanitizedStatement.getOperation(), sanitizedStatement.getMainIdentifier()); + namespace, sanitizedStatement.getOperation(), sanitizedStatement.getMainIdentifier()); } } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java index eacf266333bc..fc5f29efe81b 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; /** * Extractor of It sets the same set of attributes as {@link DbClientAttributesExtractor} plus an additional * db.sql.table attribute. The raw SQL statements returned by the {@link - * SqlClientAttributesGetter#getRawStatement(Object)} method are sanitized before use, all statement + * SqlClientAttributesGetter#getRawQueryText(Object)} method are sanitized before use, all statement * parameters are removed. */ public final class SqlClientAttributesExtractor @@ -28,7 +29,12 @@ public final class SqlClientAttributesExtractor // copied from DbIncubatingAttributes private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); + private static final AttributeKey DB_OPERATION_NAME = + AttributeKey.stringKey("db.operation.name"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); + private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); + private static final AttributeKey DB_COLLECTION_NAME = + AttributeKey.stringKey("db.collection.name"); /** Creates the SQL client attributes extractor with default configuration. */ public static AttributesExtractor create( @@ -49,15 +55,15 @@ public static SqlClientAttributesExtractorBuilder dbTableAttribute; + private final AttributeKey oldSemconvTableAttribute; private final boolean statementSanitizationEnabled; SqlClientAttributesExtractor( SqlClientAttributesGetter getter, - AttributeKey dbTableAttribute, + AttributeKey oldSemconvTableAttribute, boolean statementSanitizationEnabled) { super(getter); - this.dbTableAttribute = dbTableAttribute; + this.oldSemconvTableAttribute = oldSemconvTableAttribute; this.statementSanitizationEnabled = statementSanitizationEnabled; } @@ -65,16 +71,30 @@ public static SqlClientAttributesExtractorBuilder { private static final AttributeKey DB_SQL_TABLE = AttributeKey.stringKey("db.sql.table"); final SqlClientAttributesGetter getter; - AttributeKey dbTableAttribute = DB_SQL_TABLE; + AttributeKey oldSemconvTableAttribute = DB_SQL_TABLE; boolean statementSanitizationEnabled = true; SqlClientAttributesExtractorBuilder(SqlClientAttributesGetter getter) { @@ -26,17 +26,13 @@ public final class SqlClientAttributesExtractorBuilder { } /** - * Configures the extractor to set the table value extracted by the {@link - * SqlClientAttributesExtractor} under the {@code dbTableAttribute} key. By default, the - * db.sql.table attribute is used. - * - * @param dbTableAttribute The {@link AttributeKey} under which the table extracted by the {@link - * SqlClientAttributesExtractor} will be stored. + * @deprecated not needed anymore since the new semantic conventions always use db.collection.name */ @CanIgnoreReturnValue + @Deprecated public SqlClientAttributesExtractorBuilder setTableAttribute( - AttributeKey dbTableAttribute) { - this.dbTableAttribute = requireNonNull(dbTableAttribute); + AttributeKey oldSemconvTableAttribute) { + this.oldSemconvTableAttribute = requireNonNull(oldSemconvTableAttribute); return this; } @@ -58,6 +54,6 @@ public SqlClientAttributesExtractorBuilder setStatementSaniti */ public AttributesExtractor build() { return new SqlClientAttributesExtractor<>( - getter, dbTableAttribute, statementSanitizationEnabled); + getter, oldSemconvTableAttribute, statementSanitizationEnabled); } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java index e0a19c43df2a..d0817d63e460 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java @@ -24,7 +24,18 @@ public interface SqlClientAttributesGetter /** * Get the raw SQL statement. The value returned by this method is later sanitized by the {@link * SqlClientAttributesExtractor} before being set as span attribute. + * + * @deprecated Use {@link #getRawQueryText(Object)} instead. */ + @Deprecated @Nullable - String getRawStatement(REQUEST request); + default String getRawStatement(REQUEST request) { + return null; + } + + // TODO: make this required to implement + @Nullable + default String getRawQueryText(REQUEST request) { + return getRawStatement(request); + } } diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java index 68991d1b813a..4836a85e359c 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java @@ -8,10 +8,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static org.assertj.core.api.Assertions.entry; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.HashMap; @@ -22,32 +24,34 @@ class DbClientAttributesExtractorTest { static final class TestAttributesGetter implements DbClientAttributesGetter> { @Override - public String getSystem(Map map) { + public String getDbSystem(Map map) { return map.get("db.system"); } + @Deprecated @Override public String getUser(Map map) { return map.get("db.user"); } @Override - public String getName(Map map) { + public String getDbNamespace(Map map) { return map.get("db.name"); } + @Deprecated @Override public String getConnectionString(Map map) { return map.get("db.connection_string"); } @Override - public String getStatement(Map map) { + public String getDbQueryText(Map map) { return map.get("db.statement"); } @Override - public String getOperation(Map map) { + public String getDbOperationName(Map map) { return map.get("db.operation"); } } @@ -77,14 +81,35 @@ void shouldExtractAllAvailableAttributes() { underTest.onEnd(endAttributes, context, request, null, null); // then - assertThat(startAttributes.build()) - .containsOnly( - entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), - entry(DbIncubatingAttributes.DB_USER, "username"), - entry(DbIncubatingAttributes.DB_NAME, "potatoes"), - entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), - entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato"), - entry(DbIncubatingAttributes.DB_OPERATION, "SELECT")); + if (SemconvStability.emitStableDatabaseSemconv() && SemconvStability.emitOldDatabaseSemconv()) { + assertThat(startAttributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), + entry(DbIncubatingAttributes.DB_USER, "username"), + entry(DbIncubatingAttributes.DB_NAME, "potatoes"), + entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + entry(AttributeKey.stringKey("db.namespace"), "potatoes"), + entry(AttributeKey.stringKey("db.query.text"), "SELECT * FROM potato"), + entry(AttributeKey.stringKey("db.operation.name"), "SELECT")); + } else if (SemconvStability.emitOldDatabaseSemconv()) { + assertThat(startAttributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), + entry(DbIncubatingAttributes.DB_USER, "username"), + entry(DbIncubatingAttributes.DB_NAME, "potatoes"), + entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT")); + } else if (SemconvStability.emitStableDatabaseSemconv()) { + assertThat(startAttributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), + entry(AttributeKey.stringKey("db.namespace"), "potatoes"), + entry(AttributeKey.stringKey("db.query.text"), "SELECT * FROM potato"), + entry(AttributeKey.stringKey("db.operation.name"), "SELECT")); + } assertThat(endAttributes.build().isEmpty()).isTrue(); } diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractorTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractorTest.java index 39698bdc1ca2..1e05cef5a37e 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractorTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractorTest.java @@ -24,8 +24,8 @@ void shouldExtractFullSpanName() { // given DbRequest dbRequest = new DbRequest(); - when(sqlAttributesGetter.getRawStatement(dbRequest)).thenReturn("SELECT * from table"); - when(sqlAttributesGetter.getName(dbRequest)).thenReturn("database"); + when(sqlAttributesGetter.getRawQueryText(dbRequest)).thenReturn("SELECT * from table"); + when(sqlAttributesGetter.getDbNamespace(dbRequest)).thenReturn("database"); SpanNameExtractor underTest = DbClientSpanNameExtractor.create(sqlAttributesGetter); @@ -41,8 +41,8 @@ void shouldSkipDbNameIfTableAlreadyHasDbNamePrefix() { // given DbRequest dbRequest = new DbRequest(); - when(sqlAttributesGetter.getRawStatement(dbRequest)).thenReturn("SELECT * from another.table"); - when(sqlAttributesGetter.getName(dbRequest)).thenReturn("database"); + when(sqlAttributesGetter.getRawQueryText(dbRequest)).thenReturn("SELECT * from another.table"); + when(sqlAttributesGetter.getDbNamespace(dbRequest)).thenReturn("database"); SpanNameExtractor underTest = DbClientSpanNameExtractor.create(sqlAttributesGetter); @@ -58,7 +58,7 @@ void shouldExtractOperationAndTable() { // given DbRequest dbRequest = new DbRequest(); - when(sqlAttributesGetter.getRawStatement(dbRequest)).thenReturn("SELECT * from table"); + when(sqlAttributesGetter.getRawQueryText(dbRequest)).thenReturn("SELECT * from table"); SpanNameExtractor underTest = DbClientSpanNameExtractor.create(sqlAttributesGetter); @@ -74,8 +74,8 @@ void shouldExtractOperationAndName() { // given DbRequest dbRequest = new DbRequest(); - when(dbAttributesGetter.getOperation(dbRequest)).thenReturn("SELECT"); - when(dbAttributesGetter.getName(dbRequest)).thenReturn("database"); + when(dbAttributesGetter.getDbOperationName(dbRequest)).thenReturn("SELECT"); + when(dbAttributesGetter.getDbNamespace(dbRequest)).thenReturn("database"); SpanNameExtractor underTest = DbClientSpanNameExtractor.create(dbAttributesGetter); @@ -91,7 +91,7 @@ void shouldExtractOperation() { // given DbRequest dbRequest = new DbRequest(); - when(dbAttributesGetter.getOperation(dbRequest)).thenReturn("SELECT"); + when(dbAttributesGetter.getDbOperationName(dbRequest)).thenReturn("SELECT"); SpanNameExtractor underTest = DbClientSpanNameExtractor.create(dbAttributesGetter); @@ -107,7 +107,7 @@ void shouldExtractDbName() { // given DbRequest dbRequest = new DbRequest(); - when(dbAttributesGetter.getName(dbRequest)).thenReturn("database"); + when(dbAttributesGetter.getDbNamespace(dbRequest)).thenReturn("database"); SpanNameExtractor underTest = DbClientSpanNameExtractor.create(dbAttributesGetter); diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java index f782a20b16ff..f0b31197a3e2 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.db; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -12,37 +13,41 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv class SqlClientAttributesExtractorTest { static final class TestAttributesGetter implements SqlClientAttributesGetter> { @Override - public String getRawStatement(Map map) { + public String getRawQueryText(Map map) { return map.get("db.statement"); } @Override - public String getSystem(Map map) { + public String getDbSystem(Map map) { return map.get("db.system"); } + @Deprecated @Override public String getUser(Map map) { return map.get("db.user"); } @Override - public String getName(Map map) { + public String getDbNamespace(Map map) { return map.get("db.name"); } + @Deprecated @Override public String getConnectionString(Map map) { return map.get("db.connection_string"); @@ -73,15 +78,39 @@ void shouldExtractAllAttributes() { underTest.onEnd(endAttributes, context, request, null, null); // then - assertThat(startAttributes.build()) - .containsOnly( - entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), - entry(DbIncubatingAttributes.DB_USER, "username"), - entry(DbIncubatingAttributes.DB_NAME, "potatoes"), - entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), - entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato WHERE id=?"), - entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - entry(DbIncubatingAttributes.DB_SQL_TABLE, "potato")); + if (SemconvStability.emitStableDatabaseSemconv() && SemconvStability.emitOldDatabaseSemconv()) { + assertThat(startAttributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), + entry(DbIncubatingAttributes.DB_USER, "username"), + entry(DbIncubatingAttributes.DB_NAME, "potatoes"), + entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato WHERE id=?"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + entry(DbIncubatingAttributes.DB_SQL_TABLE, "potato"), + entry(stringKey("db.namespace"), "potatoes"), + entry(stringKey("db.query.text"), "SELECT * FROM potato WHERE id=?"), + entry(stringKey("db.operation.name"), "SELECT"), + entry(stringKey("db.collection.name"), "potato")); + } else if (SemconvStability.emitOldDatabaseSemconv()) { + assertThat(startAttributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), + entry(DbIncubatingAttributes.DB_USER, "username"), + entry(DbIncubatingAttributes.DB_NAME, "potatoes"), + entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato WHERE id=?"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + entry(DbIncubatingAttributes.DB_SQL_TABLE, "potato")); + } else if (SemconvStability.emitStableDatabaseSemconv()) { + assertThat(startAttributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), + entry(stringKey("db.namespace"), "potatoes"), + entry(stringKey("db.query.text"), "SELECT * FROM potato WHERE id=?"), + entry(stringKey("db.operation.name"), "SELECT"), + entry(stringKey("db.collection.name"), "potato")); + } assertThat(endAttributes.build().isEmpty()).isTrue(); } @@ -102,13 +131,28 @@ void shouldNotExtractTableIfAttributeIsNotSet() { underTest.onStart(attributes, context, request); // then - assertThat(attributes.build()) - .containsOnly( - entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT *"), - entry(DbIncubatingAttributes.DB_OPERATION, "SELECT")); + if (SemconvStability.emitStableDatabaseSemconv() && SemconvStability.emitOldDatabaseSemconv()) { + assertThat(attributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT *"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + entry(stringKey("db.query.text"), "SELECT *"), + entry(stringKey("db.operation.name"), "SELECT")); + } else if (SemconvStability.emitOldDatabaseSemconv()) { + assertThat(attributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT *"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT")); + } else if (SemconvStability.emitStableDatabaseSemconv()) { + assertThat(attributes.build()) + .containsOnly( + entry(stringKey("db.query.text"), "SELECT *"), + entry(stringKey("db.operation.name"), "SELECT")); + } } @Test + @SuppressWarnings("deprecation") // to support old database semantic conventions void shouldExtractTableToSpecifiedKey() { // given Map request = new HashMap<>(); @@ -126,11 +170,28 @@ void shouldExtractTableToSpecifiedKey() { underTest.onStart(attributes, context, request); // then - assertThat(attributes.build()) - .containsOnly( - entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM table"), - entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - entry(DbIncubatingAttributes.DB_CASSANDRA_TABLE, "table")); + if (SemconvStability.emitStableDatabaseSemconv() && SemconvStability.emitOldDatabaseSemconv()) { + assertThat(attributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM table"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + entry(DbIncubatingAttributes.DB_CASSANDRA_TABLE, "table"), + entry(stringKey("db.query.text"), "SELECT * FROM table"), + entry(stringKey("db.operation.name"), "SELECT"), + entry(stringKey("db.collection.name"), "table")); + } else if (SemconvStability.emitOldDatabaseSemconv()) { + assertThat(attributes.build()) + .containsOnly( + entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM table"), + entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + entry(DbIncubatingAttributes.DB_CASSANDRA_TABLE, "table")); + } else if (SemconvStability.emitStableDatabaseSemconv()) { + assertThat(attributes.build()) + .containsOnly( + entry(stringKey("db.query.text"), "SELECT * FROM table"), + entry(stringKey("db.operation.name"), "SELECT"), + entry(stringKey("db.collection.name"), "table")); + } } @Test diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorTest.java index 395f52fdfdb7..b395fe4a053e 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractorTest.java @@ -29,6 +29,7 @@ class MessagingAttributesExtractorTest { + @SuppressWarnings("deprecation") // using deprecated semconv @ParameterizedTest @MethodSource("destinations") void shouldExtractAllAvailableAttributes( @@ -88,7 +89,7 @@ void shouldExtractAllAvailableAttributes( entry(MessagingIncubatingAttributes.MESSAGING_MESSAGE_CONVERSATION_ID, "42")); expectedEntries.add(entry(MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, 100L)); expectedEntries.add(entry(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ENVELOPE_SIZE, 120L)); - expectedEntries.add(entry(MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, "43")); + expectedEntries.add(entry(AttributeKey.stringKey("messaging.client_id"), "43")); expectedEntries.add( entry(MessagingIncubatingAttributes.MESSAGING_OPERATION, operation.operationName())); diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java index 7bf3c3670d4c..f2f199718e82 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingProducerMetricsTest.java @@ -27,6 +27,7 @@ class MessagingProducerMetricsTest { private static final double[] DURATION_BUCKETS = MessagingMetricsAdvice.DURATION_SECONDS_BUCKETS.stream().mapToDouble(d -> d).toArray(); + @SuppressWarnings("deprecation") // using deprecated semconv @Test void collectsMetrics() { InMemoryMetricReader metricReader = InMemoryMetricReader.create(); diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java new file mode 100644 index 000000000000..bbf7706c5a43 --- /dev/null +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java @@ -0,0 +1,54 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.internal; + +import static java.util.Arrays.asList; + +import java.util.HashSet; +import java.util.Set; + +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public final class SemconvStability { + + private static final boolean emitOldDatabaseSemconv; + private static final boolean emitStableDatabaseSemconv; + + static { + boolean oldDatabase = true; + boolean stableDatabase = false; + + String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in"); + if (value != null) { + Set values = new HashSet<>(asList(value.split(","))); + if (values.contains("database")) { + oldDatabase = false; + stableDatabase = true; + } + // no else -- technically it's possible to set "database,database/dup", in which case we + // should emit both sets of attributes + if (values.contains("database/dup")) { + oldDatabase = true; + stableDatabase = true; + } + } + + emitOldDatabaseSemconv = oldDatabase; + emitStableDatabaseSemconv = stableDatabase; + } + + public static boolean emitOldDatabaseSemconv() { + return emitOldDatabaseSemconv; + } + + public static boolean emitStableDatabaseSemconv() { + return emitStableDatabaseSemconv; + } + + private SemconvStability() {} +} diff --git a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java index 85ea385128cd..b33be477f625 100644 --- a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java +++ b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTest.java @@ -130,7 +130,7 @@ void testApacheDubboBase() throws ReflectiveOperationException { .hasAttributesSatisfyingExactly( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), @@ -165,7 +165,7 @@ void testApacheDubboBase() throws ReflectiveOperationException { .hasAttributesSatisfying( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), @@ -230,7 +230,7 @@ void testApacheDubboTest() .hasAttributesSatisfyingExactly( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), @@ -265,7 +265,7 @@ void testApacheDubboTest() .hasAttributesSatisfying( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), diff --git a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java index 4f90694b49f8..8eaa9368f719 100644 --- a/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java +++ b/instrumentation/apache-dubbo-2.7/testing/src/main/java/io/opentelemetry/instrumentation/apachedubbo/v2_7/AbstractDubboTraceChainTest.java @@ -173,7 +173,7 @@ void testDubboChain() throws ReflectiveOperationException { .hasAttributesSatisfyingExactly( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), @@ -208,7 +208,7 @@ void testDubboChain() throws ReflectiveOperationException { .hasAttributesSatisfying( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), @@ -233,7 +233,7 @@ void testDubboChain() throws ReflectiveOperationException { .hasAttributesSatisfyingExactly( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), @@ -268,7 +268,7 @@ void testDubboChain() throws ReflectiveOperationException { .hasAttributesSatisfying( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.HelloService"), @@ -354,7 +354,7 @@ void testDubboChainInJvm() throws ReflectiveOperationException { .hasAttributesSatisfyingExactly( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "org.apache.dubbo.rpc.service.GenericService"), @@ -389,7 +389,7 @@ void testDubboChainInJvm() throws ReflectiveOperationException { .hasAttributesSatisfying( equalTo( RpcIncubatingAttributes.RPC_SYSTEM, - RpcIncubatingAttributes.RpcSystemValues.APACHE_DUBBO), + RpcIncubatingAttributes.RpcSystemIncubatingValues.APACHE_DUBBO), equalTo( RpcIncubatingAttributes.RPC_SERVICE, "io.opentelemetry.instrumentation.apachedubbo.v2_7.api.MiddleService"), diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java index 2402365b9efa..a3dafa9893dc 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java @@ -53,6 +53,7 @@ public void sayHello( } }; + @SuppressWarnings("deprecation") // using deprecated semconv @Test void grpcInstrumentation() { GreeterGrpc.GreeterBlockingStub client = diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsEventAttributesExtractor.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsEventAttributesExtractor.java index f8aa3c80e137..a29b6a7c4ca7 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsEventAttributesExtractor.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsEventAttributesExtractor.java @@ -19,7 +19,7 @@ class SqsEventAttributesExtractor implements AttributesExtractor AttributeKey.stringKey("messaging.operation"); private static final AttributeKey MESSAGING_SYSTEM = AttributeKey.stringKey("messaging.system"); - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsMessageAttributesExtractor.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsMessageAttributesExtractor.java index ad6358c34f50..8962dfe08ffc 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsMessageAttributesExtractor.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/internal/SqsMessageAttributesExtractor.java @@ -23,7 +23,7 @@ class SqsMessageAttributesExtractor implements AttributesExtractor MESSAGING_SYSTEM = AttributeKey.stringKey("messaging.system"); - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java index de6bd8b85f5b..24b6439c24c9 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsEventWrapperTest.java @@ -55,6 +55,7 @@ void tearDown() { assertThat(testing.forceFlushCalled()).isTrue(); } + @SuppressWarnings("deprecation") // using deprecated semconv @Test void eventTraced() { SQSEvent event = new SQSEvent(); @@ -86,7 +87,8 @@ void eventTraced() { .hasAttributesSatisfyingExactly( equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")))); } diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java index 49bcbe97e241..364d10f10b11 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/library/src/test/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AwsLambdaSqsMessageHandlerTest.java @@ -56,6 +56,7 @@ void tearDown() { assertThat(testing.forceFlushCalled()).isTrue(); } + @SuppressWarnings("deprecation") // using deprecated semconv @Test void processSpans() { SQSEvent.SQSMessage message1 = newMessage(); @@ -88,7 +89,8 @@ void processSpans() { .hasAttributesSatisfyingExactly( equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")) .hasLinks( LinkData.create( @@ -110,7 +112,8 @@ void processSpans() { .hasAttributesSatisfyingExactly( equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, "message1"), equalTo( @@ -129,7 +132,8 @@ void processSpans() { .hasAttributesSatisfyingExactly( equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), equalTo(MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, "message2"), equalTo( diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java index c7003983787c..070c8f0f3019 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awslambdaevents/v2_2/AbstractAwsLambdaSqsEventHandlerTest.java @@ -26,6 +26,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +@SuppressWarnings("deprecation") // using deprecated semconv @ExtendWith(MockitoExtension.class) public abstract class AbstractAwsLambdaSqsEventHandlerTest { @@ -82,7 +83,8 @@ void sameSource() { .hasAttributesSatisfyingExactly( equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")) .hasLinksSatisfying( @@ -131,7 +133,8 @@ void differentSource() { .hasAttributesSatisfyingExactly( equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_OPERATION, "process")) .hasLinksSatisfying( diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy index 616e8af4f92c..8ba084ba0215 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy @@ -202,7 +202,7 @@ class S3TracingTest extends AgentInstrumentationSpecification { "$UrlAttributes.URL_FULL" { it.startsWith("http://") } "$ServerAttributes.SERVER_ADDRESS" String "$ServerAttributes.SERVER_PORT" { it == null || Number } - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "s3ToSqsTestQueue" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String @@ -546,7 +546,7 @@ class S3TracingTest extends AgentInstrumentationSpecification { "$UrlAttributes.URL_FULL" { it.startsWith("http://") } "$ServerAttributes.SERVER_ADDRESS" String "$ServerAttributes.SERVER_PORT" { it == null || Number } - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "s3ToSnsToSqsTestQueue" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy index 7f307f69015a..0a227581227a 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy @@ -196,7 +196,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification { "$UrlAttributes.URL_FULL" String "$ServerAttributes.SERVER_ADDRESS" String "$ServerAttributes.SERVER_PORT" { it == null || Number } - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "snsToSqsTestQueue" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsAttributesGetter.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsAttributesGetter.java index cf24390446e1..fc1f98154da9 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsAttributesGetter.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsAttributesGetter.java @@ -15,7 +15,7 @@ enum SqsAttributesGetter implements MessagingAttributesGetter, Response> { INSTANCE; - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsProcessRequestAttributesGetter.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsProcessRequestAttributesGetter.java index c7786c8dab2f..1988d39342c1 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsProcessRequestAttributesGetter.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsProcessRequestAttributesGetter.java @@ -15,7 +15,7 @@ enum SqsProcessRequestAttributesGetter implements MessagingAttributesGetter> { INSTANCE; - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsReceiveRequestAttributesGetter.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsReceiveRequestAttributesGetter.java index 107adb34f648..46f711744a1a 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsReceiveRequestAttributesGetter.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SqsReceiveRequestAttributesGetter.java @@ -16,7 +16,7 @@ enum SqsReceiveRequestAttributesGetter implements MessagingAttributesGetter> { INSTANCE; - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java index 2dd6822f4417..fae95611e7f5 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java @@ -37,6 +37,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractSqsSuppressReceiveSpansTest { protected abstract InstrumentationExtension testing(); @@ -135,7 +136,8 @@ void testSimpleSqsProducerConsumerServices() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -168,7 +170,8 @@ void testSimpleSqsProducerConsumerServices() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -253,7 +256,8 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -286,7 +290,8 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java index 927239ca2e51..94ca66f12df1 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java @@ -50,6 +50,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractSqsTracingTest { protected abstract InstrumentationExtension testing(); @@ -167,7 +168,8 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -214,7 +216,8 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -259,7 +262,8 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -356,7 +360,8 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -430,8 +435,8 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues - .AWS_SQS), + MessagingIncubatingAttributes + .MessagingSystemIncubatingValues.AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -470,8 +475,8 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues - .AWS_SQS), + MessagingIncubatingAttributes + .MessagingSystemIncubatingValues.AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsAttributesGetter.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsAttributesGetter.java index ea955e69dc20..ce26bf80b192 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsAttributesGetter.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsAttributesGetter.java @@ -16,7 +16,7 @@ enum SqsAttributesGetter implements MessagingAttributesGetter { INSTANCE; - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsProcessRequestAttributesGetter.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsProcessRequestAttributesGetter.java index 9f629f73b499..64c3e1ffd8ff 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsProcessRequestAttributesGetter.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsProcessRequestAttributesGetter.java @@ -15,7 +15,7 @@ enum SqsProcessRequestAttributesGetter implements MessagingAttributesGetter { INSTANCE; - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsReceiveRequestAttributesGetter.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsReceiveRequestAttributesGetter.java index 2fcab869001f..891cc3c3bc19 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsReceiveRequestAttributesGetter.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/SqsReceiveRequestAttributesGetter.java @@ -16,7 +16,7 @@ enum SqsReceiveRequestAttributesGetter implements MessagingAttributesGetter { INSTANCE; - // copied from MessagingIncubatingAttributes.MessagingSystemValues + // copied from MessagingIncubatingAttributes.MessagingSystemIncubatingValues private static final String AWS_SQS = "aws_sqs"; @Override diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java index e308ec37ba8d..43a2c68d9936 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java @@ -51,7 +51,7 @@ public final class TracingExecutionInterceptor implements ExecutionInterceptor { // copied from DbIncubatingAttributes private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - // copied from DbIncubatingAttributes.DbSystemValues + // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String DB_SYSTEM_DYNAMODB = "dynamodb"; // copied from AwsIncubatingAttributes private static final AttributeKey AWS_REQUEST_ID = diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy index b41a37518a66..2533a0202dac 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy @@ -145,7 +145,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "somequeue" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS } else if (service == "Kinesis") { "aws.stream.name" "somestream" } else if (service == "Sns") { @@ -305,7 +305,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "somequeue" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS } else if (service == "Kinesis") { "aws.stream.name" "somestream" } else if (service == "Sns") { diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy index 22b33739fef8..a0dd2a8adae0 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy @@ -158,7 +158,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp "$UrlAttributes.URL_FULL" { it.startsWith("http://localhost:$sqsPort") } "$ServerAttributes.SERVER_ADDRESS" "localhost" "$ServerAttributes.SERVER_PORT" sqsPort - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "testSdkSqs" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String @@ -179,7 +179,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp "$UrlAttributes.URL_FULL" { it.startsWith("http://localhost:$sqsPort") } "$ServerAttributes.SERVER_ADDRESS" "localhost" "$ServerAttributes.SERVER_PORT" sqsPort - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "testSdkSqs" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String @@ -330,7 +330,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp "$UrlAttributes.URL_FULL" { it.startsWith("http://localhost:$sqsPort") } "$ServerAttributes.SERVER_ADDRESS" "localhost" "$ServerAttributes.SERVER_PORT" sqsPort - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "testSdkSqs" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" } @@ -352,7 +352,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp "$UrlAttributes.URL_FULL" { it.startsWith("http://localhost:$sqsPort") } "$ServerAttributes.SERVER_ADDRESS" "localhost" "$ServerAttributes.SERVER_PORT" sqsPort - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "testSdkSqs" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String @@ -380,7 +380,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp "$UrlAttributes.URL_FULL" { it.startsWith("http://localhost:$sqsPort") } "$ServerAttributes.SERVER_ADDRESS" "localhost" "$ServerAttributes.SERVER_PORT" sqsPort - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS + "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" "testSdkSqs" "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID" String diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java index 19abb21a8ee0..43c3db0ed42f 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; @@ -59,6 +60,7 @@ public static void setup() { server.start(); } + @AfterAll public static void cleanup() { server.stop(); } @@ -118,6 +120,7 @@ public boolean isRecordIndividualHttpErrorEnabled() { "otel.instrumentation.aws-sdk.experimental-record-individual-http-error", false); } + @SuppressWarnings("deprecation") // using deprecated semconv @Test public void testSendDynamoDbRequestWithRetries() { cleanResponses(); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java index a6293e7af4db..be0effde3e4a 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java @@ -56,6 +56,7 @@ import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest; import software.amazon.awssdk.services.sqs.model.SendMessageRequest; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractAws2SqsTracingTest { protected abstract InstrumentationExtension getTesting(); @@ -217,7 +218,8 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -300,8 +302,8 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues - .AWS_SQS), + MessagingIncubatingAttributes + .MessagingSystemIncubatingValues.AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -347,8 +349,8 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues - .AWS_SQS), + MessagingIncubatingAttributes + .MessagingSystemIncubatingValues.AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -528,7 +530,8 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -557,7 +560,8 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), @@ -604,8 +608,8 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { equalTo(ServerAttributes.SERVER_PORT, sqsPort), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues - .AWS_SQS), + MessagingIncubatingAttributes + .MessagingSystemIncubatingValues.AWS_SQS), equalTo( MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, "testSdkSqs"), diff --git a/instrumentation/azure-core/azure-core-1.14/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_14/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.14/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_14/AzureSdkTest.java index bceda620a0c2..066330a16f55 100644 --- a/instrumentation/azure-core/azure-core-1.14/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_14/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.14/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_14/AzureSdkTest.java @@ -55,6 +55,6 @@ void testSpan() { span.hasName("hello") .hasKind(SpanKind.INTERNAL) .hasStatus(StatusData.ok()) - .hasAttributesSatisfying(Attributes::isEmpty))); + .hasAttributes(Attributes.empty()))); } } diff --git a/instrumentation/azure-core/azure-core-1.19/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_19/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.19/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_19/AzureSdkTest.java index ae3cea3b7ed4..c723d9b37e5a 100644 --- a/instrumentation/azure-core/azure-core-1.19/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_19/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.19/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_19/AzureSdkTest.java @@ -55,6 +55,6 @@ void testSpan() { span.hasName("hello") .hasKind(SpanKind.INTERNAL) .hasStatus(StatusData.ok()) - .hasAttributesSatisfying(Attributes::isEmpty))); + .hasAttributes(Attributes.empty()))); } } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts index 3a8fd040b87c..5144db03647f 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts @@ -33,6 +33,12 @@ dependencies { val latestDepTest = findProperty("testLatestDeps") as Boolean +tasks { + withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) + } +} + testing { suites { // using a test suite to ensure that classes from library-instrumentation-shaded that were @@ -41,8 +47,10 @@ testing { dependencies { if (latestDepTest) { implementation("com.azure:azure-core:+") + implementation("com.azure:azure-core-test:+") } else { implementation("com.azure:azure-core:1.36.0") + implementation("com.azure:azure-core-test:1.16.2") } } } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java index 2e1a68f2affe..9cce8f85e7fb 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java @@ -12,6 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.azure.core.http.HttpResponse; import io.opentelemetry.context.Scope; @@ -35,12 +36,14 @@ public void transform(TypeTransformer transformer) { isMethod() .and(isPublic()) .and(named("send")) + .and(takesArgument(1, named("com.azure.core.util.Context"))) .and(returns(named("reactor.core.publisher.Mono"))), this.getClass().getName() + "$SuppressNestedClientMonoAdvice"); transformer.applyAdviceToMethod( isMethod() .and(isPublic()) .and(named("sendSync")) + .and(takesArgument(1, named("com.azure.core.util.Context"))) .and(returns(named("com.azure.core.http.HttpResponse"))), this.getClass().getName() + "$SuppressNestedClientSyncAdvice"); } @@ -48,8 +51,10 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class SuppressNestedClientMonoAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void asyncSendExit(@Advice.Return(readOnly = false) Mono mono) { - mono = disallowNestedClientSpanMono(mono); + public static void asyncSendExit( + @Advice.Argument(1) com.azure.core.util.Context azContext, + @Advice.Return(readOnly = false) Mono mono) { + mono = disallowNestedClientSpanMono(mono, azContext); } } @@ -57,8 +62,10 @@ public static void asyncSendExit(@Advice.Return(readOnly = false) Mono Mono disallowNestedClientSpanMono(Mono delegate) { + public static Mono disallowNestedClientSpanMono( + Mono delegate, com.azure.core.util.Context azContext) { return new Mono() { @Override public void subscribe(CoreSubscriber coreSubscriber) { Context parentContext = currentContext(); - if (doesNotHaveClientSpan(parentContext)) { + + boolean hasAzureClientSpan = azContext.getData("client-method-call-flag").isPresent(); + if (doesNotHaveClientSpan(parentContext) && hasAzureClientSpan) { try (Scope ignored = disallowNestedClientSpan(parentContext).makeCurrent()) { delegate.subscribe(coreSubscriber); } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java index 4661a9cf7ea0..f27cc23d7246 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -5,16 +5,39 @@ package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; +import com.azure.core.annotation.ExpectedResponses; +import com.azure.core.annotation.Get; +import com.azure.core.annotation.Host; +import com.azure.core.annotation.ServiceInterface; +import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.HttpPolicyProviders; +import com.azure.core.http.rest.Response; +import com.azure.core.http.rest.RestProxy; +import com.azure.core.test.http.MockHttpResponse; +import com.azure.core.util.ClientOptions; import com.azure.core.util.Context; +import com.azure.core.util.TracingOptions; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.semconv.HttpAttributes; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; class AzureSdkTest { @@ -45,7 +68,63 @@ void testSpan() { span.hasName("hello") .hasKind(SpanKind.INTERNAL) .hasStatus(StatusData.unset()) - .hasAttributesSatisfying(Attributes::isEmpty))); + .hasAttributesSatisfyingExactly( + equalTo(AttributeKey.stringKey("az.namespace"), "otel.tests")))); + } + + @Test + void testPipelineAndSuppression() { + AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); + + HttpClient mockClient = + request -> + Mono.defer( + () -> { + // check if suppression is working + hasClientAndHttpKeys.set(hasClientAndHttpSpans()); + return Mono.just(new MockHttpResponse(request, 200)); + }); + + StepVerifier.create(createService(mockClient, true).testMethod()) + .expectNextCount(1) + .expectComplete() + .verify(); + + assertThat(hasClientAndHttpKeys.get()).isTrue(); + testing.waitAndAssertTracesWithoutScopeVersionVerification( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("myService.testMethod") + .hasKind(SpanKind.INTERNAL) + .hasStatus(StatusData.unset()) + .hasAttributes(Attributes.empty()), + span -> + span.hasKind(SpanKind.CLIENT) + .hasName(Boolean.getBoolean("testLatestDeps") ? "GET" : "HTTP GET") + .hasStatus(StatusData.unset()) + .hasAttribute(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L))); + } + + @Test + void testDisabledTracingNoSuppression() { + AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); + + HttpClient mockClient = + request -> + Mono.defer( + () -> { + // check no suppression + hasClientAndHttpKeys.set(hasClientAndHttpSpans()); + return Mono.just(new MockHttpResponse(request, 200)); + }); + + StepVerifier.create(createService(mockClient, false).testMethod()) + .expectNextCount(1) + .expectComplete() + .verify(); + + assertThat(hasClientAndHttpKeys.get()).isFalse(); } private static com.azure.core.util.tracing.Tracer createAzTracer() { @@ -53,4 +132,34 @@ private static com.azure.core.util.tracing.Tracer createAzTracer() { com.azure.core.util.tracing.TracerProvider.getDefaultProvider(); return azProvider.createTracer("test-lib", "test-version", "otel.tests", null); } + + private static TestInterface createService(HttpClient httpClient, boolean tracingEnabled) { + List policies = new ArrayList<>(); + HttpPolicyProviders.addAfterRetryPolicies(policies); + + ClientOptions clientOptions = + new ClientOptions().setTracingOptions(new TracingOptions().setEnabled(tracingEnabled)); + HttpPipeline pipeline = + new HttpPipelineBuilder() + .policies(policies.toArray(new HttpPipelinePolicy[0])) + .httpClient(httpClient) + .clientOptions(clientOptions) + .build(); + + return RestProxy.create(TestInterface.class, pipeline); + } + + private static boolean hasClientAndHttpSpans() { + io.opentelemetry.context.Context ctx = io.opentelemetry.context.Context.current(); + return SpanKey.KIND_CLIENT.fromContextOrNull(ctx) != null + && SpanKey.HTTP_CLIENT.fromContextOrNull(ctx) != null; + } + + @Host("https://azure.com") + @ServiceInterface(name = "myService") + interface TestInterface { + @Get("path") + @ExpectedResponses({200}) + Mono> testMethod(); + } } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java index 650f84ebeecb..6145cfe5458d 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java @@ -50,7 +50,7 @@ void testSpan() { span.hasName("hello") .hasKind(SpanKind.INTERNAL) .hasStatus(StatusData.unset()) - .hasAttributesSatisfying(Attributes::isEmpty))); + .hasAttributes(Attributes.empty()))); } private static com.azure.core.util.tracing.Tracer createAzTracer() { diff --git a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts index 423f391f7e29..f3ffaf42e612 100644 --- a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts @@ -6,7 +6,9 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { - implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.42") + // this is the last good version that works with indy build + // update to 1.49 or latest once https://github.com/Azure/azure-sdk-for-java/pull/42586 is released. + implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.45") } tasks { diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java index 45b368a043f1..2bd258112151 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java @@ -114,6 +114,7 @@ private String getDbName(Endpoint endpoint) { } } + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void pre( AttributesBuilder attributes, diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DecoratorRegistry.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DecoratorRegistry.java index c8171d2d6cb2..039bb0c7e712 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DecoratorRegistry.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DecoratorRegistry.java @@ -25,7 +25,9 @@ private static Map loadDecorators() { result.put("aws-sqs", new MessagingSpanDecorator("aws-sqs")); result.put("cometd", new MessagingSpanDecorator("cometd")); result.put("cometds", new MessagingSpanDecorator("cometds")); - result.put("cql", new DbSpanDecorator("cql", DbIncubatingAttributes.DbSystemValues.CASSANDRA)); + result.put( + "cql", + new DbSpanDecorator("cql", DbIncubatingAttributes.DbSystemIncubatingValues.CASSANDRA)); result.put("direct", new InternalSpanDecorator()); result.put("direct-vm", new InternalSpanDecorator()); result.put("disruptor", new InternalSpanDecorator()); @@ -37,13 +39,15 @@ private static Map loadDecorators() { result.put("http", new HttpSpanDecorator()); result.put("ironmq", new MessagingSpanDecorator("ironmq")); result.put( - "jdbc", new DbSpanDecorator("jdbc", DbIncubatingAttributes.DbSystemValues.OTHER_SQL)); + "jdbc", + new DbSpanDecorator("jdbc", DbIncubatingAttributes.DbSystemIncubatingValues.OTHER_SQL)); result.put("jetty", new HttpSpanDecorator()); result.put("jms", new MessagingSpanDecorator("jms")); result.put("kafka", new KafkaSpanDecorator()); result.put("log", new LogSpanDecorator()); result.put( - "mongodb", new DbSpanDecorator("mongodb", DbIncubatingAttributes.DbSystemValues.MONGODB)); + "mongodb", + new DbSpanDecorator("mongodb", DbIncubatingAttributes.DbSystemIncubatingValues.MONGODB)); result.put("mqtt", new MessagingSpanDecorator("mqtt")); result.put("netty-http4", new HttpSpanDecorator()); result.put("netty-http", new HttpSpanDecorator()); @@ -54,7 +58,9 @@ private static Map loadDecorators() { result.put("seda", new InternalSpanDecorator()); result.put("servlet", new HttpSpanDecorator()); result.put("sjms", new MessagingSpanDecorator("sjms")); - result.put("sql", new DbSpanDecorator("sql", DbIncubatingAttributes.DbSystemValues.OTHER_SQL)); + result.put( + "sql", + new DbSpanDecorator("sql", DbIncubatingAttributes.DbSystemIncubatingValues.OTHER_SQL)); result.put("stomp", new MessagingSpanDecorator("stomp")); result.put("timer", new TimerSpanDecorator()); result.put("undertow", new HttpSpanDecorator()); diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/KafkaSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/KafkaSpanDecorator.java index fc6e1fc87113..183175416f1a 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/KafkaSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/KafkaSpanDecorator.java @@ -52,6 +52,7 @@ public String getDestination(Exchange exchange, Endpoint endpoint) { return topic != null ? topic : super.getDestination(exchange, endpoint); } + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void pre( AttributesBuilder attributes, diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java index 74a3efe8cdca..ee0cd25e488a 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java @@ -42,6 +42,7 @@ static SpanDataAssert sqs( return sqs(span, spanName, queueUrl, queueName, CLIENT); } + @SuppressWarnings("deprecation") // using deprecated semconv static SpanDataAssert sqs( SpanDataAssert span, String spanName, String queueUrl, String queueName, SpanKind spanKind) { @@ -100,7 +101,7 @@ static SpanDataAssert sqs( equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, queueName), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS))); + MessagingIncubatingAttributes.MessagingSystemIncubatingValues.AWS_SQS))); if (spanName.endsWith("receive")) { attributeAssertions.add( equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive")); diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java index 61e59850cfb7..3e061418ae11 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java @@ -95,6 +95,7 @@ static void cassandraSetup() { cqlSession.execute("CREATE TABLE IF NOT EXISTS test.users (id int PRIMARY KEY, name TEXT);"); } + @SuppressWarnings("deprecation") // using deprecated semconv @Test void testCassandra() { CamelContext camelContext = appContext.getBean(CamelContext.class); diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts index f4dfa06370fb..924e4db0f3a3 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts @@ -44,7 +44,15 @@ dependencies { configurations.testRuntimeClasspath.get().resolutionStrategy.force("com.google.guava:guava:19.0") tasks { - test { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraRequest.java index 5407bb6d2f75..0463ce3aa3f5 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraRequest.java @@ -11,11 +11,11 @@ @AutoValue public abstract class CassandraRequest { - public static CassandraRequest create(Session session, String statement) { - return new AutoValue_CassandraRequest(session, statement); + public static CassandraRequest create(Session session, String queryText) { + return new AutoValue_CassandraRequest(session, queryText); } public abstract Session getSession(); - public abstract String getStatement(); + public abstract String getQueryText(); } diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java index 841f48fdbc6e..5598d2fcb994 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java @@ -15,6 +15,7 @@ import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; +@SuppressWarnings("deprecation") // using deprecated semconv public final class CassandraSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-3.0"; diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSqlAttributesGetter.java index 5b973f4e9922..516f1133bea6 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSqlAttributesGetter.java @@ -12,10 +12,11 @@ final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { @Override - public String getSystem(CassandraRequest request) { - return DbIncubatingAttributes.DbSystemValues.CASSANDRA; + public String getDbSystem(CassandraRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.CASSANDRA; } + @Deprecated @Override @Nullable public String getUser(CassandraRequest request) { @@ -24,10 +25,11 @@ public String getUser(CassandraRequest request) { @Override @Nullable - public String getName(CassandraRequest request) { + public String getDbNamespace(CassandraRequest request) { return request.getSession().getLoggedKeyspace(); } + @Deprecated @Override @Nullable public String getConnectionString(CassandraRequest request) { @@ -36,7 +38,7 @@ public String getConnectionString(CassandraRequest request) { @Override @Nullable - public String getRawStatement(CassandraRequest request) { - return request.getStatement(); + public String getRawQueryText(CassandraRequest request) { + return request.getQueryText(); } } diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java index 7d581375d537..2db183ba837d 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java @@ -12,6 +12,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @@ -34,7 +35,8 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; -public class CassandraClientTest { +@SuppressWarnings("deprecation") // using deprecated semconv +class CassandraClientTest { private static final Logger logger = LoggerFactory.getLogger(CassandraClientTest.class); @@ -100,7 +102,8 @@ void syncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), "USE " + parameter.keyspace))), trace -> trace.hasSpansSatisfyingExactly( @@ -115,12 +118,22 @@ void syncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo(DbIncubatingAttributes.DB_NAME, parameter.keyspace), equalTo( - DbIncubatingAttributes.DB_STATEMENT, parameter.expectedStatement), - equalTo(DbIncubatingAttributes.DB_OPERATION, parameter.operation), + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_NAME), + parameter.keyspace), equalTo( - DbIncubatingAttributes.DB_CASSANDRA_TABLE, parameter.table)))); + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)))); } else { testing.waitAndAssertTraces( trace -> @@ -137,10 +150,17 @@ void syncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, parameter.expectedStatement), - equalTo(DbIncubatingAttributes.DB_OPERATION, parameter.operation), + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), equalTo( - DbIncubatingAttributes.DB_CASSANDRA_TABLE, parameter.table)))); + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)))); } session.close(); @@ -178,7 +198,8 @@ void asyncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), "USE " + parameter.keyspace))), trace -> trace.hasSpansSatisfyingExactly( @@ -194,11 +215,22 @@ void asyncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), - equalTo(DbIncubatingAttributes.DB_NAME, parameter.keyspace), equalTo( - DbIncubatingAttributes.DB_STATEMENT, parameter.expectedStatement), - equalTo(DbIncubatingAttributes.DB_OPERATION, parameter.operation), - equalTo(DbIncubatingAttributes.DB_CASSANDRA_TABLE, parameter.table)), + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_NAME), + parameter.keyspace), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)), span -> span.hasName("callbackListener") .hasKind(SpanKind.INTERNAL) @@ -220,9 +252,17 @@ void asyncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DbIncubatingAttributes.DB_SYSTEM, "cassandra"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, parameter.expectedStatement), - equalTo(DbIncubatingAttributes.DB_OPERATION, parameter.operation), - equalTo(DbIncubatingAttributes.DB_CASSANDRA_TABLE, parameter.table)), + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)), span -> span.hasName("callbackListener") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java index e833ab27b155..e8c06ee952c8 100644 --- a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java +++ b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java @@ -16,10 +16,6 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_IDEMPOTENCE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_PAGE_SIZE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -31,7 +27,9 @@ import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.NetworkAttributes; +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -47,6 +45,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractCassandraTest { private static final Logger logger = LoggerFactory.getLogger(AbstractCassandraTest.class); @@ -110,9 +109,18 @@ void syncTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DB_SYSTEM, "cassandra"), - equalTo(DB_NAME, parameter.keyspace), - equalTo(DB_STATEMENT, parameter.expectedStatement), - equalTo(DB_OPERATION, parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_NAME), + parameter.keyspace), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), satisfies( @@ -123,7 +131,10 @@ void syncTest(Parameter parameter) { val -> val.isInstanceOf(Boolean.class)), equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo(DB_CASSANDRA_TABLE, parameter.table)))); + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)))); session.close(); } @@ -164,9 +175,18 @@ void asyncTest(Parameter parameter) throws Exception { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DB_SYSTEM, "cassandra"), - equalTo(DB_NAME, parameter.keyspace), - equalTo(DB_STATEMENT, parameter.expectedStatement), - equalTo(DB_OPERATION, parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_NAME), + parameter.keyspace), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), satisfies( @@ -177,7 +197,10 @@ void asyncTest(Parameter parameter) throws Exception { val -> val.isInstanceOf(Boolean.class)), equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo(DB_CASSANDRA_TABLE, parameter.table)), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)), span -> span.hasName("child") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index 8c5f2faab149..28eb7cf3f557 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -27,4 +27,12 @@ tasks { test { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java index 9c783cc3f196..e4160bb80495 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java @@ -11,11 +11,11 @@ @AutoValue public abstract class CassandraRequest { - public static CassandraRequest create(Session session, String statement) { - return new AutoValue_CassandraRequest(session, statement); + public static CassandraRequest create(Session session, String queryText) { + return new AutoValue_CassandraRequest(session, queryText); } public abstract Session getSession(); - public abstract String getStatement(); + public abstract String getQueryText(); } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index 4da5b599d0a6..668cf2f50974 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -15,6 +15,7 @@ import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; +@SuppressWarnings("deprecation") // using deprecated semconv public final class CassandraSingletons { private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.0"; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java index e08cf36a940f..0ac75ae3778c 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java @@ -13,10 +13,11 @@ final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { @Override - public String getSystem(CassandraRequest request) { - return DbIncubatingAttributes.DbSystemValues.CASSANDRA; + public String getDbSystem(CassandraRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.CASSANDRA; } + @Deprecated @Override @Nullable public String getUser(CassandraRequest request) { @@ -25,10 +26,11 @@ public String getUser(CassandraRequest request) { @Override @Nullable - public String getName(CassandraRequest request) { + public String getDbNamespace(CassandraRequest request) { return request.getSession().getKeyspace().map(CqlIdentifier::toString).orElse(null); } + @Deprecated @Override @Nullable public String getConnectionString(CassandraRequest request) { @@ -37,7 +39,7 @@ public String getConnectionString(CassandraRequest request) { @Override @Nullable - public String getRawStatement(CassandraRequest request) { - return request.getStatement(); + public String getRawQueryText(CassandraRequest request) { + return request.getQueryText(); } } diff --git a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts index c0f0592742a9..963467200f5d 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts @@ -10,3 +10,13 @@ dependencies { testImplementation(project(":instrumentation:cassandra:cassandra-4.4:testing")) } + +tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java index 021dfc7b6c6d..426321e146df 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java @@ -11,11 +11,11 @@ @AutoValue public abstract class CassandraRequest { - public static CassandraRequest create(Session session, String statement) { - return new AutoValue_CassandraRequest(session, statement); + public static CassandraRequest create(Session session, String queryText) { + return new AutoValue_CassandraRequest(session, queryText); } public abstract Session getSession(); - public abstract String getStatement(); + public abstract String getQueryText(); } diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java index f78a1fab53be..fb14a7abc93f 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java @@ -10,14 +10,15 @@ import javax.annotation.Nullable; final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { - // copied from DbIncubatingAttributes.DbSystemValues + // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String CASSANDRA = "cassandra"; @Override - public String getSystem(CassandraRequest request) { + public String getDbSystem(CassandraRequest request) { return CASSANDRA; } + @Deprecated @Override @Nullable public String getUser(CassandraRequest request) { @@ -26,10 +27,11 @@ public String getUser(CassandraRequest request) { @Override @Nullable - public String getName(CassandraRequest request) { + public String getDbNamespace(CassandraRequest request) { return request.getSession().getKeyspace().map(CqlIdentifier::toString).orElse(null); } + @Deprecated @Override @Nullable public String getConnectionString(CassandraRequest request) { @@ -38,7 +40,7 @@ public String getConnectionString(CassandraRequest request) { @Override @Nullable - public String getRawStatement(CassandraRequest request) { - return request.getStatement(); + public String getRawQueryText(CassandraRequest request) { + return request.getQueryText(); } } diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java index 6d39ac2d6f0a..d5a92eb7d936 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java @@ -50,6 +50,7 @@ public CassandraTelemetry build() { return new CassandraTelemetry(createInstrumenter(openTelemetry, statementSanitizationEnabled)); } + @SuppressWarnings("deprecation") // to support old database semantic conventions protected Instrumenter createInstrumenter( OpenTelemetry openTelemetry, boolean statementSanitizationEnabled) { CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); diff --git a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java index bd3357978d36..648ecb86a927 100644 --- a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java +++ b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java @@ -16,10 +16,6 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_IDEMPOTENCE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_PAGE_SIZE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -27,7 +23,9 @@ import com.datastax.oss.driver.api.core.CqlSession; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.cassandra.v4.common.AbstractCassandraTest; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.NetworkAttributes; +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -36,6 +34,7 @@ public abstract class AbstractCassandra44Test extends AbstractCassandraTest { + @SuppressWarnings("deprecation") // using deprecated semconv @ParameterizedTest(name = "{index}: {0}") @MethodSource("provideReactiveParameters") void reactiveTest(Parameter parameter) { @@ -70,9 +69,18 @@ void reactiveTest(Parameter parameter) { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, cassandraIp), equalTo(NetworkAttributes.NETWORK_PEER_PORT, cassandraPort), equalTo(DB_SYSTEM, "cassandra"), - equalTo(DB_NAME, parameter.keyspace), - equalTo(DB_STATEMENT, parameter.expectedStatement), - equalTo(DB_OPERATION, parameter.operation), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_NAME), + parameter.keyspace), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + parameter.expectedStatement), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + parameter.operation), equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), satisfies( @@ -83,7 +91,10 @@ void reactiveTest(Parameter parameter) { val -> val.isInstanceOf(Boolean.class)), equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo(DB_CASSANDRA_TABLE, parameter.table)), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_CASSANDRA_TABLE), + parameter.table)), span -> span.hasName("child") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseAttributesGetter.java b/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseAttributesGetter.java index 2e729cdd2416..c8210b53b5b9 100644 --- a/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseAttributesGetter.java +++ b/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseAttributesGetter.java @@ -10,9 +10,10 @@ import javax.annotation.Nullable; final class ClickHouseAttributesGetter implements DbClientAttributesGetter { + @Nullable @Override - public String getStatement(ClickHouseDbRequest request) { + public String getDbQueryText(ClickHouseDbRequest request) { if (request.getSqlStatementInfo() == null) { return null; } @@ -21,7 +22,7 @@ public String getStatement(ClickHouseDbRequest request) { @Nullable @Override - public String getOperation(ClickHouseDbRequest request) { + public String getDbOperationName(ClickHouseDbRequest request) { if (request.getSqlStatementInfo() == null) { return null; } @@ -30,10 +31,11 @@ public String getOperation(ClickHouseDbRequest request) { @Nullable @Override - public String getSystem(ClickHouseDbRequest request) { - return DbIncubatingAttributes.DbSystemValues.CLICKHOUSE; + public String getDbSystem(ClickHouseDbRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.CLICKHOUSE; } + @Deprecated @Nullable @Override public String getUser(ClickHouseDbRequest request) { @@ -42,7 +44,7 @@ public String getUser(ClickHouseDbRequest request) { @Nullable @Override - public String getName(ClickHouseDbRequest request) { + public String getDbNamespace(ClickHouseDbRequest request) { String dbName = request.getDbName(); if (dbName == null || dbName.isEmpty()) { return null; @@ -50,6 +52,7 @@ public String getName(ClickHouseDbRequest request) { return dbName; } + @Deprecated @Nullable @Override public String getConnectionString(ClickHouseDbRequest request) { diff --git a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java index 745bed68392e..63fb20f413d3 100644 --- a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java +++ b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java @@ -332,9 +332,12 @@ void testParameterizedQueryInput() throws ClickHouseException { "select * from " + tableName + " where s=:val", "SELECT")))); } + @SuppressWarnings("deprecation") // using deprecated semconv private static List attributeAssertions(String statement, String operation) { return asList( - equalTo(DbIncubatingAttributes.DB_SYSTEM, DbIncubatingAttributes.DbSystemValues.CLICKHOUSE), + equalTo( + DbIncubatingAttributes.DB_SYSTEM, + DbIncubatingAttributes.DbSystemIncubatingValues.CLICKHOUSE), equalTo(DbIncubatingAttributes.DB_NAME, dbName), equalTo(ServerAttributes.SERVER_ADDRESS, host), equalTo(ServerAttributes.SERVER_PORT, port), diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts index d6504dc00f43..13f696c31334 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts @@ -31,9 +31,19 @@ dependencies { latestDepTestLibrary("com.couchbase.client:java-client:2.5.+") } -tasks.withType().configureEach { - // required on jdk17 - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") - jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") +tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + withType().configureEach { + // required on jdk17 + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAttributesGetter.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAttributesGetter.java index 05edc5679f75..5975b40d76e0 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAttributesGetter.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAttributesGetter.java @@ -12,10 +12,11 @@ final class CouchbaseAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(CouchbaseRequestInfo couchbaseRequest) { - return DbIncubatingAttributes.DbSystemValues.COUCHBASE; + public String getDbSystem(CouchbaseRequestInfo couchbaseRequest) { + return DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE; } + @Deprecated @Override @Nullable public String getUser(CouchbaseRequestInfo couchbaseRequest) { @@ -24,10 +25,11 @@ public String getUser(CouchbaseRequestInfo couchbaseRequest) { @Override @Nullable - public String getName(CouchbaseRequestInfo couchbaseRequest) { + public String getDbNamespace(CouchbaseRequestInfo couchbaseRequest) { return couchbaseRequest.bucket(); } + @Deprecated @Override @Nullable public String getConnectionString(CouchbaseRequestInfo couchbaseRequest) { @@ -36,13 +38,13 @@ public String getConnectionString(CouchbaseRequestInfo couchbaseRequest) { @Override @Nullable - public String getStatement(CouchbaseRequestInfo couchbaseRequest) { + public String getDbQueryText(CouchbaseRequestInfo couchbaseRequest) { return couchbaseRequest.statement(); } @Override @Nullable - public String getOperation(CouchbaseRequestInfo couchbaseRequest) { + public String getDbOperationName(CouchbaseRequestInfo couchbaseRequest) { return couchbaseRequest.operation(); } } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts index 19428dc07b26..1c68002dfe1e 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts @@ -34,11 +34,21 @@ dependencies { latestDepTestLibrary("com.couchbase.client:java-client:2.+") } -tasks.withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.couchbase.experimental-span-attributes=true") +tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + withType().configureEach { + // TODO run tests both with and without experimental span attributes + jvmArgs("-Dotel.instrumentation.couchbase.experimental-span-attributes=true") - // required on jdk17 - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + // required on jdk17 + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java index fe917fa613ce..9ee67015fa4c 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java @@ -21,6 +21,7 @@ import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.concurrent.CompletableFuture; @@ -34,6 +35,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractCouchbaseAsyncClientTest extends AbstractCouchbaseTest { private static final int TIMEOUT_SECONDS = 10; @@ -88,8 +90,11 @@ void hasBucket(BucketSettings bucketSettings) .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.COUCHBASE), - equalTo(DbIncubatingAttributes.DB_OPERATION, "Cluster.openBucket")), + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "ClusterManager.hasBucket") .hasParent(trace.getSpan(0)))); @@ -129,8 +134,11 @@ void upsert(BucketSettings bucketSettings) .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.COUCHBASE), - equalTo(DbIncubatingAttributes.DB_OPERATION, "Cluster.openBucket")), + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "Bucket.upsert", bucketSettings.name()) .hasParent(trace.getSpan(1)))); @@ -177,8 +185,11 @@ void upsertAndGet(BucketSettings bucketSettings) .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.COUCHBASE), - equalTo(DbIncubatingAttributes.DB_OPERATION, "Cluster.openBucket")), + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "Bucket.upsert", bucketSettings.name()) .hasParent(trace.getSpan(1)), @@ -222,8 +233,11 @@ void query() throws ExecutionException, InterruptedException, TimeoutException { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.COUCHBASE), - equalTo(DbIncubatingAttributes.DB_OPERATION, "Cluster.openBucket")), + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "Cluster.openBucket")), span -> assertCouchbaseSpan( span, diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java index d0ea69c2cc37..b142e2b592d3 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java @@ -22,6 +22,7 @@ import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.concurrent.atomic.AtomicReference; @@ -32,6 +33,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractCouchbaseClientTest extends AbstractCouchbaseTest { @RegisterExtension @@ -107,8 +109,11 @@ void upsertAndGet(BucketSettings bucketSettings) { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.COUCHBASE), - equalTo(DbIncubatingAttributes.DB_OPERATION, "Cluster.openBucket"))), + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "Cluster.openBucket"))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("someTrace").hasKind(SpanKind.INTERNAL).hasNoParent(), @@ -143,8 +148,11 @@ void query() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.COUCHBASE), - equalTo(DbIncubatingAttributes.DB_OPERATION, "Cluster.openBucket"))), + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "Cluster.openBucket"))), trace -> trace.hasSpansSatisfyingExactly( span -> diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java index 406456ed4ef4..1331c3e65b61 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java @@ -19,6 +19,7 @@ import com.couchbase.mock.httpio.HttpServer; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @@ -114,21 +115,32 @@ protected SpanDataAssert assertCouchbaseSpan( return assertCouchbaseSpan(span, operation, operation, bucketName, null); } + @SuppressWarnings("deprecation") // using deprecated semconv protected SpanDataAssert assertCouchbaseSpan( SpanDataAssert span, String spanName, String operation, String bucketName, String statement) { span.hasName(spanName).hasKind(SpanKind.CLIENT); List assertions = new ArrayList<>(); assertions.add( - equalTo(DbIncubatingAttributes.DB_SYSTEM, DbIncubatingAttributes.DbSystemValues.COUCHBASE)); + equalTo( + DbIncubatingAttributes.DB_SYSTEM, + DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE)); if (operation != null) { - assertions.add(equalTo(DbIncubatingAttributes.DB_OPERATION, operation)); + assertions.add( + equalTo( + SemconvStabilityUtil.getAttributeKey(DbIncubatingAttributes.DB_OPERATION), + operation)); } if (bucketName != null) { - assertions.add(equalTo(DbIncubatingAttributes.DB_NAME, bucketName)); + assertions.add( + equalTo( + SemconvStabilityUtil.getAttributeKey(DbIncubatingAttributes.DB_NAME), bucketName)); } if (statement != null) { - assertions.add(satisfies(DbIncubatingAttributes.DB_STATEMENT, s -> s.startsWith(statement))); + assertions.add( + satisfies( + SemconvStabilityUtil.getAttributeKey(DbIncubatingAttributes.DB_STATEMENT), + s -> s.startsWith(statement))); } assertions.addAll(couchbaseAttributes()); diff --git a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java index 698320035221..1c1520c5bfef 100644 --- a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java @@ -35,6 +35,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.testcontainers.elasticsearch.ElasticsearchContainer; +@SuppressWarnings("deprecation") // using deprecated semconv class ElasticsearchClientTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchDbAttributesGetter.java b/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchDbAttributesGetter.java index 22bc0374d444..fc72192dea24 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchDbAttributesGetter.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchDbAttributesGetter.java @@ -27,7 +27,7 @@ final class ElasticsearchDbAttributesGetter private static final Logger logger = Logger.getLogger(ElasticsearchDbAttributesGetter.class.getName()); - // copied from DbIncubatingAttributes.DbSystemValues + // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String ELASTICSEARCH = "elasticsearch"; private final boolean captureSearchQuery; @@ -37,10 +37,11 @@ final class ElasticsearchDbAttributesGetter } @Override - public String getSystem(ElasticsearchRestRequest request) { + public String getDbSystem(ElasticsearchRestRequest request) { return ELASTICSEARCH; } + @Deprecated @Override @Nullable public String getUser(ElasticsearchRestRequest request) { @@ -49,10 +50,11 @@ public String getUser(ElasticsearchRestRequest request) { @Override @Nullable - public String getName(ElasticsearchRestRequest request) { + public String getDbNamespace(ElasticsearchRestRequest request) { return null; } + @Deprecated @Override @Nullable public String getConnectionString(ElasticsearchRestRequest request) { @@ -61,7 +63,7 @@ public String getConnectionString(ElasticsearchRestRequest request) { @Override @Nullable - public String getStatement(ElasticsearchRestRequest request) { + public String getDbQueryText(ElasticsearchRestRequest request) { ElasticsearchEndpointDefinition epDefinition = request.getEndpointDefinition(); HttpEntity httpEntity = request.getHttpEntity(); if (captureSearchQuery @@ -85,7 +87,7 @@ public String getStatement(ElasticsearchRestRequest request) { @Override @Nullable - public String getOperation(ElasticsearchRestRequest request) { + public String getDbOperationName(ElasticsearchRestRequest request) { ElasticsearchEndpointDefinition endpointDefinition = request.getEndpointDefinition(); return endpointDefinition != null ? endpointDefinition.getEndpointName() : null; } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchSpanNameExtractor.java b/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchSpanNameExtractor.java index 1faf90ee33e2..1fd48256c8d5 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchSpanNameExtractor.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchSpanNameExtractor.java @@ -21,7 +21,7 @@ public ElasticsearchSpanNameExtractor(ElasticsearchDbAttributesGetter dbAttribut @Override public String extract(ElasticsearchRestRequest elasticsearchRestRequest) { - String name = dbAttributesGetter.getOperation(elasticsearchRestRequest); + String name = dbAttributesGetter.getDbOperationName(elasticsearchRestRequest); return name != null ? name : elasticsearchRestRequest.getMethod(); } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java index 9dd228ebfafc..e04bd93b3071 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringRepositoryTest.java @@ -26,6 +26,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import spock.util.environment.Jvm; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) class Elasticsearch53SpringRepositoryTest { @@ -87,7 +88,7 @@ void emptyRepository() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), @@ -121,7 +122,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), equalTo(stringKey("elasticsearch.action"), "IndexAction"), equalTo(stringKey("elasticsearch.request"), "IndexRequest"), @@ -139,7 +140,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), @@ -170,7 +171,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(stringKey("elasticsearch.action"), "GetAction"), equalTo(stringKey("elasticsearch.request"), "GetRequest"), @@ -204,7 +205,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), equalTo(stringKey("elasticsearch.action"), "IndexAction"), equalTo(stringKey("elasticsearch.request"), "IndexRequest"), @@ -222,7 +223,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), @@ -248,7 +249,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(stringKey("elasticsearch.action"), "GetAction"), equalTo(stringKey("elasticsearch.request"), "GetRequest"), @@ -280,7 +281,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "DeleteAction"), equalTo(stringKey("elasticsearch.action"), "DeleteAction"), equalTo(stringKey("elasticsearch.request"), "DeleteRequest"), @@ -297,7 +298,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), @@ -323,7 +324,7 @@ void crud() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java index 9f4051ef3bcc..8127aacc342f 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/v5_3/springdata/Elasticsearch53SpringTemplateTest.java @@ -61,6 +61,7 @@ import org.testcontainers.shaded.com.google.common.collect.ImmutableMap; import spock.util.environment.Jvm; +@SuppressWarnings("deprecation") // using deprecated semconv class Elasticsearch53SpringTemplateTest { private static final Logger logger = LoggerFactory.getLogger(Elasticsearch53SpringTemplateTest.class); @@ -171,7 +172,7 @@ void elasticsearchError() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), @@ -226,7 +227,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "CreateIndexAction"), equalTo(stringKey("elasticsearch.action"), "CreateIndexAction"), equalTo(stringKey("elasticsearch.request"), "CreateIndexRequest"), @@ -240,7 +241,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), equalTo(stringKey("elasticsearch.action"), "ClusterHealthAction"), equalTo(stringKey("elasticsearch.request"), "ClusterHealthRequest"))), @@ -253,7 +254,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), @@ -268,7 +269,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), equalTo(stringKey("elasticsearch.action"), "IndexAction"), equalTo(stringKey("elasticsearch.request"), "IndexRequest"), @@ -288,7 +289,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "RefreshAction"), equalTo(stringKey("elasticsearch.action"), "RefreshAction"), equalTo(stringKey("elasticsearch.request"), "RefreshRequest"), @@ -305,7 +306,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), @@ -389,7 +390,7 @@ void resultsExtractor() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "SearchAction"), equalTo(stringKey("elasticsearch.action"), "SearchAction"), equalTo(stringKey("elasticsearch.request"), "SearchRequest"), diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportAttributesGetter.java b/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportAttributesGetter.java index 537dd06bed20..cbd713f364f6 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportAttributesGetter.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/ElasticsearchTransportAttributesGetter.java @@ -13,36 +13,38 @@ final class ElasticsearchTransportAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(ElasticTransportRequest s) { - return DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH; + public String getDbSystem(ElasticTransportRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH; } + @Deprecated @Override @Nullable - public String getUser(ElasticTransportRequest s) { + public String getUser(ElasticTransportRequest request) { return null; } @Override @Nullable - public String getName(ElasticTransportRequest s) { + public String getDbNamespace(ElasticTransportRequest request) { return null; } + @Deprecated @Override @Nullable - public String getConnectionString(ElasticTransportRequest s) { + public String getConnectionString(ElasticTransportRequest request) { return null; } @Override @Nullable - public String getStatement(ElasticTransportRequest s) { + public String getDbQueryText(ElasticTransportRequest request) { return null; } @Override - public String getOperation(ElasticTransportRequest action) { - return action.getAction().getClass().getSimpleName(); + public String getDbOperationName(ElasticTransportRequest request) { + return request.getAction().getClass().getSimpleName(); } } diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java index 02937bfc8c02..05d534f96a48 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchNodeClientTest.java @@ -34,6 +34,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractElasticsearchNodeClientTest extends AbstractElasticsearchClientTest { @@ -68,7 +69,7 @@ void elasticsearchStatus(ThrowingSupplier suppli .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_ACTION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_REQUEST, "ClusterHealthRequest")), @@ -117,7 +118,7 @@ void elasticsearchError(Runnable action) { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), @@ -179,7 +180,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "CreateIndexAction"), equalTo(ELASTICSEARCH_ACTION, "CreateIndexAction"), equalTo(ELASTICSEARCH_REQUEST, "CreateIndexRequest"), @@ -193,7 +194,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_ACTION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_REQUEST, "ClusterHealthRequest"))), @@ -206,7 +207,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), @@ -224,7 +225,7 @@ void elasticsearchGet() { addIndexActionAttributes( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), equalTo(ELASTICSEARCH_ACTION, "IndexAction"), equalTo(ELASTICSEARCH_REQUEST, "IndexRequest"), @@ -243,7 +244,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), diff --git a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java index 9b155e0dc434..8180c23900f7 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/AbstractElasticsearchTransportClientTest.java @@ -39,6 +39,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractElasticsearchTransportClientTest extends AbstractElasticsearchClientTest { @@ -81,7 +82,7 @@ void elasticsearchStatus(ThrowingSupplier suppli equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_ACTION, "ClusterHealthAction"), equalTo(ELASTICSEARCH_REQUEST, "ClusterHealthRequest"))), @@ -137,7 +138,7 @@ void elasticsearchError(Runnable action) { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), @@ -198,7 +199,7 @@ void elasticsearchGet() { equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "CreateIndexAction"), equalTo(ELASTICSEARCH_ACTION, "CreateIndexAction"), equalTo(ELASTICSEARCH_REQUEST, "CreateIndexRequest"), @@ -212,7 +213,7 @@ void elasticsearchGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, getPutMappingActionName()), equalTo(ELASTICSEARCH_ACTION, getPutMappingActionName()), equalTo(ELASTICSEARCH_REQUEST, "PutMappingRequest"))), @@ -228,7 +229,7 @@ void elasticsearchGet() { equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "IndexAction"), equalTo(ELASTICSEARCH_ACTION, "IndexAction"), equalTo(ELASTICSEARCH_REQUEST, "IndexRequest"), @@ -251,7 +252,7 @@ void elasticsearchGet() { equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), @@ -271,7 +272,7 @@ void elasticsearchGet() { equalTo(NetworkAttributes.NETWORK_PEER_PORT, getPort()), equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.ELASTICSEARCH), + DbIncubatingAttributes.DbSystemIncubatingValues.ELASTICSEARCH), equalTo(DbIncubatingAttributes.DB_OPERATION, "GetAction"), equalTo(ELASTICSEARCH_ACTION, "GetAction"), equalTo(ELASTICSEARCH_REQUEST, "GetRequest"), diff --git a/instrumentation/executors/javaagent/build.gradle.kts b/instrumentation/executors/javaagent/build.gradle.kts index 65fd4332209a..5d15c4b6a5ff 100644 --- a/instrumentation/executors/javaagent/build.gradle.kts +++ b/instrumentation/executors/javaagent/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { testImplementation(project(":instrumentation:executors:testing")) testImplementation("org.scala-lang:scala-library:2.11.12") testCompileOnly(project(":instrumentation:executors:bootstrap")) + testCompileOnly(project(":javaagent-bootstrap")) } testing { @@ -30,6 +31,7 @@ testing { dependencies { implementation(project(":instrumentation:executors:testing")) compileOnly(project(":instrumentation:executors:bootstrap")) + compileOnly(project(":javaagent-bootstrap")) } targets { diff --git a/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorsInstrumentationModule.java b/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorsInstrumentationModule.java index 60de54633025..b7e57eeee455 100644 --- a/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorsInstrumentationModule.java +++ b/instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorsInstrumentationModule.java @@ -10,10 +10,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.EarlyInstrumentationModule; import java.util.List; -@AutoService(InstrumentationModule.class) -public class ExecutorsInstrumentationModule extends InstrumentationModule { +@AutoService({InstrumentationModule.class, EarlyInstrumentationModule.class}) +public class ExecutorsInstrumentationModule extends InstrumentationModule + implements EarlyInstrumentationModule { public ExecutorsInstrumentationModule() { super("executors"); diff --git a/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ThreadPoolExecutorTest.java b/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ThreadPoolExecutorTest.java index e31d0d2d4fa0..010399cab3ce 100644 --- a/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ThreadPoolExecutorTest.java +++ b/instrumentation/executors/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/executors/ThreadPoolExecutorTest.java @@ -10,7 +10,9 @@ import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.context.Scope; +import io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.FutureTask; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -19,6 +21,11 @@ class ThreadPoolExecutorTest { + @Test + void virtualFieldsAdded() { + assertThat(VirtualFieldInstalledMarker.class).isAssignableFrom(FutureTask.class); + } + @Test void shouldPassOriginalRunnableToBeforeAfterMethods() throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); diff --git a/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java b/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java index f0f15e7f6d2b..0ce010e302ce 100644 --- a/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java +++ b/instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/GeodeDbAttributesGetter.java @@ -17,10 +17,11 @@ final class GeodeDbAttributesGetter implements DbClientAttributesGetter diff --git a/instrumentation/grails-3.0/javaagent/src/test/java/test/GrailsTest.java b/instrumentation/grails-3.0/javaagent/src/test/java/test/GrailsTest.java index 11abd923af40..e8d42efd8169 100644 --- a/instrumentation/grails-3.0/javaagent/src/test/java/test/GrailsTest.java +++ b/instrumentation/grails-3.0/javaagent/src/test/java/test/GrailsTest.java @@ -14,6 +14,8 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import grails.boot.GrailsApp; import grails.boot.config.GrailsAutoConfiguration; @@ -27,6 +29,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -35,6 +38,7 @@ import java.util.Locale; import java.util.Map; import java.util.function.Consumer; +import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.extension.RegisterExtension; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.web.ServerProperties; @@ -160,12 +164,19 @@ public SpanDataAssert assertHandlerSpan( @Override public SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { + String methodName; if (endpoint == REDIRECT) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); + methodName = "sendRedirect"; + } else if (endpoint == ERROR || endpoint == NOT_FOUND) { + methodName = "sendError"; } else { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + satisfies(CodeIncubatingAttributes.CODE_NAMESPACE, AbstractStringAssert::isNotEmpty)); return span; } @@ -178,13 +189,17 @@ public List> errorPageSpanAssertions( span.hasName( endpoint == NOT_FOUND ? "ErrorController.notFound" : "ErrorController.index") .hasKind(SpanKind.INTERNAL) - .hasAttributesSatisfying(Attributes::isEmpty)); + .hasAttributes(Attributes.empty())); if (endpoint == NOT_FOUND) { spanAssertions.add( span -> span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")) .hasKind(SpanKind.INTERNAL) - .hasAttributesSatisfying(Attributes::isEmpty)); + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, "sendError"), + satisfies( + CodeIncubatingAttributes.CODE_NAMESPACE, + AbstractStringAssert::isNotEmpty))); } return spanAssertions; } diff --git a/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java b/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java index fc40a585170b..afc4da0ca6bc 100644 --- a/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java +++ b/instrumentation/graphql-java/graphql-java-common/testing/src/main/java/io/opentelemetry/instrumentation/graphql/AbstractGraphqlTest.java @@ -238,7 +238,7 @@ void parseError() { span.hasName("GraphQL Operation") .hasKind(SpanKind.INTERNAL) .hasNoParent() - .hasAttributesSatisfying(Attributes::isEmpty) + .hasAttributes(Attributes.empty()) .hasStatus(StatusData.error()) .hasEventsSatisfyingExactly( event -> @@ -280,7 +280,7 @@ void validationError() { span.hasName("GraphQL Operation") .hasKind(SpanKind.INTERNAL) .hasNoParent() - .hasAttributesSatisfying(Attributes::isEmpty) + .hasAttributes(Attributes.empty()) .hasStatus(StatusData.error()) .hasEventsSatisfyingExactly( event -> diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java index 9153436ba922..cfc1906634ab 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcStreamingTest.java @@ -61,8 +61,8 @@ void tearDown() throws Throwable { } } + @SuppressWarnings("deprecation") // using deprecated semconv @CartesianTest - @SuppressWarnings({"unchecked", "rawtypes"}) void conversation( @CartesianTest.Values(ints = {1, 2, 3}) int clientMessageCount, @CartesianTest.Values(ints = {1, 2, 3}) int serverMessageCount) @@ -195,8 +195,7 @@ public void onCompleted() { .satisfies( spanData -> assertThat(spanData.getEvents()) - .satisfiesExactlyInAnyOrder( - events.toArray(new Consumer[0]))), + .satisfiesExactlyInAnyOrder(toArray(events))), span -> span.hasName("example.Greeter/Conversation") .hasKind(SpanKind.SERVER) @@ -218,8 +217,7 @@ public void onCompleted() { .satisfies( spanData -> assertThat(spanData.getEvents()) - .satisfiesExactlyInAnyOrder( - events.toArray(new Consumer[0]))))); + .satisfiesExactlyInAnyOrder(toArray(events))))); testing() .waitAndAssertMetrics( "io.opentelemetry.grpc-1.6", @@ -384,4 +382,9 @@ private static void usePlainText(ManagedChannelBuilder channelBuilder) throws channelBuilder.getClass().getMethod("usePlaintext").invoke(channelBuilder); } } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static Consumer[] toArray(List> list) { + return list.toArray(new Consumer[0]); + } } diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java index bc812d26babd..2dd00edfe5eb 100644 --- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java +++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java @@ -74,6 +74,7 @@ import org.junit.jupiter.params.provider.ArgumentsSource; import org.junit.jupiter.params.provider.ValueSource; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractGrpcTest { protected static final String CLIENT_REQUEST_METADATA_KEY = "some-client-key"; diff --git a/instrumentation/gwt-2.0/javaagent/build.gradle.kts b/instrumentation/gwt-2.0/javaagent/build.gradle.kts index 7a94b9010330..eeb020869ef6 100644 --- a/instrumentation/gwt-2.0/javaagent/build.gradle.kts +++ b/instrumentation/gwt-2.0/javaagent/build.gradle.kts @@ -88,6 +88,12 @@ tasks { classpath(sourceSets["testapp"].java.srcDirs, sourceSets["testapp"].compileClasspath) argumentProviders.add(CompilerArgumentsProvider()) + + if (findProperty("testLatestDeps") as Boolean) { + javaLauncher.set(project.javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(11) + }) + } } val copyTestWebapp by registering(Copy::class) { diff --git a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java index c2152b4c8dc0..bf382ba49237 100644 --- a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java +++ b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java @@ -8,16 +8,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import java.time.Duration; import java.util.concurrent.CompletableFuture; @@ -294,6 +290,7 @@ private static void complete( } } + @SuppressWarnings("deprecation") // using deprecated semconv private static void assertTrace() { testing.waitAndAssertTraces( trace -> @@ -304,13 +301,13 @@ private static void assertTrace() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), equalTo( - DB_STATEMENT, + DbIncubatingAttributes.DB_STATEMENT, "select value0_.id as id1_0_0_, value0_.name as name2_0_0_ from Value value0_ where value0_.id=$1"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "Value"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> diff --git a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java index a7ec8dc7248d..3d418604fd15 100644 --- a/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java +++ b/instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive2Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/HibernateReactiveTest.java @@ -8,16 +8,12 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; @@ -286,6 +282,7 @@ private static void complete( } } + @SuppressWarnings("deprecation") // using deprecated semconv private static void assertTrace() { testing.waitAndAssertTraces( trace -> @@ -296,13 +293,13 @@ private static void assertTrace() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), equalTo( - DB_STATEMENT, + DbIncubatingAttributes.DB_STATEMENT, "select v1_0.id,v1_0.name from Value v1_0 where v1_0.id=$1"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "Value"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "Value"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> diff --git a/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbAttributesGetter.java b/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbAttributesGetter.java index c73bf348583b..39460c14a135 100644 --- a/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbAttributesGetter.java +++ b/instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbAttributesGetter.java @@ -12,13 +12,13 @@ final class InfluxDbAttributesGetter implements DbClientAttributesGetter attributeAssertions( String statement, String operation, String databaseName) { List result = new ArrayList<>(); diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java index 74ef07ba249c..f619782f5024 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java @@ -47,10 +47,7 @@ public class BootDelegationInstrumentation implements TypeInstrumentation { public ElementMatcher typeMatcher() { // just an optimization to exclude common class loaders that are known to delegate to the // bootstrap loader (or happen to _be_ the bootstrap loader) - return not(namedOneOf( - "java.lang.ClassLoader", - "com.ibm.oti.vm.BootstrapClassLoader", - "io.opentelemetry.javaagent.bootstrap.AgentClassLoader")) + return not(namedOneOf("java.lang.ClassLoader", "com.ibm.oti.vm.BootstrapClassLoader")) .and(extendsClass(named("java.lang.ClassLoader"))); } @@ -136,13 +133,14 @@ public static Class onEnter(@Advice.Argument(0) String name) { return null; } - @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) Class result, - @Advice.Enter Class resultFromBootstrapLoader) { + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + @Advice.AssignReturned.ToReturned + public static Class onExit( + @Advice.Return Class result, @Advice.Enter Class resultFromBootstrapLoader) { if (resultFromBootstrapLoader != null) { - result = resultFromBootstrapLoader; + return resultFromBootstrapLoader; } + return result; } } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java index 91fbb3b4baf9..8707d329b222 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java @@ -25,13 +25,10 @@ public boolean defaultEnabled(ConfigProperties config) { return true; } - @Override - public boolean isIndyModule() { - return false; - } - @Override public boolean isHelperClass(String className) { + // TODO: this can be removed when we drop inlined-advice support + // The advices can directly access this class in the AgentClassLoader with invokedynamic Advice return className.equals("io.opentelemetry.javaagent.tooling.Constants"); } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/DefineClassInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/DefineClassInstrumentation.java index 1e3b63acf1a8..20ca23bb8b0d 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/DefineClassInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/DefineClassInstrumentation.java @@ -52,9 +52,15 @@ public static DefineClassContext onEnter( classLoader, className, classBytes, offset, length); } + // TODO: the ToReturned does nothing except for signaling the AdviceTransformer that it must + // not touch this advice + // this is done because we do not want the return values to be wrapped in array types @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit(@Advice.Enter DefineClassContext context) { + @Advice.AssignReturned.ToReturned + public static Class onExit( + @Advice.Enter DefineClassContext context, @Advice.Return Class returned) { DefineClassHelper.afterDefineClass(context); + return returned; } } @@ -68,9 +74,15 @@ public static DefineClassContext onEnter( return DefineClassHelper.beforeDefineClass(classLoader, className, classBytes); } + // TODO: the ToReturned does nothing except for signaling the AdviceTransformer that it must + // not touch this advice + // this is done because we do not want the return values to be wrapped in array types @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit(@Advice.Enter DefineClassContext context) { + @Advice.AssignReturned.ToReturned + public static Class onExit( + @Advice.Enter DefineClassContext context, @Advice.Return Class returned) { DefineClassHelper.afterDefineClass(context); + return returned; } } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java index e39f0eef8459..c967eef599d0 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java @@ -65,11 +65,13 @@ public static Class onEnter( } @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) Class result, @Advice.Enter Class loadedClass) { + @Advice.AssignReturned.ToReturned + public static Class onExit( + @Advice.Return Class result, @Advice.Enter Class loadedClass) { if (loadedClass != null) { - result = loadedClass; + return loadedClass; } + return result; } } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ResourceInjectionInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ResourceInjectionInstrumentation.java index de47454033a8..65076ce645d7 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ResourceInjectionInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ResourceInjectionInstrumentation.java @@ -61,18 +61,18 @@ public void transform(TypeTransformer transformer) { public static class GetResourceAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void onExit( + @Advice.AssignReturned.ToReturned + public static URL onExit( @Advice.This ClassLoader classLoader, @Advice.Argument(0) String name, - @Advice.Return(readOnly = false) URL resource) { - if (resource != null) { - return; - } - - URL helper = HelperResources.loadOne(classLoader, name); - if (helper != null) { - resource = helper; + @Advice.Return URL resource) { + if (resource == null) { + URL helper = HelperResources.loadOne(classLoader, name); + if (helper != null) { + return helper; + } } + return resource; } } @@ -80,18 +80,18 @@ public static void onExit( public static class GetResourcesAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void onExit( + @Advice.AssignReturned.ToReturned + public static Enumeration onExit( @Advice.This ClassLoader classLoader, @Advice.Argument(0) String name, - @Advice.Return(readOnly = false) Enumeration resources) { + @Advice.Return Enumeration resources) { List helpers = HelperResources.loadAll(classLoader, name); if (helpers.isEmpty()) { - return; + return resources; } if (!resources.hasMoreElements()) { - resources = Collections.enumeration(helpers); - return; + return Collections.enumeration(helpers); } List result = Collections.list(resources); @@ -108,8 +108,7 @@ public static void onExit( result.add(helperUrl); } } - - resources = Collections.enumeration(result); + return Collections.enumeration(result); } } @@ -117,22 +116,22 @@ public static void onExit( public static class GetResourceAsStreamAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void onExit( + @Advice.AssignReturned.ToReturned + public static InputStream onExit( @Advice.This ClassLoader classLoader, @Advice.Argument(0) String name, - @Advice.Return(readOnly = false) InputStream inputStream) { - if (inputStream != null) { - return; - } - - URL helper = HelperResources.loadOne(classLoader, name); - if (helper != null) { - try { - inputStream = helper.openStream(); - } catch (IOException ignored) { - // ClassLoader.getResourceAsStream also ignores io exceptions from opening the stream + @Advice.Return InputStream inputStream) { + if (inputStream == null) { + URL helper = HelperResources.loadOne(classLoader, name); + if (helper != null) { + try { + return helper.openStream(); + } catch (IOException ignored) { + // ClassLoader.getResourceAsStream also ignores io exceptions from opening the stream + } } } + return inputStream; } } } diff --git a/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionHelper.java b/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionHelper.java index 33f947491483..241c731f1469 100644 --- a/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionHelper.java +++ b/instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionHelper.java @@ -11,6 +11,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; public final class ReflectionHelper { @@ -61,21 +63,23 @@ public static Class[] filterInterfaces(Class[] interfaces, Class contai return interfaces; } List> result = new ArrayList<>(interfaces.length); + Collection virtualFieldClassNames = new HashSet<>(); boolean hasVirtualFieldMarker = false; for (Class interfaceClass : interfaces) { // filter out virtual field marker and accessor interfaces - if (interfaceClass == VirtualFieldInstalledMarker.class - || (VirtualFieldAccessorMarker.class.isAssignableFrom(interfaceClass) - && interfaceClass.isSynthetic() - && interfaceClass.getName().contains("VirtualFieldAccessor$"))) { - hasVirtualFieldMarker = true; + if (interfaceClass == VirtualFieldInstalledMarker.class) { + continue; + } else if (VirtualFieldAccessorMarker.class.isAssignableFrom(interfaceClass) + && interfaceClass.isSynthetic() + && interfaceClass.getName().contains("VirtualFieldAccessor$")) { + virtualFieldClassNames.add(interfaceClass.getName()); continue; } result.add(interfaceClass); } - if (hasVirtualFieldMarker) { - VirtualFieldDetector.markVirtualFieldsPresent(containingClass); + if (!virtualFieldClassNames.isEmpty()) { + VirtualFieldDetector.markVirtualFields(containingClass, virtualFieldClassNames); } return result.toArray(new Class[0]); diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index d89414baa55a..6d9742e9223e 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -61,6 +61,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; +@SuppressWarnings("deprecation") // using deprecated semconv class JdbcInstrumentationTest { @RegisterExtension static final AutoCleanupExtension cleanup = AutoCleanupExtension.create(); diff --git a/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala b/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala index dc1ff375acc6..fa8684e5dcfb 100644 --- a/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala +++ b/instrumentation/jdbc/javaagent/src/test/scala/io/opentelemetry/javaagent/instrumentation/scalaexecutors/SlickTest.scala @@ -14,11 +14,13 @@ import io.opentelemetry.javaagent.testing.common.Java8BytecodeBridge import io.opentelemetry.sdk.testing.assertj.{SpanDataAssert, TraceAssert} import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo import io.opentelemetry.semconv.incubating.DbIncubatingAttributes -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemValues +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemIncubatingValues + import java.util.function.Consumer import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.{Test, TestInstance} import org.junit.jupiter.api.extension.RegisterExtension + import scala.concurrent.{Await, Future} import scala.concurrent.duration.Duration import slick.jdbc.H2Profile.api._ @@ -81,7 +83,7 @@ class SlickTest { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbSystemValues.H2 + DbSystemIncubatingValues.H2 ), equalTo(DbIncubatingAttributes.DB_NAME, Db), equalTo(DbIncubatingAttributes.DB_USER, Username), diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java index fb35e335d9d7..7e71ddd5c6ab 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.jdbc.internal.dbinfo.DbInfo; import javax.annotation.Nullable; import javax.sql.DataSource; @@ -20,6 +21,7 @@ enum DataSourceDbAttributesExtractor implements AttributesExtractor DB_NAME = AttributeKey.stringKey("db.name"); + private static final AttributeKey DB_NAMESPACE = AttributeKey.stringKey("db.namespace"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); private static final AttributeKey DB_CONNECTION_STRING = @@ -39,10 +41,15 @@ public void onEnd( if (dbInfo == null) { return; } + if (SemconvStability.emitStableDatabaseSemconv()) { + internalSet(attributes, DB_NAMESPACE, getName(dbInfo)); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + internalSet(attributes, DB_USER, dbInfo.getUser()); + internalSet(attributes, DB_NAME, getName(dbInfo)); + internalSet(attributes, DB_CONNECTION_STRING, dbInfo.getShortUrl()); + } internalSet(attributes, DB_SYSTEM, dbInfo.getSystem()); - internalSet(attributes, DB_USER, dbInfo.getUser()); - internalSet(attributes, DB_NAME, getName(dbInfo)); - internalSet(attributes, DB_CONNECTION_STRING, dbInfo.getShortUrl()); } private static String getName(DbInfo dbInfo) { diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DbRequest.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DbRequest.java index ef22562b3239..f1360d9b1cac 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DbRequest.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DbRequest.java @@ -37,12 +37,11 @@ public static DbRequest create(Statement statement, String dbStatementString) { return create(extractDbInfo(connection), dbStatementString); } - public static DbRequest create(DbInfo dbInfo, String statement) { - return new AutoValue_DbRequest(dbInfo, statement); + public static DbRequest create(DbInfo dbInfo, String queryText) { + return new AutoValue_DbRequest(dbInfo, queryText); } public abstract DbInfo getDbInfo(); - @Nullable - public abstract String getStatement(); + public abstract String getQueryText(); } diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcAttributesGetter.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcAttributesGetter.java index ba04f3807395..b5623f4d99ce 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcAttributesGetter.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcAttributesGetter.java @@ -17,10 +17,11 @@ public final class JdbcAttributesGetter implements SqlClientAttributesGetter provideArguments(ExtensionContext context) { .setPort(666) .setName("orclsn") .build(), - arg("jdbc:oracle:thin:@(description = (connect_timeout=90)(retry_count=20)(retry_delay=3) (transport_connect_timeout=3000) (address_list = (load_balance = on) (failover = on) (address = (protocol = tcp)(host = orcl.host1)(port = 1521)) (address = (protocol = tcp)(host = orcl.host2)(port = 1521)) (address = (protocol = tcp)(host = orcl.host3)(port = 1521)) (address = (protocol = tcp)(host = orcl.host4)(port = 1521)) ) (connect_data = (server = dedicated) (service_name = orclsn)))") + arg("jdbc:oracle:thin:@ ( description = (connect_timeout=90)(retry_count=20)(retry_delay=3) (transport_connect_timeout=3000) (address_list = (load_balance = on) (failover = on) (address = (protocol = tcp)(host = orcl.host1 )(port = 1521 )) (address = (protocol = tcp)(host = orcl.host2)(port = 1521)) (address = (protocol = tcp)(host = orcl.host3)(port = 1521)) (address = (protocol = tcp)(host = orcl.host4)(port = 1521)) ) (connect_data = (server = dedicated) (service_name = orclsn)))") .setShortUrl("oracle:thin://orcl.host1:1521") .setSystem("oracle") .setSubtype("thin") diff --git a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java index 8ad1c67c30cb..b50e312e4f97 100644 --- a/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java +++ b/instrumentation/jedis/jedis-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisDbAttributesGetter.java @@ -17,10 +17,11 @@ final class JedisDbAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(JedisRequest request) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(JedisRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Override @Nullable public String getUser(JedisRequest request) { @@ -23,22 +24,23 @@ public String getUser(JedisRequest request) { } @Override - public String getName(JedisRequest request) { + public String getDbNamespace(JedisRequest request) { return null; } + @Deprecated @Override public String getConnectionString(JedisRequest request) { return null; } @Override - public String getStatement(JedisRequest request) { + public String getDbQueryText(JedisRequest request) { return request.getStatement(); } @Override - public String getOperation(JedisRequest request) { + public String getDbOperationName(JedisRequest request) { return request.getOperation(); } } diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java index be3e155d06fc..1889d2a7d66d 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java @@ -26,6 +26,7 @@ import org.testcontainers.containers.GenericContainer; import redis.clients.jedis.Jedis; +@SuppressWarnings("deprecation") // using deprecated semconv class Jedis30ClientTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisDbAttributesGetter.java b/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisDbAttributesGetter.java index 4d77c785d768..8cdd49df99e8 100644 --- a/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisDbAttributesGetter.java +++ b/instrumentation/jedis/jedis-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/JedisDbAttributesGetter.java @@ -12,10 +12,11 @@ final class JedisDbAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(JedisRequest request) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(JedisRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Override @Nullable public String getUser(JedisRequest request) { @@ -23,22 +24,23 @@ public String getUser(JedisRequest request) { } @Override - public String getName(JedisRequest request) { + public String getDbNamespace(JedisRequest request) { return null; } + @Deprecated @Override public String getConnectionString(JedisRequest request) { return null; } @Override - public String getStatement(JedisRequest request) { + public String getDbQueryText(JedisRequest request) { return request.getStatement(); } @Override - public String getOperation(JedisRequest request) { + public String getDbOperationName(JedisRequest request) { return request.getOperation(); } } diff --git a/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java b/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java index 0d54274d9a35..fb8db40a906b 100644 --- a/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java +++ b/instrumentation/jedis/jedis-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v4_0/Jedis40ClientTest.java @@ -23,6 +23,7 @@ import org.testcontainers.containers.GenericContainer; import redis.clients.jedis.Jedis; +@SuppressWarnings("deprecation") // using deprecated semconv class Jedis40ClientTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java b/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java index 4b7fd9f9d3b8..126b79a1da43 100644 --- a/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java +++ b/instrumentation/jetty/jetty-11.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/JettyHandlerTest.java @@ -14,10 +14,10 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.Sets; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; @@ -26,6 +26,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.semconv.HttpAttributes; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import jakarta.servlet.DispatcherType; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -89,12 +90,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { + String methodName; if (endpoint == REDIRECT) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); + methodName = "sendRedirect"; } else if (endpoint == ERROR) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + equalTo(CodeIncubatingAttributes.CODE_NAMESPACE, "org.eclipse.jetty.server.Response")); return span; } diff --git a/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java b/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java index 46b178e06561..9d0e5e728f00 100644 --- a/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java +++ b/instrumentation/jetty/jetty-12.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v12_0/Jetty12HandlerTest.java @@ -14,10 +14,10 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.Sets; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; @@ -26,6 +26,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.semconv.HttpAttributes; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Collections; @@ -69,12 +70,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { + String methodName; if (endpoint == REDIRECT) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); + methodName = "sendRedirect"; } else if (endpoint == ERROR) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + equalTo(CodeIncubatingAttributes.CODE_NAMESPACE, "org.eclipse.jetty.server.Response")); return span; } diff --git a/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java b/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java index b18f7a292065..30b119a60c8f 100644 --- a/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java +++ b/instrumentation/jetty/jetty-8.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/JettyHandlerTest.java @@ -14,10 +14,10 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.Sets; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest; @@ -26,6 +26,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.semconv.HttpAttributes; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.IOException; import java.io.Writer; import java.util.Collections; @@ -89,12 +90,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { + String methodName; if (endpoint == REDIRECT) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); + methodName = "sendRedirect"; } else if (endpoint == ERROR) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + equalTo(CodeIncubatingAttributes.CODE_NAMESPACE, "org.eclipse.jetty.server.Response")); return span; } diff --git a/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java b/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java index 439fa62de2ec..0b9813b49fdb 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/jms2Test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms2InstrumentationTest.java @@ -60,6 +60,7 @@ import org.junit.jupiter.params.provider.ArgumentsProvider; import org.junit.jupiter.params.provider.ArgumentsSource; +@SuppressWarnings("deprecation") // using deprecated semconv public class Jms2InstrumentationTest { @RegisterExtension diff --git a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java index 76aba2ac0414..9e06b0854a1d 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/AbstractJms1Test.java @@ -46,6 +46,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +@SuppressWarnings("deprecation") // using deprecated semconv abstract class AbstractJms1Test { static final Logger logger = LoggerFactory.getLogger(AbstractJms1Test.class); diff --git a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java index dc21edad5f6d..2de618b59df7 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1InstrumentationTest.java @@ -24,6 +24,7 @@ class Jms1InstrumentationTest extends AbstractJms1Test { + @SuppressWarnings("deprecation") // using deprecated semconv @ArgumentsSource(DestinationsProvider.class) @ParameterizedTest void testMessageConsumer( diff --git a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java index 261f2c3e87f9..e5706f69e175 100644 --- a/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java +++ b/instrumentation/jms/jms-1.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v1_1/Jms1SuppressReceiveSpansTest.java @@ -21,6 +21,7 @@ class Jms1SuppressReceiveSpansTest extends AbstractJms1Test { + @SuppressWarnings("deprecation") // using deprecated semconv @ArgumentsSource(DestinationsProvider.class) @ParameterizedTest void testMessageConsumer( diff --git a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java index 0e90b1164c3b..8f2939f03606 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/AbstractJms3Test.java @@ -48,6 +48,7 @@ import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.wait.strategy.Wait; +@SuppressWarnings("deprecation") // using deprecated semconv abstract class AbstractJms3Test { static final Logger logger = LoggerFactory.getLogger(AbstractJms3Test.class); diff --git a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java index b5f8b1f3cd58..28a074bf9db0 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3InstrumentationTest.java @@ -25,6 +25,7 @@ class Jms3InstrumentationTest extends AbstractJms3Test { + @SuppressWarnings("deprecation") // using deprecated semconv @ArgumentsSource(DestinationsProvider.class) @ParameterizedTest void testMessageConsumer(DestinationFactory destinationFactory, boolean isTemporary) diff --git a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java index 3789a29acf34..423616096a88 100644 --- a/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java +++ b/instrumentation/jms/jms-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jms/v3_0/Jms3SuppressReceiveSpansTest.java @@ -22,6 +22,7 @@ class Jms3SuppressReceiveSpansTest extends AbstractJms3Test { + @SuppressWarnings("deprecation") // using deprecated semconv @ArgumentsSource(DestinationsProvider.class) @ParameterizedTest void testMessageConsumer(DestinationFactory destinationFactory, boolean isTemporary) diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java index 119aa628ae98..0698eb811521 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafka/internal/KafkaClientBaseTest.java @@ -54,6 +54,8 @@ public abstract class KafkaClientBaseTest { private static final Logger logger = LoggerFactory.getLogger(KafkaClientBaseTest.class); protected static final String SHARED_TOPIC = "shared.topic"; + protected static final AttributeKey MESSAGING_CLIENT_ID = + AttributeKey.stringKey("messaging.client_id"); private KafkaContainer kafka; protected Producer producer; @@ -153,6 +155,7 @@ public void awaitUntilConsumerIsReady() throws InterruptedException { consumer.seekToBeginning(Collections.emptyList()); } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List sendAttributes( String messageKey, String messageValue, boolean testHeaders) { List assertions = @@ -161,9 +164,7 @@ protected static List sendAttributes( equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("producer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), @@ -187,6 +188,7 @@ protected static List sendAttributes( return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List receiveAttributes(boolean testHeaders) { List assertions = new ArrayList<>( @@ -194,9 +196,7 @@ protected static List receiveAttributes(boolean testHeaders) equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), satisfies( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isPositive))); @@ -213,6 +213,7 @@ protected static List receiveAttributes(boolean testHeaders) return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List processAttributes( String messageKey, String messageValue, boolean testHeaders) { List assertions = @@ -221,9 +222,7 @@ protected static List processAttributes( equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java index 8d70c340f60a..ad2df34dc8c9 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsSuppressReceiveSpansTest.java @@ -16,6 +16,7 @@ class InterceptorsSuppressReceiveSpansTest extends AbstractInterceptorsTest { + @SuppressWarnings("deprecation") // using deprecated semconv @Override void assertTraces() { testing.waitAndAssertTraces( @@ -33,7 +34,7 @@ void assertTraces() { SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer"))), span -> span.hasName(SHARED_TOPIC + " process") @@ -58,7 +59,7 @@ void assertTraces() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))), span -> span.hasName("process child") diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java index 35e723247b44..83f87c8edc72 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java @@ -21,6 +21,7 @@ class InterceptorsTest extends AbstractInterceptorsTest { + @SuppressWarnings("deprecation") // using deprecated semconv @Override void assertTraces() { AtomicReference producerSpanContext = new AtomicReference<>(); @@ -40,7 +41,7 @@ void assertTraces() { SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); SpanContext spanContext = trace.getSpan(1).getSpanContext(); producerSpanContext.set( @@ -67,7 +68,7 @@ void assertTraces() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)), @@ -95,7 +96,7 @@ void assertTraces() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))), span -> span.hasName("process child") diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java index 04c1babf5b60..55b4b37e0234 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java @@ -53,6 +53,7 @@ void assertTraces(boolean testHeaders) { .hasParent(trace.getSpan(0)))); } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List sendAttributes(boolean testHeaders) { List assertions = new ArrayList<>( @@ -60,9 +61,7 @@ protected static List sendAttributes(boolean testHeaders) { equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("producer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), @@ -78,6 +77,7 @@ protected static List sendAttributes(boolean testHeaders) { return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv private static List processAttributes(String greeting, boolean testHeaders) { List assertions = new ArrayList<>( @@ -99,8 +99,7 @@ private static List processAttributes(String greeting, boole AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")))); + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")))); if (testHeaders) { assertions.add( equalTo( diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java index aaa6730f1dd6..5728847319e6 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java @@ -75,6 +75,7 @@ void assertTraces(boolean testHeaders) { .hasParent(trace.getSpan(1)))); } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List sendAttributes(boolean testHeaders) { List assertions = new ArrayList<>( @@ -82,9 +83,7 @@ protected static List sendAttributes(boolean testHeaders) { equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"), equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("producer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), @@ -100,6 +99,7 @@ protected static List sendAttributes(boolean testHeaders) { return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv private static List processAttributes(String greeting, boolean testHeaders) { List assertions = new ArrayList<>( @@ -121,8 +121,7 @@ private static List processAttributes(String greeting, boole AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")))); + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")))); if (testHeaders) { assertions.add( equalTo( @@ -132,6 +131,7 @@ private static List processAttributes(String greeting, boole return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List receiveAttributes(boolean testHeaders) { List assertions = new ArrayList<>( @@ -140,9 +140,7 @@ protected static List receiveAttributes(boolean testHeaders) equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, SHARED_TOPIC), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (testHeaders) { assertions.add( diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsBaseTest.groovy b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsBaseTest.groovy deleted file mode 100644 index 96b1827d03f0..000000000000 --- a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsBaseTest.groovy +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import org.apache.kafka.clients.admin.AdminClient -import org.apache.kafka.clients.admin.NewTopic -import org.apache.kafka.clients.consumer.Consumer -import org.apache.kafka.clients.consumer.ConsumerRebalanceListener -import org.apache.kafka.clients.consumer.KafkaConsumer -import org.apache.kafka.clients.producer.KafkaProducer -import org.apache.kafka.clients.producer.Producer -import org.apache.kafka.common.TopicPartition -import org.apache.kafka.common.serialization.IntegerDeserializer -import org.apache.kafka.common.serialization.IntegerSerializer -import org.apache.kafka.common.serialization.StringDeserializer -import org.apache.kafka.common.serialization.StringSerializer -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testcontainers.containers.output.Slf4jLogConsumer -import org.testcontainers.containers.wait.strategy.Wait -import org.testcontainers.kafka.KafkaContainer -import org.testcontainers.utility.DockerImageName -import spock.lang.Shared - -import java.time.Duration -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit - -class KafkaStreamsBaseTest extends AgentInstrumentationSpecification { - private static final Logger logger = LoggerFactory.getLogger("io.opentelemetry.KafkaStreamsBaseTest") - - protected static final STREAM_PENDING = "test.pending" - protected static final STREAM_PROCESSED = "test.processed" - - @Shared - static KafkaContainer kafka - @Shared - static Producer producer - @Shared - static Consumer consumer - @Shared - static CountDownLatch consumerReady = new CountDownLatch(1) - - def setupSpec() { - kafka = new KafkaContainer(DockerImageName.parse("apache/kafka:3.8.0")) - .withEnv("KAFKA_HEAP_OPTS", "-Xmx256m") - .withLogConsumer(new Slf4jLogConsumer(logger)) - .waitingFor(Wait.forLogMessage(".*started \\(kafka.server.Kafka.*Server\\).*", 1)) - .withStartupTimeout(Duration.ofMinutes(1)) - kafka.start() - - // create test topic - AdminClient.create(["bootstrap.servers": kafka.bootstrapServers]).withCloseable { admin -> - admin.createTopics([ - new NewTopic(STREAM_PENDING, 1, (short) 1), - new NewTopic(STREAM_PROCESSED, 1, (short) 1), - ]).all().get(10, TimeUnit.SECONDS) - } - - producer = new KafkaProducer<>(producerProps(kafka.bootstrapServers)) - - def consumerProps = [ - "bootstrap.servers" : kafka.bootstrapServers, - "group.id" : "test", - "enable.auto.commit" : "true", - "auto.commit.interval.ms": "10", - "session.timeout.ms" : "30000", - "key.deserializer" : IntegerDeserializer, - "value.deserializer" : StringDeserializer - ] - consumer = new KafkaConsumer<>(consumerProps) - - consumer.subscribe([STREAM_PROCESSED], new ConsumerRebalanceListener() { - @Override - void onPartitionsRevoked(Collection collection) { - } - - @Override - void onPartitionsAssigned(Collection collection) { - consumerReady.countDown() - } - }) - } - - def cleanupSpec() { - consumer?.close() - producer?.close() - kafka.stop() - } - - static Map producerProps(String servers) { - // values copied from spring's KafkaTestUtils - return [ - "bootstrap.servers": servers, - "retries" : 0, - "batch.size" : "16384", - "linger.ms" : 1, - "buffer.memory" : "33554432", - "key.serializer" : IntegerSerializer, - "value.serializer" : StringSerializer - ] - } - - // Kafka's eventual consistency behavior forces us to do a couple of empty poll() calls until it gets properly assigned a topic partition - static void awaitUntilConsumerIsReady() { - if (consumerReady.await(0, TimeUnit.SECONDS)) { - return - } - for (i in 0..<10) { - consumer.poll(0) - if (consumerReady.await(1, TimeUnit.SECONDS)) { - break - } - } - if (consumerReady.getCount() != 0) { - throw new AssertionError("Consumer wasn't assigned any partitions!") - } - consumer.seekToBeginning([]) - } -} diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsDefaultTest.groovy b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsDefaultTest.groovy deleted file mode 100644 index d50f9e950dba..000000000000 --- a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsDefaultTest.groovy +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.api.trace.Span -import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator -import io.opentelemetry.context.Context -import io.opentelemetry.context.propagation.TextMapGetter -import io.opentelemetry.sdk.trace.data.SpanData -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes -import org.apache.kafka.clients.producer.ProducerRecord -import org.apache.kafka.common.header.Headers -import org.apache.kafka.common.serialization.Serdes -import org.apache.kafka.streams.KafkaStreams -import org.apache.kafka.streams.StreamsConfig -import org.apache.kafka.streams.kstream.KStream -import org.apache.kafka.streams.kstream.ValueMapper - -import java.time.Duration - -import static io.opentelemetry.api.trace.SpanKind.CONSUMER -import static io.opentelemetry.api.trace.SpanKind.PRODUCER - -class KafkaStreamsDefaultTest extends KafkaStreamsBaseTest { - - def "test kafka produce and consume with streams in-between"() { - setup: - def config = new Properties() - config.putAll(producerProps(KafkaStreamsBaseTest.kafka.bootstrapServers)) - config.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-application") - config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.Integer().getClass().getName()) - config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()) - - // CONFIGURE PROCESSOR - def builder - try { - // Different class names for test and latestDepTest. - builder = Class.forName("org.apache.kafka.streams.kstream.KStreamBuilder").newInstance() - } catch (ClassNotFoundException | NoClassDefFoundError e) { - builder = Class.forName("org.apache.kafka.streams.StreamsBuilder").newInstance() - } - KStream textLines = builder.stream(STREAM_PENDING) - def values = textLines - .mapValues(new ValueMapper() { - @Override - String apply(String textLine) { - Span.current().setAttribute("asdf", "testing") - return textLine.toLowerCase() - } - }) - - KafkaStreams streams - try { - // Different api for test and latestDepTest. - values.to(Serdes.Integer(), Serdes.String(), STREAM_PROCESSED) - streams = new KafkaStreams(builder, config) - } catch (MissingMethodException e) { - def producer = Class.forName("org.apache.kafka.streams.kstream.Produced") - .with(Serdes.Integer(), Serdes.String()) - values.to(STREAM_PROCESSED, producer) - streams = new KafkaStreams(builder.build(), config) - } - streams.start() - - when: - String greeting = "TESTING TESTING 123!" - KafkaStreamsBaseTest.producer.send(new ProducerRecord<>(STREAM_PENDING, 10, greeting)) - - then: - awaitUntilConsumerIsReady() - def records = KafkaStreamsBaseTest.consumer.poll(Duration.ofSeconds(10).toMillis()) - Headers receivedHeaders = null - for (record in records) { - Span.current().setAttribute("testing", 123) - - assert record.key() == 10 - assert record.value() == greeting.toLowerCase() - - if (receivedHeaders == null) { - receivedHeaders = record.headers() - } - } - - assertTraces(3) { - traces.sort(orderByRootSpanName( - STREAM_PENDING + " publish", - STREAM_PENDING + " receive", - STREAM_PROCESSED + " receive")) - - SpanData producerPending, producerProcessed - - trace(0, 1) { - // kafka-clients PRODUCER - span(0) { - name STREAM_PENDING + " publish" - kind PRODUCER - hasNoParent() - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PENDING - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.startsWith("producer") } - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY" "10" - } - } - - producerPending = span(0) - } - trace(1, 3) { - // kafka-clients CONSUMER receive - span(0) { - name STREAM_PENDING + " receive" - kind CONSUMER - hasNoParent() - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PENDING - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "receive" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.endsWith("consumer") } - "$MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT" 1 - if (Boolean.getBoolean("testLatestDeps")) { - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP" "test-application" - } - } - } - // kafka-stream CONSUMER - span(1) { - name STREAM_PENDING + " process" - kind CONSUMER - childOf span(0) - hasLink(producerPending) - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PENDING - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.endsWith("consumer") } - "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE" Long - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY" "10" - "kafka.record.queue_time_ms" { it >= 0 } - "asdf" "testing" - if (Boolean.getBoolean("testLatestDeps")) { - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP" "test-application" - } - } - } - // kafka-clients PRODUCER - span(2) { - name STREAM_PROCESSED + " publish" - kind PRODUCER - childOf span(1) - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PROCESSED - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.endsWith("producer") } - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - } - } - - producerProcessed = span(2) - } - trace(2, 2) { - // kafka-clients CONSUMER receive - span(0) { - name STREAM_PROCESSED + " receive" - kind CONSUMER - hasNoParent() - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PROCESSED - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "receive" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.startsWith("consumer") } - "$MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT" 1 - if (Boolean.getBoolean("testLatestDeps")) { - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP" "test" - } - } - } - // kafka-clients CONSUMER process - span(1) { - name STREAM_PROCESSED + " process" - kind CONSUMER - childOf span(0) - hasLink producerProcessed - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PROCESSED - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.startsWith("consumer") } - "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE" Long - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY" "10" - if (Boolean.getBoolean("testLatestDeps")) { - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP" "test" - } - "kafka.record.queue_time_ms" { it >= 0 } - "testing" 123 - } - } - } - } - - receivedHeaders.iterator().hasNext() - def traceparent = new String(receivedHeaders.headers("traceparent").iterator().next().value()) - Context context = W3CTraceContextPropagator.instance.extract(Context.root(), "", new TextMapGetter() { - @Override - Iterable keys(String carrier) { - return Collections.singleton("traceparent") - } - - @Override - String get(String carrier, String key) { - if (key == "traceparent") { - return traceparent - } - return null - } - }) - def spanContext = Span.fromContext(context).getSpanContext() - def streamTrace = traces.find { it.size() == 3 } - def streamSendSpan = streamTrace[2] - spanContext.traceId == streamSendSpan.traceId - spanContext.spanId == streamSendSpan.spanId - } -} diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsSuppressReceiveSpansTest.groovy b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsSuppressReceiveSpansTest.groovy deleted file mode 100644 index 386e09b56efb..000000000000 --- a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/groovy/KafkaStreamsSuppressReceiveSpansTest.groovy +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.api.trace.Span -import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator -import io.opentelemetry.context.Context -import io.opentelemetry.context.propagation.TextMapGetter -import io.opentelemetry.sdk.trace.data.SpanData -import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes -import org.apache.kafka.clients.producer.ProducerRecord -import org.apache.kafka.common.header.Headers -import org.apache.kafka.common.serialization.Serdes -import org.apache.kafka.streams.KafkaStreams -import org.apache.kafka.streams.StreamsConfig -import org.apache.kafka.streams.kstream.KStream -import org.apache.kafka.streams.kstream.ValueMapper - -import java.time.Duration - -import static io.opentelemetry.api.trace.SpanKind.CONSUMER -import static io.opentelemetry.api.trace.SpanKind.PRODUCER - -class KafkaStreamsSuppressReceiveSpansTest extends KafkaStreamsBaseTest { - - def "test kafka produce and consume with streams in-between"() { - setup: - def config = new Properties() - config.putAll(producerProps(KafkaStreamsBaseTest.kafka.bootstrapServers)) - config.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-application") - config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.Integer().getClass().getName()) - config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()) - - // CONFIGURE PROCESSOR - def builder - try { - // Different class names for test and latestDepTest. - builder = Class.forName("org.apache.kafka.streams.kstream.KStreamBuilder").newInstance() - } catch (ClassNotFoundException | NoClassDefFoundError e) { - builder = Class.forName("org.apache.kafka.streams.StreamsBuilder").newInstance() - } - KStream textLines = builder.stream(STREAM_PENDING) - def values = textLines - .mapValues(new ValueMapper() { - @Override - String apply(String textLine) { - Span.current().setAttribute("asdf", "testing") - return textLine.toLowerCase() - } - }) - - KafkaStreams streams - try { - // Different api for test and latestDepTest. - values.to(Serdes.Integer(), Serdes.String(), STREAM_PROCESSED) - streams = new KafkaStreams(builder, config) - } catch (MissingMethodException e) { - def producer = Class.forName("org.apache.kafka.streams.kstream.Produced") - .with(Serdes.Integer(), Serdes.String()) - values.to(STREAM_PROCESSED, producer) - streams = new KafkaStreams(builder.build(), config) - } - streams.start() - - when: - String greeting = "TESTING TESTING 123!" - KafkaStreamsBaseTest.producer.send(new ProducerRecord<>(STREAM_PENDING, 10, greeting)) - - then: - // check that the message was received - def records = KafkaStreamsBaseTest.consumer.poll(Duration.ofSeconds(10).toMillis()) - Headers receivedHeaders = null - for (record in records) { - Span.current().setAttribute("testing", 123) - - assert record.key() == 10 - assert record.value() == greeting.toLowerCase() - - if (receivedHeaders == null) { - receivedHeaders = record.headers() - } - } - - SpanData streamSendSpan - - assertTraces(1) { - trace(0, 4) { - // kafka-clients PRODUCER - span(0) { - name STREAM_PENDING + " publish" - kind PRODUCER - hasNoParent() - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PENDING - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" "producer-1" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY" "10" - } - } - // kafka-stream CONSUMER - span(1) { - name STREAM_PENDING + " process" - kind CONSUMER - childOf span(0) - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PENDING - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.endsWith("consumer") } - "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE" Long - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY" "10" - "kafka.record.queue_time_ms" { it >= 0 } - "asdf" "testing" - if (Boolean.getBoolean("testLatestDeps")) { - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP" "test-application" - } - } - } - - streamSendSpan = span(2) - - // kafka-clients PRODUCER - span(2) { - name STREAM_PROCESSED + " publish" - kind PRODUCER - childOf span(1) - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PROCESSED - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "publish" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" String - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - } - } - // kafka-clients CONSUMER process - span(3) { - name STREAM_PROCESSED + " process" - kind CONSUMER - childOf span(2) - attributes { - "$MessagingIncubatingAttributes.MESSAGING_SYSTEM" "kafka" - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME" STREAM_PROCESSED - "$MessagingIncubatingAttributes.MESSAGING_OPERATION" "process" - "$MessagingIncubatingAttributes.MESSAGING_CLIENT_ID" { it.startsWith("consumer") } - "$MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE" Long - "$MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID" String - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET" 0 - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY" "10" - if (Boolean.getBoolean("testLatestDeps")) { - "$MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP" "test" - } - "kafka.record.queue_time_ms" { it >= 0 } - "testing" 123 - } - } - } - } - - receivedHeaders.iterator().hasNext() - def traceparent = new String(receivedHeaders.headers("traceparent").iterator().next().value()) - Context context = W3CTraceContextPropagator.instance.extract(Context.root(), "", new TextMapGetter() { - @Override - Iterable keys(String carrier) { - return Collections.singleton("traceparent") - } - - @Override - String get(String carrier, String key) { - if (key == "traceparent") { - return traceparent - } - return null - } - }) - def spanContext = Span.fromContext(context).getSpanContext() - spanContext.traceId == streamSendSpan.traceId - spanContext.spanId == streamSendSpan.spanId - } -} diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsBaseTest.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsBaseTest.java new file mode 100644 index 000000000000..854fee4f10bd --- /dev/null +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsBaseTest.java @@ -0,0 +1,183 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.kafkastreams; + +import static java.util.Arrays.asList; +import static java.util.Collections.singleton; + +import com.google.common.collect.ImmutableMap; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import org.apache.kafka.clients.admin.AdminClient; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRebalanceListener; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.serialization.IntegerDeserializer; +import org.apache.kafka.common.serialization.IntegerSerializer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.kafka.KafkaContainer; +import org.testcontainers.utility.DockerImageName; + +abstract class KafkaStreamsBaseTest { + + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + protected static final AttributeKey MESSAGING_CLIENT_ID = + AttributeKey.stringKey("messaging.client_id"); + protected static final String STREAM_PENDING = "test.pending"; + protected static final String STREAM_PROCESSED = "test.processed"; + + static KafkaContainer kafka; + static Producer producer; + static Consumer consumer; + static CountDownLatch consumerReady = new CountDownLatch(1); + + @BeforeAll + static void setup() throws ExecutionException, InterruptedException, TimeoutException { + kafka = + new KafkaContainer(DockerImageName.parse("apache/kafka:3.8.0")) + .withEnv("KAFKA_HEAP_OPTS", "-Xmx256m") + .waitingFor(Wait.forLogMessage(".*started \\(kafka.server.Kafka.*Server\\).*", 1)) + .withStartupTimeout(Duration.ofMinutes(1)); + kafka.start(); + + // create test topic + try (AdminClient adminClient = + AdminClient.create(ImmutableMap.of("bootstrap.servers", kafka.getBootstrapServers()))) { + adminClient + .createTopics( + asList( + new NewTopic(STREAM_PENDING, 1, (short) 1), + new NewTopic(STREAM_PROCESSED, 1, (short) 1))) + .all() + .get(10, TimeUnit.SECONDS); + } + + producer = new KafkaProducer<>(producerProps(kafka.getBootstrapServers())); + + Map consumerProps = + ImmutableMap.of( + "bootstrap.servers", + kafka.getBootstrapServers(), + "group.id", + "test", + "enable.auto.commit", + "true", + "auto.commit.interval.ms", + "10", + "session.timeout.ms", + "30000", + "key.deserializer", + IntegerDeserializer.class, + "value.deserializer", + StringDeserializer.class); + consumer = new KafkaConsumer<>(consumerProps); + consumer.subscribe( + singleton(STREAM_PROCESSED), + new ConsumerRebalanceListener() { + @Override + public void onPartitionsRevoked(Collection collection) {} + + @Override + public void onPartitionsAssigned(Collection collection) { + consumerReady.countDown(); + } + }); + } + + @AfterAll + static void cleanup() { + consumer.close(); + producer.close(); + kafka.stop(); + } + + static Map producerProps(String servers) { + // values copied from spring's KafkaTestUtils + return ImmutableMap.of( + "bootstrap.servers", + servers, + "retries", + 0, + "batch.size", + "16384", + "linger.ms", + 1, + "buffer.memory", + "33554432", + "key.serializer", + IntegerSerializer.class, + "value.serializer", + StringSerializer.class); + } + + // Kafka's eventual consistency behavior forces us to do a couple of empty poll() calls until it + // gets properly assigned a topic partition + @SuppressWarnings("PreferJavaTimeOverload") + static void awaitUntilConsumerIsReady() throws InterruptedException { + if (consumerReady.await(0, TimeUnit.SECONDS)) { + return; + } + for (int i = 0; i < 10; i++) { + consumer.poll(0); + if (consumerReady.await(1, TimeUnit.SECONDS)) { + break; + } + } + if (consumerReady.getCount() != 0) { + throw new AssertionError("Consumer wasn't assigned any partitions!"); + } + consumer.seekToBeginning(Collections.emptyList()); + } + + static Context getContext(Headers headers) { + String traceparent = + new String( + headers.headers("traceparent").iterator().next().value(), StandardCharsets.UTF_8); + return W3CTraceContextPropagator.getInstance() + .extract( + Context.root(), + "", + new TextMapGetter() { + @Override + public String get(String carrier, String key) { + if ("traceparent".equals(key)) { + return traceparent; + } + return null; + } + + @Override + public Iterable keys(String carrier) { + return Collections.singleton("traceparent"); + } + }); + } +} diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java new file mode 100644 index 000000000000..46caa0a78c90 --- /dev/null +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsDefaultTest.java @@ -0,0 +1,282 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.kafkastreams; + +import static io.opentelemetry.api.common.AttributeKey.longKey; +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.sdk.trace.data.LinkData; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.streams.KafkaStreams; +import org.apache.kafka.streams.StreamsConfig; +import org.apache.kafka.streams.kstream.KStream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class KafkaStreamsDefaultTest extends KafkaStreamsBaseTest { + + @SuppressWarnings("deprecation") // using deprecated semconv + @DisplayName("test kafka produce and consume with streams in-between") + @Test + void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { + Properties config = new Properties(); + config.putAll(producerProps(KafkaStreamsBaseTest.kafka.getBootstrapServers())); + config.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-application"); + config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.Integer().getClass().getName()); + config.put( + StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + + // CONFIGURE PROCESSOR + KafkaStreamsReflectionUtil.StreamBuilder streamBuilder = + KafkaStreamsReflectionUtil.createBuilder(); + KStream textLines = streamBuilder.stream(STREAM_PENDING); + KStream values = + textLines.mapValues( + textLine -> { + Span.current().setAttribute("asdf", "testing"); + return textLine.toLowerCase(Locale.ROOT); + }); + + KafkaStreams streams = streamBuilder.createStreams(values, config, STREAM_PROCESSED); + streams.start(); + + String greeting = "TESTING TESTING 123!"; + KafkaStreamsBaseTest.producer.send(new ProducerRecord<>(STREAM_PENDING, 10, greeting)); + + awaitUntilConsumerIsReady(); + @SuppressWarnings("PreferJavaTimeOverload") + ConsumerRecords records = + KafkaStreamsBaseTest.consumer.poll(Duration.ofSeconds(10).toMillis()); + Headers receivedHeaders = null; + for (ConsumerRecord record : records) { + Span.current().setAttribute("testing", 123); + + assertThat(record.key()).isEqualTo(10); + assertThat(record.value()).isEqualTo(greeting.toLowerCase(Locale.ROOT)); + + if (receivedHeaders == null) { + receivedHeaders = record.headers(); + } + } + assertThat(receivedHeaders).isNotEmpty(); + SpanContext receivedContext = Span.fromContext(getContext(receivedHeaders)).getSpanContext(); + + AtomicReference producerPendingRef = new AtomicReference<>(); + AtomicReference producerProcessedRef = new AtomicReference<>(); + + // Add your assertTraces logic here + testing.waitAndAssertSortedTraces( + TelemetryDataUtil.orderByRootSpanName( + STREAM_PENDING + " publish", + STREAM_PENDING + " receive", + STREAM_PROCESSED + " receive"), + trace -> { + trace.hasSpansSatisfyingExactly( + // kafka-clients PRODUCER + span -> + span.hasName(STREAM_PENDING + " publish") + .hasKind(SpanKind.PRODUCER) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues.KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PENDING), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("producer")), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"))); + producerPendingRef.set(trace.getSpan(0)); + }, + trace -> { + trace.hasSpansSatisfyingExactly( + // kafka-clients CONSUMER receive + span -> { + List assertions = + new ArrayList<>( + asList( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PENDING), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("consumer")), + equalTo( + MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); + if (Boolean.getBoolean("testLatestDeps")) { + assertions.add( + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, + "test-application")); + } + span.hasName(STREAM_PENDING + " receive") + .hasKind(SpanKind.CONSUMER) + .hasNoParent() + .hasAttributesSatisfyingExactly(assertions); + }, + // kafka-stream CONSUMER + span -> { + List assertions = + new ArrayList<>( + asList( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PENDING), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("consumer")), + satisfies( + MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + k -> k.isInstanceOf(Long.class)), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + satisfies( + longKey("kafka.record.queue_time_ms"), + k -> k.isGreaterThanOrEqualTo(0)), + equalTo(stringKey("asdf"), "testing"))); + if (Boolean.getBoolean("testLatestDeps")) { + assertions.add( + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, + "test-application")); + } + span.hasName(STREAM_PENDING + " process") + .hasKind(SpanKind.CONSUMER) + .hasParent(trace.getSpan(0)) + .hasLinks(LinkData.create(producerPendingRef.get().getSpanContext())) + .hasAttributesSatisfyingExactly(assertions); + }, + // kafka-clients PRODUCER + span -> + span.hasName(STREAM_PROCESSED + " publish") + .hasKind(SpanKind.PRODUCER) + .hasParent(trace.getSpan(1)) + .hasTraceId(receivedContext.getTraceId()) + .hasSpanId(receivedContext.getSpanId()) + .hasAttributesSatisfyingExactly( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues.KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PROCESSED), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("producer")), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0))); + + producerProcessedRef.set(trace.getSpan(2)); + }, + trace -> + trace.hasSpansSatisfyingExactly( + // kafka-clients CONSUMER receive + span -> { + List assertions = + new ArrayList<>( + asList( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PROCESSED), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), + satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("consumer")), + equalTo( + MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); + if (Boolean.getBoolean("testLatestDeps")) { + assertions.add( + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + } + span.hasName(STREAM_PROCESSED + " receive") + .hasKind(SpanKind.CONSUMER) + .hasNoParent() + .hasAttributesSatisfyingExactly(assertions); + }, + // kafka-clients CONSUMER process + span -> { + List assertions = + new ArrayList<>( + asList( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PROCESSED), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("consumer")), + satisfies( + MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + k -> k.isInstanceOf(Long.class)), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + satisfies( + longKey("kafka.record.queue_time_ms"), + k -> k.isGreaterThanOrEqualTo(0)), + equalTo(longKey("testing"), 123))); + if (Boolean.getBoolean("testLatestDeps")) { + assertions.add( + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + } + span.hasName(STREAM_PROCESSED + " process") + .hasKind(SpanKind.CONSUMER) + .hasParent(trace.getSpan(0)) + .hasLinks(LinkData.create(producerProcessedRef.get().getSpanContext())) + .hasAttributesSatisfyingExactly(assertions); + })); + } +} diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsReflectionUtil.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsReflectionUtil.java new file mode 100644 index 000000000000..d4a1a5fd1039 --- /dev/null +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsReflectionUtil.java @@ -0,0 +1,105 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.kafkastreams; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Properties; +import org.apache.kafka.common.serialization.Serde; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.streams.KafkaStreams; +import org.apache.kafka.streams.kstream.KStream; + +/** + * Kafka streams reflection util which is used to be compatible with different versions of kafka + * streams. + */ +class KafkaStreamsReflectionUtil { + + private KafkaStreamsReflectionUtil() {} + + static class StreamBuilder { + private final Object builder; + + StreamBuilder(Object builder) { + this.builder = builder; + } + + @SuppressWarnings("unchecked") + KStream stream(String topic) + throws Exception { // Different api for test and latestDepTest. + Method method; + Object[] arguments; + try { + // equivalent to: + // ((org.apache.kafka.streams.kstream.KStreamBuilder)builder).stream(STREAM_PENDING); + method = builder.getClass().getMethod("stream", String[].class); + String[] topics = new String[] {topic}; + arguments = new Object[] {topics}; + } catch (Exception exception) { + // equivalent to: + // ((org.apache.kafka.streams.StreamsBuilder)builder).stream(STREAM_PENDING); + method = builder.getClass().getMethod("stream", String.class); + arguments = new Object[] {topic}; + } + + return (KStream) method.invoke(builder, arguments); + } + + KafkaStreams createStreams(KStream values, Properties config, String topic) + throws Exception { + Constructor constructor; + // Different api for test and latestDepTest. + try { + // equivalent to: + // values.to(Serdes.Integer(), Serdes.String(), STREAM_PROCESSED); + // return new KafkaStreams(builder, config); + KStream.class + .getMethod("to", Serde.class, Serde.class, String.class) + .invoke(values, Serdes.Integer(), Serdes.String(), topic); + + Class topologyBuilderClass = + Class.forName("org.apache.kafka.streams.processor.TopologyBuilder"); + constructor = KafkaStreams.class.getConstructor(topologyBuilderClass, Properties.class); + } catch (Exception exception) { + constructor = null; + } + if (constructor != null) { + return (KafkaStreams) constructor.newInstance(builder, config); + } + + // equivalent to: + // Produced produced = Produced.with(Serdes.Integer(), Serdes.String()); + // values.to(STREAM_PROCESSED, produced); + // + // Topology topology = builder.build(); + // new KafkaStreams(topology, props); + Class producedClass = Class.forName("org.apache.kafka.streams.kstream.Produced"); + Method producedWith = producedClass.getMethod("with", Serde.class, Serde.class); + Object producer = producedWith.invoke(null, Serdes.Integer(), Serdes.String()); + + KStream.class.getMethod("to", String.class, producedClass).invoke(values, topic, producer); + + Object topology = builder.getClass().getMethod("build").invoke(builder); + + Class topologyClass = Class.forName("org.apache.kafka.streams.Topology"); + constructor = KafkaStreams.class.getConstructor(topologyClass, Properties.class); + + return (KafkaStreams) constructor.newInstance(topology, config); + } + } + + static StreamBuilder createBuilder() throws Exception { + Class builderClass; + try { + // Different class names for test and latestDepTest. + builderClass = Class.forName("org.apache.kafka.streams.kstream.KStreamBuilder"); + } catch (Exception e) { + builderClass = Class.forName("org.apache.kafka.streams.StreamsBuilder"); + } + return new StreamBuilder(builderClass.getConstructor().newInstance()); + } +} diff --git a/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java new file mode 100644 index 000000000000..ceb2b10c03c4 --- /dev/null +++ b/instrumentation/kafka/kafka-streams-0.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/kafkastreams/KafkaStreamsSuppressReceiveSpansTest.java @@ -0,0 +1,212 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.kafkastreams; + +import static io.opentelemetry.api.common.AttributeKey.longKey; +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.streams.KafkaStreams; +import org.apache.kafka.streams.StreamsConfig; +import org.apache.kafka.streams.kstream.KStream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class KafkaStreamsSuppressReceiveSpansTest extends KafkaStreamsBaseTest { + + @SuppressWarnings("deprecation") // using deprecated semconv + @DisplayName("test kafka produce and consume with streams in-between") + @Test + void testKafkaProduceAndConsumeWithStreamsInBetween() throws Exception { + Properties config = new Properties(); + config.putAll(producerProps(KafkaStreamsBaseTest.kafka.getBootstrapServers())); + config.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-application"); + config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.Integer().getClass().getName()); + config.put( + StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + + // CONFIGURE PROCESSOR + KafkaStreamsReflectionUtil.StreamBuilder streamBuilder = + KafkaStreamsReflectionUtil.createBuilder(); + KStream textLines = streamBuilder.stream(STREAM_PENDING); + KStream values = + textLines.mapValues( + textLine -> { + Span.current().setAttribute("asdf", "testing"); + return textLine.toLowerCase(Locale.ROOT); + }); + + KafkaStreams streams = streamBuilder.createStreams(values, config, STREAM_PROCESSED); + streams.start(); + + String greeting = "TESTING TESTING 123!"; + KafkaStreamsBaseTest.producer.send(new ProducerRecord<>(STREAM_PENDING, 10, greeting)); + + // check that the message was received + @SuppressWarnings("PreferJavaTimeOverload") + ConsumerRecords records = + KafkaStreamsBaseTest.consumer.poll(Duration.ofSeconds(10).toMillis()); + Headers receivedHeaders = null; + for (ConsumerRecord record : records) { + Span.current().setAttribute("testing", 123); + + assertThat(record.key()).isEqualTo(10); + assertThat(record.value()).isEqualTo(greeting.toLowerCase(Locale.ROOT)); + + if (receivedHeaders == null) { + receivedHeaders = record.headers(); + } + } + assertThat(receivedHeaders).isNotEmpty(); + SpanContext receivedContext = Span.fromContext(getContext(receivedHeaders)).getSpanContext(); + + AtomicReference streamSendSpanRef = new AtomicReference<>(); + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + // kafka-clients PRODUCER + span -> + span.hasName(STREAM_PENDING + " publish") + .hasKind(SpanKind.PRODUCER) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PENDING), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_CLIENT_ID, "producer-1"), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10")), + // kafka-stream CONSUMER + span -> { + List assertions = + new ArrayList<>( + asList( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PENDING), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_CLIENT_ID, k -> k.endsWith("consumer")), + satisfies( + MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + k -> k.isInstanceOf(Long.class)), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + satisfies( + longKey("kafka.record.queue_time_ms"), + k -> k.isGreaterThanOrEqualTo(0)), + equalTo(stringKey("asdf"), "testing"))); + if (Boolean.getBoolean("testLatestDeps")) { + assertions.add( + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, + "test-application")); + } + span.hasName(STREAM_PENDING + " process") + .hasKind(SpanKind.CONSUMER) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly(assertions); + }, + // kafka-clients PRODUCER + span -> { + streamSendSpanRef.set(trace.getSpan(2)); + span.hasName(STREAM_PROCESSED + " publish") + .hasKind(SpanKind.PRODUCER) + .hasParent(trace.getSpan(1)) + .hasTraceId(receivedContext.getTraceId()) + .hasSpanId(receivedContext.getSpanId()) + .hasAttributesSatisfyingExactly( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues.KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PROCESSED), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), + satisfies(MESSAGING_CLIENT_ID, k -> k.isInstanceOf(String.class)), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0)); + }, + // kafka-clients CONSUMER process + span -> { + List assertions = + new ArrayList<>( + asList( + equalTo( + MessagingIncubatingAttributes.MESSAGING_SYSTEM, + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .KAFKA), + equalTo( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, + STREAM_PROCESSED), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_CLIENT_ID, k -> k.startsWith("consumer")), + satisfies( + MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE, + k -> k.isInstanceOf(Long.class)), + satisfies( + MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, + k -> k.isInstanceOf(String.class)), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET, 0), + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), + satisfies( + longKey("kafka.record.queue_time_ms"), + k -> k.isGreaterThanOrEqualTo(0)), + equalTo(longKey("testing"), 123))); + if (Boolean.getBoolean("testLatestDeps")) { + assertions.add( + equalTo( + MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "test")); + } + span.hasName(STREAM_PROCESSED + " process") + .hasKind(SpanKind.CONSUMER) + .hasParent(trace.getSpan(2)) + .hasAttributesSatisfyingExactly(assertions); + })); + } +} diff --git a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt index 421a642ac87d..25ab52608eea 100644 --- a/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt +++ b/instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/KtorClientTracing.kt @@ -16,6 +16,7 @@ import io.opentelemetry.context.Context import io.opentelemetry.context.propagation.ContextPropagators import io.opentelemetry.extension.kotlin.asContextElement import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter +import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.job import kotlinx.coroutines.launch @@ -63,6 +64,14 @@ class KtorClientTracing internal constructor( } private fun installSpanCreation(plugin: KtorClientTracing, scope: HttpClient) { + val initializeRequestPhase = PipelinePhase("OpenTelemetryInitializeRequest") + scope.requestPipeline.insertPhaseAfter(HttpRequestPipeline.State, initializeRequestPhase) + + scope.requestPipeline.intercept(initializeRequestPhase) { + val openTelemetryContext = HttpClientRequestResendCount.initialize(Context.current()) + withContext(openTelemetryContext.asContextElement()) { proceed() } + } + val createSpanPhase = PipelinePhase("OpenTelemetryCreateSpan") scope.sendPipeline.insertPhaseAfter(HttpSendPipeline.State, createSpanPhase) diff --git a/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt b/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt index 7bc94ae41208..5d7619dcf3a7 100644 --- a/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt +++ b/instrumentation/ktor/ktor-2.0/testing/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/client/AbstractKtorHttpClientTest.kt @@ -60,9 +60,8 @@ abstract class AbstractKtorHttpClientTest : AbstractHttpClientTest { + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void onStart(AttributesBuilder attributes, Context parentContext, RedisURI redisUri) { - attributes.put(DbIncubatingAttributes.DB_SYSTEM, DbIncubatingAttributes.DbSystemValues.REDIS); + attributes.put( + DbIncubatingAttributes.DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.REDIS); int database = redisUri.getDatabase(); if (database != 0) { - attributes.put(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, (long) database); + if (SemconvStability.emitStableDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_NAMESPACE, String.valueOf(database)); + } + + if (SemconvStability.emitOldDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, (long) database); + } } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceDbAttributesGetter.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceDbAttributesGetter.java index 0322e0e61dd9..b51d06bfea6b 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceDbAttributesGetter.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceDbAttributesGetter.java @@ -13,10 +13,11 @@ final class LettuceDbAttributesGetter implements DbClientAttributesGetter> { @Override - public String getSystem(RedisCommand request) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(RedisCommand request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Override @Nullable public String getUser(RedisCommand request) { @@ -25,10 +26,11 @@ public String getUser(RedisCommand request) { @Override @Nullable - public String getName(RedisCommand request) { + public String getDbNamespace(RedisCommand request) { return null; } + @Deprecated @Override @Nullable public String getConnectionString(RedisCommand request) { @@ -36,12 +38,14 @@ public String getConnectionString(RedisCommand request) { } @Override - public String getStatement(RedisCommand request) { + @Nullable + public String getDbQueryText(RedisCommand request) { return null; } @Override - public String getOperation(RedisCommand request) { + @Nullable + public String getDbOperationName(RedisCommand request) { return request.getType().name(); } } diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java index 74bc895b59a9..36dfac306235 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java @@ -53,6 +53,7 @@ import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; +@SuppressWarnings("deprecation") // using deprecated semconv class LettuceAsyncClientTest { private static final Logger logger = LoggerFactory.getLogger(LettuceAsyncClientTest.class); diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java index 49fa0ba716ee..84a547851a05 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java @@ -34,6 +34,7 @@ import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; +@SuppressWarnings("deprecation") // using deprecated semconv class LettuceSyncClientTest { private static final Logger logger = LoggerFactory.getLogger(LettuceSyncClientTest.class); diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java index 142e7b15abb6..3a4f3995bf81 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceConnectAttributesExtractor.java @@ -9,18 +9,27 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import javax.annotation.Nullable; final class LettuceConnectAttributesExtractor implements AttributesExtractor { + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void onStart(AttributesBuilder attributes, Context parentContext, RedisURI redisUri) { - attributes.put(DbIncubatingAttributes.DB_SYSTEM, DbIncubatingAttributes.DbSystemValues.REDIS); + attributes.put( + DbIncubatingAttributes.DB_SYSTEM, DbIncubatingAttributes.DbSystemIncubatingValues.REDIS); int database = redisUri.getDatabase(); if (database != 0) { - attributes.put(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, (long) database); + if (SemconvStability.emitStableDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_NAMESPACE, String.valueOf(database)); + } + + if (SemconvStability.emitOldDatabaseSemconv()) { + attributes.put(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, (long) database); + } } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java index a3c7050e3c79..392f090aceaf 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceDbAttributesGetter.java @@ -21,10 +21,11 @@ final class LettuceDbAttributesGetter implements DbClientAttributesGetter request) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(RedisCommand request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Override @Nullable public String getUser(RedisCommand request) { @@ -33,10 +34,11 @@ public String getUser(RedisCommand request) { @Override @Nullable - public String getName(RedisCommand request) { + public String getDbNamespace(RedisCommand request) { return null; } + @Deprecated @Override @Nullable public String getConnectionString(RedisCommand request) { @@ -44,7 +46,7 @@ public String getConnectionString(RedisCommand request) { } @Override - public String getStatement(RedisCommand request) { + public String getDbQueryText(RedisCommand request) { String command = LettuceInstrumentationUtil.getCommandName(request); List args = request.getArgs() == null @@ -54,7 +56,7 @@ public String getStatement(RedisCommand request) { } @Override - public String getOperation(RedisCommand request) { + public String getDbOperationName(RedisCommand request) { return request.getType().name(); } } diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java index 408f2ba72d91..7a6c8043ea4f 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java @@ -47,6 +47,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv class LettuceAsyncClientTest extends AbstractLettuceClientTest { private static int incorrectPort; private static String dbUriNonExistent; diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java index feb5f7ead45c..c6da9d791b77 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java @@ -30,6 +30,7 @@ import org.junit.jupiter.api.Test; import reactor.core.scheduler.Schedulers; +@SuppressWarnings("deprecation") // using deprecated semconv class LettuceReactiveClientTest extends AbstractLettuceClientTest { private static RedisReactiveCommands reactiveCommands; diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java index 7828a3c5ef8e..d3acc270d681 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java @@ -29,6 +29,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv class LettuceSyncClientTest extends AbstractLettuceClientTest { private static int incorrectPort; private static String dbUriNonExistent; diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java index 692c49243901..c3fe329d1ae0 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java @@ -16,7 +16,7 @@ class LettuceAsyncClientTest extends AbstractLettuceAsyncClientTest { static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java index 2121d2500510..f9abae4a35c6 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java @@ -24,7 +24,7 @@ class LettuceReactiveClientTest extends AbstractLettuceReactiveClientTest { static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } @@ -35,14 +35,15 @@ protected RedisClient createClient(String uri) { // TODO(anuraaga): reactor library instrumentation doesn't seem to handle this case, figure out if // it should and if so move back to base class. + @SuppressWarnings("deprecation") // using deprecated semconv @Test void testAsyncSubscriberWithSpecificThreadPool() { - getInstrumentationExtension() + testing() .runWithSpan( "test-parent", () -> reactiveCommands.set("a", "1").then(reactiveCommands.get("a")).subscribe()); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -52,13 +53,14 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -67,13 +69,14 @@ void testAsyncSubscriberWithSpecificThreadPool() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java index 7f79509b9eba..61855dbe510f 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java @@ -16,7 +16,7 @@ class LettuceSyncClientAuthTest extends AbstractLettuceSyncClientTest { static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java index 417de8c61d62..e718f053d10e 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java @@ -16,7 +16,7 @@ class LettuceSyncClientTest extends AbstractLettuceSyncClientTest { static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } diff --git a/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java b/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java index d040634872b6..6fb88f269b5e 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java +++ b/instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java @@ -27,6 +27,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; import java.net.InetSocketAddress; @@ -41,7 +42,8 @@ final class OpenTelemetryTracing implements Tracing { // copied from DbIncubatingAttributes private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); - // copied from DbIncubatingAttributes.DbSystemValues + private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); + // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String REDIS = "redis"; private static final AttributesExtractor serverAttributesExtractor = @@ -232,7 +234,7 @@ public synchronized Tracer.Span start(RedisCommand command) { if (span == null) { throw new IllegalStateException("Span started but null, this is a programming error."); } - span.updateName(command.getType().name()); + span.updateName(command.getType().toString()); if (command.getArgs() != null) { argsList = OtelCommandArgsUtil.getCommandArgs(command.getArgs()); @@ -304,6 +306,9 @@ public synchronized Tracer.Span annotate(String value) { @Override @CanIgnoreReturnValue public synchronized Tracer.Span tag(String key, String value) { + if (value == null || value.isEmpty()) { + return this; + } if (key.equals("redis.args")) { argsString = value; return this; @@ -338,7 +343,12 @@ private void finish(Span span) { if (name != null) { String statement = sanitizer.sanitize(name, argsList != null ? argsList : splitArgs(argsString)); - span.setAttribute(DB_STATEMENT, statement); + if (SemconvStability.emitStableDatabaseSemconv()) { + span.setAttribute(DB_QUERY_TEXT, statement); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + span.setAttribute(DB_STATEMENT, statement); + } } span.end(); } diff --git a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java index 38bf96282f25..235e37749e01 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceAsyncClientTest.java @@ -16,7 +16,7 @@ class LettuceAsyncClientTest extends AbstractLettuceAsyncClientTest { static InstrumentationExtension testing = LibraryInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } @@ -24,9 +24,7 @@ public InstrumentationExtension getInstrumentationExtension() { protected RedisClient createClient(String uri) { return RedisClient.create( ClientResources.builder() - .tracing( - LettuceTelemetry.create(getInstrumentationExtension().getOpenTelemetry()) - .newTracing()) + .tracing(LettuceTelemetry.create(testing().getOpenTelemetry()).newTracing()) .build(), uri); } diff --git a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java index 5a256549e18b..62c8ca8ba375 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceReactiveClientTest.java @@ -19,7 +19,7 @@ class LettuceReactiveClientTest extends AbstractLettuceReactiveClientTest { static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } @@ -29,9 +29,7 @@ public InstrumentationExtension getInstrumentationExtension() { protected RedisClient createClient(String uri) { return RedisClient.create( ClientResources.builder() - .tracing( - LettuceTelemetry.create(getInstrumentationExtension().getOpenTelemetry()) - .newTracing()) + .tracing(LettuceTelemetry.create(testing().getOpenTelemetry()).newTracing()) .build(), uri); } diff --git a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java index 357ae8e09e74..ed2de998719a 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java +++ b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientAuthTest.java @@ -16,7 +16,7 @@ class LettuceSyncClientAuthTest extends AbstractLettuceSyncClientAuthTest { static InstrumentationExtension testing = LibraryInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } @@ -24,9 +24,7 @@ public InstrumentationExtension getInstrumentationExtension() { protected RedisClient createClient(String uri) { return RedisClient.create( ClientResources.builder() - .tracing( - LettuceTelemetry.create(getInstrumentationExtension().getOpenTelemetry()) - .newTracing()) + .tracing(LettuceTelemetry.create(testing().getOpenTelemetry()).newTracing()) .build(), uri); } diff --git a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java index 7bfb8e452769..6966dc270549 100644 --- a/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/library/src/test/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceSyncClientTest.java @@ -16,7 +16,7 @@ class LettuceSyncClientTest extends AbstractLettuceSyncClientTest { static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); @Override - public InstrumentationExtension getInstrumentationExtension() { + public InstrumentationExtension testing() { return testing; } @@ -24,9 +24,7 @@ public InstrumentationExtension getInstrumentationExtension() { protected RedisClient createClient(String uri) { return RedisClient.create( ClientResources.builder() - .tracing( - LettuceTelemetry.create(getInstrumentationExtension().getOpenTelemetry()) - .newTracing()) + .tracing(LettuceTelemetry.create(testing().getOpenTelemetry()).newTracing()) .build(), uri); } diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java index 4cb3f7ff171b..a0189fbbfa67 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceAsyncClientTest.java @@ -41,7 +41,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -@SuppressWarnings({"InterruptedExceptionSwallowed"}) +@SuppressWarnings({"InterruptedExceptionSwallowed", "deprecation"}) // using deprecated semconv public abstract class AbstractLettuceAsyncClientTest extends AbstractLettuceClientTest { private static String dbUriNonExistent; private static int incorrectPort; @@ -75,8 +75,8 @@ void setUp() throws UnknownHostException { syncCommands.set("TESTKEY", "TESTVAL"); // 1 set trace - getInstrumentationExtension().waitForTraces(1); - getInstrumentationExtension().clearData(); + testing().waitForTraces(1); + testing().clearData(); } @AfterAll @@ -109,10 +109,10 @@ void testConnectUsingGetOnConnectionFuture() throws Exception { assertThat(connection1).isNotNull(); if (connectHasSpans()) { // ignore CLIENT SETINFO traces - getInstrumentationExtension().waitForTraces(2); + testing().waitForTraces(2); } else { // Lettuce tracing does not trace connect - assertThat(getInstrumentationExtension().spans()).isEmpty(); + assertThat(testing().spans()).isEmpty(); } } @@ -137,7 +137,7 @@ void testConnectExceptionInsideTheConnectionFuture() { assertThat(thrown).isInstanceOf(ExecutionException.class); // Lettuce tracing does not trace connect - assertThat(getInstrumentationExtension().spans()).isEmpty(); + assertThat(testing().spans()).isEmpty(); } @Test @@ -147,7 +147,7 @@ void testSetCommandUsingFutureGetWithTimeout() throws Exception { assertThat(res).isEqualTo("OK"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -155,13 +155,15 @@ void testSetCommandUsingFutureGetWithTimeout() throws Exception { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -173,13 +175,12 @@ void testGetCommandChainedWithThenAccept() throws Exception { Consumer consumer = res -> { if (testCallback()) { - getInstrumentationExtension() - .runWithSpan("callback", () -> assertThat(res).isEqualTo("TESTVAL")); + testing().runWithSpan("callback", () -> assertThat(res).isEqualTo("TESTVAL")); } future.complete(res); }; - getInstrumentationExtension() + testing() .runWithSpan( "parent", () -> { @@ -189,7 +190,7 @@ void testGetCommandChainedWithThenAccept() throws Exception { assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo("TESTVAL"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> { List> spanAsserts = @@ -201,13 +202,15 @@ void testGetCommandChainedWithThenAccept() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -233,7 +236,7 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() throws BiFunction firstStage = (res, error) -> { if (testCallback()) { - getInstrumentationExtension() + testing() .runWithSpan( "callback1", () -> { @@ -246,7 +249,7 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() throws Function secondStage = input -> { if (testCallback()) { - getInstrumentationExtension() + testing() .runWithSpan( "callback2", () -> { @@ -257,7 +260,7 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() throws return null; }; - getInstrumentationExtension() + testing() .runWithSpan( "parent", () -> { @@ -267,7 +270,7 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() throws assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo(successStr); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> { List> spanAsserts = @@ -279,15 +282,16 @@ void testGetNonExistentKeyCommandWithHandleAsyncAndChainedWithThenApply() throws .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "GET NON_EXISTENT_KEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "GET NON_EXISTENT_KEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -314,7 +318,7 @@ void testCommandWithNoArgumentsUsingBiconsumer() throws Exception { BiConsumer biConsumer = (keyRetrieved, error) -> { if (testCallback()) { - getInstrumentationExtension() + testing() .runWithSpan( "callback", () -> { @@ -324,7 +328,7 @@ void testCommandWithNoArgumentsUsingBiconsumer() throws Exception { future.complete(keyRetrieved); }; - getInstrumentationExtension() + testing() .runWithSpan( "parent", () -> { @@ -334,7 +338,7 @@ void testCommandWithNoArgumentsUsingBiconsumer() throws Exception { assertThat(future.get(10, TimeUnit.SECONDS)).isNotNull(); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> { List> spanAsserts = @@ -346,13 +350,15 @@ void testCommandWithNoArgumentsUsingBiconsumer() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -376,7 +382,7 @@ void testHashSetAndThenNestApplyToHashGetall() throws Exception { hmsetFuture.thenApplyAsync( setResult -> { // Wait for 'hmset' trace to get written - getInstrumentationExtension().waitForTraces(1); + testing().waitForTraces(1); if (!"OK".equals(setResult)) { future.completeExceptionally(new AssertionError("Wrong hmset result " + setResult)); @@ -397,7 +403,7 @@ void testHashSetAndThenNestApplyToHashGetall() throws Exception { assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo(testHashMap); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -405,15 +411,16 @@ void testHashSetAndThenNestApplyToHashGetall() throws Exception { span.hasName("HMSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "HMSET TESTHM firstname ? lastname ? age ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "HMSET TESTHM firstname ? lastname ? age ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end"))), @@ -423,13 +430,14 @@ void testHashSetAndThenNestApplyToHashGetall() throws Exception { span.hasName("HGETALL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java index 38b5df08085c..90fe8a884450 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java @@ -5,10 +5,17 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; + import io.lettuce.core.RedisClient; import io.lettuce.core.api.StatefulRedisConnection; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.Logger; @@ -40,7 +47,7 @@ abstract class AbstractLettuceClientTest { protected abstract RedisClient createClient(String uri); - protected abstract InstrumentationExtension getInstrumentationExtension(); + protected abstract InstrumentationExtension testing(); protected ContainerConnection newContainerConnection() { GenericContainer server = @@ -72,4 +79,12 @@ private ContainerConnection(StatefulRedisConnection connection, this.port = port; } } + + protected static List addExtraAttributes(AttributeAssertion... assertions) { + List result = new ArrayList<>(Arrays.asList(assertions)); + if (Boolean.getBoolean("testLatestDeps")) { + result.add(equalTo(DbIncubatingAttributes.DB_NAMESPACE, "0")); + } + return result; + } } diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java index a2e157952953..c0f0a4ee18a2 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceReactiveClientTest.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -@SuppressWarnings({"InterruptedExceptionSwallowed"}) +@SuppressWarnings({"InterruptedExceptionSwallowed", "deprecation"}) // using deprecated semconv public abstract class AbstractLettuceReactiveClientTest extends AbstractLettuceClientTest { protected static String expectedHostAttributeValue; @@ -52,8 +52,8 @@ void setUp() throws UnknownHostException { syncCommands.set("TESTKEY", "TESTVAL"); // 1 set trace - getInstrumentationExtension().waitForTraces(1); - getInstrumentationExtension().clearData(); + testing().waitForTraces(1); + testing().clearData(); } @AfterAll @@ -69,7 +69,7 @@ void testSetCommandWithSubscribeOnDefinedConsumer() throws Exception { Consumer consumer = res -> - getInstrumentationExtension() + testing() .runWithSpan( "callback", () -> { @@ -77,13 +77,13 @@ void testSetCommandWithSubscribeOnDefinedConsumer() throws Exception { future.complete(res); }); - getInstrumentationExtension() + testing() .runWithSpan( "parent", () -> reactiveCommands.set("TESTSETKEY", "TESTSETVAL").subscribe(consumer)); assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo("OK"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -93,13 +93,15 @@ void testSetCommandWithSubscribeOnDefinedConsumer() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -123,7 +125,7 @@ void testGetCommandWithLambdaFunction() throws Exception { assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo("TESTVAL"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -131,13 +133,14 @@ void testGetCommandWithLambdaFunction() throws Exception { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -150,7 +153,7 @@ void testGetNonExistentKeyCommand() throws Exception { CompletableFuture future = new CompletableFuture<>(); String defaultVal = "NOT THIS VALUE"; - getInstrumentationExtension() + testing() .runWithSpan( "parent", () -> { @@ -159,7 +162,7 @@ void testGetNonExistentKeyCommand() throws Exception { .defaultIfEmpty(defaultVal) .subscribe( res -> - getInstrumentationExtension() + testing() .runWithSpan( "callback", () -> { @@ -170,7 +173,7 @@ void testGetNonExistentKeyCommand() throws Exception { assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo(defaultVal); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -180,14 +183,16 @@ void testGetNonExistentKeyCommand() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "GET NON_EXISTENT_KEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "GET NON_EXISTENT_KEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -210,7 +215,7 @@ void testCommandWithNoArguments() throws Exception { }); assertThat(future.get(10, TimeUnit.SECONDS)).isEqualTo("TESTKEY"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -218,13 +223,14 @@ void testCommandWithNoArguments() throws Exception { span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -234,7 +240,7 @@ void testCommandWithNoArguments() throws Exception { void testCommandFluxPublisher() { reactiveCommands.command().subscribe(); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -242,13 +248,14 @@ void testCommandFluxPublisher() { span.hasName("COMMAND") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "COMMAND")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "COMMAND"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -267,17 +274,17 @@ void testNonReactiveCommandShouldNotProduceSpan() throws Exception { String res = (String) digestMethod.invoke(reactiveCommands, "test"); assertThat(res).isNotNull(); - assertThat(getInstrumentationExtension().spans().size()).isEqualTo(0); + assertThat(testing().spans().size()).isEqualTo(0); } @Test void testBlockingSubscriber() { - getInstrumentationExtension() + testing() .runWithSpan( "test-parent", () -> reactiveCommands.set("a", "1").then(reactiveCommands.get("a")).block()); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -287,13 +294,14 @@ void testBlockingSubscriber() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -302,13 +310,14 @@ void testBlockingSubscriber() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -316,12 +325,12 @@ void testBlockingSubscriber() { @Test void testAsyncSubscriber() { - getInstrumentationExtension() + testing() .runWithSpan( "test-parent", () -> reactiveCommands.set("a", "1").then(reactiveCommands.get("a")).subscribe()); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -331,13 +340,14 @@ void testAsyncSubscriber() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET a ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")), @@ -346,13 +356,14 @@ void testAsyncSubscriber() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET a"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java index 19e354bdf381..c6aa56acc372 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientAuthTest.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractLettuceSyncClientAuthTest extends AbstractLettuceClientTest { @BeforeAll @@ -61,7 +62,7 @@ void testAuthCommand() throws Exception { assertThat(result).isEqualTo("OK"); if (Boolean.getBoolean("testLatestDeps")) { - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -69,50 +70,53 @@ void testAuthCommand() throws Exception { span.hasName("CLIENT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "CLIENT SETINFO lib-name Lettuce"))), + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "CLIENT SETINFO lib-name Lettuce")))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("CLIENT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - stringAssert -> - stringAssert.startsWith("CLIENT SETINFO lib-ver")))), + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + satisfies( + DbIncubatingAttributes.DB_STATEMENT, + stringAssert -> + stringAssert.startsWith("CLIENT SETINFO lib-ver"))))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("AUTH") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "AUTH ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "AUTH ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); } else { - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -120,13 +124,14 @@ void testAuthCommand() throws Exception { span.hasName("AUTH") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "AUTH ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "AUTH ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java index 156a8b49df7f..be7806e9a87c 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java @@ -32,6 +32,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractLettuceSyncClientTest extends AbstractLettuceClientTest { private static String dbUriNonExistent; @@ -66,8 +67,8 @@ void setUp() throws UnknownHostException { syncCommands.hmset("TESTHM", testHashMap); // 2 sets - getInstrumentationExtension().waitForTraces(2); - getInstrumentationExtension().clearData(); + testing().waitForTraces(2); + testing().clearData(); } @AfterAll @@ -84,10 +85,10 @@ void testConnect() { if (Boolean.getBoolean("testLatestDeps")) { // ignore CLIENT SETINFO traces - getInstrumentationExtension().waitForTraces(2); + testing().waitForTraces(2); } else { // Lettuce tracing does not trace connect - assertThat(getInstrumentationExtension().spans()).isEmpty(); + assertThat(testing().spans()).isEmpty(); } } @@ -102,7 +103,7 @@ void testConnectException() { assertThat(thrown).isInstanceOf(RedisConnectionException.class); // Lettuce tracing does not trace connect - assertThat(getInstrumentationExtension().spans()).isEmpty(); + assertThat(testing().spans()).isEmpty(); } @Test @@ -110,7 +111,7 @@ void testSetCommand() { String res = syncCommands.set("TESTSETKEY", "TESTSETVAL"); assertThat(res).isEqualTo("OK"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -118,13 +119,15 @@ void testSetCommand() { span.hasName("SET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "SET TESTSETKEY ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -135,7 +138,7 @@ void testGetCommand() { String res = syncCommands.get("TESTKEY"); assertThat(res).isEqualTo("TESTVAL"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -143,13 +146,14 @@ void testGetCommand() { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET TESTKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -160,7 +164,7 @@ void testGetNonExistentKeyCommand() { String res = syncCommands.get("NON_EXISTENT_KEY"); assertThat(res).isNull(); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -168,14 +172,16 @@ void testGetNonExistentKeyCommand() { span.hasName("GET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, "GET NON_EXISTENT_KEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "GET NON_EXISTENT_KEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -186,7 +192,7 @@ void testCommandWithNoArguments() { String res = syncCommands.randomkey(); assertThat(res).isNotNull(); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -194,13 +200,14 @@ void testCommandWithNoArguments() { span.hasName("RANDOMKEY") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "RANDOMKEY"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -214,14 +221,14 @@ void testListCommand() { if (Boolean.getBoolean("testLatestDeps")) { // ignore CLIENT SETINFO traces - getInstrumentationExtension().waitForTraces(2); - getInstrumentationExtension().clearData(); + testing().waitForTraces(2); + testing().clearData(); } long res = commands.lpush("TESTLIST", "TESTLIST ELEMENT"); assertThat(res).isEqualTo(1); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -229,14 +236,17 @@ void testListCommand() { span.hasName("LPUSH") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "LPUSH TESTLIST ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "LPUSH TESTLIST ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -247,7 +257,7 @@ void testHashSetCommand() { String res = syncCommands.hmset("user", testHashMap); assertThat(res).isEqualTo("OK"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -255,15 +265,16 @@ void testHashSetCommand() { span.hasName("HMSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "HMSET user firstname ? lastname ? age ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "HMSET user firstname ? lastname ? age ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -274,7 +285,7 @@ void testHashGetallCommand() { Map res = syncCommands.hgetall("TESTHM"); assertThat(res).isEqualTo(testHashMap); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -282,13 +293,14 @@ void testHashGetallCommand() { span.hasName("HGETALL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGETALL TESTHM"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -306,7 +318,7 @@ void testEvalCommand() { String b64Script = Base64.getEncoder().encodeToString(script.getBytes(UTF_8)); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -314,15 +326,16 @@ void testEvalCommand() { span.hasName("EVAL") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "EVAL " + b64Script + " 1 TESTLIST ? ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "EVAL " + b64Script + " 1 TESTLIST ? ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -334,7 +347,7 @@ void testMsetCommand() { assertThat(result).isEqualTo("OK"); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -342,13 +355,15 @@ void testMsetCommand() { span.hasName("MSET") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "MSET key1 ? key2 ?")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "MSET key1 ? key2 ?"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end")))); @@ -363,7 +378,7 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { commands.debugSegfault(); if (Boolean.getBoolean("testLatestDeps")) { - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -371,52 +386,60 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { span.hasName("CLIENT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo( - DbIncubatingAttributes.DB_STATEMENT, - "CLIENT SETINFO lib-name Lettuce"))), + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo( + ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "CLIENT SETINFO lib-name Lettuce")))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("CLIENT") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - satisfies( - DbIncubatingAttributes.DB_STATEMENT, - stringAssert -> - stringAssert.startsWith("CLIENT SETINFO lib-ver")))), + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo( + ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + satisfies( + DbIncubatingAttributes.DB_STATEMENT, + stringAssert -> + stringAssert.startsWith("CLIENT SETINFO lib-ver"))))), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT")))); + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo( + ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "DEBUG SEGFAULT"))))); } else { - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( @@ -424,15 +447,18 @@ void testDebugSegfaultCommandWithNoArgumentProducesNoSpan() { span.hasName("DEBUG") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, - containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT")) + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo( + ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "DEBUG SEGFAULT"))) // these are no longer recorded since Lettuce 6.1.6 .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), @@ -448,13 +474,13 @@ void testShutdownCommandProducesNoSpan() { if (Boolean.getBoolean("testLatestDeps")) { // ignore CLIENT SETINFO traces - getInstrumentationExtension().waitForTraces(2); - getInstrumentationExtension().clearData(); + testing().waitForTraces(2); + testing().clearData(); } commands.shutdown(false); - getInstrumentationExtension() + testing() .waitAndAssertTraces( trace -> { if (Boolean.getBoolean("testLatestDeps")) { @@ -465,29 +491,36 @@ void testShutdownCommandProducesNoSpan() { // Seems to only be treated as an error with Lettuce 6+ .hasException(new RedisException("Connection disconnected")) .hasAttributesSatisfyingExactly( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE"))); + addExtraAttributes( + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE")))); } else { trace.hasSpansSatisfyingExactly( span -> span.hasName("SHUTDOWN") .hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( - equalTo(AttributeKey.stringKey("error"), "Connection disconnected"), - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), - equalTo( - NetworkAttributes.NETWORK_PEER_PORT, containerConnection.port), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE")) + addExtraAttributes( + equalTo( + AttributeKey.stringKey("error"), "Connection disconnected"), + equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), + equalTo( + NetworkAttributes.NETWORK_PEER_PORT, + containerConnection.port), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, containerConnection.port), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, "SHUTDOWN NOSAVE"))) .hasEventsSatisfyingExactly( event -> event.hasName("redis.encode.start"), event -> event.hasName("redis.encode.end"))); diff --git a/instrumentation/log4j/log4j-appender-2.17/library/README.md b/instrumentation/log4j/log4j-appender-2.17/library/README.md index 42decc1e0813..4a3d14441a44 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/README.md +++ b/instrumentation/log4j/log4j-appender-2.17/library/README.md @@ -20,7 +20,6 @@ For Maven, add to your `pom.xml` dependencies: io.opentelemetry.instrumentation opentelemetry-log4j-appender-2.17 OPENTELEMETRY_VERSION - runtime ``` @@ -28,7 +27,7 @@ For Maven, add to your `pom.xml` dependencies: For Gradle, add to your dependencies: ```groovy -runtimeOnly("io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17:OPENTELEMETRY_VERSION") +implementation("io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17:OPENTELEMETRY_VERSION") ``` ### Usage diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java index 4a21b6c4b529..a57a9fd41959 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java @@ -204,7 +204,10 @@ public void setOpenTelemetry(OpenTelemetry openTelemetry) { try { // minimize scope of write lock this.openTelemetry = openTelemetry; - this.eventsToReplay.drainTo(eventsToReplay); + // tests set openTelemetry to null, ignore it + if (openTelemetry != null) { + this.eventsToReplay.drainTo(eventsToReplay); + } } finally { writeLock.unlock(); } diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java index edb3ffda13a6..06ae481de250 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java @@ -25,7 +25,7 @@ class MongoDbAttributesGetter implements DbClientAttributesGetter { - // copied from DbIncubatingAttributes.DbSystemValues + // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String MONGODB = "mongodb"; @Nullable private static final Method IS_TRUNCATED_METHOD; @@ -50,10 +50,11 @@ class MongoDbAttributesGetter implements DbClientAttributesGetter { @Override public String extract(CommandStartedEvent event) { - String operation = dbAttributesGetter.getOperation(event); - String dbName = dbAttributesGetter.getName(event); + String operation = dbAttributesGetter.getDbOperationName(event); + String dbName = dbAttributesGetter.getDbNamespace(event); if (operation == null) { return dbName == null ? DEFAULT_SPAN_NAME : dbName; } diff --git a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java index cb51f8efb076..1f562caafca0 100644 --- a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java +++ b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/OpenSearchRestTest.java @@ -38,6 +38,7 @@ import org.opensearch.testcontainers.OpensearchContainer; import org.testcontainers.utility.DockerImageName; +@SuppressWarnings("deprecation") // using deprecated semconv public class OpenSearchRestTest { @RegisterExtension static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create(); @@ -87,7 +88,6 @@ static void tearDownOpenSearch() { @Test void shouldGetStatusWithTraces() throws IOException { - client.performRequest(new Request("GET", "_cluster/health")); testing.waitAndAssertTraces( diff --git a/instrumentation/opensearch/opensearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/OpenSearchRestAttributesGetter.java b/instrumentation/opensearch/opensearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/OpenSearchRestAttributesGetter.java index 79e70641dfd9..aadbeba17015 100644 --- a/instrumentation/opensearch/opensearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/OpenSearchRestAttributesGetter.java +++ b/instrumentation/opensearch/opensearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/OpenSearchRestAttributesGetter.java @@ -13,10 +13,11 @@ final class OpenSearchRestAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(OpenSearchRestRequest request) { - return DbIncubatingAttributes.DbSystemValues.OPENSEARCH; + public String getDbSystem(OpenSearchRestRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.OPENSEARCH; } + @Deprecated @Override @Nullable public String getUser(OpenSearchRestRequest request) { @@ -25,10 +26,11 @@ public String getUser(OpenSearchRestRequest request) { @Override @Nullable - public String getName(OpenSearchRestRequest request) { + public String getDbNamespace(OpenSearchRestRequest request) { return null; } + @Deprecated @Override @Nullable public String getConnectionString(OpenSearchRestRequest request) { @@ -37,13 +39,13 @@ public String getConnectionString(OpenSearchRestRequest request) { @Override @Nullable - public String getStatement(OpenSearchRestRequest request) { + public String getDbQueryText(OpenSearchRestRequest request) { return request.getMethod() + " " + request.getOperation(); } @Override @Nullable - public String getOperation(OpenSearchRestRequest request) { + public String getDbOperationName(OpenSearchRestRequest request) { return request.getMethod(); } } diff --git a/instrumentation/opentelemetry-instrumentation-api/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/SpanKeyInstrumentation.java b/instrumentation/opentelemetry-instrumentation-api/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/SpanKeyInstrumentation.java index 2439bfb7cc82..b8cc4ea99f40 100644 --- a/instrumentation/opentelemetry-instrumentation-api/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/SpanKeyInstrumentation.java +++ b/instrumentation/opentelemetry-instrumentation-api/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/SpanKeyInstrumentation.java @@ -41,22 +41,16 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class StoreInContextAdvice { - @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) - public static Object onEnter() { - return null; - } - - @Advice.OnMethodExit(suppress = Throwable.class) - public static void onExit( + @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) + public static Context onEnter( @Advice.This SpanKey applicationSpanKey, @Advice.Argument(0) Context applicationContext, - @Advice.Argument(1) Span applicationSpan, - @Advice.Return(readOnly = false) Context newApplicationContext) { + @Advice.Argument(1) Span applicationSpan) { io.opentelemetry.instrumentation.api.internal.SpanKey agentSpanKey = SpanKeyBridging.toAgentOrNull(applicationSpanKey); if (agentSpanKey == null) { - return; + return null; } io.opentelemetry.context.Context agentContext = @@ -64,41 +58,61 @@ public static void onExit( io.opentelemetry.api.trace.Span agentSpan = Bridging.toAgentOrNull(applicationSpan); if (agentSpan == null) { - return; + // if application span can not be bridged to agent span, this could happen when it is not + // created through bridged GlobalOpenTelemetry, we'll let the original method run and + // store the span in context without bridging + return null; } io.opentelemetry.context.Context newAgentContext = agentSpanKey.storeInContext(agentContext, agentSpan); - newApplicationContext = AgentContextStorage.toApplicationContext(newAgentContext); + return AgentContextStorage.toApplicationContext(newAgentContext); + } + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void onExit( + @Advice.Enter Context newApplicationContext, + @Advice.Return(readOnly = false) Context result) { + + if (newApplicationContext != null) { + result = newApplicationContext; + } } } @SuppressWarnings("unused") public static class FromContextOrNullAdvice { - @Advice.OnMethodEnter(skipOn = Advice.OnDefaultValue.class) - public static Object onEnter() { - return null; - } - - @Advice.OnMethodExit(suppress = Throwable.class) - public static void onExit( - @Advice.This SpanKey applicationSpanKey, - @Advice.Argument(0) Context applicationContext, - @Advice.Return(readOnly = false) Span applicationSpan) { + @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) + public static Span onEnter( + @Advice.This SpanKey applicationSpanKey, @Advice.Argument(0) Context applicationContext) { io.opentelemetry.instrumentation.api.internal.SpanKey agentSpanKey = SpanKeyBridging.toAgentOrNull(applicationSpanKey); if (agentSpanKey == null) { - return; + return null; } io.opentelemetry.context.Context agentContext = AgentContextStorage.getAgentContext(applicationContext); io.opentelemetry.api.trace.Span agentSpan = agentSpanKey.fromContextOrNull(agentContext); + if (agentSpan == null) { + // Bridged agent span was not found. Run the original method, there could be an unbridged + // span stored in the application context. + return null; + } - applicationSpan = agentSpan == null ? null : Bridging.toApplication(agentSpan); + return Bridging.toApplication(agentSpan); + } + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void onExit( + @Advice.Enter Span applicationSpan, @Advice.Return(readOnly = false) Span result) { + + if (applicationSpan != null) { + result = applicationSpan; + } } } } diff --git a/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java b/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java index cd5078cd2211..2ebea20102b6 100644 --- a/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java +++ b/instrumentation/opentelemetry-instrumentation-api/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/instrumentationapi/ContextBridgeTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.instrumentationapi; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import io.opentelemetry.api.trace.Span; @@ -18,6 +19,7 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.javaagent.instrumentation.testing.AgentSpanTesting; +import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.semconv.ErrorAttributes; import io.opentelemetry.semconv.HttpAttributes; import java.util.Arrays; @@ -76,6 +78,18 @@ void testSpanKeyBridge() { }); } + @Test + void testSpanKeyBridge_UnbridgedSpan() { + OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().build(); + // span is bridged only when it is created though a bridged OpenTelemetry instance obtained + // from GlobalOpenTelemetry + Span span = openTelemetry.getTracer("test").spanBuilder("test").startSpan(); + + Context context = SpanKey.HTTP_CLIENT.storeInContext(Context.current(), span); + assertThat(context).isNotNull(); + assertThat(SpanKey.HTTP_CLIENT.fromContextOrNull(context)).isEqualTo(span); + } + @Test void testHttpRouteHolder_SameSourceAsServerInstrumentationDoesNotOverrideRoute() { AgentSpanTesting.runWithHttpServerSpan( diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts index a19052c386f7..ebe736e79fa5 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/build.gradle.kts @@ -67,6 +67,9 @@ tasks { named("test") { enabled = false } + named("compileTestJava") { + enabled = false + } } check { diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index 4567ee9d766c..956d6aec6caa 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -29,7 +29,7 @@ import play.routing.RoutingDsl; import play.server.Server; -abstract class PlayServerTest extends AbstractHttpServerTest { +class PlayServerTest extends AbstractHttpServerTest { @RegisterExtension static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); @@ -75,9 +75,10 @@ protected Server setupServer() { Result result = Results.status( CAPTURE_HEADERS.getStatus(), CAPTURE_HEADERS.getBody()); - request - .header("X-Test-Request") - .ifPresent(value -> result.withHeader("X-Test-Response", value)); + result = + result.withHeader( + "X-Test-Response", + request.header("X-Test-Request").orElse("missing")); return result; })) .GET(INDEXED_CHILD.getPath()) diff --git a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java index b1be98ba0674..6129333750df 100644 --- a/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java +++ b/instrumentation/play/play-mvc/play-mvc-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayServerTest.java @@ -29,7 +29,7 @@ import play.routing.RoutingDsl; import play.server.Server; -abstract class PlayServerTest extends AbstractHttpServerTest { +class PlayServerTest extends AbstractHttpServerTest { @RegisterExtension static final InstrumentationExtension testing = HttpServerInstrumentationExtension.forAgent(); diff --git a/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/groovy/PlayWsClientTest.groovy b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/groovy/PlayWsClientTest.groovy deleted file mode 100644 index 0e20a872adf8..000000000000 --- a/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/groovy/PlayWsClientTest.groovy +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -class PlayJavaWsClientTest extends PlayJavaWsClientTestBase {} - -class PlayJavaStreamedWsClientTest extends PlayJavaStreamedWsClientTestBase {} - -class PlayScalaWsClientTest extends PlayScalaWsClientTestBase {} - -class PlayScalaStreamedWsClientTest extends PlayScalaStreamedWsClientTestBase {} diff --git a/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayJavaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayJavaStreamedWsClientTest.java new file mode 100644 index 000000000000..400e4149643d --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayJavaStreamedWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v1_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayJavaStreamedWsClientBaseTest; + +class PlayJavaStreamedWsClientTest extends PlayJavaStreamedWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayJavaWsClientTest.java b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayJavaWsClientTest.java new file mode 100644 index 000000000000..111378b7c259 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayJavaWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v1_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayJavaWsClientBaseTest; + +class PlayJavaWsClientTest extends PlayJavaWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayScalaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayScalaStreamedWsClientTest.java new file mode 100644 index 000000000000..39a73d93c85a --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayScalaStreamedWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v1_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayScalaStreamedWsClientBaseTest; + +class PlayScalaStreamedWsClientTest extends PlayScalaStreamedWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayScalaWsClientTest.java b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayScalaWsClientTest.java new file mode 100644 index 000000000000..afe93bde2875 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayScalaWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v1_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayScalaWsClientBaseTest; + +class PlayScalaWsClientTest extends PlayScalaWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/groovy/PlayWsClientTest.groovy b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/groovy/PlayWsClientTest.groovy deleted file mode 100644 index 0e20a872adf8..000000000000 --- a/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/groovy/PlayWsClientTest.groovy +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -class PlayJavaWsClientTest extends PlayJavaWsClientTestBase {} - -class PlayJavaStreamedWsClientTest extends PlayJavaStreamedWsClientTestBase {} - -class PlayScalaWsClientTest extends PlayScalaWsClientTestBase {} - -class PlayScalaStreamedWsClientTest extends PlayScalaStreamedWsClientTestBase {} diff --git a/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayJavaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayJavaStreamedWsClientTest.java new file mode 100644 index 000000000000..fdffbac49403 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayJavaStreamedWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayJavaStreamedWsClientBaseTest; + +class PlayJavaStreamedWsClientTest extends PlayJavaStreamedWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayJavaWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayJavaWsClientTest.java new file mode 100644 index 000000000000..f9175d644e21 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayJavaWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayJavaWsClientBaseTest; + +class PlayJavaWsClientTest extends PlayJavaWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayScalaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayScalaStreamedWsClientTest.java new file mode 100644 index 000000000000..63f68e80b602 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayScalaStreamedWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayScalaStreamedWsClientBaseTest; + +class PlayScalaStreamedWsClientTest extends PlayScalaStreamedWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayScalaWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayScalaWsClientTest.java new file mode 100644 index 000000000000..7063c444938f --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayScalaWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_0; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayScalaWsClientBaseTest; + +class PlayScalaWsClientTest extends PlayScalaWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/build.gradle.kts b/instrumentation/play/play-ws/play-ws-2.1/javaagent/build.gradle.kts index 92ded4cea19f..8060ebc876fb 100644 --- a/instrumentation/play/play-ws/play-ws-2.1/javaagent/build.gradle.kts +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/build.gradle.kts @@ -41,15 +41,33 @@ dependencies { testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) testInstrumentation(project(":instrumentation:akka:akka-http-10.0:javaagent")) testInstrumentation(project(":instrumentation:akka:akka-actor-2.3:javaagent")) +} + +val testLatestDeps = findProperty("testLatestDeps") as Boolean - latestDepTestLibrary("com.typesafe.play:play-ahc-ws-standalone_2.13:+") +testing { + suites { + val latestDepTest by registering(JvmTestSuite::class) { + dependencies { + implementation("com.typesafe.play:play-ahc-ws-standalone_2.13:+") + } + } + } } -if (findProperty("testLatestDeps") as Boolean) { - configurations { - // play-ws artifact name is different for regular and latest tests - testImplementation { - exclude("com.typesafe.play", "play-ahc-ws-standalone_$scalaVersion") +tasks { + if (testLatestDeps) { + // disable regular test running and compiling tasks when latest dep test task is run + named("test") { + enabled = false } } + + named("latestDepTest") { + enabled = testLatestDeps + } + + check { + dependsOn(testing.suites) + } } diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaStreamedWsClientTest.java new file mode 100644 index 000000000000..610f468b823f --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaStreamedWsClientTest.java @@ -0,0 +1,88 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.libs.ws.StandaloneWSClient; +import play.libs.ws.StandaloneWSRequest; +import play.libs.ws.StandaloneWSResponse; +import play.libs.ws.ahc.StandaloneAhcWSClient; + +class PlayJavaStreamedWsClientTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + static void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { + StandaloneWSRequest request = getClient(uri).url(uri.toString()).setFollowRedirects(true); + headers.forEach(request::addHeader); + request.setMethod(method); + return request; + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws ExecutionException, InterruptedException { + return internalSendRequest(request).toCompletableFuture().get().getStatus(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + internalSendRequest(request) + .whenComplete( + (response, throwable) -> { + if (throwable != null) { + requestResult.complete(throwable.getCause()); + } else { + requestResult.complete(response.getStatus()); + } + }); + } + + private static CompletionStage internalSendRequest( + StandaloneWSRequest request) { + CompletionStage stream = request.stream(); + // The status can be ready before the body so explicitly call wait for body to be ready + return stream + .thenCompose( + response -> response.getBodyAsSource().runFold("", (acc, out) -> "", materializer)) + .thenCombine(stream, (body, response) -> response); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaWsClientTest.java new file mode 100644 index 000000000000..37b61523e323 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaWsClientTest.java @@ -0,0 +1,76 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.libs.ws.StandaloneWSClient; +import play.libs.ws.StandaloneWSRequest; +import play.libs.ws.ahc.StandaloneAhcWSClient; + +class PlayJavaWsClientTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + static void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { + StandaloneWSRequest request = getClient(uri).url(uri.toString()).setFollowRedirects(true); + headers.forEach(request::addHeader); + return request.setMethod(method); + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws ExecutionException, InterruptedException { + return request.execute().toCompletableFuture().get().getStatus(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + request + .execute() + .whenComplete( + (response, throwable) -> { + if (throwable != null) { + requestResult.complete(throwable); + } else { + requestResult.complete(response.getStatus()); + } + }); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaStreamedWsClientTest.java new file mode 100644 index 000000000000..2f65c1193de5 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaStreamedWsClientTest.java @@ -0,0 +1,114 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.api.libs.ws.StandaloneWSClient; +import play.api.libs.ws.StandaloneWSRequest; +import play.api.libs.ws.StandaloneWSResponse; +import play.api.libs.ws.ahc.StandaloneAhcWSClient; +import scala.Function1; +import scala.concurrent.Await; +import scala.concurrent.ExecutionContext; +import scala.concurrent.Future; +import scala.concurrent.duration.Duration; +import scala.jdk.javaapi.CollectionConverters; +import scala.util.Try; + +class PlayScalaStreamedWsClientTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) + throws Exception { + return getClient(uri) + .url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(CollectionConverters.asScala(headers).toList()); + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws Exception { + return Await.result(internalSendRequest(request), Duration.apply(10, TimeUnit.SECONDS)) + .status(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + internalSendRequest(request) + .onComplete( + new Function1, Void>() { + @Override + public Void apply(Try response) { + if (response.isSuccess()) { + requestResult.complete(response.get().status()); + } else { + requestResult.complete(response.failed().get()); + } + return null; + } + }, + ExecutionContext.global()); + } + + private static Future internalSendRequest(StandaloneWSRequest request) { + Future futureResponse = request.stream(); + // The status can be ready before the body so explicitly call wait for body to be ready + Future bodyResponse = + futureResponse.flatMap( + new Function1>() { + @Override + public Future apply(StandaloneWSResponse wsResponse) { + return wsResponse.bodyAsSource().runFold("", (acc, out) -> "", materializer); + } + }, + ExecutionContext.global()); + return bodyResponse.flatMap( + new Function1>() { + @Override + public Future apply(String v1) { + return futureResponse; + } + }, + ExecutionContext.global()); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaWsClientTest.java new file mode 100644 index 000000000000..a954db31b68b --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaWsClientTest.java @@ -0,0 +1,100 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.api.libs.ws.StandaloneWSClient; +import play.api.libs.ws.StandaloneWSRequest; +import play.api.libs.ws.StandaloneWSResponse; +import play.api.libs.ws.ahc.StandaloneAhcWSClient; +import scala.Function1; +import scala.concurrent.Await; +import scala.concurrent.ExecutionContext; +import scala.concurrent.Future; +import scala.concurrent.duration.Duration; +import scala.jdk.javaapi.CollectionConverters; +import scala.util.Try; + +class PlayScalaWsClientTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) + throws MalformedURLException { + return getClient(uri) + .url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(CollectionConverters.asScala(headers).toSeq()); + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws Exception { + Future futureResponse = request.execute(); + Await.ready(futureResponse, Duration.apply(10, TimeUnit.SECONDS)); + Try value = futureResponse.value().get(); + if (value.isSuccess()) { + return value.get().status(); + } + // Catch the Throwable and rethrow it + throw (Exception) value.failed().get(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + request + .execute() + .onComplete( + new Function1, Void>() { + @Override + public Void apply(Try response) { + if (response.isSuccess()) { + requestResult.complete(response.get().status()); + } else { + requestResult.complete(response.failed().get()); + } + return null; + } + }, + ExecutionContext.global()); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java new file mode 100644 index 000000000000..a9288e8be04c --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/latestDepTest/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsClientBaseTest.java @@ -0,0 +1,133 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import akka.actor.ActorSystem; +import akka.stream.Materializer; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; +import io.opentelemetry.semconv.NetworkAttributes; +import io.opentelemetry.semconv.ServerAttributes; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; +import play.shaded.ahc.io.netty.resolver.InetNameResolver; +import play.shaded.ahc.io.netty.util.concurrent.EventExecutor; +import play.shaded.ahc.io.netty.util.concurrent.ImmediateEventExecutor; +import play.shaded.ahc.io.netty.util.concurrent.Promise; +import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient; +import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig; +import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient; +import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig; +import play.shaded.ahc.org.asynchttpclient.RequestBuilderBase; + +abstract class PlayWsClientBaseTest extends AbstractHttpClientTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forAgent(); + + private static ActorSystem system; + protected static AsyncHttpClient asyncHttpClient; + protected static AsyncHttpClient asyncHttpClientWithReadTimeout; + protected static Materializer materializer; + + @BeforeAll + static void setupHttpClient() { + String name = "play-ws"; + system = ActorSystem.create(name); + materializer = Materializer.matFromSystem(system); + + // Replace dns name resolver with custom implementation that returns only once address for each + // host. This is needed for "connection error dropped request" because in case of connection + // failure ahc will try the next address which isn't necessary for this test. + RequestBuilderBase.DEFAULT_NAME_RESOLVER = + new CustomNameResolver(ImmediateEventExecutor.INSTANCE); + + asyncHttpClient = createClient(false); + asyncHttpClientWithReadTimeout = createClient(true); + } + + @AfterAll + static void cleanupHttpClient() throws IOException { + asyncHttpClient.close(); + asyncHttpClientWithReadTimeout.close(); + system.terminate(); + } + + @Override + protected void configure(HttpClientTestOptions.Builder optionsBuilder) { + super.configure(optionsBuilder); + // apparently play ws does not report the 302 status code + optionsBuilder.setResponseCodeOnRedirectError(null); + optionsBuilder.setMaxRedirects(3); + optionsBuilder.spanEndsAfterBody(); + optionsBuilder.setHttpAttributes( + uri -> { + Set> attributes = + new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); + attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + if (uri.toString().endsWith("/circular-redirect")) { + attributes.remove(ServerAttributes.SERVER_ADDRESS); + attributes.remove(ServerAttributes.SERVER_PORT); + } + return attributes; + }); + } + + private static AsyncHttpClient createClient(boolean readTimeout) { + DefaultAsyncHttpClientConfig.Builder builder = + new DefaultAsyncHttpClientConfig.Builder() + .setMaxRequestRetry(0) + .setShutdownQuietPeriod(0) + .setShutdownTimeout(0) + .setMaxRedirects(3) + .setConnectTimeout(5000); + + if (readTimeout) { + builder.setReadTimeout(2000); + } + + AsyncHttpClientConfig asyncHttpClientConfig = builder.build(); + return new DefaultAsyncHttpClient(asyncHttpClientConfig); + } + + private static class CustomNameResolver extends InetNameResolver { + + public CustomNameResolver(EventExecutor executor) { + super(executor); + } + + @Override + protected void doResolve(String inetHost, Promise promise) throws Exception { + try { + promise.setSuccess(InetAddress.getByName(inetHost)); + } catch (UnknownHostException exception) { + promise.setFailure(exception); + } + } + + @Override + protected void doResolveAll(String inetHost, Promise> promise) + throws Exception { + try { + // default implementation calls InetAddress.getAllByName + promise.setSuccess(Collections.singletonList(InetAddress.getByName(inetHost))); + } catch (UnknownHostException exception) { + promise.setFailure(exception); + } + } + } +} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/groovy/PlayWsClientTest.groovy b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/groovy/PlayWsClientTest.groovy deleted file mode 100644 index 0e20a872adf8..000000000000 --- a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/groovy/PlayWsClientTest.groovy +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -class PlayJavaWsClientTest extends PlayJavaWsClientTestBase {} - -class PlayJavaStreamedWsClientTest extends PlayJavaStreamedWsClientTestBase {} - -class PlayScalaWsClientTest extends PlayScalaWsClientTestBase {} - -class PlayScalaStreamedWsClientTest extends PlayScalaStreamedWsClientTestBase {} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaStreamedWsClientTest.java new file mode 100644 index 000000000000..66eb33c82202 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaStreamedWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayJavaStreamedWsClientBaseTest; + +class PlayJavaStreamedWsClientTest extends PlayJavaStreamedWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaWsClientTest.java new file mode 100644 index 000000000000..1fe6a418fd66 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayJavaWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayJavaWsClientBaseTest; + +class PlayJavaWsClientTest extends PlayJavaWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaStreamedWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaStreamedWsClientTest.java new file mode 100644 index 000000000000..d557676e3843 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaStreamedWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayScalaStreamedWsClientBaseTest; + +class PlayScalaStreamedWsClientTest extends PlayScalaStreamedWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaWsClientTest.java b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaWsClientTest.java new file mode 100644 index 000000000000..1e0c8959db2a --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-2.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayScalaWsClientTest.java @@ -0,0 +1,10 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws.v2_1; + +import io.opentelemetry.javaagent.instrumentation.playws.PlayScalaWsClientBaseTest; + +class PlayScalaWsClientTest extends PlayScalaWsClientBaseTest {} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/build.gradle.kts b/instrumentation/play/play-ws/play-ws-common/testing/build.gradle.kts index c6b3d498a4b4..c6668c7801e1 100644 --- a/instrumentation/play/play-ws/play-ws-common/testing/build.gradle.kts +++ b/instrumentation/play/play-ws/play-ws-common/testing/build.gradle.kts @@ -8,7 +8,5 @@ dependencies { api(project(":testing-common")) api("com.typesafe.play:play-ahc-ws-standalone_$scalaVersion:1.0.2") - implementation("org.apache.groovy:groovy") implementation("io.opentelemetry:opentelemetry-api") - implementation("org.spockframework:spock-core") } diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/groovy/PlayWsClientTestBase.groovy b/instrumentation/play/play-ws/play-ws-common/testing/src/main/groovy/PlayWsClientTestBase.groovy deleted file mode 100644 index 52f47021b4d3..000000000000 --- a/instrumentation/play/play-ws/play-ws-common/testing/src/main/groovy/PlayWsClientTestBase.groovy +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult -import play.libs.ws.StandaloneWSClient -import play.libs.ws.StandaloneWSRequest -import play.libs.ws.StandaloneWSResponse -import play.libs.ws.ahc.StandaloneAhcWSClient -import scala.Function1 -import scala.collection.JavaConverters -import scala.concurrent.Await -import scala.concurrent.ExecutionContext -import scala.concurrent.Future -import scala.concurrent.duration.Duration -import scala.util.Try -import spock.lang.Shared - -import java.util.concurrent.CompletionStage -import java.util.concurrent.TimeUnit - -class PlayJavaWsClientTestBase extends PlayWsClientTestBaseBase { - @Shared - StandaloneWSClient wsClient - @Shared - StandaloneWSClient wsClientWithReadTimeout - - @Override - StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { - def request = getClient(uri).url(uri.toURL().toString()).setFollowRedirects(true) - headers.entrySet().each { entry -> request.addHeader(entry.getKey(), entry.getValue()) } - return request.setMethod(method) - } - - @Override - int sendRequest(StandaloneWSRequest request, String method, URI uri, Map headers) { - return request.execute().toCompletableFuture().get().status - } - - @Override - void sendRequestWithCallback(StandaloneWSRequest request, String method, URI uri, Map headers, HttpClientResult requestResult) { - request.execute().whenComplete { response, throwable -> - requestResult.complete({ response.status }, throwable) - } - } - - def getClient(URI uri) { - if (uri.toString().contains("/read-timeout")) { - return wsClientWithReadTimeout - } - return wsClient - } - - def setupSpec() { - wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) - wsClientWithReadTimeout = new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer) - } - - def cleanupSpec() { - wsClient?.close() - wsClientWithReadTimeout?.close() - } -} - -class PlayJavaStreamedWsClientTestBase extends PlayWsClientTestBaseBase { - @Shared - StandaloneWSClient wsClient - @Shared - StandaloneWSClient wsClientWithReadTimeout - - @Override - StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { - def request = getClient(uri).url(uri.toURL().toString()).setFollowRedirects(true) - headers.entrySet().each { entry -> request.addHeader(entry.getKey(), entry.getValue()) } - request.setMethod(method) - return request - } - - @Override - int sendRequest(StandaloneWSRequest request, String method, URI uri, Map headers) { - return internalSendRequest(request).toCompletableFuture().get().status - } - - @Override - void sendRequestWithCallback(StandaloneWSRequest request, String method, URI uri, Map headers, HttpClientResult requestResult) { - internalSendRequest(request).whenComplete { response, throwable -> - requestResult.complete({ response.status }, throwable?.getCause()) - } - } - - private CompletionStage internalSendRequest(StandaloneWSRequest request) { - def stream = request.stream() - // The status can be ready before the body so explicitly call wait for body to be ready - return stream - .thenCompose { StandaloneWSResponse response -> - response.getBodyAsSource().runFold("", { acc, out -> "" }, materializer) - } - .thenCombine(stream) { String body, StandaloneWSResponse response -> - response - } - } - - def getClient(URI uri) { - if (uri.toString().contains("/read-timeout")) { - return wsClientWithReadTimeout - } - return wsClient - } - - def setupSpec() { - wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) - wsClientWithReadTimeout = new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer) - } - - def cleanupSpec() { - wsClient?.close() - wsClientWithReadTimeout?.close() - } -} - -class PlayScalaWsClientTestBase extends PlayWsClientTestBaseBase { - @Shared - play.api.libs.ws.StandaloneWSClient wsClient - @Shared - play.api.libs.ws.StandaloneWSClient wsClientWithReadTimeout - - @Override - play.api.libs.ws.StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { - return getClient(uri).url(uri.toURL().toString()) - .withMethod(method) - .withFollowRedirects(true) - .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) - } - - @Override - int sendRequest(play.api.libs.ws.StandaloneWSRequest request, String method, URI uri, Map headers) { - def futureResponse = request.execute() - Await.ready(futureResponse, Duration.apply(10, TimeUnit.SECONDS)) - def value = futureResponse.value().get() - if (value.isSuccess()) { - return value.get().status() - } - throw value.failed().get() - } - - @Override - void sendRequestWithCallback(play.api.libs.ws.StandaloneWSRequest request, String method, URI uri, Map headers, HttpClientResult requestResult) { - request.execute().onComplete(new Function1, Void>() { - @Override - Void apply(Try response) { - if (response.isSuccess()) { - requestResult.complete(response.get().status()) - } else { - requestResult.complete(response.failed().get()) - } - return null - } - }, ExecutionContext.global()) - } - - def getClient(URI uri) { - if (uri.toString().contains("/read-timeout")) { - return wsClientWithReadTimeout - } - return wsClient - } - - def setupSpec() { - wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) - wsClientWithReadTimeout = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer) - } - - def cleanupSpec() { - wsClient?.close() - wsClientWithReadTimeout?.close() - } -} - -class PlayScalaStreamedWsClientTestBase extends PlayWsClientTestBaseBase { - @Shared - play.api.libs.ws.StandaloneWSClient wsClient - @Shared - play.api.libs.ws.StandaloneWSClient wsClientWithReadTimeout - - @Override - play.api.libs.ws.StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { - return getClient(uri).url(uri.toURL().toString()) - .withMethod(method) - .withFollowRedirects(true) - .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) - } - - @Override - int sendRequest(play.api.libs.ws.StandaloneWSRequest request, String method, URI uri, Map headers) { - Await.result(internalSendRequest(request), Duration.apply(10, TimeUnit.SECONDS)).status() - } - - @Override - void sendRequestWithCallback(play.api.libs.ws.StandaloneWSRequest request, String method, URI uri, Map headers, HttpClientResult requestResult) { - internalSendRequest(request).onComplete(new Function1, Void>() { - @Override - Void apply(Try response) { - if (response.isSuccess()) { - requestResult.complete(response.get().status()) - } else { - requestResult.complete(response.failed().get()) - } - return null - } - }, ExecutionContext.global()) - } - - private Future internalSendRequest(play.api.libs.ws.StandaloneWSRequest request) { - Future futureResponse = request.stream() - // The status can be ready before the body so explicitly call wait for body to be ready - Future bodyResponse = futureResponse.flatMap(new Function1>() { - @Override - Future apply(play.api.libs.ws.StandaloneWSResponse wsResponse) { - return wsResponse.bodyAsSource().runFold("", { acc, out -> "" }, materializer) - } - }, ExecutionContext.global()) - return bodyResponse.flatMap(new Function1>() { - @Override - Future apply(String v1) { - return futureResponse - } - }, ExecutionContext.global()) - } - - def getClient(URI uri) { - if (uri.toString().contains("/read-timeout")) { - return wsClientWithReadTimeout - } - return wsClient - } - - def setupSpec() { - wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) - wsClientWithReadTimeout = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer) - } - - def cleanupSpec() { - wsClient?.close() - wsClientWithReadTimeout?.close() - } -} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/groovy/PlayWsClientTestBaseBase.groovy b/instrumentation/play/play-ws/play-ws-common/testing/src/main/groovy/PlayWsClientTestBaseBase.groovy deleted file mode 100644 index 20df768f7b10..000000000000 --- a/instrumentation/play/play-ws/play-ws-common/testing/src/main/groovy/PlayWsClientTestBaseBase.groovy +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import akka.actor.ActorSystem -import akka.stream.ActorMaterializer -import akka.stream.ActorMaterializerSettings -import io.opentelemetry.api.common.AttributeKey -import io.opentelemetry.instrumentation.test.AgentTestTrait -import io.opentelemetry.instrumentation.test.base.HttpClientTest -import io.opentelemetry.semconv.ServerAttributes -import io.opentelemetry.semconv.NetworkAttributes -import play.shaded.ahc.io.netty.resolver.InetNameResolver -import play.shaded.ahc.io.netty.util.concurrent.EventExecutor -import play.shaded.ahc.io.netty.util.concurrent.ImmediateEventExecutor -import play.shaded.ahc.io.netty.util.concurrent.Promise -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig -import play.shaded.ahc.org.asynchttpclient.RequestBuilderBase -import spock.lang.Shared - -abstract class PlayWsClientTestBaseBase extends HttpClientTest implements AgentTestTrait { - @Shared - ActorSystem system - - @Shared - AsyncHttpClient asyncHttpClient - - @Shared - AsyncHttpClient asyncHttpClientWithReadTimeout - - @Shared - ActorMaterializer materializer - - def setupSpec() { - String name = "play-ws" - system = ActorSystem.create(name) - ActorMaterializerSettings settings = ActorMaterializerSettings.create(system) - materializer = ActorMaterializer.create(settings, system, name) - - // Replace dns name resolver with custom implementation that returns only once address for each - // host. This is needed for "connection error dropped request" because in case of connection - // failure ahc will try the next address which isn't necessary for this test. - RequestBuilderBase.DEFAULT_NAME_RESOLVER = new CustomNameResolver(ImmediateEventExecutor.INSTANCE) - - asyncHttpClient = createClient(false) - asyncHttpClientWithReadTimeout = createClient(true) - } - - def createClient(boolean readTimeout) { - DefaultAsyncHttpClientConfig.Builder builder = new DefaultAsyncHttpClientConfig.Builder() - .setMaxRequestRetry(0) - .setShutdownQuietPeriod(0) - .setShutdownTimeout(0) - .setMaxRedirects(3) - .setConnectTimeout(CONNECT_TIMEOUT_MS) - - if (readTimeout) { - builder.setReadTimeout(READ_TIMEOUT_MS) - } - - AsyncHttpClientConfig asyncHttpClientConfig =builder.build() - return new DefaultAsyncHttpClient(asyncHttpClientConfig) - } - - def cleanupSpec() { - system?.terminate() - asyncHttpClient?.close() - asyncHttpClientWithReadTimeout?.close() - } - - @Override - Integer responseCodeOnRedirectError() { - // apparently play ws does not report the 302 status code - null - } - - @Override - int maxRedirects() { - 3 - } - - @Override - Set> httpAttributes(URI uri) { - def attributes = super.httpAttributes(uri) - attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION) - if (uri.toString().endsWith("/circular-redirect")) { - attributes.remove(ServerAttributes.SERVER_ADDRESS) - attributes.remove(ServerAttributes.SERVER_PORT) - } - return attributes - } -} - -class CustomNameResolver extends InetNameResolver { - CustomNameResolver(EventExecutor executor) { - super(executor) - } - - protected void doResolve(String inetHost, Promise promise) throws Exception { - try { - promise.setSuccess(InetAddress.getByName(inetHost)) - } catch (UnknownHostException exception) { - promise.setFailure(exception) - } - } - - protected void doResolveAll(String inetHost, Promise> promise) throws Exception { - try { - // default implementation calls InetAddress.getAllByName - promise.setSuccess(Collections.singletonList(InetAddress.getByName(inetHost))) - } catch (UnknownHostException exception) { - promise.setFailure(exception) - } - } -} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayJavaStreamedWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayJavaStreamedWsClientBaseTest.java new file mode 100644 index 000000000000..5e2193c31268 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayJavaStreamedWsClientBaseTest.java @@ -0,0 +1,88 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.libs.ws.StandaloneWSClient; +import play.libs.ws.StandaloneWSRequest; +import play.libs.ws.StandaloneWSResponse; +import play.libs.ws.ahc.StandaloneAhcWSClient; + +public class PlayJavaStreamedWsClientBaseTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + static void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { + StandaloneWSRequest request = getClient(uri).url(uri.toString()).setFollowRedirects(true); + headers.forEach(request::addHeader); + request.setMethod(method); + return request; + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws ExecutionException, InterruptedException { + return internalSendRequest(request).toCompletableFuture().get().getStatus(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + internalSendRequest(request) + .whenComplete( + (response, throwable) -> { + if (throwable != null) { + requestResult.complete(throwable.getCause()); + } else { + requestResult.complete(response.getStatus()); + } + }); + } + + private static CompletionStage internalSendRequest( + StandaloneWSRequest request) { + CompletionStage stream = request.stream(); + // The status can be ready before the body so explicitly call wait for body to be ready + return stream + .thenCompose( + response -> response.getBodyAsSource().runFold("", (acc, out) -> "", materializer)) + .thenCombine(stream, (body, response) -> response); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayJavaWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayJavaWsClientBaseTest.java new file mode 100644 index 000000000000..48afe933f091 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayJavaWsClientBaseTest.java @@ -0,0 +1,78 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.libs.ws.StandaloneWSClient; +import play.libs.ws.StandaloneWSRequest; +import play.libs.ws.ahc.StandaloneAhcWSClient; + +public class PlayJavaWsClientBaseTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + static void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + // autoCleanup.deferCleanup(wsClient); + // autoCleanup.deferCleanup(wsClientWithReadTimeout); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) { + StandaloneWSRequest request = getClient(uri).url(uri.toString()).setFollowRedirects(true); + headers.forEach(request::addHeader); + return request.setMethod(method); + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws ExecutionException, InterruptedException { + return request.execute().toCompletableFuture().get().getStatus(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + request + .execute() + .whenComplete( + (response, throwable) -> { + if (throwable != null) { + requestResult.complete(throwable); + } else { + requestResult.complete(response.getStatus()); + } + }); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayScalaStreamedWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayScalaStreamedWsClientBaseTest.java new file mode 100644 index 000000000000..43c84cab9e78 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayScalaStreamedWsClientBaseTest.java @@ -0,0 +1,114 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.api.libs.ws.StandaloneWSClient; +import play.api.libs.ws.StandaloneWSRequest; +import play.api.libs.ws.StandaloneWSResponse; +import play.api.libs.ws.ahc.StandaloneAhcWSClient; +import scala.Function1; +import scala.collection.JavaConverters; +import scala.concurrent.Await; +import scala.concurrent.ExecutionContext; +import scala.concurrent.Future; +import scala.concurrent.duration.Duration; +import scala.util.Try; + +public class PlayScalaStreamedWsClientBaseTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) + throws Exception { + return getClient(uri) + .url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()); + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws Exception { + return Await.result(internalSendRequest(request), Duration.apply(10, TimeUnit.SECONDS)) + .status(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + internalSendRequest(request) + .onComplete( + new Function1, Void>() { + @Override + public Void apply(Try response) { + if (response.isSuccess()) { + requestResult.complete(response.get().status()); + } else { + requestResult.complete(response.failed().get()); + } + return null; + } + }, + ExecutionContext.global()); + } + + private static Future internalSendRequest(StandaloneWSRequest request) { + Future futureResponse = request.stream(); + // The status can be ready before the body so explicitly call wait for body to be ready + Future bodyResponse = + futureResponse.flatMap( + new Function1>() { + @Override + public Future apply(StandaloneWSResponse wsResponse) { + return wsResponse.bodyAsSource().runFold("", (acc, out) -> "", materializer); + } + }, + ExecutionContext.global()); + return bodyResponse.flatMap( + new Function1>() { + @Override + public Future apply(String v1) { + return futureResponse; + } + }, + ExecutionContext.global()); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayScalaWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayScalaWsClientBaseTest.java new file mode 100644 index 000000000000..74688e81b3ff --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayScalaWsClientBaseTest.java @@ -0,0 +1,100 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws; + +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import play.api.libs.ws.StandaloneWSClient; +import play.api.libs.ws.StandaloneWSRequest; +import play.api.libs.ws.StandaloneWSResponse; +import play.api.libs.ws.ahc.StandaloneAhcWSClient; +import scala.Function1; +import scala.collection.JavaConverters; +import scala.concurrent.Await; +import scala.concurrent.ExecutionContext; +import scala.concurrent.Future; +import scala.concurrent.duration.Duration; +import scala.util.Try; + +public class PlayScalaWsClientBaseTest extends PlayWsClientBaseTest { + + private static StandaloneWSClient wsClient; + private static StandaloneWSClient wsClientWithReadTimeout; + + @BeforeAll + void setup() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer); + wsClientWithReadTimeout = + new StandaloneAhcWSClient(asyncHttpClientWithReadTimeout, materializer); + } + + @AfterAll + static void cleanup() throws IOException { + wsClient.close(); + wsClientWithReadTimeout.close(); + } + + @Override + public StandaloneWSRequest buildRequest(String method, URI uri, Map headers) + throws MalformedURLException { + return getClient(uri) + .url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()); + } + + @Override + public int sendRequest( + StandaloneWSRequest request, String method, URI uri, Map headers) + throws Exception { + Future futureResponse = request.execute(); + Await.ready(futureResponse, Duration.apply(10, TimeUnit.SECONDS)); + Try value = futureResponse.value().get(); + if (value.isSuccess()) { + return value.get().status(); + } + // Catch the Throwable and rethrow it + throw (Exception) value.failed().get(); + } + + @Override + public void sendRequestWithCallback( + StandaloneWSRequest request, + String method, + URI uri, + Map headers, + HttpClientResult requestResult) { + request + .execute() + .onComplete( + new Function1, Void>() { + @Override + public Void apply(Try response) { + if (response.isSuccess()) { + requestResult.complete(response.get().status()); + } else { + requestResult.complete(response.failed().get()); + } + return null; + } + }, + ExecutionContext.global()); + } + + private static StandaloneWSClient getClient(URI uri) { + if (uri.toString().contains("/read-timeout")) { + return wsClientWithReadTimeout; + } + return wsClient; + } +} diff --git a/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java new file mode 100644 index 000000000000..905e2c44f9e1 --- /dev/null +++ b/instrumentation/play/play-ws/play-ws-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/PlayWsClientBaseTest.java @@ -0,0 +1,134 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.playws; + +import akka.actor.ActorSystem; +import akka.stream.ActorMaterializer; +import akka.stream.ActorMaterializerSettings; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions; +import io.opentelemetry.semconv.NetworkAttributes; +import io.opentelemetry.semconv.ServerAttributes; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; +import play.shaded.ahc.io.netty.resolver.InetNameResolver; +import play.shaded.ahc.io.netty.util.concurrent.EventExecutor; +import play.shaded.ahc.io.netty.util.concurrent.ImmediateEventExecutor; +import play.shaded.ahc.io.netty.util.concurrent.Promise; +import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient; +import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig; +import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient; +import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig; +import play.shaded.ahc.org.asynchttpclient.RequestBuilderBase; + +abstract class PlayWsClientBaseTest extends AbstractHttpClientTest { + + @RegisterExtension + static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forAgent(); + + private static ActorSystem system; + protected static AsyncHttpClient asyncHttpClient; + protected static AsyncHttpClient asyncHttpClientWithReadTimeout; + protected static ActorMaterializer materializer; + + @BeforeAll + static void setupHttpClient() { + String name = "play-ws"; + system = ActorSystem.create(name); + materializer = ActorMaterializer.create(ActorMaterializerSettings.create(system), system, name); + + // Replace dns name resolver with custom implementation that returns only once address for each + // host. This is needed for "connection error dropped request" because in case of connection + // failure ahc will try the next address which isn't necessary for this test. + RequestBuilderBase.DEFAULT_NAME_RESOLVER = + new CustomNameResolver(ImmediateEventExecutor.INSTANCE); + + asyncHttpClient = createClient(false); + asyncHttpClientWithReadTimeout = createClient(true); + } + + @AfterAll + static void cleanupHttpClient() throws IOException { + asyncHttpClient.close(); + asyncHttpClientWithReadTimeout.close(); + system.terminate(); + } + + @Override + protected void configure(HttpClientTestOptions.Builder optionsBuilder) { + super.configure(optionsBuilder); + // apparently play ws does not report the 302 status code + optionsBuilder.setResponseCodeOnRedirectError(null); + optionsBuilder.setMaxRedirects(3); + optionsBuilder.spanEndsAfterBody(); + optionsBuilder.setHttpAttributes( + uri -> { + Set> attributes = + new HashSet<>(HttpClientTestOptions.DEFAULT_HTTP_ATTRIBUTES); + attributes.remove(NetworkAttributes.NETWORK_PROTOCOL_VERSION); + if (uri.toString().endsWith("/circular-redirect")) { + attributes.remove(ServerAttributes.SERVER_ADDRESS); + attributes.remove(ServerAttributes.SERVER_PORT); + } + return attributes; + }); + } + + private static AsyncHttpClient createClient(boolean readTimeout) { + DefaultAsyncHttpClientConfig.Builder builder = + new DefaultAsyncHttpClientConfig.Builder() + .setMaxRequestRetry(0) + .setShutdownQuietPeriod(0) + .setShutdownTimeout(0) + .setMaxRedirects(3) + .setConnectTimeout(5000); + + if (readTimeout) { + builder.setReadTimeout(2000); + } + + AsyncHttpClientConfig asyncHttpClientConfig = builder.build(); + return new DefaultAsyncHttpClient(asyncHttpClientConfig); + } + + private static class CustomNameResolver extends InetNameResolver { + + public CustomNameResolver(EventExecutor executor) { + super(executor); + } + + @Override + protected void doResolve(String inetHost, Promise promise) throws Exception { + try { + promise.setSuccess(InetAddress.getByName(inetHost)); + } catch (UnknownHostException exception) { + promise.setFailure(exception); + } + } + + @Override + protected void doResolveAll(String inetHost, Promise> promise) + throws Exception { + try { + // default implementation calls InetAddress.getAllByName + promise.setSuccess(Collections.singletonList(InetAddress.getByName(inetHost))); + } catch (UnknownHostException exception) { + promise.setFailure(exception); + } + } + } +} diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index d87708e196bb..378638960c63 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -15,7 +15,6 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.common.AttributeKey; @@ -25,6 +24,7 @@ import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; @@ -340,6 +340,7 @@ void testConsumeNonPartitionedTopicUsingBatchReceiveAsync() throws Exception { equalTo(SERVER_ADDRESS, brokerHost))))); } + @SuppressWarnings("deprecation") // using deprecated semconv static List sendAttributes( String destination, String messageId, boolean testHeaders) { List assertions = @@ -349,7 +350,7 @@ static List sendAttributes( equalTo(SERVER_ADDRESS, brokerHost), equalTo(SERVER_PORT, brokerPort), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), equalTo(MESSAGE_TYPE, "normal"))); @@ -377,6 +378,7 @@ static List receiveAttributes( return receiveAttributes(destination, messageId, testHeaders, false); } + @SuppressWarnings("deprecation") // using deprecated semconv static List receiveAttributes( String destination, String messageId, boolean testHeaders, boolean isBatch) { List assertions = @@ -386,7 +388,7 @@ static List receiveAttributes( equalTo(SERVER_ADDRESS, brokerHost), equalTo(SERVER_PORT, brokerPort), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (testHeaders) { @@ -405,6 +407,7 @@ static List receiveAttributes( return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv static List processAttributes( String destination, String messageId, boolean testHeaders) { List assertions = @@ -412,7 +415,7 @@ static List processAttributes( Arrays.asList( equalTo(MESSAGING_SYSTEM, "pulsar"), equalTo(MESSAGING_DESTINATION_NAME, destination), - equalTo(MESSAGING_OPERATION, "process"), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), equalTo(MESSAGING_MESSAGE_ID, messageId), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative))); if (testHeaders) { diff --git a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/DbExecution.java b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/DbExecution.java index bcdca4014339..95284c985c33 100644 --- a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/DbExecution.java +++ b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/DbExecution.java @@ -25,7 +25,7 @@ * any time. */ public final class DbExecution { - // copied from DbIncubatingAttributes.DbSystemValues + // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String OTHER_SQL = "other_sql"; private final String system; @@ -34,7 +34,7 @@ public final class DbExecution { private final String host; private final Integer port; private final String connectionString; - private final String rawStatement; + private final String rawQueryText; private Context context; @@ -66,7 +66,7 @@ public DbExecution(QueryExecutionInfo queryInfo, ConnectionFactoryOptions factor protocol != null ? ":" + protocol : "", host != null ? "//" + host : "", port != null ? ":" + port : ""); - this.rawStatement = + this.rawQueryText = queryInfo.getQueries().stream().map(QueryInfo::getQuery).collect(Collectors.joining(";\n")); } @@ -94,8 +94,8 @@ public String getConnectionString() { return connectionString; } - public String getRawStatement() { - return rawStatement; + public String getRawQueryText() { + return rawQueryText; } public Context getContext() { @@ -127,7 +127,7 @@ public String toString() { + connectionString + '\'' + ", rawStatement='" - + rawStatement + + rawQueryText + '\'' + ", context=" + context diff --git a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcSqlAttributesGetter.java b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcSqlAttributesGetter.java index 6b7bcbb41ff6..9f0a259d5ae9 100644 --- a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcSqlAttributesGetter.java +++ b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcSqlAttributesGetter.java @@ -16,10 +16,11 @@ public enum R2dbcSqlAttributesGetter implements SqlClientAttributesGetter span.hasName("consumer").hasParent(trace.getSpan(1)))); } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List sendAttributes(ProducerRecord record) { List assertions = new ArrayList<>( @@ -183,7 +185,7 @@ protected static List sendAttributes(ProducerRecord stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, @@ -199,6 +201,7 @@ protected static List sendAttributes(ProducerRecord receiveAttributes(String topic) { ArrayList assertions = new ArrayList<>( @@ -207,7 +210,7 @@ protected static List receiveAttributes(String topic) { equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, topic), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1))); if (Boolean.getBoolean("hasConsumerGroup")) { @@ -216,6 +219,7 @@ protected static List receiveAttributes(String topic) { return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List processAttributes( ProducerRecord record) { List assertions = @@ -225,7 +229,7 @@ protected static List processAttributes( equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, diff --git a/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaAttributesGetter.java b/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaAttributesGetter.java index a99f63faebc2..a103eddf771c 100644 --- a/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaAttributesGetter.java +++ b/instrumentation/rediscala-1.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rediscala/RediscalaAttributesGetter.java @@ -14,10 +14,11 @@ final class RediscalaAttributesGetter implements DbClientAttributesGetter> { @Override - public String getSystem(RedisCommand redisCommand) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(RedisCommand redisCommand) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Override @Nullable public String getUser(RedisCommand redisCommand) { @@ -26,10 +27,11 @@ public String getUser(RedisCommand redisCommand) { @Override @Nullable - public String getName(RedisCommand redisCommand) { + public String getDbNamespace(RedisCommand redisCommand) { return null; } + @Deprecated @Override @Nullable public String getConnectionString(RedisCommand redisCommand) { @@ -38,12 +40,12 @@ public String getConnectionString(RedisCommand redisCommand) { @Override @Nullable - public String getStatement(RedisCommand redisCommand) { + public String getDbQueryText(RedisCommand redisCommand) { return null; } @Override - public String getOperation(RedisCommand redisCommand) { + public String getDbOperationName(RedisCommand redisCommand) { return redisCommand.getClass().getSimpleName().toUpperCase(Locale.ROOT); } } diff --git a/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts b/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts index a37e1e87a96e..6e255116700d 100644 --- a/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts +++ b/instrumentation/redisson/redisson-3.17/javaagent/build.gradle.kts @@ -24,7 +24,17 @@ dependencies { testImplementation(project(":instrumentation:redisson:redisson-common:testing")) } -tasks.test { - systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) +tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonDbAttributesGetter.java b/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonDbAttributesGetter.java index e11f73ec316a..a2000c8e06c6 100644 --- a/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonDbAttributesGetter.java +++ b/instrumentation/redisson/redisson-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/RedissonDbAttributesGetter.java @@ -12,10 +12,11 @@ final class RedissonDbAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(RedissonRequest request) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(RedissonRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Nullable @Override public String getUser(RedissonRequest request) { @@ -24,23 +25,24 @@ public String getUser(RedissonRequest request) { @Nullable @Override - public String getName(RedissonRequest request) { + public String getDbNamespace(RedissonRequest request) { return null; } + @Deprecated @Override public String getConnectionString(RedissonRequest request) { return null; } @Override - public String getStatement(RedissonRequest request) { + public String getDbQueryText(RedissonRequest request) { return request.getStatement(); } @Nullable @Override - public String getOperation(RedissonRequest request) { + public String getDbOperationName(RedissonRequest request) { return request.getOperation(); } } diff --git a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java index 6f565a02a80d..2a0936aee1de 100644 --- a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java +++ b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonAsyncClientTest.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.io.Serializable; @@ -47,6 +48,7 @@ import org.redisson.config.SingleServerConfig; import org.testcontainers.containers.GenericContainer; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractRedissonAsyncClientTest { @@ -119,8 +121,14 @@ void futureSet() throws ExecutionException, InterruptedException, TimeoutExcepti equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")))); + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "SET foo ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "SET")))); } @Test @@ -152,8 +160,14 @@ void futureWhenComplete() throws ExecutionException, InterruptedException, Timeo equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SADD set1 ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SADD")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "SADD set1 ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "SADD")) .hasParent(trace.getSpan(0)), span -> span.hasName("callback").hasKind(INTERNAL).hasParent(trace.getSpan(0)))); } @@ -226,7 +240,10 @@ void atomicBatchCommand() throws ExecutionException, InterruptedException, Timeo equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "MULTI;SET batch1 ?")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "MULTI;SET batch1 ?")) .hasParent(trace.getSpan(0)), span -> span.hasName("SET") @@ -236,8 +253,14 @@ void atomicBatchCommand() throws ExecutionException, InterruptedException, Timeo equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET batch2 ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "SET batch2 ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "SET")) .hasParent(trace.getSpan(0)), span -> span.hasName("EXEC") @@ -247,8 +270,14 @@ void atomicBatchCommand() throws ExecutionException, InterruptedException, Timeo equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "EXEC"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "EXEC")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "EXEC"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "EXEC")) .hasParent(trace.getSpan(0)), span -> span.hasName("callback").hasKind(INTERNAL).hasParent(trace.getSpan(0)))); } diff --git a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java index ca9fa0d72f6c..0c9278a6cde2 100644 --- a/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java +++ b/instrumentation/redisson/redisson-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/AbstractRedissonClientTest.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; @@ -51,6 +52,7 @@ import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractRedissonClientTest { @@ -122,8 +124,14 @@ void stringCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET foo ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET"))), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "SET foo ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "SET"))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -134,8 +142,14 @@ void stringCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "GET foo"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "GET")))); + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "GET foo"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "GET")))); } @Test @@ -161,7 +175,8 @@ void batchCommand() equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), "SET batch1 ?;SET batch2 ?")))); } @@ -202,7 +217,10 @@ void atomicBatchCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "MULTI;SET batch1 ?")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "MULTI;SET batch1 ?")) .hasParent(trace.getSpan(0)), span -> span.hasName("SET") @@ -212,8 +230,14 @@ void atomicBatchCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SET batch2 ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SET")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "SET batch2 ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "SET")) .hasParent(trace.getSpan(0)), span -> span.hasName("EXEC") @@ -223,8 +247,14 @@ void atomicBatchCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "EXEC"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "EXEC")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "EXEC"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "EXEC")) .hasParent(trace.getSpan(0)))); } @@ -245,8 +275,14 @@ void listCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "RPUSH list1 ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "RPUSH")) + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "RPUSH list1 ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "RPUSH")) .hasNoParent())); } @@ -271,9 +307,13 @@ void hashCommand() { equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), String.format("EVAL %s 1 map1 ? ?", script)), - equalTo(DbIncubatingAttributes.DB_OPERATION, "EVAL"))), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "EVAL"))), trace -> trace.hasSpansSatisfyingExactly( span -> @@ -284,8 +324,14 @@ void hashCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "HGET map1 key1"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "HGET")))); + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "HGET map1 key1"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "HGET")))); } @Test @@ -305,8 +351,14 @@ void setCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "SADD set1 ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "SADD")))); + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "SADD set1 ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "SADD")))); } @Test @@ -334,8 +386,13 @@ void sortedSetCommand() equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), equalTo( - DbIncubatingAttributes.DB_STATEMENT, "ZADD sort_set1 ? ? ? ? ? ?"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "ZADD")))); + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "ZADD sort_set1 ? ? ? ? ? ?"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "ZADD")))); } private static void invokeAddAll(RScoredSortedSet object, Map arg) @@ -360,8 +417,14 @@ void atomicLongCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, "INCR AtomicLong"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "INCR")))); + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), + "INCR AtomicLong"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "INCR")))); } @Test @@ -386,9 +449,13 @@ void lockCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "EVAL"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "EVAL"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), stringAssert -> stringAssert.startsWith("EVAL"))))); traceAsserts.add( trace -> @@ -401,9 +468,13 @@ void lockCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "EVAL"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "EVAL"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), stringAssert -> stringAssert.startsWith("EVAL"))))); if (lockHas3Traces()) { traceAsserts.add( @@ -417,9 +488,13 @@ void lockCommand() { equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip), equalTo(NetworkAttributes.NETWORK_PEER_PORT, (long) port), equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_OPERATION, "DEL"), + equalTo( + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_OPERATION), + "DEL"), satisfies( - DbIncubatingAttributes.DB_STATEMENT, + SemconvStabilityUtil.getAttributeKey( + DbIncubatingAttributes.DB_STATEMENT), stringAssert -> stringAssert.startsWith("DEL"))))); } diff --git a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/OsResourceTest.java b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/OsResourceTest.java index 453fb92ac071..27bbcf293500 100644 --- a/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/OsResourceTest.java +++ b/instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/OsResourceTest.java @@ -21,7 +21,7 @@ void linux() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.LINUX); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.LINUX); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -31,7 +31,7 @@ void macos() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.DARWIN); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.DARWIN); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -41,7 +41,7 @@ void windows() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.WINDOWS); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.WINDOWS); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -51,7 +51,7 @@ void freebsd() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.FREEBSD); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.FREEBSD); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -61,7 +61,7 @@ void netbsd() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.NETBSD); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.NETBSD); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -71,7 +71,7 @@ void openbsd() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.OPENBSD); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.OPENBSD); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -81,7 +81,7 @@ void dragonflybsd() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.DRAGONFLYBSD); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.DRAGONFLYBSD); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -91,7 +91,7 @@ void hpux() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.HPUX); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.HPUX); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -101,7 +101,7 @@ void aix() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.AIX); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.AIX); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -111,7 +111,7 @@ void solaris() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.SOLARIS); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.SOLARIS); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } @@ -121,7 +121,7 @@ void zos() { Resource resource = OsResource.buildResource(); assertThat(resource.getSchemaUrl()).isEqualTo(SchemaUrls.V1_24_0); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_TYPE)) - .isEqualTo(OsIncubatingAttributes.OsTypeValues.Z_OS); + .isEqualTo(OsIncubatingAttributes.OsTypeIncubatingValues.Z_OS); assertThat(resource.getAttribute(OsIncubatingAttributes.OS_DESCRIPTION)).isNotEmpty(); } diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java index 60b277d7a46d..a2307762cca2 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java @@ -44,6 +44,7 @@ import org.slf4j.LoggerFactory; /** TODO add tests for propagationEnabled flag */ +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) abstract class AbstractRocketMqClientTest { diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerProcessAttributeExtractor.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerProcessAttributeExtractor.java index ce36d59cb5f1..13e89e33753a 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerProcessAttributeExtractor.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerProcessAttributeExtractor.java @@ -23,6 +23,7 @@ enum RocketMqConsumerProcessAttributeExtractor implements AttributesExtractor { INSTANCE; + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void onStart( AttributesBuilder attributes, Context parentContext, MessageView messageView) { diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerReceiveAttributeExtractor.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerReceiveAttributeExtractor.java index c60ccd08b66c..7f0baff093c6 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerReceiveAttributeExtractor.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqConsumerReceiveAttributeExtractor.java @@ -23,6 +23,7 @@ enum RocketMqConsumerReceiveAttributeExtractor public void onStart( AttributesBuilder attributes, Context parentContext, ReceiveMessageRequest request) {} + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void onEnd( AttributesBuilder attributes, diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqProducerAttributeExtractor.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqProducerAttributeExtractor.java index 8c77a20ba899..ac916accfab7 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqProducerAttributeExtractor.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/RocketMqProducerAttributeExtractor.java @@ -37,22 +37,22 @@ public void onStart( case FIFO: attributes.put( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.FIFO); + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues.FIFO); break; case DELAY: attributes.put( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.DELAY); + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues.DELAY); break; case TRANSACTION: attributes.put( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.TRANSACTION); + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues.TRANSACTION); break; default: attributes.put( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.NORMAL); + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues.NORMAL); } } diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java index c9b0557e79a5..5f2fcb31d631 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientSuppressReceiveSpanTest.java @@ -9,8 +9,6 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_KEYS; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TAG; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TYPE; @@ -38,6 +36,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractRocketMqClientSuppressReceiveSpanTest { private static final RocketMqProxyContainer container = new RocketMqProxyContainer(); @@ -117,14 +116,16 @@ void testSendAndConsumeMessage() throws Throwable { equalTo( MESSAGING_ROCKETMQ_MESSAGE_TYPE, MessagingIncubatingAttributes - .MessagingRocketmqMessageTypeValues.NORMAL), + .MessagingRocketmqMessageTypeIncubatingValues.NORMAL), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo( MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "publish")), + equalTo( + MessagingIncubatingAttributes.MESSAGING_OPERATION, + "publish")), span -> span.hasKind(SpanKind.CONSUMER) .hasName(topic + " process") @@ -132,7 +133,10 @@ void testSendAndConsumeMessage() throws Throwable { // As the child of send span. .hasParent(trace.getSpan(1)) .hasAttributesSatisfyingExactly( - equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo( + MessagingIncubatingAttributes + .MESSAGING_ROCKETMQ_CLIENT_GROUP, + consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), @@ -141,7 +145,9 @@ void testSendAndConsumeMessage() throws Throwable { MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "process")), + equalTo( + MessagingIncubatingAttributes.MESSAGING_OPERATION, + "process")), span -> span.hasName("child") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java index beab651f2a8f..1acb96f61268 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java @@ -11,8 +11,6 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; -import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_DELIVERY_TIMESTAMP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_GROUP; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_KEYS; @@ -56,6 +54,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; +@SuppressWarnings("deprecation") // using deprecated semconv @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractRocketMqClientTest { @@ -416,12 +415,13 @@ private static SpanDataAssert assertProducerSpan( equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.NORMAL), + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues + .NORMAL), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "publish"))); + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.PRODUCER) @@ -447,12 +447,13 @@ private static SpanDataAssert assertProducerSpanWithFifoMessage( equalTo(MESSAGING_ROCKETMQ_MESSAGE_GROUP, messageGroup), equalTo( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.FIFO), + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues + .FIFO), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "publish"))); + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.PRODUCER) @@ -478,12 +479,13 @@ private static SpanDataAssert assertProducerSpanWithDelayMessage( equalTo(MESSAGING_ROCKETMQ_MESSAGE_DELIVERY_TIMESTAMP, deliveryTimestamp), equalTo( MESSAGING_ROCKETMQ_MESSAGE_TYPE, - MessagingIncubatingAttributes.MessagingRocketmqMessageTypeValues.DELAY), + MessagingIncubatingAttributes.MessagingRocketmqMessageTypeIncubatingValues + .DELAY), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "publish"))); + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.PRODUCER) @@ -498,10 +500,10 @@ private static SpanDataAssert assertReceiveSpan( .hasName(topic + " receive") .hasStatus(StatusData.unset()) .hasAttributesSatisfyingExactly( - equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo(MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), equalTo(MESSAGING_BATCH_MESSAGE_COUNT, 1)); } @@ -518,14 +520,15 @@ private static SpanDataAssert assertProcessSpan( List attributeAssertions = new ArrayList<>( Arrays.asList( - equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo( + MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_MESSAGE_BODY_SIZE, (long) body.length), equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "process"))); + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.CONSUMER) @@ -550,7 +553,8 @@ private static SpanDataAssert assertProcessSpanWithFifoMessage( List attributeAssertions = new ArrayList<>( Arrays.asList( - equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo( + MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_ROCKETMQ_MESSAGE_GROUP, messageGroup), @@ -558,7 +562,7 @@ private static SpanDataAssert assertProcessSpanWithFifoMessage( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "process"))); + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.CONSUMER) @@ -583,7 +587,8 @@ private static SpanDataAssert assertProcessSpanWithDelayMessage( List attributeAssertions = new ArrayList<>( Arrays.asList( - equalTo(MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), + equalTo( + MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_CLIENT_GROUP, consumerGroup), equalTo(MESSAGING_ROCKETMQ_MESSAGE_TAG, tag), equalTo(MESSAGING_ROCKETMQ_MESSAGE_KEYS, Arrays.asList(keys)), equalTo(MESSAGING_ROCKETMQ_MESSAGE_DELIVERY_TIMESTAMP, deliveryTimestamp), @@ -591,7 +596,7 @@ private static SpanDataAssert assertProcessSpanWithDelayMessage( equalTo(MESSAGING_SYSTEM, "rocketmq"), equalTo(MESSAGING_MESSAGE_ID, sendReceipt.getMessageId().toString()), equalTo(MESSAGING_DESTINATION_NAME, topic), - equalTo(MESSAGING_OPERATION, "process"))); + equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"))); attributeAssertions.addAll(Arrays.asList(extraAttributes)); return span.hasKind(SpanKind.CONSUMER) diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java index 076c43c1c9c3..6e4489dcd15c 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java @@ -22,6 +22,7 @@ import java.security.Principal; import java.util.function.Function; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class BaseServletHelper { protected final Instrumenter, ServletResponseContext> instrumenter; diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletAdditionalAttributesExtractor.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletAdditionalAttributesExtractor.java index 3ecebe26fe3b..7a4f0e7f4dfb 100644 --- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletAdditionalAttributesExtractor.java +++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletAdditionalAttributesExtractor.java @@ -37,6 +37,7 @@ public void onStart( Context parentContext, ServletRequestContext requestContext) {} + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void onEnd( AttributesBuilder attributes, diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts index dafd20b4f923..79c30b7ff7f3 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts +++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { implementation(project(":instrumentation:log4j:log4j-appender-2.17:library")) compileOnly("org.apache.logging.log4j:log4j-core:2.17.0") implementation(project(":instrumentation:logback:logback-appender-1.0:library")) + implementation(project(":instrumentation:logback:logback-mdc-1.0:library")) compileOnly("ch.qos.logback:logback-classic:1.0.0") implementation(project(":instrumentation:jdbc:library")) diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java index c2ef98d65f1d..06cc2eb09a3d 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java @@ -19,7 +19,19 @@ class LogbackAppenderInstaller { static void install(ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { - Optional existingOpenTelemetryAppender = findOpenTelemetryAppender(); + Optional + existingMdcAppender = + findAppender( + io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender.class); + if (existingMdcAppender.isPresent()) { + initializeMdcAppenderFromProperties( + applicationEnvironmentPreparedEvent, existingMdcAppender.get()); + } else if (isLogbackMdcAppenderAddable(applicationEnvironmentPreparedEvent)) { + addMdcAppender(applicationEnvironmentPreparedEvent); + } + + Optional existingOpenTelemetryAppender = + findAppender(OpenTelemetryAppender.class); if (existingOpenTelemetryAppender.isPresent()) { reInitializeOpenTelemetryAppender( existingOpenTelemetryAppender, applicationEnvironmentPreparedEvent); @@ -30,13 +42,22 @@ static void install(ApplicationEnvironmentPreparedEvent applicationEnvironmentPr private static boolean isLogbackAppenderAddable( ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { + return isAppenderAddable( + applicationEnvironmentPreparedEvent, "otel.instrumentation.logback-appender.enabled"); + } + + private static boolean isLogbackMdcAppenderAddable( + ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { + return isAppenderAddable( + applicationEnvironmentPreparedEvent, "otel.instrumentation.logback-mdc.enabled"); + } + + private static boolean isAppenderAddable( + ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent, String property) { boolean otelSdkDisabled = evaluateBooleanProperty(applicationEnvironmentPreparedEvent, "otel.sdk.disabled", false); boolean logbackInstrumentationEnabled = - evaluateBooleanProperty( - applicationEnvironmentPreparedEvent, - "otel.instrumentation.logback-appender.enabled", - true); + evaluateBooleanProperty(applicationEnvironmentPreparedEvent, property, true); return !otelSdkDisabled && logbackInstrumentationEnabled; } @@ -133,6 +154,58 @@ private static void initializeOpenTelemetryAppenderFromProperties( } } + private static void addMdcAppender( + ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { + ch.qos.logback.classic.Logger logger = + (ch.qos.logback.classic.Logger) + LoggerFactory.getILoggerFactory().getLogger(Logger.ROOT_LOGGER_NAME); + io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender openTelemetryAppender = + new io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender(); + initializeMdcAppenderFromProperties(applicationEnvironmentPreparedEvent, openTelemetryAppender); + openTelemetryAppender.start(); + logger.addAppender(openTelemetryAppender); + } + + private static void initializeMdcAppenderFromProperties( + ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent, + io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender + openTelemetryAppender) { + + // Implemented in the same way as the + // org.springframework.boot.context.logging.LoggingApplicationListener, config properties not + // available + Boolean addBaggage = + evaluateBooleanProperty( + applicationEnvironmentPreparedEvent, "otel.instrumentation.logback-mdc.add-baggage"); + if (addBaggage != null) { + openTelemetryAppender.setAddBaggage(addBaggage); + } + + String traceIdKey = + applicationEnvironmentPreparedEvent + .getEnvironment() + .getProperty("otel.instrumentation.common.logging.trace-id", String.class); + if (traceIdKey != null) { + openTelemetryAppender.setTraceIdKey(traceIdKey); + } + + String spanIdKey = + applicationEnvironmentPreparedEvent + .getEnvironment() + .getProperty("otel.instrumentation.common.logging.span-id", String.class); + if (spanIdKey != null) { + openTelemetryAppender.setSpanIdKey(spanIdKey); + } + + String traceFlagsKey = + applicationEnvironmentPreparedEvent + .getEnvironment() + .getProperty("otel.instrumentation.common.logging.trace-flags", String.class); + if (traceFlagsKey != null) { + openTelemetryAppender.setTraceFlagsKey(traceFlagsKey); + } + } + private static Boolean evaluateBooleanProperty( ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent, String property) { return applicationEnvironmentPreparedEvent @@ -149,7 +222,7 @@ private static boolean evaluateBooleanProperty( .getProperty(property, Boolean.class, defaultValue); } - private static Optional findOpenTelemetryAppender() { + private static Optional findAppender(Class appenderClass) { ILoggerFactory loggerFactorySpi = LoggerFactory.getILoggerFactory(); if (!(loggerFactorySpi instanceof LoggerContext)) { return Optional.empty(); @@ -159,8 +232,8 @@ private static Optional findOpenTelemetryAppender() { Iterator> appenderIterator = logger.iteratorForAppenders(); while (appenderIterator.hasNext()) { Appender appender = appenderIterator.next(); - if (appender instanceof OpenTelemetryAppender) { - OpenTelemetryAppender openTelemetryAppender = (OpenTelemetryAppender) appender; + if (appenderClass.isInstance(appender)) { + T openTelemetryAppender = appenderClass.cast(appender); return Optional.of(openTelemetryAppender); } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 19ea58c78334..f3e0820a79aa 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -416,6 +416,36 @@ "type": "java.util.List", "description": "MDC attributes to capture. Use the wildcard character * to capture all attributes." }, + { + "name": "otel.instrumentation.logback-mdc.enabled", + "type": "java.lang.Boolean", + "description": "Enable the Logback MDC instrumentation.", + "defaultValue": true + }, + { + "name": "otel.instrumentation.logback-mdc.add-baggage", + "type": "java.lang.Boolean", + "description": "Enable exposing baggage attributes through MDC.", + "defaultValue": false + }, + { + "name": "otel.instrumentation.common.logging.trace-id", + "type": "java.lang.String", + "description": "Customize MDC key name for the trace id.", + "defaultValue": "trace_id" + }, + { + "name": "otel.instrumentation.common.logging.span-id", + "type": "java.lang.String", + "description": "Customize MDC key name for the span id.", + "defaultValue": "span_id" + }, + { + "name": "otel.instrumentation.common.logging.trace-flags", + "type": "java.lang.String", + "description": "Customize MDC key name for the trace flags.", + "defaultValue": "trace_flags" + }, { "name": "otel.instrumentation.micrometer.enabled", "type": "java.lang.Boolean", diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java index 3c3ec9c0d665..a0fba64cf1f6 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java @@ -33,6 +33,7 @@ class R2DbcInstrumentationAutoConfigurationTest { R2dbcInstrumentationAutoConfiguration.class, R2dbcAutoConfiguration.class)) .withBean("openTelemetry", OpenTelemetry.class, testing::getOpenTelemetry); + @SuppressWarnings("deprecation") // using deprecated semconv @Test void statementSanitizerEnabledByDefault() { runner.run( diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java index ad677c0520c2..c11631cb7d4d 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java @@ -7,9 +7,15 @@ import static org.assertj.core.api.Assertions.assertThat; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import ch.qos.logback.core.spi.AppenderAttachable; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -21,6 +27,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.boot.SpringApplication; @@ -66,6 +73,9 @@ void shouldInitializeAppender() { ConfigurableApplicationContext context = app.run(); cleanup.deferCleanup(context); + ListAppender listAppender = getListAppender(); + listAppender.list.clear(); + MDC.put("key1", "val1"); MDC.put("key2", "val2"); try { @@ -91,6 +101,14 @@ void shouldInitializeAppender() { .containsEntry(AttributeKey.stringKey("key1"), "val1") .containsEntry(AttributeKey.stringKey("key2"), "val2"); }); + + assertThat(listAppender.list) + .satisfiesExactly( + event -> + assertThat(event) + .satisfies( + e -> assertThat(e.getMessage()).isEqualTo("test log message"), + e -> assertThat(e.getMDCPropertyMap()).containsOnlyKeys("key1", "key2"))); } @Test @@ -110,4 +128,123 @@ void shouldNotInitializeAppenderWhenDisabled() { assertThat(testing.logRecords()).isEmpty(); } + + @Test + void mdcAppender() { + Map properties = new HashMap<>(); + properties.put("logging.config", "classpath:logback-test.xml"); + properties.put("otel.instrumentation.logback-appender.enabled", "false"); + properties.put("otel.instrumentation.logback-mdc.add-baggage", "true"); + properties.put("otel.instrumentation.common.logging.trace-id", "traceid"); + properties.put("otel.instrumentation.common.logging.span-id", "spanid"); + properties.put("otel.instrumentation.common.logging.trace-flags", "traceflags"); + + SpringApplication app = + new SpringApplication( + TestingOpenTelemetryConfiguration.class, OpenTelemetryAppenderAutoConfiguration.class); + app.setDefaultProperties(properties); + ConfigurableApplicationContext context = app.run(); + cleanup.deferCleanup(context); + + ListAppender listAppender = getListAppender(); + listAppender.list.clear(); + + try (Scope ignore = Baggage.current().toBuilder().put("key", "value").build().makeCurrent()) { + Span span = testing.getOpenTelemetry().getTracer("test").spanBuilder("test").startSpan(); + try (Scope ignore2 = span.makeCurrent()) { + LoggerFactory.getLogger("test").info("test log message"); + } + } + + assertThat(testing.logRecords()).isEmpty(); + assertThat(listAppender.list) + .satisfiesExactly( + event -> + assertThat(event) + .satisfies( + e -> assertThat(e.getMessage()).isEqualTo("test log message"), + e -> + assertThat(e.getMDCPropertyMap()) + .containsOnlyKeys( + "traceid", "spanid", "traceflags", "baggage.key"))); + } + + @Test + void shouldInitializeMdcAppender() { + Map properties = new HashMap<>(); + properties.put("logging.config", "classpath:logback-no-otel-appenders.xml"); + properties.put("otel.instrumentation.logback-appender.enabled", "false"); + + SpringApplication app = + new SpringApplication( + TestingOpenTelemetryConfiguration.class, OpenTelemetryAppenderAutoConfiguration.class); + app.setDefaultProperties(properties); + ConfigurableApplicationContext context = app.run(); + cleanup.deferCleanup(context); + + ListAppender listAppender = getListAppender(); + listAppender.list.clear(); + + Span span = testing.getOpenTelemetry().getTracer("test").spanBuilder("test").startSpan(); + try (Scope ignore = span.makeCurrent()) { + LoggerFactory.getLogger("test").info("test log message"); + } + + assertThat(testing.logRecords()).isEmpty(); + assertThat(listAppender.list) + .satisfiesExactly( + event -> + assertThat(event) + .satisfies( + e -> assertThat(e.getMessage()).isEqualTo("test log message"), + e -> + assertThat(e.getMDCPropertyMap()) + .containsOnlyKeys("trace_id", "span_id", "trace_flags"))); + } + + @Test + void shouldNotInitializeMdcAppenderWhenDisabled() { + Map properties = new HashMap<>(); + properties.put("logging.config", "classpath:logback-no-otel-appenders.xml"); + properties.put("otel.instrumentation.logback-appender.enabled", "false"); + properties.put("otel.instrumentation.logback-mdc.enabled", "false"); + + SpringApplication app = + new SpringApplication( + TestingOpenTelemetryConfiguration.class, OpenTelemetryAppenderAutoConfiguration.class); + app.setDefaultProperties(properties); + ConfigurableApplicationContext context = app.run(); + cleanup.deferCleanup(context); + + ListAppender listAppender = getListAppender(); + listAppender.list.clear(); + + Span span = testing.getOpenTelemetry().getTracer("test").spanBuilder("test").startSpan(); + try (Scope ignore = span.makeCurrent()) { + LoggerFactory.getLogger("test").info("test log message"); + } + + assertThat(testing.logRecords()).isEmpty(); + assertThat(listAppender.list) + .satisfiesExactly( + event -> + assertThat(event) + .satisfies( + e -> assertThat(e.getMessage()).isEqualTo("test log message"), + e -> assertThat(e.getMDCPropertyMap()).isEmpty())); + } + + @SuppressWarnings("unchecked") + private static ListAppender getListAppender() { + Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) logger; + ListAppender listAppender = + (ListAppender) logbackLogger.getAppender("List"); + if (listAppender != null) { + return listAppender; + } + AppenderAttachable mdcAppender = + (AppenderAttachable) logbackLogger.getAppender("OpenTelemetryMdc"); + return (ListAppender) mdcAppender.getAppender("List"); + } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-no-otel-appenders.xml b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-no-otel-appenders.xml new file mode 100644 index 000000000000..d77f5158c476 --- /dev/null +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-no-otel-appenders.xml @@ -0,0 +1,18 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-test.xml b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-test.xml index 9b88dc0e09ca..f4f1d7e47070 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-test.xml +++ b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/resources/logback-test.xml @@ -12,10 +12,16 @@ class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender"> true + + + + + diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java index f1961da32e62..9a50ab4a49a3 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java @@ -61,6 +61,7 @@ static void cleanUp() { } } + @SuppressWarnings("deprecation") // using deprecated semconv @Test void sqsListener() throws InterruptedException, ExecutionException, TimeoutException { String messageContent = "hello"; @@ -121,7 +122,8 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep "http://localhost:" + AwsSqsTestApplication.sqsPort)), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), satisfies( MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), @@ -158,7 +160,8 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep "http://localhost:" + AwsSqsTestApplication.sqsPort)), equalTo( MessagingIncubatingAttributes.MESSAGING_SYSTEM, - MessagingIncubatingAttributes.MessagingSystemValues.AWS_SQS), + MessagingIncubatingAttributes.MessagingSystemIncubatingValues + .AWS_SQS), satisfies( MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotBlank), diff --git a/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java b/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java index cf1f7882ba4e..2960c927ab5b 100644 --- a/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java +++ b/instrumentation/spring/spring-integration-4.1/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/integration/v4_1/SpringIntegrationAndRabbitTest.java @@ -29,6 +29,7 @@ class SpringIntegrationAndRabbitTest { rabbit = new RabbitExtension(null); } + @SuppressWarnings("deprecation") // using deprecated semconv @Test void shouldCooperateWithExistingRabbitMqInstrumentation() { testing.waitForTraces(13); // from rabbitmq instrumentation of startup diff --git a/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java b/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java index 6e679ecd2f3d..8db2a8d26fae 100644 --- a/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java +++ b/instrumentation/spring/spring-jms/spring-jms-2.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/jms/v2_0/AbstractJmsTest.java @@ -33,6 +33,7 @@ protected void assertProducerSpan( .hasAttributesSatisfyingExactly(attributeAssertions); } + @SuppressWarnings("deprecation") // using deprecated semconv protected List producerAttributeAssertions( String destinationName, boolean testHeaders) { List attributeAssertions = @@ -82,6 +83,7 @@ protected void assertConsumerSpan( consumerAttributeAssertions(destinationName, testHeaders, operation, msgId)); } + @SuppressWarnings("deprecation") // using deprecated semconv protected List consumerAttributeAssertions( String destinationName, boolean testHeaders, String operation, String msgId) { List attributeAssertions = diff --git a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java index d0f50978b3f0..366f9514cc51 100644 --- a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java +++ b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringJmsListenerTest.java @@ -31,6 +31,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.jms.core.JmsTemplate; +@SuppressWarnings("deprecation") // using deprecated semconv class SpringJmsListenerTest extends AbstractSpringJmsListenerTest { @Override diff --git a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java index 043cf148ab9b..6e8677579779 100644 --- a/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java +++ b/instrumentation/spring/spring-jms/spring-jms-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/jms/v6_0/SpringListenerSuppressReceiveSpansTest.java @@ -15,6 +15,7 @@ class SpringListenerSuppressReceiveSpansTest extends AbstractSpringJmsListenerTest { + @SuppressWarnings("deprecation") // using deprecated semconv @Override void assertSpringJmsListener() { testing.waitAndAssertTraces( diff --git a/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java b/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java index edf932d59af9..b43f479cab0e 100644 --- a/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java +++ b/instrumentation/spring/spring-kafka-2.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/kafka/v2_7/SpringKafkaTest.java @@ -34,6 +34,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +@SuppressWarnings("deprecation") // using deprecated semconv class SpringKafkaTest extends AbstractSpringKafkaTest { @RegisterExtension @@ -86,7 +87,7 @@ void shouldCreateSpansForSingleRecordProcess() { AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); producer.set(trace.getSpan(1)); @@ -107,7 +108,7 @@ void shouldCreateSpansForSingleRecordProcess() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)), @@ -137,7 +138,7 @@ void shouldCreateSpansForSingleRecordProcess() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), satisfies( longKey("kafka.record.queue_time_ms"), @@ -172,8 +173,7 @@ void shouldHandleFailureInKafkaListener() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); List processAttributes = Arrays.asList( @@ -192,9 +192,7 @@ void shouldHandleFailureInKafkaListener() { equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), equalTo( MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), satisfies(longKey("kafka.record.queue_time_ms"), AbstractLongAssert::isNotNegative)); AtomicReference producer = new AtomicReference<>(); @@ -221,7 +219,7 @@ void shouldHandleFailureInKafkaListener() { AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); producer.set(trace.getSpan(1)); @@ -295,7 +293,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer"))), span -> span.hasName("testBatchTopic publish") @@ -315,7 +313,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "20"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); producer1.set(trace.getSpan(1)); @@ -337,7 +335,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 2)), @@ -358,7 +356,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 2)), @@ -402,7 +400,7 @@ void shouldHandleFailureInKafkaBatchListener() { AbstractLongAssert::isNotNegative), equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")))); producer.set(trace.getSpan(1)); @@ -454,9 +452,7 @@ private static void assertReceiveSpan(SpanDataAssert span) { equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "receive"), equalTo( MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); } @@ -472,9 +468,7 @@ private static void assertProcessSpan( equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), equalTo( MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); if (failed) { span.hasStatus(StatusData.error()).hasException(new IllegalArgumentException("boom")); diff --git a/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java b/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java index 53535037d566..97dc95a800e0 100644 --- a/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java +++ b/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaNoReceiveTelemetryTest.java @@ -24,6 +24,7 @@ import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.Test; +@SuppressWarnings("deprecation") // using deprecated semconv public abstract class AbstractSpringKafkaNoReceiveTelemetryTest extends AbstractSpringKafkaTest { protected abstract boolean isLibraryInstrumentationTest(); @@ -58,7 +59,7 @@ void shouldCreateSpansForSingleRecordProcess() { equalTo( MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes @@ -98,7 +99,7 @@ void shouldCreateSpansForSingleRecordProcess() { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))), span -> span.hasName("consumer").hasParent(trace.getSpan(2)))); } @@ -133,9 +134,7 @@ void shouldHandleFailureInKafkaListener() { equalTo(MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_KEY, "10"), equalTo( MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testSingleListener"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer"))); + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer"))); testing() .waitAndAssertTraces( @@ -154,7 +153,7 @@ void shouldHandleFailureInKafkaListener() { equalTo( MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes @@ -218,7 +217,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { "testBatchTopic"), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, @@ -239,7 +238,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { "testBatchTopic"), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, @@ -275,7 +274,7 @@ void shouldCreateSpansForBatchReceiveAndProcess() throws InterruptedException { MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, @@ -305,9 +304,7 @@ void shouldHandleFailureInKafkaBatchListener() { equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), equalTo( MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP, "testBatchListener"), - satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, - stringAssert -> stringAssert.startsWith("consumer")), + satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")), equalTo(MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, 1)); testing() @@ -327,7 +324,7 @@ void shouldHandleFailureInKafkaBatchListener() { "testBatchTopic"), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, diff --git a/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaTest.java b/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaTest.java index da397730c92c..3a53fcce2aaa 100644 --- a/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaTest.java +++ b/instrumentation/spring/spring-kafka-2.7/testing/src/main/java/io/opentelemetry/testing/AbstractSpringKafkaTest.java @@ -7,6 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.LinkData; @@ -38,6 +39,8 @@ public abstract class AbstractSpringKafkaTest { private static final Logger logger = LoggerFactory.getLogger(AbstractSpringKafkaTest.class); + protected static final AttributeKey MESSAGING_CLIENT_ID = + AttributeKey.stringKey("messaging.client_id"); static KafkaContainer kafka; ConfigurableApplicationContext applicationContext; diff --git a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java index 950ee620dbae..98b41f0b698a 100644 --- a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java +++ b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java @@ -95,6 +95,7 @@ static void teardown() { } } + @SuppressWarnings("deprecation") // using deprecated semconv private static List getAssertions( String destination, String operation, diff --git a/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerTest.java b/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerTest.java index 511afc49bbbb..dea04fc37664 100644 --- a/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerTest.java +++ b/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/EnduserAttributesCapturerTest.java @@ -21,6 +21,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; +@SuppressWarnings("deprecation") // using deprecated semconv public class EnduserAttributesCapturerTest { @RegisterExtension diff --git a/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/servlet/EnduserAttributesCapturingServletFilterTest.java b/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/servlet/EnduserAttributesCapturingServletFilterTest.java index 0d8b2150d4f6..26ad968e0975 100644 --- a/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/servlet/EnduserAttributesCapturingServletFilterTest.java +++ b/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/servlet/EnduserAttributesCapturingServletFilterTest.java @@ -35,6 +35,7 @@ class EnduserAttributesCapturingServletFilterTest { * io.opentelemetry.instrumentation.spring.security.config.v6_0.EnduserAttributesCapturerTest} * tests many other scenarios. */ + @SuppressWarnings("deprecation") // using deprecated semconv @Test void test() throws Exception { diff --git a/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/webflux/EnduserAttributesCapturingWebFilterTest.java b/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/webflux/EnduserAttributesCapturingWebFilterTest.java index 3d0e7be94d83..35d0ce50be60 100644 --- a/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/webflux/EnduserAttributesCapturingWebFilterTest.java +++ b/instrumentation/spring/spring-security-config-6.0/library/src/test/java/io/opentelemetry/instrumentation/spring/security/config/v6_0/webflux/EnduserAttributesCapturingWebFilterTest.java @@ -23,9 +23,11 @@ import org.springframework.web.server.handler.DefaultWebFilterChain; import reactor.core.publisher.Mono; +@SuppressWarnings("deprecation") // using deprecated semconv class EnduserAttributesCapturingWebFilterTest { - @RegisterExtension InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + @RegisterExtension + static InstrumentationExtension testing = LibraryInstrumentationExtension.create(); /** * Tests to ensure enduser attributes are captured. @@ -37,7 +39,6 @@ class EnduserAttributesCapturingWebFilterTest { */ @Test void test() { - EnduserAttributesCapturer capturer = new EnduserAttributesCapturer(); capturer.setEnduserIdEnabled(true); capturer.setEnduserRoleEnabled(true); diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/boot/AbstractSpringBootBasedTest.java b/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/boot/AbstractSpringBootBasedTest.java index 0147d8f672bc..eab035be29fe 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/boot/AbstractSpringBootBasedTest.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/boot/AbstractSpringBootBasedTest.java @@ -149,7 +149,7 @@ protected List> errorPageSpanAssertions( span -> span.hasName("BasicErrorController.error") .hasKind(SpanKind.INTERNAL) - .hasAttributesSatisfying(Attributes::isEmpty)); + .hasAttributes(Attributes.empty())); return spanAssertions; } diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/filter/AbstractServletFilterTest.java b/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/filter/AbstractServletFilterTest.java index 70587e31039e..db292d9224ba 100644 --- a/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/filter/AbstractServletFilterTest.java +++ b/instrumentation/spring/spring-webmvc/spring-webmvc-common/testing/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/filter/AbstractServletFilterTest.java @@ -98,7 +98,7 @@ protected List> errorPageSpanAssertions( span -> span.hasName("BasicErrorController.error") .hasKind(SpanKind.INTERNAL) - .hasAttributesSatisfying(Attributes::isEmpty)); + .hasAttributes(Attributes.empty())); return spanAssertions; } diff --git a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedAttributesGetter.java b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedAttributesGetter.java index b5778dc96a32..086c2dc65693 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedAttributesGetter.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedAttributesGetter.java @@ -11,10 +11,11 @@ public class SpymemcachedAttributesGetter implements DbClientAttributesGetter { @Override - public String getSystem(SpymemcachedRequest spymemcachedRequest) { + public String getDbSystem(SpymemcachedRequest spymemcachedRequest) { return "memcached"; } + @Deprecated @Override @Nullable public String getUser(SpymemcachedRequest spymemcachedRequest) { @@ -23,10 +24,11 @@ public String getUser(SpymemcachedRequest spymemcachedRequest) { @Override @Nullable - public String getName(SpymemcachedRequest spymemcachedRequest) { + public String getDbNamespace(SpymemcachedRequest spymemcachedRequest) { return null; } + @Deprecated @Override @Nullable public String getConnectionString(SpymemcachedRequest spymemcachedRequest) { @@ -35,13 +37,13 @@ public String getConnectionString(SpymemcachedRequest spymemcachedRequest) { @Override @Nullable - public String getStatement(SpymemcachedRequest spymemcachedRequest) { + public String getDbQueryText(SpymemcachedRequest spymemcachedRequest) { return null; } @Override @Nullable - public String getOperation(SpymemcachedRequest spymemcachedRequest) { + public String getDbOperationName(SpymemcachedRequest spymemcachedRequest) { return spymemcachedRequest.dbOperation(); } } diff --git a/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java b/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java index b396d0121f73..c3206e60b68c 100644 --- a/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java +++ b/instrumentation/spymemcached-2.12/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spymemcached/SpymemcachedTest.java @@ -53,6 +53,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.testcontainers.containers.GenericContainer; +@SuppressWarnings("deprecation") // using deprecated semconv class SpymemcachedTest { private static final String KEY_PREFIX = "SpymemcachedTest-"; // https://github.com/memcached/memcached/wiki/Programming#expiration @@ -144,7 +145,7 @@ void getHit() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -166,7 +167,7 @@ void getMiss() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "miss")))); } @@ -201,7 +202,7 @@ void getCancel() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(booleanKey("spymemcached.command.cancelled"), true)))); } @@ -256,7 +257,7 @@ void getTimeout() throws InterruptedException { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get")))); } @@ -284,7 +285,7 @@ void bulkGet() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "getBulk")))); } @@ -308,7 +309,7 @@ void set() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "set")))); } @@ -344,7 +345,7 @@ void setCancel() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "set"), equalTo(booleanKey("spymemcached.command.cancelled"), true)))); } @@ -370,7 +371,7 @@ void add() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "add")), span -> span.hasName("get") @@ -379,7 +380,7 @@ void add() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -406,7 +407,7 @@ void secondAdd() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "add")), span -> span.hasName("add") @@ -415,7 +416,7 @@ void secondAdd() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "add")))); } @@ -440,7 +441,7 @@ void delete() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "delete")), span -> span.hasName("get") @@ -449,7 +450,7 @@ void delete() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "miss")))); } @@ -474,7 +475,7 @@ void deleteNonExistent() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "delete")))); } @@ -500,7 +501,7 @@ void replace() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "replace")), span -> span.hasName("get") @@ -509,7 +510,7 @@ void replace() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -538,7 +539,7 @@ void replaceNonExistent() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "replace")))); } @@ -565,7 +566,7 @@ void append() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "gets")), span -> span.hasName("append") @@ -574,7 +575,7 @@ void append() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "append")), span -> span.hasName("get") @@ -583,7 +584,7 @@ void append() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -611,7 +612,7 @@ void prepend() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "gets")), span -> span.hasName("prepend") @@ -620,7 +621,7 @@ void prepend() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "prepend")), span -> span.hasName("get") @@ -629,7 +630,7 @@ void prepend() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -657,7 +658,7 @@ void cas() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "gets")), span -> span.hasName("cas") @@ -666,7 +667,7 @@ void cas() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "cas")))); } @@ -692,7 +693,7 @@ void casNotFound() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "cas")))); } @@ -716,7 +717,7 @@ void touch() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "touch")))); } @@ -741,7 +742,7 @@ void touchNonExistent() throws Exception { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "touch")))); } @@ -766,7 +767,7 @@ void getAndTouch() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "getAndTouch")))); } @@ -791,7 +792,7 @@ void getAndTouchNonExistent() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "getAndTouch")))); } @@ -820,7 +821,7 @@ it needs values to be strings (with digits in them) and it returns actual long f .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "decr")), span -> span.hasName("get") @@ -829,7 +830,7 @@ it needs values to be strings (with digits in them) and it returns actual long f .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -854,7 +855,7 @@ void decrNonExistent() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "decr")))); } @@ -877,7 +878,7 @@ void decrException() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "decr")))); } @@ -906,7 +907,7 @@ it needs values to be strings (with digits in them) and it returns actual long f .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "incr")), span -> span.hasName("get") @@ -915,7 +916,7 @@ it needs values to be strings (with digits in them) and it returns actual long f .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "get"), equalTo(stringKey("spymemcached.result"), "hit")))); } @@ -940,7 +941,7 @@ void incrNonExistent() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "incr")))); } @@ -963,7 +964,7 @@ void incrException() { .hasAttributesSatisfyingExactly( equalTo( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MEMCACHED), + DbIncubatingAttributes.DbSystemIncubatingValues.MEMCACHED), equalTo(DbIncubatingAttributes.DB_OPERATION, "incr")))); } diff --git a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java index 9d89fbf376dc..4a08cc9c7a83 100644 --- a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java +++ b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java @@ -14,9 +14,10 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -25,6 +26,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import jakarta.servlet.Servlet; import java.io.File; import java.nio.file.Files; @@ -32,6 +34,7 @@ import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; +import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.extension.RegisterExtension; class TomcatAsyncTest extends AbstractHttpServerTest { @@ -116,12 +119,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - if (endpoint.equals(REDIRECT)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); - } else if (endpoint.equals(NOT_FOUND)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + String methodName; + if (endpoint == REDIRECT) { + methodName = "sendRedirect"; + } else if (endpoint == NOT_FOUND) { + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + satisfies(CodeIncubatingAttributes.CODE_NAMESPACE, AbstractStringAssert::isNotEmpty)); return span; } } diff --git a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatHandlerTest.java b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatHandlerTest.java index ad304e683afc..74e666f7a7c9 100644 --- a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatHandlerTest.java +++ b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatHandlerTest.java @@ -18,10 +18,11 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -30,6 +31,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.File; import java.nio.file.Files; import java.util.List; @@ -37,6 +39,7 @@ import org.apache.catalina.LifecycleException; import org.apache.catalina.core.StandardHost; import org.apache.catalina.startup.Tomcat; +import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.extension.RegisterExtension; class TomcatHandlerTest extends AbstractHttpServerTest { @@ -116,12 +119,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - if (endpoint.equals(REDIRECT)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); - } else if (endpoint.equals(NOT_FOUND)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + String methodName; + if (endpoint == REDIRECT) { + methodName = "sendRedirect"; + } else if (endpoint == NOT_FOUND || endpoint == ERROR) { + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + satisfies(CodeIncubatingAttributes.CODE_NAMESPACE, AbstractStringAssert::isNotEmpty)); return span; } } diff --git a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java index 3853768973c7..abe4e5e5eafe 100644 --- a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java +++ b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java @@ -14,9 +14,10 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -25,12 +26,14 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.File; import java.nio.file.Files; import java.util.UUID; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; +import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.extension.RegisterExtension; class TomcatAsyncTest extends AbstractHttpServerTest { @@ -111,12 +114,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - if (endpoint.equals(REDIRECT)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); - } else if (endpoint.equals(NOT_FOUND)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + String methodName; + if (endpoint == REDIRECT) { + methodName = "sendRedirect"; + } else if (endpoint == NOT_FOUND) { + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + satisfies(CodeIncubatingAttributes.CODE_NAMESPACE, AbstractStringAssert::isNotEmpty)); return span; } } diff --git a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatHandlerTest.java b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatHandlerTest.java index 286f525ac236..23f1b4be3fd0 100644 --- a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatHandlerTest.java +++ b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatHandlerTest.java @@ -18,10 +18,11 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.QUERY_PARAM; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -30,6 +31,7 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import java.io.File; import java.nio.file.Files; import java.util.List; @@ -37,6 +39,7 @@ import org.apache.catalina.LifecycleException; import org.apache.catalina.core.StandardHost; import org.apache.catalina.startup.Tomcat; +import org.assertj.core.api.AbstractStringAssert; import org.junit.jupiter.api.extension.RegisterExtension; class TomcatHandlerTest extends AbstractHttpServerTest { @@ -116,12 +119,19 @@ protected void configure(HttpServerTestOptions options) { @Override protected SpanDataAssert assertResponseSpan( SpanDataAssert span, String method, ServerEndpoint endpoint) { - if (endpoint.equals(REDIRECT)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect")); - } else if (endpoint.equals(NOT_FOUND)) { - span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError")); + String methodName; + if (endpoint == REDIRECT) { + methodName = "sendRedirect"; + } else if (endpoint == NOT_FOUND || endpoint == ERROR) { + methodName = "sendError"; + } else { + throw new AssertionError("Unexpected endpoint: " + endpoint.name()); } - span.hasKind(SpanKind.INTERNAL).hasAttributesSatisfying(Attributes::isEmpty); + span.hasKind(SpanKind.INTERNAL) + .satisfies(spanData -> assertThat(spanData.getName()).endsWith("." + methodName)) + .hasAttributesSatisfyingExactly( + equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName), + satisfies(CodeIncubatingAttributes.CODE_NAMESPACE, AbstractStringAssert::isNotEmpty)); return span; } } diff --git a/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java b/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java index fd88db245bf8..ecc5c91d0b76 100644 --- a/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java +++ b/instrumentation/vertx/vertx-kafka-client-3.6/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/kafka/v3_6/AbstractVertxKafkaTest.java @@ -195,6 +195,7 @@ protected static void sendRecord( } } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List sendAttributes( KafkaProducerRecord record) { List assertions = @@ -204,7 +205,7 @@ protected static List sendAttributes( equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, @@ -228,6 +229,7 @@ protected static List batchProcessAttributes(String topic) { return batchConsumerAttributes(topic, "process"); } + @SuppressWarnings("deprecation") // using deprecated semconv private static List batchConsumerAttributes(String topic, String operation) { List assertions = new ArrayList<>( @@ -236,7 +238,7 @@ private static List batchConsumerAttributes(String topic, St equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, topic), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, operation), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), satisfies( MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT, @@ -248,6 +250,7 @@ private static List batchConsumerAttributes(String topic, St return assertions; } + @SuppressWarnings("deprecation") // using deprecated semconv protected static List processAttributes( KafkaProducerRecord record) { List assertions = @@ -257,7 +260,7 @@ protected static List processAttributes( equalTo(MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME, record.topic()), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "process"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/build.gradle.kts b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/build.gradle.kts index 748df2ab83cf..0199413110d6 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/build.gradle.kts +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/build.gradle.kts @@ -24,4 +24,12 @@ tasks { withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } + + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + } + + check { + dependsOn(testStableSemconv) + } } diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesExtractor.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesExtractor.java index 5203ed1e96b8..b8fa8fd3796b 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesExtractor.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesExtractor.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import javax.annotation.Nullable; @@ -17,11 +18,14 @@ enum VertxRedisClientAttributesExtractor implements AttributesExtractor { INSTANCE; + @SuppressWarnings("deprecation") // using deprecated semconv @Override public void onStart( AttributesBuilder attributes, Context parentContext, VertxRedisClientRequest request) { - internalSet( - attributes, DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, request.getDatabaseIndex()); + if (SemconvStability.emitOldDatabaseSemconv()) { + internalSet( + attributes, DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, request.getDatabaseIndex()); + } } @Override diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java index d662aa053ad6..928ca141b154 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientAttributesGetter.java @@ -7,6 +7,7 @@ import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter; import io.opentelemetry.instrumentation.api.incubator.semconv.db.RedisCommandSanitizer; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import javax.annotation.Nullable; @@ -19,10 +20,11 @@ public enum VertxRedisClientAttributesGetter RedisCommandSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled()); @Override - public String getSystem(VertxRedisClientRequest request) { - return DbIncubatingAttributes.DbSystemValues.REDIS; + public String getDbSystem(VertxRedisClientRequest request) { + return DbIncubatingAttributes.DbSystemIncubatingValues.REDIS; } + @Deprecated @Override @Nullable public String getUser(VertxRedisClientRequest request) { @@ -31,10 +33,14 @@ public String getUser(VertxRedisClientRequest request) { @Override @Nullable - public String getName(VertxRedisClientRequest request) { + public String getDbNamespace(VertxRedisClientRequest request) { + if (SemconvStability.emitStableDatabaseSemconv()) { + return String.valueOf(request.getDatabaseIndex()); + } return null; } + @Deprecated @Override @Nullable public String getConnectionString(VertxRedisClientRequest request) { @@ -42,13 +48,13 @@ public String getConnectionString(VertxRedisClientRequest request) { } @Override - public String getStatement(VertxRedisClientRequest request) { + public String getDbQueryText(VertxRedisClientRequest request) { return sanitizer.sanitize(request.getCommand(), request.getArgs()); } @Nullable @Override - public String getOperation(VertxRedisClientRequest request) { + public String getDbOperationName(VertxRedisClientRequest request) { return request.getCommand(); } } diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java index b5164522897c..64d1942e99e8 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientSingletons.java @@ -9,7 +9,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; @@ -36,8 +35,10 @@ public final class VertxRedisClientSingletons { VirtualField.find(RedisStandaloneConnection.class, RedisURI.class); static { + // Redis semantic conventions don't follow the regular pattern of adding the db.namespace to + // the span name SpanNameExtractor spanNameExtractor = - DbClientSpanNameExtractor.create(VertxRedisClientAttributesGetter.INSTANCE); + VertxRedisClientRequest::getCommand; InstrumenterBuilder builder = Instrumenter.builder( diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java index 69add7333329..5df51cf79108 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java @@ -8,7 +8,9 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static org.assertj.core.api.Assertions.assertThat; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; @@ -199,16 +201,31 @@ void commandWithNoArguments() throws Exception { redisSpanAttributes("RANDOMKEY", "RANDOMKEY")))); } + @SuppressWarnings("deprecation") // using deprecated semconv private static AttributeAssertion[] redisSpanAttributes(String operation, String statement) { - return new AttributeAssertion[] { - equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), - equalTo(DbIncubatingAttributes.DB_STATEMENT, statement), - equalTo(DbIncubatingAttributes.DB_OPERATION, operation), - equalTo(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, 1), - equalTo(ServerAttributes.SERVER_ADDRESS, host), - equalTo(ServerAttributes.SERVER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip) - }; + // not testing database/dup + if (SemconvStability.emitStableDatabaseSemconv()) { + return new AttributeAssertion[] { + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(AttributeKey.stringKey("db.query.text"), statement), + equalTo(AttributeKey.stringKey("db.operation.name"), operation), + equalTo(AttributeKey.stringKey("db.namespace"), "1"), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip) + }; + } else { + return new AttributeAssertion[] { + equalTo(DbIncubatingAttributes.DB_SYSTEM, "redis"), + equalTo(DbIncubatingAttributes.DB_STATEMENT, statement), + equalTo(DbIncubatingAttributes.DB_OPERATION, operation), + equalTo(DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX, 1), + equalTo(ServerAttributes.SERVER_ADDRESS, host), + equalTo(ServerAttributes.SERVER_PORT, port), + equalTo(NetworkAttributes.NETWORK_PEER_PORT, port), + equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, ip) + }; + } } } diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientAttributesGetter.java b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientAttributesGetter.java index 4fa4a6ea5359..92c27b4ddb19 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientAttributesGetter.java +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientAttributesGetter.java @@ -13,10 +13,11 @@ public enum VertxSqlClientAttributesGetter INSTANCE; @Override - public String getSystem(VertxSqlClientRequest request) { + public String getDbSystem(VertxSqlClientRequest request) { return null; } + @Deprecated @Override @Nullable public String getUser(VertxSqlClientRequest request) { @@ -25,10 +26,11 @@ public String getUser(VertxSqlClientRequest request) { @Override @Nullable - public String getName(VertxSqlClientRequest request) { + public String getDbNamespace(VertxSqlClientRequest request) { return request.getDatabase(); } + @Deprecated @Override @Nullable public String getConnectionString(VertxSqlClientRequest request) { @@ -37,7 +39,7 @@ public String getConnectionString(VertxSqlClientRequest request) { @Override @Nullable - public String getRawStatement(VertxSqlClientRequest request) { - return request.getStatement(); + public String getRawQueryText(VertxSqlClientRequest request) { + return request.getQueryText(); } } diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientRequest.java b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientRequest.java index d644d8b9a742..6355fd3f6e24 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientRequest.java +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientRequest.java @@ -8,16 +8,16 @@ import io.vertx.sqlclient.SqlConnectOptions; public final class VertxSqlClientRequest { - private final String statement; + private final String queryText; private final SqlConnectOptions sqlConnectOptions; - public VertxSqlClientRequest(String statement, SqlConnectOptions sqlConnectOptions) { - this.statement = statement; + public VertxSqlClientRequest(String queryText, SqlConnectOptions sqlConnectOptions) { + this.queryText = queryText; this.sqlConnectOptions = sqlConnectOptions; } - public String getStatement() { - return statement; + public String getQueryText() { + return queryText; } public String getUser() { diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java index 17f318eb375f..c870b6b87230 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java @@ -12,11 +12,6 @@ import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; @@ -24,6 +19,7 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.vertx.core.Vertx; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgException; @@ -50,6 +46,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +@SuppressWarnings("deprecation") // using deprecated semconv class VertxSqlClientTest { private static final Logger logger = LoggerFactory.getLogger(VertxSqlClientTest.class); @@ -137,11 +134,11 @@ void testSimpleSelect() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, "select * from test"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "test"), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "select * from test"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> @@ -193,9 +190,9 @@ void testInvalidQuery() throws Exception { EXCEPTION_STACKTRACE, val -> val.isInstanceOf(String.class)))) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, "invalid"), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "invalid"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> @@ -227,11 +224,13 @@ private static void assertPreparedSelect() { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, "select * from test where id = $1"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "test"), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "select * from test where id = $1"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)))); } @@ -257,11 +256,13 @@ void testBatch() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, "insert into test values ($1, $2) returning *"), - equalTo(DB_OPERATION, "INSERT"), - equalTo(DB_SQL_TABLE, "test"), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "insert into test values ($1, $2) returning *"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "INSERT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)))); } @@ -343,11 +344,11 @@ void testManyQueries() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, "select * from test"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "test"), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo(DbIncubatingAttributes.DB_STATEMENT, "select * from test"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> @@ -408,11 +409,13 @@ void testConcurrency() throws Exception { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(DB_NAME, DB), - equalTo(DB_USER, USER_DB), - equalTo(DB_STATEMENT, "select * from test where id = $1"), - equalTo(DB_OPERATION, "SELECT"), - equalTo(DB_SQL_TABLE, "test"), + equalTo(DbIncubatingAttributes.DB_NAME, DB), + equalTo(DbIncubatingAttributes.DB_USER, USER_DB), + equalTo( + DbIncubatingAttributes.DB_STATEMENT, + "select * from test where id = $1"), + equalTo(DbIncubatingAttributes.DB_OPERATION, "SELECT"), + equalTo(DbIncubatingAttributes.DB_SQL_TABLE, "test"), equalTo(SERVER_ADDRESS, host), equalTo(SERVER_PORT, port)), span -> diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/IndyBootstrapDispatcher.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/IndyBootstrapDispatcher.java index efc6e4730ec7..39693200d65f 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/IndyBootstrapDispatcher.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/IndyBootstrapDispatcher.java @@ -54,8 +54,7 @@ public static CallSite bootstrap( return callSite; } - // package visibility for testing - static MethodHandle generateNoopMethodHandle(MethodType methodType) { + public static MethodHandle generateNoopMethodHandle(MethodType methodType) { Class returnType = methodType.returnType(); MethodHandle noopNoArg; if (returnType == void.class) { diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/VirtualFieldDetector.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/VirtualFieldDetector.java index 80e14aab03f8..0a1664bdf034 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/VirtualFieldDetector.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/VirtualFieldDetector.java @@ -6,36 +6,46 @@ package io.opentelemetry.javaagent.bootstrap; import io.opentelemetry.instrumentation.api.internal.cache.Cache; -import java.util.Arrays; +import java.util.Collection; /** Helper class for detecting whether given class has virtual fields. */ public final class VirtualFieldDetector { - private static final Cache, Boolean> classesWithVirtualFields = Cache.weak(); + // class to virtual field interface dot class names (see + // GeneratedVirtualFieldNames.getFieldAccessorInterfaceName) + private static final Cache, Collection> classesWithVirtualFields = Cache.weak(); private VirtualFieldDetector() {} /** - * Detect whether given class has virtual fields. This method looks for virtual fields only from - * the specified class not its super classes. + * Detect whether given class has given virtual field. This method looks for virtual fields only + * from the specified class not its super classes. * * @param clazz a class - * @return true if given class has virtual fields + * @param virtualFieldInterfaceClassName virtual field interface class dot name + * @return true if given class has the specified virtual field */ - public static boolean hasVirtualFields(Class clazz) { + public static boolean hasVirtualField(Class clazz, String virtualFieldInterfaceClassName) { + if (!VirtualFieldInstalledMarker.class.isAssignableFrom(clazz)) { + return false; + } // clazz.getInterfaces() needs to be called before reading from classesWithVirtualFields // as the call to clazz.getInterfaces() triggers adding clazz to that map via instrumentation - // calling VirtualFieldDetector#markVirtualFieldsPresent() from Class#getInterfaces() + // calling VirtualFieldDetector#markVirtualFields() from Class#getInterfaces() Class[] interfaces = clazz.getInterfaces(); // to avoid breaking in case internal-reflection instrumentation is disabled check whether // interfaces array contains virtual field marker interface - if (Arrays.asList(interfaces).contains(VirtualFieldInstalledMarker.class)) { - return true; + for (Class interfaceClass : interfaces) { + if (virtualFieldInterfaceClassName.equals(interfaceClass.getName())) { + return true; + } } - return classesWithVirtualFields.get(clazz) != null; + + Collection virtualFields = classesWithVirtualFields.get(clazz); + return virtualFields != null && virtualFields.contains(virtualFieldInterfaceClassName); } - public static void markVirtualFieldsPresent(Class clazz) { - classesWithVirtualFields.put(clazz, Boolean.TRUE); + public static void markVirtualFields(Class clazz, Collection virtualFieldClassName) { + classesWithVirtualFields.put(clazz, virtualFieldClassName); } } diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java index 7f404090b679..e6ee634fe5d9 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/InstrumentationModule.java @@ -33,14 +33,6 @@ */ public abstract class InstrumentationModule implements Ordered { private static final Logger logger = Logger.getLogger(InstrumentationModule.class.getName()); - private static final boolean indyEnabled; - - static { - indyEnabled = ExperimentalConfig.get().indyEnabled(); - if (indyEnabled) { - logger.info("Enabled indy for instrumentation modules"); - } - } private final Set instrumentationNames; @@ -125,7 +117,7 @@ public boolean isHelperClass(String className) { * techniques. The non-inlining of advice will be enforced by muzzle (TODO) */ public boolean isIndyModule() { - return indyEnabled; + return IndyConfigurationHolder.indyEnabled; } /** Register resource names to inject into the user's class loader. */ @@ -163,4 +155,16 @@ public ElementMatcher.Junction classLoaderMatcher() { public List getAdditionalHelperClassNames() { return Collections.emptyList(); } + + // InstrumentationModule is loaded before ExperimentalConfig is initialized + private static class IndyConfigurationHolder { + private static final boolean indyEnabled; + + static { + indyEnabled = ExperimentalConfig.get().indyEnabled(); + if (indyEnabled) { + logger.info("Enabled indy for instrumentation modules"); + } + } + } } diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/EarlyInstrumentationModule.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/EarlyInstrumentationModule.java new file mode 100644 index 000000000000..b7da6f55cfe9 --- /dev/null +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/EarlyInstrumentationModule.java @@ -0,0 +1,23 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.extension.instrumentation.internal; + +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.sdk.autoconfigure.spi.Ordered; + +/** + * Marker interface for instrumentation modules whose virtual fields should be set up before + * OpenTelemetry SDK is initialized. + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +public interface EarlyInstrumentationModule extends Ordered { + + default InstrumentationModule getInstrumentationModule() { + return (InstrumentationModule) this; + } +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 5d1f279e63f2..f8cfe6eb1ca8 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -13,6 +13,7 @@ import static java.util.logging.Level.FINE; import static java.util.logging.Level.SEVERE; import static net.bytebuddy.matcher.ElementMatchers.any; +import static net.bytebuddy.matcher.ElementMatchers.none; import io.opentelemetry.context.Context; import io.opentelemetry.context.ContextStorage; @@ -30,11 +31,15 @@ import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; +import io.opentelemetry.javaagent.extension.instrumentation.internal.EarlyInstrumentationModule; import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncOperationEndStrategies; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesBuilderImpl; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; import io.opentelemetry.javaagent.tooling.config.ConfigPropertiesBridge; import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; +import io.opentelemetry.javaagent.tooling.field.FieldBackedImplementationConfiguration; +import io.opentelemetry.javaagent.tooling.field.VirtualFieldImplementationInstaller; +import io.opentelemetry.javaagent.tooling.field.VirtualFieldImplementationInstallerFactory; import io.opentelemetry.javaagent.tooling.ignore.IgnoredClassLoadersMatcher; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesBuilderImpl; import io.opentelemetry.javaagent.tooling.ignore.IgnoredTypesMatcher; @@ -49,6 +54,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.logging.LogManager; import java.util.logging.Logger; import java.util.stream.Stream; @@ -84,6 +90,8 @@ public class AgentInstaller { private static final Map> CLASS_LOAD_CALLBACKS = new HashMap<>(); + private static volatile boolean instrumentationInstalled; + public static void installBytebuddyAgent( Instrumentation inst, ClassLoader extensionClassLoader, EarlyInitAgentConfig earlyConfig) { addByteBuddyRawSetting(); @@ -98,7 +106,7 @@ public static void installBytebuddyAgent( if (earlyConfig.getBoolean(JAVAAGENT_ENABLED_CONFIG, true)) { setupUnsafe(inst); List agentListeners = loadOrdered(AgentListener.class, extensionClassLoader); - installBytebuddyAgent(inst, extensionClassLoader, agentListeners); + installBytebuddyAgent(inst, extensionClassLoader, agentListeners, earlyConfig); } else { logger.fine("Tracing is disabled, not installing instrumentations."); } @@ -107,31 +115,13 @@ public static void installBytebuddyAgent( private static void installBytebuddyAgent( Instrumentation inst, ClassLoader extensionClassLoader, - Iterable agentListeners) { + Iterable agentListeners, + EarlyInitAgentConfig earlyConfig) { WeakRefAsyncOperationEndStrategies.initialize(); - EmbeddedInstrumentationProperties.setPropertiesLoader(extensionClassLoader); - setDefineClassHandler(); - - // If noop OpenTelemetry is enabled, autoConfiguredSdk will be null and AgentListeners are not - // called - AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = - installOpenTelemetrySdk(extensionClassLoader); - - ConfigProperties sdkConfig = AgentListener.resolveConfigProperties(autoConfiguredSdk); - AgentInstrumentationConfig.internalInitializeConfig(new ConfigPropertiesBridge(sdkConfig)); - copyNecessaryConfigToSystemProperties(sdkConfig); - - setBootstrapPackages(sdkConfig, extensionClassLoader); - ConfiguredResourceAttributesHolder.initialize( - SdkAutoconfigureAccess.getResourceAttributes(autoConfiguredSdk)); - - for (BeforeAgentListener agentListener : - loadOrdered(BeforeAgentListener.class, extensionClassLoader)) { - agentListener.beforeAgent(autoConfiguredSdk); - } + FieldBackedImplementationConfiguration.configure(earlyConfig); AgentBuilder agentBuilder = new AgentBuilder.Default( @@ -153,9 +143,6 @@ private static void installBytebuddyAgent( if (JavaModule.isSupported()) { agentBuilder = agentBuilder.with(new ExposeAgentBootstrapListener(inst)); } - - agentBuilder = configureIgnoredTypes(sdkConfig, extensionClassLoader, agentBuilder); - if (logger.isLoggable(FINE)) { agentBuilder = agentBuilder @@ -165,6 +152,28 @@ private static void installBytebuddyAgent( .with(new TransformLoggingListener()); } + installEarlyInstrumentation(agentBuilder, inst); + + // If noop OpenTelemetry is enabled, autoConfiguredSdk will be null and AgentListeners are not + // called + AutoConfiguredOpenTelemetrySdk autoConfiguredSdk = + installOpenTelemetrySdk(extensionClassLoader); + + ConfigProperties sdkConfig = AgentListener.resolveConfigProperties(autoConfiguredSdk); + AgentInstrumentationConfig.internalInitializeConfig(new ConfigPropertiesBridge(sdkConfig)); + copyNecessaryConfigToSystemProperties(sdkConfig); + + setBootstrapPackages(sdkConfig, extensionClassLoader); + ConfiguredResourceAttributesHolder.initialize( + SdkAutoconfigureAccess.getResourceAttributes(autoConfiguredSdk)); + + for (BeforeAgentListener agentListener : + loadOrdered(BeforeAgentListener.class, extensionClassLoader)) { + agentListener.beforeAgent(autoConfiguredSdk); + } + + agentBuilder = configureIgnoredTypes(sdkConfig, extensionClassLoader, agentBuilder); + int numberOfLoadedExtensions = 0; for (AgentExtension agentExtension : loadOrdered(AgentExtension.class, extensionClassLoader)) { if (logger.isLoggable(FINE)) { @@ -191,6 +200,7 @@ private static void installBytebuddyAgent( agentBuilder = AgentBuilderUtil.optimize(agentBuilder); ResettableClassFileTransformer resettableClassFileTransformer = agentBuilder.installOn(inst); + instrumentationInstalled = true; ClassFileTransformerHolder.setClassFileTransformer(resettableClassFileTransformer); addHttpServerResponseCustomizers(extensionClassLoader); @@ -198,6 +208,36 @@ private static void installBytebuddyAgent( runAfterAgentListeners(agentListeners, autoConfiguredSdk, sdkConfig); } + private static void installEarlyInstrumentation( + AgentBuilder agentBuilder, Instrumentation instrumentation) { + // We are only going to install the virtual fields here. Installing virtual field changes class + // structure and can not be applied to already loaded classes. + agentBuilder = agentBuilder.with(AgentBuilder.RedefinitionStrategy.DISABLED); + + AgentBuilder.Identified.Extendable extendableAgentBuilder = + agentBuilder + .ignore( + target -> instrumentationInstalled, // turn off after instrumentation is installed + Objects::nonNull) + .type(none()) + .transform( + (builder, typeDescription, classLoader, module, protectionDomain) -> builder); + + VirtualFieldImplementationInstallerFactory virtualFieldInstallerFactory = + new VirtualFieldImplementationInstallerFactory(); + for (EarlyInstrumentationModule earlyInstrumentationModule : + loadOrdered(EarlyInstrumentationModule.class, Utils.getExtensionsClassLoader())) { + + VirtualFieldImplementationInstaller contextProvider = + virtualFieldInstallerFactory.create( + earlyInstrumentationModule.getInstrumentationModule()); + extendableAgentBuilder = contextProvider.injectFields(extendableAgentBuilder); + } + + agentBuilder = AgentBuilderUtil.optimize(extendableAgentBuilder); + agentBuilder.installOn(instrumentation); + } + private static void copyNecessaryConfigToSystemProperties(ConfigProperties config) { for (String property : asList("otel.instrumentation.experimental.span-suppression-strategy")) { String value = config.getString(property); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationClassFileLocatorProvider.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationClassFileLocatorProvider.java new file mode 100644 index 000000000000..f857d0376fa0 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationClassFileLocatorProvider.java @@ -0,0 +1,57 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.field; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.bootstrap.VirtualFieldAccessorMarker; +import io.opentelemetry.javaagent.tooling.muzzle.ClassFileLocatorProvider; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.description.modifier.SyntheticState; +import net.bytebuddy.dynamic.ClassFileLocator; +import net.bytebuddy.dynamic.DynamicType; +import org.jetbrains.annotations.Nullable; + +@AutoService(ClassFileLocatorProvider.class) +public final class FieldBackedImplementationClassFileLocatorProvider + implements ClassFileLocatorProvider { + + @Nullable + @Override + public ClassFileLocator getClassFileLocator() { + if (!FieldBackedImplementationConfiguration.fieldInjectionEnabled) { + return null; + } + + return new VirtualFieldInterfaceLocator(); + } + + private static class VirtualFieldInterfaceLocator implements ClassFileLocator { + private static final ByteBuddy byteBuddy = new ByteBuddy(); + + private static DynamicType.Unloaded makeFieldAccessorInterface(String name) { + // create trimmed down version of the interface + return byteBuddy + .makeInterface() + .merge(SyntheticState.SYNTHETIC) + .name(name) + .implement(VirtualFieldAccessorMarker.class) + .make(); + } + + @Override + public Resolution locate(String name) { + if (GeneratedVirtualFieldNames.isVirtualFieldInterfaceName(name)) { + try (DynamicType.Unloaded type = makeFieldAccessorInterface(name)) { + return new Resolution.Explicit(type.getBytes()); + } + } + return new Resolution.Illegal(name); + } + + @Override + public void close() {} + } +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java new file mode 100644 index 000000000000..370ca2e85662 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationConfiguration.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.field; + +import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig; + +public final class FieldBackedImplementationConfiguration { + static boolean fieldInjectionEnabled = true; + + public static void configure(EarlyInitAgentConfig config) { + fieldInjectionEnabled = + config.getBoolean("otel.javaagent.experimental.field-injection.enabled", true); + } + + private FieldBackedImplementationConfiguration() {} +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationInstaller.java index 5c1e69063fd3..bce86a829911 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/FieldBackedImplementationInstaller.java @@ -6,6 +6,8 @@ package io.opentelemetry.javaagent.tooling.field; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasSuperType; +import static io.opentelemetry.javaagent.tooling.field.FieldBackedImplementationConfiguration.fieldInjectionEnabled; +import static io.opentelemetry.javaagent.tooling.field.GeneratedVirtualFieldNames.getFieldAccessorInterfaceName; import static java.util.logging.Level.FINEST; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -14,7 +16,6 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder; import io.opentelemetry.javaagent.bootstrap.VirtualFieldDetector; -import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; import io.opentelemetry.javaagent.tooling.HelperInjector; import io.opentelemetry.javaagent.tooling.TransformSafeLogger; import io.opentelemetry.javaagent.tooling.instrumentation.InstrumentationModuleInstaller; @@ -63,10 +64,6 @@ final class FieldBackedImplementationInstaller implements VirtualFieldImplementa private static final TransformSafeLogger logger = TransformSafeLogger.getLogger(FieldBackedImplementationInstaller.class); - private static final boolean FIELD_INJECTION_ENABLED = - AgentInstrumentationConfig.get() - .getBoolean("otel.javaagent.experimental.field-injection.enabled", true); - private final Class instrumenterClass; private final VirtualFieldMappings virtualFieldMappings; @@ -173,14 +170,13 @@ Set of pairs (type name, field type name) for which we have matchers installed. We use this to make sure we do not install matchers repeatedly for cases when same context class is used by multiple instrumentations. */ - private static final Set> INSTALLED_VIRTUAL_FIELD_MATCHERS = - new HashSet<>(); + private final Set> installedVirtualFieldMatchers = new HashSet<>(); @Override public AgentBuilder.Identified.Extendable injectFields( AgentBuilder.Identified.Extendable builder) { - if (FIELD_INJECTION_ENABLED) { + if (fieldInjectionEnabled) { for (Map.Entry entry : virtualFieldMappings.entrySet()) { /* * For each virtual field defined in a current instrumentation we create an agent builder @@ -189,8 +185,8 @@ public AgentBuilder.Identified.Extendable injectFields( * since this is done when agent builder is being made, it doesn't affect actual * class transformation. */ - synchronized (INSTALLED_VIRTUAL_FIELD_MATCHERS) { - if (INSTALLED_VIRTUAL_FIELD_MATCHERS.contains(entry)) { + synchronized (installedVirtualFieldMatchers) { + if (installedVirtualFieldMatchers.contains(entry)) { if (logger.isLoggable(FINEST)) { logger.log( FINEST, @@ -206,7 +202,7 @@ public AgentBuilder.Identified.Extendable injectFields( "Making builder for {0} {1}", new Object[] {instrumenterClass.getName(), entry}); } - INSTALLED_VIRTUAL_FIELD_MATCHERS.add(entry); + installedVirtualFieldMatchers.add(entry); /* * For each virtual field defined in a current instrumentation we create an agent builder @@ -221,7 +217,7 @@ public AgentBuilder.Identified.Extendable injectFields( builder = builder .type(typeMatcher) - .and(safeToInjectFieldsMatcher()) + .and(safeToInjectFieldMatcher(entry.getKey(), entry.getValue())) .and(InstrumentationModuleInstaller.NOT_DECORATOR_MATCHER) .transform(NoOpTransformer.INSTANCE); @@ -243,7 +239,8 @@ public AgentBuilder.Identified.Extendable injectFields( return builder; } - private static AgentBuilder.RawMatcher safeToInjectFieldsMatcher() { + private static AgentBuilder.RawMatcher safeToInjectFieldMatcher( + String typeName, String fieldTypeName) { return (typeDescription, classLoader, module, classBeingRedefined, protectionDomain) -> { /* * The idea here is that we can add fields if class is just being loaded @@ -251,7 +248,8 @@ private static AgentBuilder.RawMatcher safeToInjectFieldsMatcher() { * fields before is being transformed again. */ return classBeingRedefined == null - || VirtualFieldDetector.hasVirtualFields(classBeingRedefined); + || VirtualFieldDetector.hasVirtualField( + classBeingRedefined, getFieldAccessorInterfaceName(typeName, fieldTypeName)); }; } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/GeneratedVirtualFieldNames.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/GeneratedVirtualFieldNames.java index d1a797785a34..7c3ac6ffb807 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/GeneratedVirtualFieldNames.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/GeneratedVirtualFieldNames.java @@ -17,6 +17,10 @@ final class GeneratedVirtualFieldNames { private GeneratedVirtualFieldNames() {} + public static boolean isVirtualFieldInterfaceName(String className) { + return className.startsWith(DYNAMIC_CLASSES_PACKAGE + "VirtualFieldAccessor$"); + } + static String getVirtualFieldImplementationClassName(String typeName, String fieldTypeName) { return DYNAMIC_CLASSES_PACKAGE + "VirtualFieldImpl$" diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java index e99286911745..71d6faf68679 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationLoader.java @@ -54,7 +54,7 @@ public AgentBuilder extend(AgentBuilder agentBuilder, ConfigProperties config) { e); } } - logger.log(FINE, "Installed {0} instrumenter(s)", numberOfLoadedModules); + logger.log(FINE, "Installed {0} instrumentation(s)", numberOfLoadedModules); return agentBuilder; } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceBootstrapState.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceBootstrapState.java new file mode 100644 index 000000000000..00e4759aa1b8 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceBootstrapState.java @@ -0,0 +1,152 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.instrumentation.indy; + +import java.lang.invoke.MutableCallSite; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; +import javax.annotation.Nullable; + +class AdviceBootstrapState implements AutoCloseable { + + private static final ThreadLocal> stateForCurrentThread = + ThreadLocal.withInitial(HashMap::new); + + private final Key key; + private int recursionDepth; + @Nullable private MutableCallSite nestedCallSite; + + /** + * We have to eagerly initialize to not cause a lambda construction during {@link #enter(Class, + * String, String, String, String)}. + */ + private static final Function CONSTRUCTOR = AdviceBootstrapState::new; + + private AdviceBootstrapState(Key key) { + this.key = key; + // enter will increment it by one, so 0 is the value for non-recursive calls + recursionDepth = -1; + } + + static void initialize() { + // Eager initialize everything because we could run into recursions doing this during advice + // bootstrapping + stateForCurrentThread.get(); + stateForCurrentThread.remove(); + try { + Class.forName(Key.class.getName()); + } catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } + } + + static AdviceBootstrapState enter( + Class instrumentedClass, + String moduleClassName, + String adviceClassName, + String adviceMethodName, + String adviceMethodDescriptor) { + Key key = + new Key( + instrumentedClass, + moduleClassName, + adviceClassName, + adviceMethodName, + adviceMethodDescriptor); + AdviceBootstrapState state = stateForCurrentThread.get().computeIfAbsent(key, CONSTRUCTOR); + state.recursionDepth++; + return state; + } + + public boolean isNestedInvocation() { + return recursionDepth > 0; + } + + public MutableCallSite getOrInitMutableCallSite(Supplier initializer) { + if (nestedCallSite == null) { + nestedCallSite = initializer.get(); + } + return nestedCallSite; + } + + public void initMutableCallSite(MutableCallSite mutableCallSite) { + if (nestedCallSite != null) { + throw new IllegalStateException("callsite has already been initialized"); + } + nestedCallSite = mutableCallSite; + } + + @Nullable + public MutableCallSite getMutableCallSite() { + return nestedCallSite; + } + + @Override + public void close() { + if (recursionDepth == 0) { + Map stateMap = stateForCurrentThread.get(); + stateMap.remove(key); + if (stateMap.isEmpty()) { + // Do not leave an empty map dangling as thread local + stateForCurrentThread.remove(); + } + } else { + recursionDepth--; + } + } + + /** Key uniquely identifying a single invokedynamic instruction inserted for an advice */ + private static class Key { + + private final Class instrumentedClass; + private final String moduleClassName; + private final String adviceClassName; + private final String adviceMethodName; + private final String adviceMethodDescriptor; + + private Key( + Class instrumentedClass, + String moduleClassName, + String adviceClassName, + String adviceMethodName, + String adviceMethodDescriptor) { + this.instrumentedClass = instrumentedClass; + this.moduleClassName = moduleClassName; + this.adviceClassName = adviceClassName; + this.adviceMethodName = adviceMethodName; + this.adviceMethodDescriptor = adviceMethodDescriptor; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || !(o instanceof Key)) { + return false; + } + + Key that = (Key) o; + return instrumentedClass.equals(that.instrumentedClass) + && moduleClassName.equals(that.moduleClassName) + && adviceClassName.equals(that.adviceClassName) + && adviceMethodName.equals(that.adviceMethodName) + && adviceMethodDescriptor.equals(that.adviceMethodDescriptor); + } + + @Override + public int hashCode() { + int result = instrumentedClass.hashCode(); + result = 31 * result + moduleClassName.hashCode(); + result = 31 * result + adviceClassName.hashCode(); + result = 31 * result + adviceMethodName.hashCode(); + result = 31 * result + adviceMethodDescriptor.hashCode(); + return result; + } + } +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceTransformer.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceTransformer.java index ac1f46a99e3a..aab45a387921 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceTransformer.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/AdviceTransformer.java @@ -67,6 +67,9 @@ static byte[] transform(byte[] bytes) { })); TransformationContext context = new TransformationContext(); + if (justDelegateAdvice) { + context.disableReturnTypeChange(); + } ClassVisitor cv = new ClassVisitor(AsmApi.VERSION, cw) { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyBootstrap.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyBootstrap.java index 3ec6d531138d..bc8536fe5629 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyBootstrap.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyBootstrap.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.tooling.instrumentation.indy; -import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.bootstrap.IndyBootstrapDispatcher; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import java.lang.invoke.CallSite; @@ -13,6 +12,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.lang.invoke.MutableCallSite; import java.lang.reflect.Method; import java.security.PrivilegedAction; import java.util.Arrays; @@ -84,7 +84,7 @@ public class IndyBootstrap { MethodType bootstrapMethodType = MethodType.methodType( - ConstantCallSite.class, + CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, @@ -92,6 +92,8 @@ public class IndyBootstrap { IndyBootstrapDispatcher.init( MethodHandles.lookup().findStatic(IndyBootstrap.class, "bootstrap", bootstrapMethodType)); + + AdviceBootstrapState.initialize(); } catch (Exception e) { throw new IllegalStateException(e); } @@ -105,7 +107,7 @@ public static Method getIndyBootstrapMethod() { @Nullable @SuppressWarnings({"unused", "removal"}) // SecurityManager and AccessController are deprecated - private static ConstantCallSite bootstrap( + private static CallSite bootstrap( MethodHandles.Lookup lookup, String adviceMethodName, MethodType adviceMethodType, @@ -118,11 +120,11 @@ private static ConstantCallSite bootstrap( // callsite resolution needs privileged access to call Class#getClassLoader() and // MethodHandles$Lookup#findStatic return java.security.AccessController.doPrivileged( - (PrivilegedAction) + (PrivilegedAction) () -> internalBootstrap(lookup, adviceMethodName, adviceMethodType, args)); } - private static ConstantCallSite internalBootstrap( + private static CallSite internalBootstrap( MethodHandles.Lookup lookup, String adviceMethodName, MethodType adviceMethodType, @@ -157,7 +159,7 @@ private static ConstantCallSite internalBootstrap( } } - private static ConstantCallSite bootstrapAdvice( + private static CallSite bootstrapAdvice( MethodHandles.Lookup lookup, String adviceMethodName, MethodType invokedynamicMethodType, @@ -165,17 +167,25 @@ private static ConstantCallSite bootstrapAdvice( String adviceMethodDescriptor, String adviceClassName) throws NoSuchMethodException, IllegalAccessException, ClassNotFoundException { - CallDepth callDepth = CallDepth.forClass(IndyBootstrap.class); - try { - if (callDepth.getAndIncrement() > 0) { + try (AdviceBootstrapState nestedState = + AdviceBootstrapState.enter( + lookup.lookupClass(), + moduleClassName, + adviceClassName, + adviceMethodName, + adviceMethodDescriptor)) { + if (nestedState.isNestedInvocation()) { // avoid re-entrancy and stack overflow errors, which may happen when bootstrapping an // instrumentation that also gets triggered during the bootstrap // for example, adding correlation ids to the thread context when executing logger.debug. - logger.log( - Level.WARNING, - "Nested instrumented invokedynamic instruction linkage detected", - new Throwable()); - return null; + MutableCallSite mutableCallSite = nestedState.getMutableCallSite(); + if (mutableCallSite == null) { + mutableCallSite = + new MutableCallSite( + IndyBootstrapDispatcher.generateNoopMethodHandle(invokedynamicMethodType)); + nestedState.initMutableCallSite(mutableCallSite); + } + return mutableCallSite; } InstrumentationModuleClassLoader instrumentationClassloader = @@ -193,9 +203,21 @@ private static ConstantCallSite bootstrapAdvice( .getLookup() .findStatic(adviceClass, adviceMethodName, actualAdviceMethodType) .asType(invokedynamicMethodType); - return new ConstantCallSite(methodHandle); - } finally { - callDepth.decrementAndGet(); + + MutableCallSite nestedBootstrapCallSite = nestedState.getMutableCallSite(); + if (nestedBootstrapCallSite != null) { + // There have been nested bootstrapping attempts + // Update the callsite of those to run the actual instrumentation + logger.log( + Level.FINE, + "Fixing nested instrumentation invokedynamic instruction bootstrapping for instrumented class {0} and advice {1}.{2}, the instrumentation should be active now", + new Object[] {lookup.lookupClass().getName(), adviceClassName, adviceMethodName}); + nestedBootstrapCallSite.setTarget(methodHandle); + MutableCallSite.syncAll(new MutableCallSite[] {nestedBootstrapCallSite}); + return nestedBootstrapCallSite; + } else { + return new ConstantCallSite(methodHandle); + } } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java index b4d2477dd57e..5d5a868e21b4 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java @@ -196,6 +196,15 @@ public void applyTransformer(AgentBuilder.Transformer transformer) {} public static final Map bytecodeOverride = new ConcurrentHashMap<>(); + @Override + public Class loadClass(String name) throws ClassNotFoundException { + // We explicitly override loadClass from ClassLoader to ensure + // that loadClass is properly excluded from our internal ClassLoader Instrumentations + // (e.g. LoadInjectedClassInstrumentation, BooDelegationInstrumentation) + // Otherwise this will cause recursion in invokedynamic linkage + return loadClass(name, false); + } + @Override @SuppressWarnings("removal") // AccessController is deprecated for removal protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { @@ -317,12 +326,23 @@ private BytecodeWithUrl getInjectedClass(String name) { } private Class defineClassWithPackage(String name, byte[] bytecode) { - int lastDotIndex = name.lastIndexOf('.'); - if (lastDotIndex != -1) { - String packageName = name.substring(0, lastDotIndex); - safeDefinePackage(packageName); + try { + int lastDotIndex = name.lastIndexOf('.'); + if (lastDotIndex != -1) { + String packageName = name.substring(0, lastDotIndex); + safeDefinePackage(packageName); + } + return defineClass(name, bytecode, 0, bytecode.length, PROTECTION_DOMAIN); + } catch (LinkageError error) { + // Precaution against linkage error due to nested instrumentations happening + // it might be possible that e.g. an advice class has already been defined + // during an instrumentation of defineClass + Class clazz = findLoadedClass(name); + if (clazz != null) { + return clazz; + } + throw error; } - return defineClass(name, bytecode, 0, bytecode.length, PROTECTION_DOMAIN); } private void safeDefinePackage(String packageName) { diff --git a/javaagent-tooling/src/main/java/net/bytebuddy/agent/builder/AgentBuilderUtil.java b/javaagent-tooling/src/main/java/net/bytebuddy/agent/builder/AgentBuilderUtil.java index d596dc81ecf3..38f69bc50131 100644 --- a/javaagent-tooling/src/main/java/net/bytebuddy/agent/builder/AgentBuilderUtil.java +++ b/javaagent-tooling/src/main/java/net/bytebuddy/agent/builder/AgentBuilderUtil.java @@ -21,6 +21,7 @@ import java.util.logging.Logger; import javax.annotation.Nullable; import net.bytebuddy.agent.builder.AgentBuilder.Default.Transformation; +import net.bytebuddy.matcher.BooleanMatcher; import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ErasureMatcher; import net.bytebuddy.matcher.HasSuperClassMatcher; @@ -144,7 +145,7 @@ private static Result inspect(AgentBuilder.RawMatcher matcher) throws Exception ElementMatcher elementMatcher = getDelegateMatcher((AgentBuilder.RawMatcher.ForElementMatchers) matcher); Result result = inspect(elementMatcher); - if (result == null && logger.isLoggable(FINE)) { + if (result == null && logger.isLoggable(FINE) && shouldLog(elementMatcher)) { logger.log(Level.FINE, "Could not decompose matcher {0}", elementMatcher); } return result; @@ -309,6 +310,10 @@ private static Field getField(Class clazz, String name) { } } + private static boolean shouldLog(ElementMatcher elementMatcher) { + return !(elementMatcher instanceof BooleanMatcher); + } + private static class TransformContext extends AgentBuilder.Listener.Adapter { private static final ThreadLocal transformedName = new ThreadLocal<>(); diff --git a/licenses/jackson-annotations-2.18.0.jar/META-INF/LICENSE b/licenses/jackson-annotations-2.18.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-annotations-2.18.0.jar/META-INF/LICENSE rename to licenses/jackson-annotations-2.18.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-annotations-2.18.0.jar/META-INF/NOTICE b/licenses/jackson-annotations-2.18.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-annotations-2.18.0.jar/META-INF/NOTICE rename to licenses/jackson-annotations-2.18.1.jar/META-INF/NOTICE diff --git a/licenses/jackson-core-2.18.0.jar/META-INF/LICENSE b/licenses/jackson-core-2.18.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-core-2.18.0.jar/META-INF/LICENSE rename to licenses/jackson-core-2.18.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-core-2.18.0.jar/META-INF/NOTICE b/licenses/jackson-core-2.18.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-core-2.18.0.jar/META-INF/NOTICE rename to licenses/jackson-core-2.18.1.jar/META-INF/NOTICE diff --git a/licenses/jackson-databind-2.18.0.jar/META-INF/LICENSE b/licenses/jackson-databind-2.18.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-databind-2.18.0.jar/META-INF/LICENSE rename to licenses/jackson-databind-2.18.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-databind-2.18.0.jar/META-INF/NOTICE b/licenses/jackson-databind-2.18.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-databind-2.18.0.jar/META-INF/NOTICE rename to licenses/jackson-databind-2.18.1.jar/META-INF/NOTICE diff --git a/licenses/jackson-dataformat-yaml-2.18.0.jar/META-INF/LICENSE b/licenses/jackson-dataformat-yaml-2.18.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-dataformat-yaml-2.18.0.jar/META-INF/LICENSE rename to licenses/jackson-dataformat-yaml-2.18.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-dataformat-yaml-2.18.0.jar/META-INF/NOTICE b/licenses/jackson-dataformat-yaml-2.18.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-dataformat-yaml-2.18.0.jar/META-INF/NOTICE rename to licenses/jackson-dataformat-yaml-2.18.1.jar/META-INF/NOTICE diff --git a/licenses/licenses.md b/licenses/licenses.md index 51a044862074..74c6c6d95322 100644 --- a/licenses/licenses.md +++ b/licenses/licenses.md @@ -9,33 +9,33 @@ > - **POM Project URL**: [https://github.com/raphw/weak-lock-free](https://github.com/raphw/weak-lock-free) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**2** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.18.0` +**2** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.18.1` > - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-annotations-2.18.0.jar/META-INF/LICENSE](jackson-annotations-2.18.0.jar/META-INF/LICENSE) - - [jackson-annotations-2.18.0.jar/META-INF/NOTICE](jackson-annotations-2.18.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-annotations-2.18.1.jar/META-INF/LICENSE](jackson-annotations-2.18.1.jar/META-INF/LICENSE) + - [jackson-annotations-2.18.1.jar/META-INF/NOTICE](jackson-annotations-2.18.1.jar/META-INF/NOTICE) -**3** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-core` **Version:** `2.18.0` +**3** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-core` **Version:** `2.18.1` > - **Project URL**: [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-core-2.18.0.jar/META-INF/LICENSE](jackson-core-2.18.0.jar/META-INF/LICENSE) - - [jackson-core-2.18.0.jar/META-INF/NOTICE](jackson-core-2.18.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-core-2.18.1.jar/META-INF/LICENSE](jackson-core-2.18.1.jar/META-INF/LICENSE) + - [jackson-core-2.18.1.jar/META-INF/NOTICE](jackson-core-2.18.1.jar/META-INF/NOTICE) -**4** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-databind` **Version:** `2.18.0` +**4** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-databind` **Version:** `2.18.1` > - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-databind-2.18.0.jar/META-INF/LICENSE](jackson-databind-2.18.0.jar/META-INF/LICENSE) - - [jackson-databind-2.18.0.jar/META-INF/NOTICE](jackson-databind-2.18.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-databind-2.18.1.jar/META-INF/LICENSE](jackson-databind-2.18.1.jar/META-INF/LICENSE) + - [jackson-databind-2.18.1.jar/META-INF/NOTICE](jackson-databind-2.18.1.jar/META-INF/NOTICE) -**5** **Group:** `com.fasterxml.jackson.dataformat` **Name:** `jackson-dataformat-yaml` **Version:** `2.18.0` +**5** **Group:** `com.fasterxml.jackson.dataformat` **Name:** `jackson-dataformat-yaml` **Version:** `2.18.1` > - **Project URL**: [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-dataformat-yaml-2.18.0.jar/META-INF/LICENSE](jackson-dataformat-yaml-2.18.0.jar/META-INF/LICENSE) - - [jackson-dataformat-yaml-2.18.0.jar/META-INF/NOTICE](jackson-dataformat-yaml-2.18.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-dataformat-yaml-2.18.1.jar/META-INF/LICENSE](jackson-dataformat-yaml-2.18.1.jar/META-INF/LICENSE) + - [jackson-dataformat-yaml-2.18.1.jar/META-INF/NOTICE](jackson-dataformat-yaml-2.18.1.jar/META-INF/NOTICE) **6** **Group:** `com.google.cloud.opentelemetry` **Name:** `detector-resources-support` **Version:** `0.33.0` > - **POM Project URL**: [https://github.com/GoogleCloudPlatform/opentelemetry-operations-java](https://github.com/GoogleCloudPlatform/opentelemetry-operations-java) @@ -163,11 +163,11 @@ > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**37** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv` **Version:** `1.25.0-alpha` +**37** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv` **Version:** `1.28.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**38** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv-incubating` **Version:** `1.25.0-alpha` +**38** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv-incubating` **Version:** `1.28.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) @@ -273,7 +273,7 @@ > - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**59** **Group:** `org.yaml` **Name:** `snakeyaml` **Version:** `2.2` +**59** **Group:** `org.yaml` **Name:** `snakeyaml` **Version:** `2.3` > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategy.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategy.java index e69cc284499f..1a6476075878 100644 --- a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategy.java +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategy.java @@ -19,9 +19,12 @@ public class AgentLocationStrategy implements AgentBuilder.LocationStrategy { private final ClassLoader bootstrapProxy; + private final List additionalLocators; - public AgentLocationStrategy(ClassLoader bootstrapProxy) { + public AgentLocationStrategy( + ClassLoader bootstrapProxy, List additionalLocators) { this.bootstrapProxy = bootstrapProxy; + this.additionalLocators = additionalLocators; } public ClassFileLocator classFileLocator(ClassLoader classLoader) { @@ -32,6 +35,9 @@ public ClassFileLocator classFileLocator(ClassLoader classLoader) { public ClassFileLocator classFileLocator(ClassLoader classLoader, JavaModule javaModule) { List locators = new ArrayList<>(); + if (additionalLocators != null) { + locators.addAll(additionalLocators); + } if (classLoader != null) { locators.add(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(classLoader)); } diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentTooling.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentTooling.java index ea784ba7a0f2..d5c2f204cd16 100644 --- a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentTooling.java +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentTooling.java @@ -5,9 +5,12 @@ package io.opentelemetry.javaagent.tooling.muzzle; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.ServiceLoader; import net.bytebuddy.agent.builder.AgentBuilder; +import net.bytebuddy.dynamic.ClassFileLocator; import net.bytebuddy.utility.JavaModule; /** @@ -18,7 +21,7 @@ public final class AgentTooling { private static final AgentLocationStrategy LOCATION_STRATEGY = - new AgentLocationStrategy(getBootstrapProxy()); + new AgentLocationStrategy(getBootstrapProxy(), getLocators()); private static final AgentBuilder.PoolStrategy POOL_STRATEGY = new AgentCachingPoolStrategy(LOCATION_STRATEGY); @@ -49,6 +52,20 @@ private static ClassLoader getBootstrapProxy() { return null; } + private static List getLocators() { + List locators = new ArrayList<>(); + ServiceLoader.load(ClassFileLocatorProvider.class, AgentTooling.class.getClassLoader()) + .forEach( + provider -> { + ClassFileLocator locator = provider.getClassFileLocator(); + if (locator != null) { + locators.add(locator); + } + }); + + return locators; + } + public static boolean isTransforming(ClassLoader classLoader, String className) { CurrentTransform currentTransform = CURRENT_TRANSFORM.get(); if (currentTransform == null) { diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ClassFileLocatorProvider.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ClassFileLocatorProvider.java new file mode 100644 index 000000000000..7a501fac2eb6 --- /dev/null +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ClassFileLocatorProvider.java @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.muzzle; + +import javax.annotation.Nullable; +import net.bytebuddy.dynamic.ClassFileLocator; + +/** + * This SPI can be used to add additional {@link ClassFileLocator}s to {@link + * AgentLocationStrategy}. + */ +public interface ClassFileLocatorProvider { + + /** Provide a class loader which can be used to look up bootstrap resources. */ + @Nullable + ClassFileLocator getClassFileLocator(); +} diff --git a/muzzle/src/test/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategyTest.java b/muzzle/src/test/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategyTest.java index 85c5b65ee7e1..c2cfcd1b41d2 100644 --- a/muzzle/src/test/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategyTest.java +++ b/muzzle/src/test/java/io/opentelemetry/javaagent/tooling/muzzle/AgentLocationStrategyTest.java @@ -35,7 +35,7 @@ void cleanup() { @Test void findsResourcesFromParentClassloader() throws Exception { ClassFileLocator locator = - new AgentLocationStrategy(ClassLoader.getSystemClassLoader()) + new AgentLocationStrategy(ClassLoader.getSystemClassLoader(), null) .classFileLocator(childLoader, null); assertThat(locator.locate("java/lang/Object").isResolved()).isTrue(); assertThat(lastLookup).hasValue("java/lang/Object.class"); diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractKafkaSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractKafkaSpringStarterSmokeTest.java index 28a4d8980d9a..23de51869650 100644 --- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractKafkaSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractKafkaSpringStarterSmokeTest.java @@ -28,6 +28,7 @@ abstract class AbstractKafkaSpringStarterSmokeTest extends AbstractSpringStarter @Autowired protected KafkaTemplate kafkaTemplate; + @SuppressWarnings("deprecation") // using deprecated semconv @Test void shouldInstrumentProducerAndConsumer() { testing.runWithSpan( @@ -62,7 +63,7 @@ void shouldInstrumentProducerAndConsumer() { "testTopic"), equalTo(MessagingIncubatingAttributes.MESSAGING_OPERATION, "publish"), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("producer")), satisfies( MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID, @@ -100,7 +101,7 @@ void shouldInstrumentProducerAndConsumer() { AttributeKey.longKey("kafka.record.queue_time_ms"), AbstractLongAssert::isNotNegative), satisfies( - MessagingIncubatingAttributes.MESSAGING_CLIENT_ID, + AttributeKey.stringKey("messaging.client_id"), stringAssert -> stringAssert.startsWith("consumer"))), span -> span.hasName("consumer").hasParent(trace.getSpan(2)))); } diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractMongodbSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractMongodbSpringStarterSmokeTest.java index 60c6baa51089..c9790468ef2d 100644 --- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractMongodbSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractMongodbSpringStarterSmokeTest.java @@ -33,6 +33,6 @@ void mongodb() { .hasName("listDatabases admin") .hasAttribute( DbIncubatingAttributes.DB_SYSTEM, - DbIncubatingAttributes.DbSystemValues.MONGODB))); + DbIncubatingAttributes.DbSystemIncubatingValues.MONGODB))); } } diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java index df10159d59c9..ebec55db783f 100644 --- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java @@ -53,6 +53,7 @@ * This test class enforces the order of the tests to make sure that {@link #shouldSendTelemetry()}, * which asserts the telemetry data from the application startup, is executed first. */ +@SuppressWarnings("deprecation") // using deprecated semconv @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class AbstractOtelSpringStarterSmokeTest extends AbstractSpringStarterSmokeTest { diff --git a/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java index 8de8f4fc0ac5..9ce3218380f6 100644 --- a/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java +++ b/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java @@ -37,6 +37,7 @@ void setUp() { } @Test + @SuppressWarnings("deprecation") // using deprecated semconv void webClientAndWebFluxAndR2dbc() { webClient .get() diff --git a/smoke-tests/build.gradle.kts b/smoke-tests/build.gradle.kts index 5e49d9e99825..a4bae35639ac 100644 --- a/smoke-tests/build.gradle.kts +++ b/smoke-tests/build.gradle.kts @@ -23,13 +23,13 @@ dependencies { api("org.spockframework:spock-core") api(project(":testing-common")) - implementation(platform("io.grpc:grpc-bom:1.68.0")) + implementation(platform("io.grpc:grpc-bom:1.68.1")) implementation("org.slf4j:slf4j-api") implementation("io.opentelemetry:opentelemetry-api") implementation("io.opentelemetry.proto:opentelemetry-proto") implementation("org.testcontainers:testcontainers") implementation("com.fasterxml.jackson.core:jackson-databind") - implementation("com.google.protobuf:protobuf-java-util:3.25.5") + implementation("com.google.protobuf:protobuf-java-util:4.28.3") implementation("io.grpc:grpc-netty-shaded") implementation("io.grpc:grpc-protobuf") implementation("io.grpc:grpc-stub") diff --git a/smoke-tests/images/grpc/build.gradle.kts b/smoke-tests/images/grpc/build.gradle.kts index e00327ee5e02..d15880474b27 100644 --- a/smoke-tests/images/grpc/build.gradle.kts +++ b/smoke-tests/images/grpc/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } dependencies { - implementation(platform("io.grpc:grpc-bom:1.68.0")) + implementation(platform("io.grpc:grpc-bom:1.68.1")) implementation(platform("io.opentelemetry:opentelemetry-bom:1.0.0")) implementation(platform("io.opentelemetry:opentelemetry-bom-alpha:1.0.0-alpha")) implementation(platform("org.apache.logging.log4j:log4j-bom:2.24.1")) diff --git a/smoke-tests/images/quarkus/build.gradle.kts b/smoke-tests/images/quarkus/build.gradle.kts index 890a0bdc846d..9ebd97770857 100644 --- a/smoke-tests/images/quarkus/build.gradle.kts +++ b/smoke-tests/images/quarkus/build.gradle.kts @@ -17,7 +17,7 @@ plugins { dependencies { implementation(enforcedPlatform("io.quarkus:quarkus-bom:3.15.1")) - implementation("io.quarkus:quarkus-resteasy") + implementation("io.quarkus:quarkus-rest") } quarkus { @@ -26,7 +26,8 @@ quarkus { setFinalName("opentelemetry-quarkus-$version") } -val targetJDK = project.findProperty("targetJDK") ?: "11" +// Quarkus 3.7+ requires Java 17+ +val targetJDK = project.findProperty("targetJDK") ?: "17" val tag = findProperty("tag") ?: DateTimeFormatter.ofPattern("yyyyMMdd.HHmmSS").format(LocalDateTime.now()) @@ -45,18 +46,13 @@ jib { container { mainClass = "bogus" // to suppress Jib warning about missing main class } - pluginExtensions { - pluginExtension { - implementation = "com.google.cloud.tools.jib.gradle.extension.quarkus.JibQuarkusExtension" - } - } } tasks { withType().configureEach { with(options) { - // Quarkus 2.0+ does not support Java 8 - release.set(11) + // Quarkus 3.7+ requires Java 17+ + release.set(17) } } diff --git a/smoke-tests/images/quarkus/src/main/resources/application.properties b/smoke-tests/images/quarkus/src/main/resources/application.properties deleted file mode 100644 index 5271e05bec32..000000000000 --- a/smoke-tests/images/quarkus/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# this is needed until jib supports the new default (fast-jar) -# see https://github.com/GoogleContainerTools/jib-extensions/issues/92 -quarkus.package.type=legacy-jar diff --git a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy index 652dd4fdf5fa..4cd71037f3f1 100644 --- a/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy +++ b/smoke-tests/src/test/groovy/io/opentelemetry/smoketest/AppServerTest.groovy @@ -16,8 +16,8 @@ import java.util.jar.Attributes import java.util.jar.JarFile import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OS_TYPE -import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeValues.LINUX -import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeValues.WINDOWS +import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeIncubatingValues.LINUX +import static io.opentelemetry.semconv.incubating.OsIncubatingAttributes.OsTypeIncubatingValues.WINDOWS import static org.junit.Assume.assumeFalse import static org.junit.Assume.assumeTrue diff --git a/testing-common/integration-tests/build.gradle.kts b/testing-common/integration-tests/build.gradle.kts index 54283321482a..3379dcfab84b 100644 --- a/testing-common/integration-tests/build.gradle.kts +++ b/testing-common/integration-tests/build.gradle.kts @@ -8,6 +8,7 @@ dependencies { testCompileOnly(project(":instrumentation-api")) testCompileOnly(project(":javaagent-tooling")) + testCompileOnly(project(":javaagent-bootstrap")) testCompileOnly(project(":javaagent-extension-api")) testCompileOnly(project(":muzzle")) diff --git a/testing-common/integration-tests/src/test/groovy/AgentInstrumentationSpecificationTest.groovy b/testing-common/integration-tests/src/test/groovy/AgentInstrumentationSpecificationTest.groovy index 530221e4553f..e6af2be22ddd 100644 --- a/testing-common/integration-tests/src/test/groovy/AgentInstrumentationSpecificationTest.groovy +++ b/testing-common/integration-tests/src/test/groovy/AgentInstrumentationSpecificationTest.groovy @@ -6,7 +6,7 @@ import com.google.common.reflect.ClassPath import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import io.opentelemetry.instrumentation.test.utils.ClasspathUtils -import io.opentelemetry.javaagent.tooling.Constants +import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder import org.slf4j.LoggerFactory import java.util.concurrent.TimeoutException @@ -17,12 +17,14 @@ import java.util.concurrent.TimeoutException class AgentInstrumentationSpecificationTest extends AgentInstrumentationSpecification { private static final ClassLoader BOOTSTRAP_CLASSLOADER = null + public static final List BOOTSTRAP_PACKAGE_PREFIXES = BootstrapPackagePrefixesHolder.getBoostrapPackagePrefixes() + def "classpath setup"() { setup: final List bootstrapClassesIncorrectlyLoaded = [] for (ClassPath.ClassInfo info : getTestClasspath().getAllClasses()) { - for (int i = 0; i < Constants.BOOTSTRAP_PACKAGE_PREFIXES.size(); ++i) { - if (info.getName().startsWith(Constants.BOOTSTRAP_PACKAGE_PREFIXES[i])) { + for (int i = 0; i < BOOTSTRAP_PACKAGE_PREFIXES.size(); ++i) { + if (info.getName().startsWith(BOOTSTRAP_PACKAGE_PREFIXES[i])) { Class bootstrapClass = Class.forName(info.getName()) def loader try { diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java new file mode 100644 index 000000000000..06d25bd9ec79 --- /dev/null +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java @@ -0,0 +1,56 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.testing.junit.db; + +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_COSMOSDB_CONTAINER; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_MONGODB_COLLECTION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import java.util.HashMap; +import java.util.Map; + +// until old database semconv are dropped in 3.0 +public class SemconvStabilityUtil { + + private static final AttributeKey DB_NAMESPACE = AttributeKey.stringKey("db.namespace"); + private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); + private static final AttributeKey DB_OPERATION_NAME = + AttributeKey.stringKey("db.operation.name"); + private static final AttributeKey DB_COLLECTION_NAME = + AttributeKey.stringKey("db.collection.name"); + + private static final Map, AttributeKey> oldToNewMap = buildMap(); + + @SuppressWarnings("deprecation") // using deprecated semconv + private static Map, AttributeKey> buildMap() { + Map, AttributeKey> map = new HashMap<>(); + map.put(DB_NAME, DB_NAMESPACE); + map.put(DB_STATEMENT, DB_QUERY_TEXT); + map.put(DB_OPERATION, DB_OPERATION_NAME); + map.put(DB_SQL_TABLE, DB_COLLECTION_NAME); + map.put(DB_CASSANDRA_TABLE, DB_COLLECTION_NAME); + map.put(DB_MONGODB_COLLECTION, DB_COLLECTION_NAME); + map.put(DB_COSMOSDB_CONTAINER, DB_COLLECTION_NAME); + return map; + } + + private SemconvStabilityUtil() {} + + @SuppressWarnings("unchecked") + public static AttributeKey getAttributeKey(AttributeKey oldKey) { + // not testing database/dup + if (SemconvStability.emitStableDatabaseSemconv()) { + return (AttributeKey) oldToNewMap.get(oldKey); + } + return oldKey; + } +}