From d6568c1376735d0c4ee12998f424c9508911eb08 Mon Sep 17 00:00:00 2001 From: Zach Kemp Date: Wed, 29 Jan 2025 14:45:22 -0500 Subject: [PATCH 1/3] test: Fix simplecov configuration (#1366) test: start simplecov before library code is loaded Co-authored-by: Kayla Reopelle <87386821+kaylareopelle@users.noreply.github.com> --- .github/actions/test_gem/action.yml | 18 ++++++++++++++++++ .github/workflows/ci-contrib.yml | 3 +++ .../ci-instrumentation-with-services.yml | 6 ++++++ .github/workflows/ci-instrumentation.yml | 3 ++- .simplecov | 14 ++++++++++++++ helpers/mysql/test/test_helper.rb | 1 + ...entelemetry-helpers-sql-obfuscation.gemspec | 1 + helpers/sql-obfuscation/test/test_helper.rb | 1 + .../action_mailer/test/test_helper.rb | 1 + .../action_pack/test/test_helper.rb | 1 + .../action_view/test/test_helper.rb | 1 + instrumentation/active_job/test/test_helper.rb | 1 + .../test/test_helper.rb | 1 + .../active_record/test/test_helper.rb | 1 + .../active_support/test/test_helper.rb | 1 + instrumentation/all/test/test_helper.rb | 1 + instrumentation/aws_lambda/test/test_helper.rb | 1 + instrumentation/aws_sdk/test/test_helper.rb | 1 + instrumentation/base/test/test_helper.rb | 4 +--- instrumentation/bunny/test/test_helper.rb | 1 + .../concurrent_ruby/test/test_helper.rb | 1 + instrumentation/dalli/test/test_helper.rb | 1 + .../delayed_job/test/test_helper.rb | 1 + instrumentation/ethon/test/test_helper.rb | 1 + instrumentation/excon/test/test_helper.rb | 1 + instrumentation/faraday/test/test_helper.rb | 1 + instrumentation/grape/test/test_helper.rb | 1 + instrumentation/graphql/test/test_helper.rb | 1 + instrumentation/grpc/test/test_helper.rb | 1 + instrumentation/gruf/test/test_helper.rb | 1 + instrumentation/http/test/test_helper.rb | 1 + .../http_client/test/test_helper.rb | 1 + instrumentation/httpx/test/test_helper.rb | 1 + instrumentation/koala/test/test_helper.rb | 1 + instrumentation/lmdb/test/test_helper.rb | 1 + instrumentation/mongo/test/test_helper.rb | 1 + instrumentation/mysql2/test/test_helper.rb | 1 + instrumentation/net_http/test/test_helper.rb | 1 + instrumentation/pg/test/test_helper.rb | 1 + instrumentation/que/test/test_helper.rb | 1 + instrumentation/racecar/test/test_helper.rb | 1 + instrumentation/rack/test/test_helper.rb | 1 + instrumentation/rails/Rakefile | 6 +++++- .../rails/test/instrumentation/test_helper.rb | 1 + .../rails/test/railtie/test_helper.rb | 4 ++-- instrumentation/rake/test/test_helper.rb | 1 + instrumentation/rdkafka/test/test_helper.rb | 1 + instrumentation/redis/test/test_helper.rb | 1 + instrumentation/resque/test/test_helper.rb | 1 + instrumentation/restclient/test/test_helper.rb | 1 + instrumentation/rspec/test/test_helper.rb | 3 ++- instrumentation/ruby_kafka/test/test_helper.rb | 1 + instrumentation/sidekiq/test/test_helper.rb | 1 + instrumentation/sinatra/test/test_helper.rb | 1 + instrumentation/trilogy/test/test_helper.rb | 1 + processor/baggage/Rakefile | 2 -- processor/baggage/test/test_helper.rb | 1 + propagator/ottrace/Rakefile | 2 -- propagator/ottrace/test/test_helper.rb | 7 +------ propagator/vitess/Rakefile | 2 -- propagator/vitess/test/test_helper.rb | 7 +------ propagator/xray/test/test_helper.rb | 1 + resources/azure/test/test_helper.rb | 4 +--- resources/container/test/test_helper.rb | 4 +--- .../google_cloud_platform/test/test_helper.rb | 4 +--- 65 files changed, 106 insertions(+), 35 deletions(-) create mode 100644 .simplecov diff --git a/.github/actions/test_gem/action.yml b/.github/actions/test_gem/action.yml index 05dbf4e025..0e438d335c 100644 --- a/.github/actions/test_gem/action.yml +++ b/.github/actions/test_gem/action.yml @@ -19,6 +19,16 @@ inputs: required: false type: boolean default: false + coverage: + description: Enforce test coverage + required: false + type: boolean + default: false + minimum_coverage: + description: Minimum test coverage + required: false + type: string + default: 85 build: description: Build gem required: false @@ -161,6 +171,14 @@ runs: bundle exec rake rubocop working-directory: "${{ steps.setup.outputs.gem_dir }}" + - name: Coverage + shell: bash + if: "${{ inputs.coverage == 'true' }}" + # This starts a new simplecov run which tracks nothing of its own, + # but merges with the existing coverage reports generated during testing. + run: 'bundle exec ruby -e ''require "simplecov"; SimpleCov.minimum_coverage(${{ inputs.minimum_coverage }})''' + working-directory: "${{ steps.setup.outputs.gem_dir }}" + - name: Build Gem shell: bash if: "${{ inputs.build == 'true' }}" diff --git a/.github/workflows/ci-contrib.yml b/.github/workflows/ci-contrib.yml index d62ff1423f..5745a8c7c6 100644 --- a/.github/workflows/ci-contrib.yml +++ b/.github/workflows/ci-contrib.yml @@ -47,6 +47,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true - name: "Test JRuby" if: "${{ matrix.os == 'ubuntu-latest' }}" @@ -125,6 +126,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true - name: "Test JRuby" if: "${{ matrix.os == 'ubuntu-latest' }}" @@ -162,6 +164,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true - name: "Test JRuby" if: "${{ matrix.os == 'ubuntu-latest' && steps.jruby_skip.outputs.skip == 'false' }}" diff --git a/.github/workflows/ci-instrumentation-with-services.yml b/.github/workflows/ci-instrumentation-with-services.yml index d92a23122b..7b8d0873c5 100644 --- a/.github/workflows/ci-instrumentation-with-services.yml +++ b/.github/workflows/ci-instrumentation-with-services.yml @@ -46,6 +46,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true - name: "Test JRuby" uses: ./.github/actions/test_gem @@ -92,6 +93,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true services: mysql: @@ -129,6 +131,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true services: zookeeper: @@ -182,6 +185,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true services: redis: @@ -226,6 +230,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true services: postgres: @@ -267,6 +272,7 @@ jobs: ruby: "3.1" yard: true rubocop: true + coverage: true build: true services: rabbitmq: diff --git a/.github/workflows/ci-instrumentation.yml b/.github/workflows/ci-instrumentation.yml index 31ffe8c652..8fcfdf5901 100644 --- a/.github/workflows/ci-instrumentation.yml +++ b/.github/workflows/ci-instrumentation.yml @@ -73,10 +73,11 @@ jobs: - name: "Test Ruby 3.1" uses: ./.github/actions/test_gem with: - gem: "opentelemetry-instrumentation-${{ matrix.gem }}" + gem: "opentelemetry-instrumentation-${{ matrix.gem }}" ruby: "3.1" yard: true rubocop: true + coverage: true build: true - name: "JRuby Filter" id: jruby_skip diff --git a/.simplecov b/.simplecov new file mode 100644 index 0000000000..150d753f20 --- /dev/null +++ b/.simplecov @@ -0,0 +1,14 @@ +require 'digest' + +digest = Digest::MD5.new +digest.update('test') +digest.update(ENV.fetch('BUNDLE_GEMFILE', 'gemfile')) if ENV['APPRAISAL_INITIALIZED'] + +ENV['ENABLE_COVERAGE'] ||= '1' + +if ENV['ENABLE_COVERAGE'].to_i.positive? + SimpleCov.command_name(digest.hexdigest) + SimpleCov.start do + add_filter %r{^/test/} + end +end diff --git a/helpers/mysql/test/test_helper.rb b/helpers/mysql/test/test_helper.rb index 0f824f6b83..641f06867f 100644 --- a/helpers/mysql/test/test_helper.rb +++ b/helpers/mysql/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/helpers/sql-obfuscation/opentelemetry-helpers-sql-obfuscation.gemspec b/helpers/sql-obfuscation/opentelemetry-helpers-sql-obfuscation.gemspec index 4c6a73b76a..a8159ad8fd 100644 --- a/helpers/sql-obfuscation/opentelemetry-helpers-sql-obfuscation.gemspec +++ b/helpers/sql-obfuscation/opentelemetry-helpers-sql-obfuscation.gemspec @@ -33,6 +33,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'rubocop', '~> 1.71.0' spec.add_development_dependency 'rubocop-performance', '~> 1.23.0' + spec.add_development_dependency 'simplecov', '~> 0.22.0' spec.add_development_dependency 'yard', '~> 0.9' spec.add_development_dependency 'yard-doctest', '~> 0.1.6' diff --git a/helpers/sql-obfuscation/test/test_helper.rb b/helpers/sql-obfuscation/test/test_helper.rb index 6e84b456c3..2f81f2c99e 100644 --- a/helpers/sql-obfuscation/test/test_helper.rb +++ b/helpers/sql-obfuscation/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/action_mailer/test/test_helper.rb b/instrumentation/action_mailer/test/test_helper.rb index bd915555e5..3c15da1778 100644 --- a/instrumentation/action_mailer/test/test_helper.rb +++ b/instrumentation/action_mailer/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'logger' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/action_pack/test/test_helper.rb b/instrumentation/action_pack/test/test_helper.rb index 9594f934fc..992871d77d 100644 --- a/instrumentation/action_pack/test/test_helper.rb +++ b/instrumentation/action_pack/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'logger' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/action_view/test/test_helper.rb b/instrumentation/action_view/test/test_helper.rb index e3eafdddbb..f2ff8566de 100644 --- a/instrumentation/action_view/test/test_helper.rb +++ b/instrumentation/action_view/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'logger' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/active_job/test/test_helper.rb b/instrumentation/active_job/test/test_helper.rb index dd134b0fff..938cb3bdde 100644 --- a/instrumentation/active_job/test/test_helper.rb +++ b/instrumentation/active_job/test/test_helper.rb @@ -5,6 +5,7 @@ # SPDX-License-Identifier: Apache-2.0 ENV['OTEL_LOG_LEVEL'] ||= 'fatal' +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/active_model_serializers/test/test_helper.rb b/instrumentation/active_model_serializers/test/test_helper.rb index f5e69ad520..1bbc33d030 100644 --- a/instrumentation/active_model_serializers/test/test_helper.rb +++ b/instrumentation/active_model_serializers/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/active_record/test/test_helper.rb b/instrumentation/active_record/test/test_helper.rb index 02751e7f69..3138f52d8f 100644 --- a/instrumentation/active_record/test/test_helper.rb +++ b/instrumentation/active_record/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/active_support/test/test_helper.rb b/instrumentation/active_support/test/test_helper.rb index 2c5c5cce28..f0f85f3dcc 100644 --- a/instrumentation/active_support/test/test_helper.rb +++ b/instrumentation/active_support/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/all/test/test_helper.rb b/instrumentation/all/test/test_helper.rb index 026a026a2a..29b15e305b 100644 --- a/instrumentation/all/test/test_helper.rb +++ b/instrumentation/all/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/aws_lambda/test/test_helper.rb b/instrumentation/aws_lambda/test/test_helper.rb index cf3cde3209..3a265d369c 100644 --- a/instrumentation/aws_lambda/test/test_helper.rb +++ b/instrumentation/aws_lambda/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/aws_sdk/test/test_helper.rb b/instrumentation/aws_sdk/test/test_helper.rb index b588f8c759..c8a505356b 100644 --- a/instrumentation/aws_sdk/test/test_helper.rb +++ b/instrumentation/aws_sdk/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/base/test/test_helper.rb b/instrumentation/base/test/test_helper.rb index 9efdc59b31..6e20a575a3 100644 --- a/instrumentation/base/test/test_helper.rb +++ b/instrumentation/base/test/test_helper.rb @@ -4,12 +4,10 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) -SimpleCov.start -SimpleCov.minimum_coverage 85 - require 'opentelemetry-instrumentation-base' require 'minitest/autorun' diff --git a/instrumentation/bunny/test/test_helper.rb b/instrumentation/bunny/test/test_helper.rb index 0c28392007..c1d6ca245e 100644 --- a/instrumentation/bunny/test/test_helper.rb +++ b/instrumentation/bunny/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/concurrent_ruby/test/test_helper.rb b/instrumentation/concurrent_ruby/test/test_helper.rb index 59f69b7de7..b4f7067b62 100644 --- a/instrumentation/concurrent_ruby/test/test_helper.rb +++ b/instrumentation/concurrent_ruby/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/dalli/test/test_helper.rb b/instrumentation/dalli/test/test_helper.rb index 64fd974d4c..326f2aa13a 100644 --- a/instrumentation/dalli/test/test_helper.rb +++ b/instrumentation/dalli/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/delayed_job/test/test_helper.rb b/instrumentation/delayed_job/test/test_helper.rb index b91ed81859..96af0c334f 100644 --- a/instrumentation/delayed_job/test/test_helper.rb +++ b/instrumentation/delayed_job/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'logger' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/ethon/test/test_helper.rb b/instrumentation/ethon/test/test_helper.rb index 64fd974d4c..326f2aa13a 100644 --- a/instrumentation/ethon/test/test_helper.rb +++ b/instrumentation/ethon/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/excon/test/test_helper.rb b/instrumentation/excon/test/test_helper.rb index aa05118d16..eb53595184 100644 --- a/instrumentation/excon/test/test_helper.rb +++ b/instrumentation/excon/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/faraday/test/test_helper.rb b/instrumentation/faraday/test/test_helper.rb index 040b6a1559..49b3ed979c 100644 --- a/instrumentation/faraday/test/test_helper.rb +++ b/instrumentation/faraday/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/grape/test/test_helper.rb b/instrumentation/grape/test/test_helper.rb index 7b12c181cc..759aa83a7b 100644 --- a/instrumentation/grape/test/test_helper.rb +++ b/instrumentation/grape/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/graphql/test/test_helper.rb b/instrumentation/graphql/test/test_helper.rb index 7129b14082..6a64fad62a 100644 --- a/instrumentation/graphql/test/test_helper.rb +++ b/instrumentation/graphql/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/grpc/test/test_helper.rb b/instrumentation/grpc/test/test_helper.rb index 19330e92ae..1418bf7caf 100644 --- a/instrumentation/grpc/test/test_helper.rb +++ b/instrumentation/grpc/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/gruf/test/test_helper.rb b/instrumentation/gruf/test/test_helper.rb index 59a31967db..3e8f5dc140 100644 --- a/instrumentation/gruf/test/test_helper.rb +++ b/instrumentation/gruf/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'opentelemetry/sdk' require 'minitest/autorun' require 'webmock/minitest' diff --git a/instrumentation/http/test/test_helper.rb b/instrumentation/http/test/test_helper.rb index f2155e1df3..7ff2131311 100644 --- a/instrumentation/http/test/test_helper.rb +++ b/instrumentation/http/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/http_client/test/test_helper.rb b/instrumentation/http_client/test/test_helper.rb index aa05118d16..eb53595184 100644 --- a/instrumentation/http_client/test/test_helper.rb +++ b/instrumentation/http_client/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/httpx/test/test_helper.rb b/instrumentation/httpx/test/test_helper.rb index 10c09f2da6..4768b0ea46 100644 --- a/instrumentation/httpx/test/test_helper.rb +++ b/instrumentation/httpx/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/koala/test/test_helper.rb b/instrumentation/koala/test/test_helper.rb index 07022ca9a7..5249869459 100644 --- a/instrumentation/koala/test/test_helper.rb +++ b/instrumentation/koala/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/lmdb/test/test_helper.rb b/instrumentation/lmdb/test/test_helper.rb index aa05118d16..eb53595184 100644 --- a/instrumentation/lmdb/test/test_helper.rb +++ b/instrumentation/lmdb/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/mongo/test/test_helper.rb b/instrumentation/mongo/test/test_helper.rb index 418c41ef69..4c67e38660 100644 --- a/instrumentation/mongo/test/test_helper.rb +++ b/instrumentation/mongo/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/mysql2/test/test_helper.rb b/instrumentation/mysql2/test/test_helper.rb index 64fd974d4c..326f2aa13a 100644 --- a/instrumentation/mysql2/test/test_helper.rb +++ b/instrumentation/mysql2/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/net_http/test/test_helper.rb b/instrumentation/net_http/test/test_helper.rb index 921a7e11c7..82b97ec0ee 100644 --- a/instrumentation/net_http/test/test_helper.rb +++ b/instrumentation/net_http/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'net/http' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/pg/test/test_helper.rb b/instrumentation/pg/test/test_helper.rb index 55c179cd90..a8e6ed746d 100644 --- a/instrumentation/pg/test/test_helper.rb +++ b/instrumentation/pg/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/que/test/test_helper.rb b/instrumentation/que/test/test_helper.rb index 27414d2f31..d60cb56dce 100644 --- a/instrumentation/que/test/test_helper.rb +++ b/instrumentation/que/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/racecar/test/test_helper.rb b/instrumentation/racecar/test/test_helper.rb index e7695dc189..08e78bbef0 100644 --- a/instrumentation/racecar/test/test_helper.rb +++ b/instrumentation/racecar/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/rack/test/test_helper.rb b/instrumentation/rack/test/test_helper.rb index 111b030572..08824e318a 100644 --- a/instrumentation/rack/test/test_helper.rb +++ b/instrumentation/rack/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) require 'rack/events' diff --git a/instrumentation/rails/Rakefile b/instrumentation/rails/Rakefile index 14260497c3..d580aaf5c3 100644 --- a/instrumentation/rails/Rakefile +++ b/instrumentation/rails/Rakefile @@ -23,10 +23,14 @@ namespace :test do t.libs << 'test/railtie' t.test_files = FileList['test/railtie/**/*_test.rb'] end + + task :start_coverage do + require 'simplecov' + end end desc 'Run all tests' -task test: %i[test:instrumentation test:railtie] +task test: %i[test:start_coverage test:instrumentation test:railtie] YARD::Rake::YardocTask.new do |t| t.stats_options = ['--list-undoc'] diff --git a/instrumentation/rails/test/instrumentation/test_helper.rb b/instrumentation/rails/test/instrumentation/test_helper.rb index 73d2cf6574..23b54a7be5 100644 --- a/instrumentation/rails/test/instrumentation/test_helper.rb +++ b/instrumentation/rails/test/instrumentation/test_helper.rb @@ -5,6 +5,7 @@ # SPDX-License-Identifier: Apache-2.0 require 'logger' +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/rails/test/railtie/test_helper.rb b/instrumentation/rails/test/railtie/test_helper.rb index c2aeff8b71..47fc82f4e4 100644 --- a/instrumentation/rails/test/railtie/test_helper.rb +++ b/instrumentation/rails/test/railtie/test_helper.rb @@ -9,10 +9,10 @@ ENV['RAILS_ENV'] = 'test' require 'logger' +require 'simplecov' + require 'bundler/setup' Bundler.require(:default, :development, :test) require_relative '../../test/railtie/dummy/config/environment' require 'rails/test_help' - -SimpleCov.start diff --git a/instrumentation/rake/test/test_helper.rb b/instrumentation/rake/test/test_helper.rb index aa05118d16..eb53595184 100644 --- a/instrumentation/rake/test/test_helper.rb +++ b/instrumentation/rake/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/rdkafka/test/test_helper.rb b/instrumentation/rdkafka/test/test_helper.rb index aa05118d16..eb53595184 100644 --- a/instrumentation/rdkafka/test/test_helper.rb +++ b/instrumentation/rdkafka/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/redis/test/test_helper.rb b/instrumentation/redis/test/test_helper.rb index 9375d9e5e6..c04d0aff7f 100644 --- a/instrumentation/redis/test/test_helper.rb +++ b/instrumentation/redis/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/resque/test/test_helper.rb b/instrumentation/resque/test/test_helper.rb index a8011b8d0e..6aa9779ada 100644 --- a/instrumentation/resque/test/test_helper.rb +++ b/instrumentation/resque/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/restclient/test/test_helper.rb b/instrumentation/restclient/test/test_helper.rb index aa05118d16..eb53595184 100644 --- a/instrumentation/restclient/test/test_helper.rb +++ b/instrumentation/restclient/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/rspec/test/test_helper.rb b/instrumentation/rspec/test/test_helper.rb index 6f810ffc56..ab5075bbe0 100644 --- a/instrumentation/rspec/test/test_helper.rb +++ b/instrumentation/rspec/test/test_helper.rb @@ -4,7 +4,8 @@ # # SPDX-License-Identifier: Apache-2.0 -# This gem does not use Bundler to require gems because it is testing confilicting features between rspec and minitest. +# This gem does not use Bundler to require gems because it is testing conflicting features between rspec and minitest. +require 'simplecov' require 'opentelemetry/sdk' require 'opentelemetry-test-helpers' diff --git a/instrumentation/ruby_kafka/test/test_helper.rb b/instrumentation/ruby_kafka/test/test_helper.rb index efc2863df7..e1bfab332d 100644 --- a/instrumentation/ruby_kafka/test/test_helper.rb +++ b/instrumentation/ruby_kafka/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/sidekiq/test/test_helper.rb b/instrumentation/sidekiq/test/test_helper.rb index df49e41255..b7e37cd688 100644 --- a/instrumentation/sidekiq/test/test_helper.rb +++ b/instrumentation/sidekiq/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/sinatra/test/test_helper.rb b/instrumentation/sinatra/test/test_helper.rb index 48ae2a681f..897d8e0328 100644 --- a/instrumentation/sinatra/test/test_helper.rb +++ b/instrumentation/sinatra/test/test_helper.rb @@ -5,6 +5,7 @@ # SPDX-License-Identifier: Apache-2.0 ENV['APP_ENV'] = 'test' +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/instrumentation/trilogy/test/test_helper.rb b/instrumentation/trilogy/test/test_helper.rb index aba8e15274..b4e1fb2333 100644 --- a/instrumentation/trilogy/test/test_helper.rb +++ b/instrumentation/trilogy/test/test_helper.rb @@ -6,6 +6,7 @@ ENV['OTEL_LOG_LEVEL'] ||= 'fatal' +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/processor/baggage/Rakefile b/processor/baggage/Rakefile index 88f3670a3c..1a64ba842e 100644 --- a/processor/baggage/Rakefile +++ b/processor/baggage/Rakefile @@ -9,8 +9,6 @@ require 'rake/testtask' require 'yard' require 'rubocop/rake_task' -ENV['ENABLE_COVERAGE'] ||= '1' - RuboCop::RakeTask.new Rake::TestTask.new :test do |t| diff --git a/processor/baggage/test/test_helper.rb b/processor/baggage/test/test_helper.rb index 8c1eb5932a..17115057ee 100644 --- a/processor/baggage/test/test_helper.rb +++ b/processor/baggage/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/propagator/ottrace/Rakefile b/propagator/ottrace/Rakefile index 88f3670a3c..1a64ba842e 100644 --- a/propagator/ottrace/Rakefile +++ b/propagator/ottrace/Rakefile @@ -9,8 +9,6 @@ require 'rake/testtask' require 'yard' require 'rubocop/rake_task' -ENV['ENABLE_COVERAGE'] ||= '1' - RuboCop::RakeTask.new Rake::TestTask.new :test do |t| diff --git a/propagator/ottrace/test/test_helper.rb b/propagator/ottrace/test/test_helper.rb index ea0b34f140..d54638882a 100644 --- a/propagator/ottrace/test/test_helper.rb +++ b/propagator/ottrace/test/test_helper.rb @@ -4,16 +4,11 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) require 'opentelemetry-propagator-ottrace' require 'minitest/autorun' -if ENV['ENABLE_COVERAGE'].to_i.positive? - require 'simplecov' - SimpleCov.start - SimpleCov.minimum_coverage 85 -end - OpenTelemetry.logger = Logger.new($stderr, level: ENV.fetch('OTEL_LOG_LEVEL', 'fatal').to_sym) diff --git a/propagator/vitess/Rakefile b/propagator/vitess/Rakefile index 88f3670a3c..1a64ba842e 100644 --- a/propagator/vitess/Rakefile +++ b/propagator/vitess/Rakefile @@ -9,8 +9,6 @@ require 'rake/testtask' require 'yard' require 'rubocop/rake_task' -ENV['ENABLE_COVERAGE'] ||= '1' - RuboCop::RakeTask.new Rake::TestTask.new :test do |t| diff --git a/propagator/vitess/test/test_helper.rb b/propagator/vitess/test/test_helper.rb index 681e85d485..02470847ba 100644 --- a/propagator/vitess/test/test_helper.rb +++ b/propagator/vitess/test/test_helper.rb @@ -4,16 +4,11 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) require 'opentelemetry-propagator-vitess' require 'minitest/autorun' -if ENV['ENABLE_COVERAGE'].to_i.positive? - require 'simplecov' - SimpleCov.start - SimpleCov.minimum_coverage 85 -end - OpenTelemetry.logger = Logger.new($stderr, level: ENV.fetch('OTEL_LOG_LEVEL', 'fatal').to_sym) diff --git a/propagator/xray/test/test_helper.rb b/propagator/xray/test/test_helper.rb index 656cf5edd5..9ccfc1e092 100644 --- a/propagator/xray/test/test_helper.rb +++ b/propagator/xray/test/test_helper.rb @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) diff --git a/resources/azure/test/test_helper.rb b/resources/azure/test/test_helper.rb index 3727952a1e..e8b1a8db7e 100644 --- a/resources/azure/test/test_helper.rb +++ b/resources/azure/test/test_helper.rb @@ -4,12 +4,10 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) -SimpleCov.minimum_coverage 85 -SimpleCov.start - require 'opentelemetry-resource-detector-azure' require 'minitest/autorun' require 'webmock/minitest' diff --git a/resources/container/test/test_helper.rb b/resources/container/test/test_helper.rb index 1937b514a3..1c8ae39b69 100644 --- a/resources/container/test/test_helper.rb +++ b/resources/container/test/test_helper.rb @@ -4,12 +4,10 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) -SimpleCov.minimum_coverage 85 -SimpleCov.start - require 'opentelemetry-resource-detector-container' require 'minitest/autorun' diff --git a/resources/google_cloud_platform/test/test_helper.rb b/resources/google_cloud_platform/test/test_helper.rb index ed27a87430..7d19811472 100644 --- a/resources/google_cloud_platform/test/test_helper.rb +++ b/resources/google_cloud_platform/test/test_helper.rb @@ -4,12 +4,10 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'simplecov' require 'bundler/setup' Bundler.require(:default, :development, :test) -SimpleCov.minimum_coverage 85 -SimpleCov.start - require 'opentelemetry-resource-detector-google_cloud_platform' require 'minitest/autorun' require 'webmock/minitest' From e1e1cc4c8579a43ac5cf138d5b79da461657e71b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:58:54 -0800 Subject: [PATCH 2/3] chore: bump ruby/setup-ruby from 1.213.0 to 1.214.0 (#1371) * chore: bump ruby/setup-ruby from 1.213.0 to 1.214.0 Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.213.0 to 1.214.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb) - [Commits](https://github.com/ruby/setup-ruby/compare/v1.213.0...v1.214.0) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore: bump ruby/setup-ruby to 1.214.0; bump jruby Increase JRuby testing from 9.4.9.0 to 9.4.10.0. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Kayla Reopelle Co-authored-by: Kayla Reopelle <87386821+kaylareopelle@users.noreply.github.com> --- .github/actions/test_gem/action.yml | 4 ++-- .github/workflows/ci-contrib.yml | 8 ++++---- .github/workflows/ci-instrumentation-with-services.yml | 2 +- .github/workflows/ci-instrumentation.yml | 2 +- .github/workflows/installation-tests.yml | 2 +- .github/workflows/release-hook-on-closed.yml | 2 +- .github/workflows/release-hook-on-push.yml | 2 +- .github/workflows/release-perform.yml | 2 +- .github/workflows/release-please.yaml | 2 +- .github/workflows/release-request-weekly.yml | 2 +- .github/workflows/release-request.yml | 2 +- .github/workflows/release-retry.yml | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/actions/test_gem/action.yml b/.github/actions/test_gem/action.yml index 0e438d335c..2764523547 100644 --- a/.github/actions/test_gem/action.yml +++ b/.github/actions/test_gem/action.yml @@ -84,7 +84,7 @@ runs: # ...but not for appraisals, sadly. - name: Install Ruby ${{ inputs.ruby }} with dependencies if: "${{ steps.setup.outputs.appraisals == 'false' }}" - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: "${{ inputs.ruby }}" working-directory: "${{ steps.setup.outputs.gem_dir }}" @@ -95,7 +95,7 @@ runs: # If we're using appraisals, do it all manually. - name: Install Ruby ${{ inputs.ruby }} without dependencies if: "${{ steps.setup.outputs.appraisals == 'true' }}" - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: "${{ inputs.ruby }}" bundler: "latest" diff --git a/.github/workflows/ci-contrib.yml b/.github/workflows/ci-contrib.yml index 5745a8c7c6..1f0d0c65a5 100644 --- a/.github/workflows/ci-contrib.yml +++ b/.github/workflows/ci-contrib.yml @@ -54,7 +54,7 @@ jobs: uses: ./.github/actions/test_gem with: gem: "opentelemetry-helpers-${{ matrix.gem }}" - ruby: "jruby-9.4.9.0" + ruby: "jruby-9.4.10.0" propagators: strategy: @@ -93,7 +93,7 @@ jobs: uses: ./.github/actions/test_gem with: gem: "opentelemetry-propagator-${{ matrix.gem }}" - ruby: "jruby-9.4.9.0" + ruby: "jruby-9.4.10.0" resource-detectors: strategy: @@ -133,7 +133,7 @@ jobs: uses: ./.github/actions/test_gem with: gem: "opentelemetry-${{ matrix.gem }}" - ruby: "jruby-9.4.9.0" + ruby: "jruby-9.4.10.0" processors: strategy: @@ -171,4 +171,4 @@ jobs: uses: ./.github/actions/test_gem with: gem: "opentelemetry-processor-${{ matrix.gem }}" - ruby: "jruby-9.4.9.0" + ruby: "jruby-9.4.10.0" diff --git a/.github/workflows/ci-instrumentation-with-services.yml b/.github/workflows/ci-instrumentation-with-services.yml index 7b8d0873c5..e30123ae71 100644 --- a/.github/workflows/ci-instrumentation-with-services.yml +++ b/.github/workflows/ci-instrumentation-with-services.yml @@ -52,7 +52,7 @@ jobs: uses: ./.github/actions/test_gem with: gem: "opentelemetry-instrumentation-${{ matrix.gem }}" - ruby: "jruby-9.4.9.0" + ruby: "jruby-9.4.10.0" services: memcached: image: memcached:alpine diff --git a/.github/workflows/ci-instrumentation.yml b/.github/workflows/ci-instrumentation.yml index 8fcfdf5901..491fd6e32e 100644 --- a/.github/workflows/ci-instrumentation.yml +++ b/.github/workflows/ci-instrumentation.yml @@ -109,4 +109,4 @@ jobs: uses: ./.github/actions/test_gem with: gem: "opentelemetry-instrumentation-${{ matrix.gem }}" - ruby: "jruby-9.4.9.0" + ruby: "jruby-9.4.10.0" diff --git a/.github/workflows/installation-tests.yml b/.github/workflows/installation-tests.yml index 95ec6cb202..12a0a1448c 100644 --- a/.github/workflows/installation-tests.yml +++ b/.github/workflows/installation-tests.yml @@ -25,7 +25,7 @@ jobs: - uses: actions/checkout@v4 # ATTENTION: Dependabot does not know how to update shared actions file. # If you see it update setup-ruby here also update it as part of actions/test_gem/action.yml - - uses: ruby/setup-ruby@v1.213.0 + - uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ matrix.ruby-version }} - name: "Install Latest Gem Versions on ${{ matrix.ruby-version }}" diff --git a/.github/workflows/release-hook-on-closed.yml b/.github/workflows/release-hook-on-closed.yml index 4f7556f564..d9979bb2ca 100644 --- a/.github/workflows/release-hook-on-closed.yml +++ b/.github/workflows/release-hook-on-closed.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Ruby ${{ env.ruby_version }} - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ env.ruby_version }} - name: Checkout repo diff --git a/.github/workflows/release-hook-on-push.yml b/.github/workflows/release-hook-on-push.yml index ba0e200a5d..07ba1e07da 100644 --- a/.github/workflows/release-hook-on-push.yml +++ b/.github/workflows/release-hook-on-push.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Ruby ${{ env.ruby_version }} - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ env.ruby_version }} - name: Checkout repo diff --git a/.github/workflows/release-perform.yml b/.github/workflows/release-perform.yml index a3d3e0a5a3..d158477f34 100644 --- a/.github/workflows/release-perform.yml +++ b/.github/workflows/release-perform.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Ruby ${{ env.ruby_version }} - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ env.ruby_version }} - name: Checkout repo diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 2391aa70d6..49f610cd34 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -50,7 +50,7 @@ jobs: chmod 0600 $HOME/.gem/credentials printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials - - uses: ruby/setup-ruby@v1.213.0 + - uses: ruby/setup-ruby@v1.214.0 with: ruby-version: "3.1" bundler: latest diff --git a/.github/workflows/release-request-weekly.yml b/.github/workflows/release-request-weekly.yml index 586b2c5eb0..47140b6f5c 100644 --- a/.github/workflows/release-request-weekly.yml +++ b/.github/workflows/release-request-weekly.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Ruby ${{ env.ruby_version }} - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ env.ruby_version }} - name: Checkout repo diff --git a/.github/workflows/release-request.yml b/.github/workflows/release-request.yml index d822f8a102..89c5a6fc52 100644 --- a/.github/workflows/release-request.yml +++ b/.github/workflows/release-request.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Ruby ${{ env.ruby_version }} - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ env.ruby_version }} - name: Checkout repo diff --git a/.github/workflows/release-retry.yml b/.github/workflows/release-retry.yml index b537f08081..3f403396c3 100644 --- a/.github/workflows/release-retry.yml +++ b/.github/workflows/release-retry.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install Ruby ${{ env.ruby_version }} - uses: ruby/setup-ruby@v1.213.0 + uses: ruby/setup-ruby@v1.214.0 with: ruby-version: ${{ env.ruby_version }} - name: Checkout repo From fb9cdf42d6f14736b630a974d0fab878a4f66145 Mon Sep 17 00:00:00 2001 From: Josh Westbrook Date: Wed, 29 Jan 2025 14:05:53 -0600 Subject: [PATCH 3/3] feat: AWS lambda programatic wrap (#1308) * feat: Support programatically wrapping lambda handlers * chore: Update README and conditionally flush metrics * fix: No ruby 3.1 shorthand * fix: typo and module length * Add tests for instrument_handler * fix: Trailing whitespace --------- Co-authored-by: Kayla Reopelle <87386821+kaylareopelle@users.noreply.github.com> --- instrumentation/aws_lambda/README.md | 26 +++ .../instrumentation/aws_lambda/handler.rb | 135 +------------- .../aws_lambda/instrumentation.rb | 1 + .../instrumentation/aws_lambda/wrap.rb | 171 ++++++++++++++++++ .../opentelemetry/instrumentation_test.rb | 94 ++++++++++ 5 files changed, 296 insertions(+), 131 deletions(-) create mode 100644 instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/wrap.rb diff --git a/instrumentation/aws_lambda/README.md b/instrumentation/aws_lambda/README.md index 3dc9bff1be..d69280eaff 100644 --- a/instrumentation/aws_lambda/README.md +++ b/instrumentation/aws_lambda/README.md @@ -28,6 +28,32 @@ def otel_wrapper(event:, context:) end ``` +### Alternative Usage + +If using a Lambda Layer is not an option for your given setup, you can programmatically instrument a handler by using the `OpenTelemetry::Instrumentation::AwsLambda::Wrap` module. + +```ruby +require 'opentelemetry/sdk' +require 'opentelemetry/instrumentation/aws_lambda' + +OpenTelemetry::SDK.configure do |c| + c.service_name = '' + c.use 'OpenTelemetry::Instrumentation::AwsLambda' +end + +# Lambda Handler +module Example + class Handler + extend OpenTelemetry::Instrumentation::AwsLambda::Wrap + + def self.process(event:, context:) + puts event.inspect + end + instrument_handler :process + end +end +``` + ## Example To run the example: diff --git a/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/handler.rb b/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/handler.rb index fa0f55de20..7285054747 100644 --- a/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/handler.rb +++ b/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/handler.rb @@ -7,10 +7,10 @@ module OpenTelemetry module Instrumentation module AwsLambda - AWS_TRIGGERS = ['aws:sqs', 'aws:s3', 'aws:sns', 'aws:dynamodb'].freeze - # Handler class that creates a span around the _HANDLER class Handler + extend OpenTelemetry::Instrumentation::AwsLambda::Wrap + attr_reader :handler_method, :handler_class # anytime when the code in a Lambda function is updated or the functional configuration is changed, @@ -28,47 +28,9 @@ def initialize # Try to record and re-raise any exception from the wrapped function handler # Instrumentation should never raise its own exception def call_wrapped(event:, context:) - parent_context = extract_parent_context(event) - - span_kind = if event['Records'] && AWS_TRIGGERS.include?(event['Records'].dig(0, 'eventSource')) - :consumer - else - :server - end - - original_handler_error = nil - original_response = nil - OpenTelemetry::Context.with_current(parent_context) do - tracer.in_span(@original_handler, attributes: otel_attributes(event, context), kind: span_kind) do |span| - begin - response = call_original_handler(event: event, context: context) - status_code = response['statusCode'] || response[:statusCode] if response.is_a?(Hash) - span.set_attribute(OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE, status_code) if status_code - rescue StandardError => e - original_handler_error = e - ensure - original_response = response - end - if original_handler_error - span.record_exception(original_handler_error) - span.status = OpenTelemetry::Trace::Status.error(original_handler_error.message) - end - end + self.class.wrap_lambda(event: event, context: context, handler: @original_handler, flush_timeout: @flush_timeout) do + call_original_handler(event: event, context: context) end - - OpenTelemetry.tracer_provider.force_flush(timeout: @flush_timeout) - - raise original_handler_error if original_handler_error - - original_response - end - - def instrumentation_config - AwsLambda::Instrumentation.instance.config - end - - def tracer - AwsLambda::Instrumentation.instance.tracer end private @@ -94,95 +56,6 @@ def call_original_handler(event:, context:) __send__(@handler_method, event: event, context: context) end end - - # Extract parent context from request headers - # Downcase Traceparent and Tracestate because TraceContext::TextMapPropagator's TRACEPARENT_KEY and TRACESTATE_KEY are all lowercase - # If any error occur, rescue and give empty context - def extract_parent_context(event) - headers = event['headers'] || {} - headers.transform_keys! do |key| - %w[Traceparent Tracestate].include?(key) ? key.downcase : key - end - - OpenTelemetry.propagation.extract( - headers, - getter: OpenTelemetry::Context::Propagation.text_map_getter - ) - rescue StandardError => e - OpenTelemetry.logger.error("aws-lambda instrumentation exception occurred while extracting the parent context: #{e.message}") - OpenTelemetry::Context.empty - end - - # lambda event version 1.0 and version 2.0 - # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html - def v1_proxy_attributes(event) - attributes = { - OpenTelemetry::SemanticConventions::Trace::HTTP_METHOD => event['httpMethod'], - OpenTelemetry::SemanticConventions::Trace::HTTP_ROUTE => event['resource'], - OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET => event['resource'] - } - attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET] += "?#{event['queryStringParameters']}" if event['queryStringParameters'] - - headers = event['headers'] - if headers - attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_USER_AGENT] = headers['User-Agent'] - attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_SCHEME] = headers['X-Forwarded-Proto'] - attributes[OpenTelemetry::SemanticConventions::Trace::NET_HOST_NAME] = headers['Host'] - end - attributes - end - - def v2_proxy_attributes(event) - request_context = event['requestContext'] - attributes = { - OpenTelemetry::SemanticConventions::Trace::NET_HOST_NAME => request_context['domainName'], - OpenTelemetry::SemanticConventions::Trace::HTTP_METHOD => request_context['http']['method'], - OpenTelemetry::SemanticConventions::Trace::HTTP_USER_AGENT => request_context['http']['userAgent'], - OpenTelemetry::SemanticConventions::Trace::HTTP_ROUTE => request_context['http']['path'], - OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET => request_context['http']['path'] - } - attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET] += "?#{event['rawQueryString']}" if event['rawQueryString'] - attributes - end - - # fass.trigger set to http: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/aws-lambda.md#api-gateway - # TODO: need to update Semantic Conventions for invocation_id, trigger and resource_id - def otel_attributes(event, context) - span_attributes = {} - span_attributes['faas.invocation_id'] = context.aws_request_id - span_attributes['cloud.resource_id'] = context.invoked_function_arn - span_attributes[OpenTelemetry::SemanticConventions::Trace::AWS_LAMBDA_INVOKED_ARN] = context.invoked_function_arn - span_attributes[OpenTelemetry::SemanticConventions::Resource::CLOUD_ACCOUNT_ID] = context.invoked_function_arn.split(':')[4] - - if event['requestContext'] - request_attributes = event['version'] == '2.0' ? v2_proxy_attributes(event) : v1_proxy_attributes(event) - request_attributes[OpenTelemetry::SemanticConventions::Trace::FAAS_TRIGGER] = 'http' - span_attributes.merge!(request_attributes) - end - - if event['Records'] - trigger_attributes = trigger_type_attributes(event) - span_attributes.merge!(trigger_attributes) - end - - span_attributes - rescue StandardError => e - OpenTelemetry.logger.error("aws-lambda instrumentation exception occurred while preparing span attributes: #{e.message}") - {} - end - - # sqs spec for lambda: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/aws-lambda.md#sqs - # current there is no spec for 'aws:sns', 'aws:s3' and 'aws:dynamodb' - def trigger_type_attributes(event) - attributes = {} - case event['Records'].dig(0, 'eventSource') - when 'aws:sqs' - attributes[OpenTelemetry::SemanticConventions::Trace::FAAS_TRIGGER] = 'pubsub' - attributes[OpenTelemetry::SemanticConventions::Trace::MESSAGING_OPERATION] = 'process' - attributes[OpenTelemetry::SemanticConventions::Trace::MESSAGING_SYSTEM] = 'AmazonSQS' - end - attributes - end end end end diff --git a/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/instrumentation.rb b/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/instrumentation.rb index 08566cac8e..828ceb0022 100644 --- a/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/instrumentation.rb +++ b/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/instrumentation.rb @@ -21,6 +21,7 @@ class Instrumentation < OpenTelemetry::Instrumentation::Base private def require_dependencies + require_relative 'wrap' require_relative 'handler' end end diff --git a/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/wrap.rb b/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/wrap.rb new file mode 100644 index 0000000000..655fb7b2b8 --- /dev/null +++ b/instrumentation/aws_lambda/lib/opentelemetry/instrumentation/aws_lambda/wrap.rb @@ -0,0 +1,171 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +module OpenTelemetry + module Instrumentation + module AwsLambda + # Helper module that can be used to wrap a lambda handler method + module Wrap # rubocop:disable Metrics/ModuleLength + AWS_TRIGGERS = ['aws:sqs', 'aws:s3', 'aws:sns', 'aws:dynamodb'].freeze + DEFAULT_FLUSH_TIMEOUT = ENV.fetch('OTEL_INSTRUMENTATION_AWS_LAMBDA_FLUSH_TIMEOUT', '30000').to_i + + def instrument_handler(method, flush_timeout: DEFAULT_FLUSH_TIMEOUT) + raise ArgumentError, "#{method} is not a method of #{name}" unless respond_to?(method) + + uninstrumented_method = "#{method}_without_instrumentation" + singleton_class.alias_method uninstrumented_method, method + + handler = "#{name}.#{method}" + + define_singleton_method(method) do |event:, context:| + wrap_lambda(event: event, context: context, handler: handler, flush_timeout: flush_timeout) { public_send(uninstrumented_method, event: event, context: context) } + end + end + + # Try to record and re-raise any exception from the wrapped function handler + # Instrumentation should never raise its own exception + def wrap_lambda(event:, context:, handler:, flush_timeout: DEFAULT_FLUSH_TIMEOUT) + parent_context = extract_parent_context(event) + + span_kind = if event['Records'] && AWS_TRIGGERS.include?(event['Records'].dig(0, 'eventSource')) + :consumer + else + :server + end + + original_handler_error = nil + original_response = nil + OpenTelemetry::Context.with_current(parent_context) do + tracer.in_span(handler, attributes: otel_attributes(event, context), kind: span_kind) do |span| + begin + response = yield + + unless span.attributes.key?(OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE) + status_code = response['statusCode'] || response[:statusCode] if response.is_a?(Hash) + span.set_attribute(OpenTelemetry::SemanticConventions::Trace::HTTP_STATUS_CODE, status_code) if status_code + end + rescue StandardError => e + original_handler_error = e + ensure + original_response = response + end + if original_handler_error + span.record_exception(original_handler_error) + span.status = OpenTelemetry::Trace::Status.error(original_handler_error.message) + end + end + end + + OpenTelemetry.tracer_provider.force_flush(timeout: flush_timeout) + OpenTelemetry.meter_provider.force_flush(timeout: flush_timeout) if OpenTelemetry.respond_to?(:meter_provider) + + raise original_handler_error if original_handler_error + + original_response + end + + def instrumentation_config + AwsLambda::Instrumentation.instance.config + end + + def tracer + AwsLambda::Instrumentation.instance.tracer + end + + private + + # Extract parent context from request headers + # Downcase Traceparent and Tracestate because TraceContext::TextMapPropagator's TRACEPARENT_KEY and TRACESTATE_KEY are all lowercase + # If any error occur, rescue and give empty context + def extract_parent_context(event) + headers = event['headers'] || {} + headers.transform_keys! do |key| + %w[Traceparent Tracestate].include?(key) ? key.downcase : key + end + + OpenTelemetry.propagation.extract( + headers, + getter: OpenTelemetry::Context::Propagation.text_map_getter + ) + rescue StandardError => e + OpenTelemetry.logger.error("aws-lambda instrumentation exception occurred while extracting the parent context: #{e.message}") + OpenTelemetry::Context.empty + end + + # lambda event version 1.0 and version 2.0 + # https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html + def v1_proxy_attributes(event) + attributes = { + OpenTelemetry::SemanticConventions::Trace::HTTP_METHOD => event['httpMethod'], + OpenTelemetry::SemanticConventions::Trace::HTTP_ROUTE => event['resource'], + OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET => event['resource'] + } + attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET] += "?#{event['queryStringParameters']}" if event['queryStringParameters'] + + headers = event['headers'] + if headers + attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_USER_AGENT] = headers['User-Agent'] + attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_SCHEME] = headers['X-Forwarded-Proto'] + attributes[OpenTelemetry::SemanticConventions::Trace::NET_HOST_NAME] = headers['Host'] + end + attributes + end + + def v2_proxy_attributes(event) + request_context = event['requestContext'] + attributes = { + OpenTelemetry::SemanticConventions::Trace::NET_HOST_NAME => request_context['domainName'], + OpenTelemetry::SemanticConventions::Trace::HTTP_METHOD => request_context['http']['method'], + OpenTelemetry::SemanticConventions::Trace::HTTP_USER_AGENT => request_context['http']['userAgent'], + OpenTelemetry::SemanticConventions::Trace::HTTP_ROUTE => request_context['http']['path'], + OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET => request_context['http']['path'] + } + attributes[OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET] += "?#{event['rawQueryString']}" if event['rawQueryString'] + attributes + end + + # fass.trigger set to http: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/aws-lambda.md#api-gateway + # TODO: need to update Semantic Conventions for invocation_id, trigger and resource_id + def otel_attributes(event, context) + span_attributes = {} + span_attributes['faas.invocation_id'] = context.aws_request_id + span_attributes['cloud.resource_id'] = context.invoked_function_arn + span_attributes[OpenTelemetry::SemanticConventions::Trace::AWS_LAMBDA_INVOKED_ARN] = context.invoked_function_arn + span_attributes[OpenTelemetry::SemanticConventions::Resource::CLOUD_ACCOUNT_ID] = context.invoked_function_arn.split(':')[4] + + if event['requestContext'] + request_attributes = event['version'] == '2.0' ? v2_proxy_attributes(event) : v1_proxy_attributes(event) + request_attributes[OpenTelemetry::SemanticConventions::Trace::FAAS_TRIGGER] = 'http' + span_attributes.merge!(request_attributes) + end + + if event['Records'] + trigger_attributes = trigger_type_attributes(event) + span_attributes.merge!(trigger_attributes) + end + + span_attributes + rescue StandardError => e + OpenTelemetry.logger.error("aws-lambda instrumentation exception occurred while preparing span attributes: #{e.message}") + {} + end + + # sqs spec for lambda: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/aws-lambda.md#sqs + # current there is no spec for 'aws:sns', 'aws:s3' and 'aws:dynamodb' + def trigger_type_attributes(event) + attributes = {} + case event['Records'].dig(0, 'eventSource') + when 'aws:sqs' + attributes[OpenTelemetry::SemanticConventions::Trace::FAAS_TRIGGER] = 'pubsub' + attributes[OpenTelemetry::SemanticConventions::Trace::MESSAGING_OPERATION] = 'process' + attributes[OpenTelemetry::SemanticConventions::Trace::MESSAGING_SYSTEM] = 'AmazonSQS' + end + attributes + end + end + end + end +end diff --git a/instrumentation/aws_lambda/test/opentelemetry/instrumentation_test.rb b/instrumentation/aws_lambda/test/opentelemetry/instrumentation_test.rb index 92ae0fc8a4..c45525c5a9 100644 --- a/instrumentation/aws_lambda/test/opentelemetry/instrumentation_test.rb +++ b/instrumentation/aws_lambda/test/opentelemetry/instrumentation_test.rb @@ -235,4 +235,98 @@ end end end + + describe 'validate_instrument_handler' do + let(:expected_flush_timeout) { 30_000 } + let(:expected_handler) { 'Handler.process' } + let(:method_name) { :process } + + before do + Handler = Class.new do + extend OpenTelemetry::Instrumentation::AwsLambda::Wrap + + def self.process(event:, context:) + { 'statusCode' => 200 } + end + end + end + + after do + Object.send(:remove_const, :Handler) + end + + describe 'when handler method is defined' do + describe 'when a flush_timeout is not provided' do + before do + Handler.instrument_handler(method_name) + end + + it 'calls wrap_lambda with correct arguments' do + args_checker = proc do |event:, context:, handler:, flush_timeout:| + _(event).must_equal event_v1 + _(context).must_equal context + _(handler).must_equal expected_handler + _(flush_timeout).must_equal expected_flush_timeout + end + + Handler.stub(:wrap_lambda, args_checker) do + Handler.process(event: event_v1, context: context) + end + end + + it 'calls the original method with correct arguments' do + args_checker = proc do |event:, context:| + _(event).must_equal event_v1 + _(context).must_equal context + end + + Handler.stub(:process_without_instrumentation, args_checker) do + Handler.process(event: event_v1, context: context) + end + end + end + + describe 'when a flush_timeout is provided' do + let(:expected_flush_timeout) { 10_000 } + + before do + Handler.instrument_handler(:process, flush_timeout: expected_flush_timeout) + end + + it 'calls wrap_lambda with correct arguments' do + args_checker = proc do |event:, context:, handler:, flush_timeout:| + _(event).must_equal event_v1 + _(context).must_equal context + _(handler).must_equal expected_handler + _(flush_timeout).must_equal expected_flush_timeout + end + + Handler.stub(:wrap_lambda, args_checker) do + Handler.process(event: event_v1, context: context) + end + end + + it 'calls the original method with correct arguments' do + args_checker = proc do |event:, context:| + _(event).must_equal event_v1 + _(context).must_equal context + end + + Handler.stub(:process_without_instrumentation, args_checker) do + Handler.process(event: event_v1, context: context) + end + end + end + end + + describe 'when handler method is not defined' do + let(:method_name) { :dummy } + + it 'raises ArgumentError' do + assert_raises ArgumentError, "#{method_name} is not a method of Handler" do + Handler.instrument_handler(method_name) + end + end + end + end end