diff --git a/.github/workflows/metadata-update.yml b/.github/workflows/metadata-update.yml new file mode 100644 index 000000000000..572141d9fb2a --- /dev/null +++ b/.github/workflows/metadata-update.yml @@ -0,0 +1,121 @@ +name: Metadata Update + +on: + workflow_dispatch: # allow this to be manually triggered + schedule: + - cron: "00 1 * * *" # daily at 1:00 UTC + +permissions: + contents: read + +# Should only be one job running at a time to avoid conflicts with the metadata update branch +concurrency: + group: metadata-update + cancel-in-progress: true + +jobs: + update: + runs-on: ubuntu-latest + permissions: + contents: write # for git push to PR branch + pull-requests: write # for adding label and assignee to PR + + steps: + - 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@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + with: + distribution: temurin + java-version-file: .java-version + + - name: Set up gradle + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + + - name: Collect telemetry + run: ./instrumentation-docs/ci-collect.sh + + - name: Run documentation analyzer + run: ./gradlew :instrumentation-docs:runAnalysis + + - name: Check for diff + id: diffcheck + run: | + git add docs/instrumentation-list.yaml + if ! git diff --cached --quiet; then + echo "has_diff=true" >> $GITHUB_OUTPUT + else + echo "has_diff=false" >> $GITHUB_OUTPUT + fi + + - name: Use CLA approved github bot + if: steps.diffcheck.outputs.has_diff == 'true' + run: .github/scripts/use-cla-approved-bot.sh + + - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + if: steps.diffcheck.outputs.has_diff == 'true' + id: otelbot-token + with: + app-id: ${{ vars.OTELBOT_APP_ID }} + private-key: ${{ secrets.OTELBOT_PRIVATE_KEY }} + + - name: Find or create metadata update branch + if: steps.diffcheck.outputs.has_diff == 'true' + id: findbranch + env: + GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} + run: | + BRANCH_NAME="metadata-update-main" + echo "branch=$BRANCH_NAME" >> $GITHUB_OUTPUT + if git ls-remote --exit-code --heads origin "$BRANCH_NAME"; then + git fetch origin "$BRANCH_NAME" + git checkout "$BRANCH_NAME" + git merge origin/main --no-edit + else + git checkout -b "$BRANCH_NAME" origin/main + fi + + - name: Commit and push changes + if: steps.diffcheck.outputs.has_diff == 'true' + env: + GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} + run: | + BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" + git commit -m "chore: update instrumentation list [automated]" || echo "No changes to commit." + git push origin "$BRANCH_NAME" + + - name: Create PR if needed + if: steps.diffcheck.outputs.has_diff == 'true' + id: createpr + env: + GH_TOKEN: ${{ steps.otelbot-token.outputs.token }} + run: | + BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" + PR_EXISTS=$(gh pr list --state open --head "$BRANCH_NAME" --label automation --json url -q '.[0].url') + if [ -z "$PR_EXISTS" ]; then + gh pr create \ + --title "chore: update instrumentation list [automated]" \ + --body "This PR was created automatically by the metadata update workflow." \ + --head "$BRANCH_NAME" \ + --base main + echo "new_pr=true" >> $GITHUB_OUTPUT + else + echo "PR already exists: $PR_EXISTS" + echo "new_pr=false" >> $GITHUB_OUTPUT + fi + + - name: Add label to PR + if: steps.createpr.outputs.new_pr == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + BRANCH_NAME="${{ steps.findbranch.outputs.branch }}" + PR_URL=$(gh pr list --state open --head "$BRANCH_NAME" --json url -q '.[0].url') + if [ -n "$PR_URL" ]; then + gh pr edit "$PR_URL" --add-label "automation" --add-assignee jaydeluca + else + echo "No open PR found for branch $BRANCH_NAME." + fi diff --git a/instrumentation-docs/ci-collect.sh b/instrumentation-docs/ci-collect.sh new file mode 100755 index 000000000000..dec93c26ea62 --- /dev/null +++ b/instrumentation-docs/ci-collect.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Runs selected Gradle test tasks to regenerate *.telemetry output for +# individual OpenTelemetry Java agent instrumentations. + +set -euo pipefail + +# shellcheck source=instrumentation-docs/instrumentations.sh +source "$(dirname "$0")/instrumentations.sh" + +ALL_TASKS=() +for task in "${INSTRUMENTATIONS[@]}"; do + ALL_TASKS+=(":instrumentation:${task}") +done +for task in "${COLIMA_INSTRUMENTATIONS[@]}"; do + ALL_TASKS+=(":instrumentation:${task}") +done + +echo "Processing instrumentations..." +./gradlew "${ALL_TASKS[@]}" \ + -PcollectMetadata=true \ + --rerun-tasks --continue +echo "Telemetry file regeneration complete." diff --git a/instrumentation-docs/collect.sh b/instrumentation-docs/collect.sh index ba3ad6f04b4a..130aaff2d908 100755 --- a/instrumentation-docs/collect.sh +++ b/instrumentation-docs/collect.sh @@ -2,127 +2,12 @@ # Runs selected Gradle test tasks to regenerate *.telemetry output for # individual OpenTelemetry Java agent instrumentations. Some instrumentation test suites don't run -# on Apple Silicon, so we use colima to run them in an x86_64 container. +# on ARM, so we use colima to run them in an x86_64 container. set -euo pipefail -readonly INSTRUMENTATIONS=( - # : : [ gradle-task-suffix ] - "activej-http-6.0:javaagent:test" - "akka:akka-http-10.0:javaagent:test" - "armeria:armeria-grpc-1.14:javaagent:test" - "apache-httpasyncclient-4.1:javaagent:test" - "alibaba-druid-1.0:javaagent:test" - "alibaba-druid-1.0:javaagent:testStableSemconv" - "apache-dbcp-2.0:javaagent:test" - "apache-dbcp-2.0:javaagent:testStableSemconv" - "apache-httpclient:apache-httpclient-2.0:javaagent:test" - "apache-httpclient:apache-httpclient-4.0:javaagent:test" - "apache-httpclient:apache-httpclient-4.3:library:test" - "apache-httpclient:apache-httpclient-5.0:javaagent:test" - "apache-dubbo-2.7:javaagent:testDubbo" - "c3p0-0.9:javaagent:test" - "c3p0-0.9:javaagent:testStableSemconv" - "clickhouse-client-0.5:javaagent:test" - "clickhouse-client-0.5:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-1.11:javaagent:test" - "google-http-client-1.19:javaagent:test" - "http-url-connection:javaagent:test" - "java-http-client:javaagent:test" - "jetty-httpclient:jetty-httpclient-9.2:javaagent:test" - "jetty-httpclient:jetty-httpclient-12.0:javaagent:test" - "jodd-http-4.2:javaagent:test" - "netty:netty-3.8:javaagent:test" - "netty:netty-4.0:javaagent:test" - "netty:netty-4.1:javaagent:test" - "okhttp:okhttp-2.2:javaagent:test" - "okhttp:okhttp-3.0:javaagent:test" - "pekko:pekko-http-1.0:javaagent:test" - "play:play-ws:play-ws-1.0:javaagent:test" - "play:play-ws:play-ws-2.0:javaagent:test" - "play:play-ws:play-ws-2.1:javaagent:test" - "reactor:reactor-netty:reactor-netty-0.9:javaagent:test" - "reactor:reactor-netty:reactor-netty-1.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-3.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-4.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-5.0:javaagent:test" - "vertx:vertx-redis-client-4.0:javaagent:test" - "vertx:vertx-redis-client-4.0:javaagent:testStableSemconv" - "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:test" - "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:testStableSemconv" - "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:test" - "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-1.11:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-2.2:javaagent:test" - "aws-sdk:aws-sdk-2.2:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-2.2:javaagent:testBedrockRuntime" - "hikaricp-3.0:javaagent:test" - "hikaricp-3.0:javaagent:testStableSemconv" - "tomcat:tomcat-jdbc:javaagent:test" - "tomcat:tomcat-jdbc:javaagent:testStableSemconv" - "oshi:javaagent:test" - "oshi:javaagent:testExperimental" - "vibur-dbcp-11.0:javaagent:test" - "vibur-dbcp-11.0:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-api-client-7.16:javaagent:test" - "elasticsearch:elasticsearch-api-client-7.16:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-rest-7.0:javaagent:test" - "elasticsearch:elasticsearch-transport-5.0:javaagent:test" - "elasticsearch:elasticsearch-transport-5.0:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-transport-5.0:javaagent:testExperimental" - "elasticsearch:elasticsearch-transport-5.3:javaagent:test" - "elasticsearch:elasticsearch-transport-5.3:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-transport-5.3:javaagent:testExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestExperimental" - "apache-httpclient:apache-httpclient-5.2:library:test" - "armeria:armeria-1.3:javaagent:test" - "async-http-client:async-http-client-1.9:javaagent:test" - "async-http-client:async-http-client-2.0:javaagent:test" - "apache-dubbo-2.7:javaagent:testDubbo" - "finagle-http-23.11:javaagent:test" - "finatra-2.9:javaagent:test" - "spring:spring-batch-3.0:javaagent:test" - "spring:spring-data:spring-data-1.8:javaagent:test" - "spring:spring-integration-4.1:javaagent:test" - "spring:spring-integration-4.1:javaagent:testWithRabbitInstrumentation" - "spring:spring-integration-4.1:javaagent:testWithProducerInstrumentation" - "spring:spring-jms:spring-jms-2.0:javaagent:test" - "spring:spring-kafka-2.7:javaagent:test" - "spring:spring-kafka-2.7:javaagent:testNoReceiveTelemetry" - "spring:spring-pulsar-1.0:javaagent:test" - "spring:spring-rabbit-1.0:javaagent:test" - "spring:spring-rmi-4.0:javaagent:test" - "spring:spring-scheduling-3.1:javaagent:test" - "spring:spring-scheduling-3.1:javaagent:testExperimental" - "spring:spring-web:spring-web-3.1:library:test" - "spring:spring-web:spring-web-6.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.3:library:test" - "spring:spring-webmvc:spring-webmvc-3.1:javaagent:test" - "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" - "spring:spring-webmvc:spring-webmvc-5.3:library:test" - "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" - "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" - "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" - "spring:spring-webmvc:spring-webmvc-6.0:javaagent:testExperimental" - "openai:openai-java-1.1:javaagent:test" -) - -readonly COLIMA_INSTRUMENTATIONS=( - "elasticsearch:elasticsearch-rest-6.4:javaagent:test" - "elasticsearch:elasticsearch-rest-5.0:javaagent:test" - "oracle-ucp-11.2:javaagent:test" - "oracle-ucp-11.2:javaagent:testStableSemconv" -) +# shellcheck source=instrumentation-docs/instrumentations.sh +source "$(dirname "$0")/instrumentations.sh" readonly TELEMETRY_DIR_NAME=".telemetry" diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh new file mode 100755 index 000000000000..d75099913ebf --- /dev/null +++ b/instrumentation-docs/instrumentations.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# This file is sourced by collect.sh and ci-collect.sh + +# shellcheck disable=SC2034 +readonly INSTRUMENTATIONS=( + # : : [ gradle-task-suffix ] + "activej-http-6.0:javaagent:test" + "akka:akka-http-10.0:javaagent:test" + "armeria:armeria-grpc-1.14:javaagent:test" + "apache-httpasyncclient-4.1:javaagent:test" + "alibaba-druid-1.0:javaagent:test" + "alibaba-druid-1.0:javaagent:testStableSemconv" + "apache-dbcp-2.0:javaagent:test" + "apache-dbcp-2.0:javaagent:testStableSemconv" + "apache-httpclient:apache-httpclient-2.0:javaagent:test" + "apache-httpclient:apache-httpclient-4.0:javaagent:test" + "apache-httpclient:apache-httpclient-4.3:library:test" + "apache-httpclient:apache-httpclient-5.0:javaagent:test" + "apache-dubbo-2.7:javaagent:testDubbo" + "c3p0-0.9:javaagent:test" + "c3p0-0.9:javaagent:testStableSemconv" + "clickhouse-client-0.5:javaagent:test" + "clickhouse-client-0.5:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-1.11:javaagent:test" + "google-http-client-1.19:javaagent:test" + "http-url-connection:javaagent:test" + "java-http-client:javaagent:test" + "jetty-httpclient:jetty-httpclient-9.2:javaagent:test" + "jetty-httpclient:jetty-httpclient-12.0:javaagent:test" + "jodd-http-4.2:javaagent:test" + "netty:netty-3.8:javaagent:test" + "netty:netty-4.0:javaagent:test" + "netty:netty-4.1:javaagent:test" + "okhttp:okhttp-2.2:javaagent:test" + "okhttp:okhttp-3.0:javaagent:test" + "pekko:pekko-http-1.0:javaagent:test" + "play:play-ws:play-ws-1.0:javaagent:test" + "play:play-ws:play-ws-2.0:javaagent:test" + "play:play-ws:play-ws-2.1:javaagent:test" + "reactor:reactor-netty:reactor-netty-0.9:javaagent:test" + "reactor:reactor-netty:reactor-netty-1.0:javaagent:test" + "spring:spring-webflux:spring-webflux-5.0:javaagent:test" + "vertx:vertx-http-client:vertx-http-client-3.0:javaagent:test" + "vertx:vertx-http-client:vertx-http-client-4.0:javaagent:test" + "vertx:vertx-http-client:vertx-http-client-5.0:javaagent:test" + "vertx:vertx-redis-client-4.0:javaagent:test" + "vertx:vertx-redis-client-4.0:javaagent:testStableSemconv" + "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:test" + "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:testStableSemconv" + "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:test" + "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-1.11:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-2.2:javaagent:test" + "aws-sdk:aws-sdk-2.2:javaagent:testStableSemconv" + "aws-sdk:aws-sdk-2.2:javaagent:testBedrockRuntime" + "hikaricp-3.0:javaagent:test" + "hikaricp-3.0:javaagent:testStableSemconv" + "tomcat:tomcat-jdbc:javaagent:test" + "tomcat:tomcat-jdbc:javaagent:testStableSemconv" + "oshi:javaagent:test" + "oshi:javaagent:testExperimental" + "vibur-dbcp-11.0:javaagent:test" + "vibur-dbcp-11.0:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-api-client-7.16:javaagent:test" + "elasticsearch:elasticsearch-api-client-7.16:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-rest-7.0:javaagent:test" + "elasticsearch:elasticsearch-transport-5.0:javaagent:test" + "elasticsearch:elasticsearch-transport-5.0:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-transport-5.0:javaagent:testExperimental" + "elasticsearch:elasticsearch-transport-5.3:javaagent:test" + "elasticsearch:elasticsearch-transport-5.3:javaagent:testStableSemconv" + "elasticsearch:elasticsearch-transport-5.3:javaagent:testExperimental" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6Test" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestStableSemconv" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestExperimental" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65Test" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestStableSemconv" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestExperimental" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7Test" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestStableSemconv" + "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestExperimental" + "apache-httpclient:apache-httpclient-5.2:library:test" + "armeria:armeria-1.3:javaagent:test" + "async-http-client:async-http-client-1.9:javaagent:test" + "async-http-client:async-http-client-2.0:javaagent:test" + "apache-dubbo-2.7:javaagent:testDubbo" + "finagle-http-23.11:javaagent:test" + "finatra-2.9:javaagent:test" + "spring:spring-batch-3.0:javaagent:test" + "spring:spring-data:spring-data-1.8:javaagent:test" + "spring:spring-integration-4.1:javaagent:test" + "spring:spring-integration-4.1:javaagent:testWithRabbitInstrumentation" + "spring:spring-integration-4.1:javaagent:testWithProducerInstrumentation" + "spring:spring-jms:spring-jms-2.0:javaagent:test" + "spring:spring-kafka-2.7:javaagent:test" + "spring:spring-kafka-2.7:javaagent:testNoReceiveTelemetry" + "spring:spring-pulsar-1.0:javaagent:test" + "spring:spring-rabbit-1.0:javaagent:test" + "spring:spring-rmi-4.0:javaagent:test" + "spring:spring-scheduling-3.1:javaagent:test" + "spring:spring-scheduling-3.1:javaagent:testExperimental" + "spring:spring-web:spring-web-3.1:library:test" + "spring:spring-web:spring-web-6.0:javaagent:test" + "spring:spring-webflux:spring-webflux-5.0:javaagent:test" + "spring:spring-webflux:spring-webflux-5.3:library:test" + "spring:spring-webmvc:spring-webmvc-3.1:javaagent:test" + "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" + "spring:spring-webmvc:spring-webmvc-5.3:library:test" + "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" + "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" + "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" + "spring:spring-webmvc:spring-webmvc-6.0:javaagent:testExperimental" + "openai:openai-java-1.1:javaagent:test" +) + +# Some instrumentation test suites don't run ARM, so we use colima to run them in an x86_64 +# container. +# shellcheck disable=SC2034 +readonly COLIMA_INSTRUMENTATIONS=( + "elasticsearch:elasticsearch-rest-6.4:javaagent:test" + "elasticsearch:elasticsearch-rest-5.0:javaagent:test" + "oracle-ucp-11.2:javaagent:test" + "oracle-ucp-11.2:javaagent:testStableSemconv" +)