From 43b02cc84fd22df1c1d2c829300be4746d170a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Tue, 13 Jun 2023 10:00:00 +0000 Subject: [PATCH 1/6] ci: Test Rails 6.1 on Ruby 3.X runtimes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ferenc Géczi --- .circleci/config.yml | 85 ++++++++++++++++++++++++++++++++++++++- gemfiles/rails_61.gemfile | 22 ++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 gemfiles/rails_61.gemfile diff --git a/.circleci/config.yml b/.circleci/config.yml index 18d4c582..f698e507 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -53,6 +53,28 @@ executors: - image: s12v/sns - image: softwaremill/elasticmq-native - image: mongo:5-focal + ruby_30_mysql2: + docker: + - image: cimg/ruby:3.0-node + environment: + DATABASE_URL: "mysql2://root@127.0.0.1:3306/ci_test" + - image: mariadb + environment: + MYSQL_DATABASE: 'ci_test' + MYSQL_USER: 'root' + MYSQL_PASSWORD: '' + MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' + MYSQL_ROOT_PASSWORD: '' + MYSQL_ROOT_HOST: '%' + ruby_30_postgres: + docker: + - image: cimg/ruby:3.0-node + environment: + DATABASE_URL: "postgres://postgres:test@127.0.0.1:5432/ci_test" + - image: postgres + environment: + POSTGRES_PASSWORD: 'test' + POSTGRES_DB: 'ci_test' ruby_31: docker: - image: cimg/ruby:3.1-node @@ -68,6 +90,28 @@ executors: - image: s12v/sns - image: softwaremill/elasticmq-native - image: mongo:5-focal + ruby_31_mysql2: + docker: + - image: cimg/ruby:3.1-node + environment: + DATABASE_URL: "mysql2://root@127.0.0.1:3306/ci_test" + - image: mariadb + environment: + MYSQL_DATABASE: 'ci_test' + MYSQL_USER: 'root' + MYSQL_PASSWORD: '' + MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' + MYSQL_ROOT_PASSWORD: '' + MYSQL_ROOT_HOST: '%' + ruby_31_postgres: + docker: + - image: cimg/ruby:3.1-node + environment: + DATABASE_URL: "postgres://postgres:test@127.0.0.1:5432/ci_test" + - image: postgres + environment: + POSTGRES_PASSWORD: 'test' + POSTGRES_DB: 'ci_test' ruby_32: docker: - image: cimg/ruby:3.2-node @@ -83,6 +127,28 @@ executors: - image: s12v/sns - image: softwaremill/elasticmq-native - image: mongo:5-focal + ruby_32_mysql2: + docker: + - image: cimg/ruby:3.2-node + environment: + DATABASE_URL: "mysql2://root@127.0.0.1:3306/ci_test" + - image: mariadb + environment: + MYSQL_DATABASE: 'ci_test' + MYSQL_USER: 'root' + MYSQL_PASSWORD: '' + MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' + MYSQL_ROOT_PASSWORD: '' + MYSQL_ROOT_HOST: '%' + ruby_32_postgres: + docker: + - image: cimg/ruby:3.2-node + environment: + DATABASE_URL: "postgres://postgres:test@127.0.0.1:5432/ci_test" + - image: postgres + environment: + POSTGRES_PASSWORD: 'test' + POSTGRES_DB: 'ci_test' commands: setup: @@ -279,7 +345,7 @@ workflows: - stack: ruby_32 gemfile: "./gemfiles/sinatra_14.gemfile" - rails: + rails_ruby_2: jobs: - test_apprisal: matrix: @@ -292,3 +358,20 @@ workflows: - "./gemfiles/rails_60.gemfile" - "./gemfiles/rails_52.gemfile" - "./gemfiles/rails_50.gemfile" + rails_ruby_3: + jobs: + - test_apprisal: + matrix: + parameters: + stack: + - ruby_30 + - ruby_30_postgres + - ruby_30_mysql2 + - ruby_31 + - ruby_31_postgres + - ruby_31_mysql2 + - ruby_32 + - ruby_32_postgres + - ruby_32_mysql2 + gemfile: + - "./gemfiles/rails_61.gemfile" diff --git a/gemfiles/rails_61.gemfile b/gemfiles/rails_61.gemfile new file mode 100644 index 00000000..d44b8c10 --- /dev/null +++ b/gemfiles/rails_61.gemfile @@ -0,0 +1,22 @@ +# This file was generated by Appraisal + +# (c) Copyright IBM Corp. 2021 +# (c) Copyright Instana Inc. 2021 + +source "https://rubygems.org" + +gem "rake" +gem "minitest", "5.9.1" +gem "minitest-reporters" +gem "webmock" +gem "puma" +gem "rubocop", "~> 1.9" +gem "rack-test" +gem "simplecov", "~> 0.21.2" +gem "mail", "< 2.8.0" +gem "rails", ">= 6.1" +gem "mysql2", "0.4.10" +gem "pg" +gem "sqlite3", "~> 1.4" + +gemspec path: "../" From 9af7f1d79d1d8f9632ec3d54d15cfc29f3ca27f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Wed, 14 Jun 2023 10:00:00 +0000 Subject: [PATCH 2/6] test(rails): Add tests for unsupported framework versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ferenc Géczi --- .circleci/config.yml | 1 + gemfiles/rails_61.gemfile | 2 +- gemfiles/rails_70.gemfile | 22 ++++++++ .../instrumentation/rails_action_view_test.rb | 40 +++++++++++++++ test/support/apps/action_view/config.ru | 51 ++++++++++++++----- 5 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 gemfiles/rails_70.gemfile diff --git a/.circleci/config.yml b/.circleci/config.yml index f698e507..85a123f3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -375,3 +375,4 @@ workflows: - ruby_32_mysql2 gemfile: - "./gemfiles/rails_61.gemfile" + - "./gemfiles/rails_70.gemfile" diff --git a/gemfiles/rails_61.gemfile b/gemfiles/rails_61.gemfile index d44b8c10..36b2eb33 100644 --- a/gemfiles/rails_61.gemfile +++ b/gemfiles/rails_61.gemfile @@ -14,7 +14,7 @@ gem "rubocop", "~> 1.9" gem "rack-test" gem "simplecov", "~> 0.21.2" gem "mail", "< 2.8.0" -gem "rails", ">= 6.1" +gem "rails", ">= 6.1", "< 7.0" gem "mysql2", "0.4.10" gem "pg" gem "sqlite3", "~> 1.4" diff --git a/gemfiles/rails_70.gemfile b/gemfiles/rails_70.gemfile new file mode 100644 index 00000000..2ed02b5b --- /dev/null +++ b/gemfiles/rails_70.gemfile @@ -0,0 +1,22 @@ +# This file was generated by Appraisal + +# (c) Copyright IBM Corp. 2021 +# (c) Copyright Instana Inc. 2021 + +source "https://rubygems.org" + +gem "rake" +gem "minitest", "5.9.1" +gem "minitest-reporters" +gem "webmock" +gem "puma" +gem "rubocop", "~> 1.9" +gem "rack-test" +gem "simplecov", "~> 0.21.2" +gem "mail", "< 2.8.0" +gem "rails", ">= 7.0" +gem "mysql2", "0.4.10" +gem "pg" +gem "sqlite3", "~> 1.4" + +gemspec path: "../" diff --git a/test/instrumentation/rails_action_view_test.rb b/test/instrumentation/rails_action_view_test.rb index 5cc5a7c2..eb94903a 100644 --- a/test/instrumentation/rails_action_view_test.rb +++ b/test/instrumentation/rails_action_view_test.rb @@ -13,6 +13,18 @@ def app def setup clear_all! + @framework_version = Gem::Specification.find_by_name('rails').version + @supported_framework_version = @framework_version < Gem::Version.new('6.1') + @execute_test_if_framework_version_is_supported = lambda { + unless @supported_framework_version + skip "Skipping this test because Rails version #{@framework_version} is not yet supported!" + end + } + @execute_test_only_if_framework_version_is_not_supported = lambda { + if @supported_framework_version + skip "Skipping this test because Rails version #{@framework_version} is already supported!" + end + } end def test_config_defaults @@ -21,7 +33,25 @@ def test_config_defaults assert_equal true, ::Instana.config[:action_view][:enabled] end + def test_no_tracing_if_unsupported_version_only_render_is_ok + @execute_test_only_if_framework_version_is_not_supported.call + + ['/render_view', '/render_view_direct', '/render_partial', '/render_collection', '/render_file', + '/render_alternate_layout', '/render_json', '/render_xml', + '/render_rawbody', '/render_js'].each do |endpoint| + get endpoint + assert last_response.ok? + end + + get '/render_partial_that_errors' + assert_equal false, last_response.ok? + + spans = ::Instana.processor.queued_spans + assert_equal [], spans + end + def test_render_view + @execute_test_if_framework_version_is_supported.call get '/render_view' assert last_response.ok? @@ -32,6 +62,7 @@ def test_render_view end def test_render_view_direct + @execute_test_if_framework_version_is_supported.call get '/render_view_direct' assert last_response.ok? @@ -54,6 +85,7 @@ def test_render_nothing end def test_render_file + @execute_test_if_framework_version_is_supported.call get '/render_file' assert last_response.ok? @@ -64,6 +96,7 @@ def test_render_file end def test_render_json + @execute_test_if_framework_version_is_supported.call get '/render_json' assert last_response.ok? @@ -74,6 +107,7 @@ def test_render_json end def test_render_xml + @execute_test_if_framework_version_is_supported.call get '/render_xml' assert last_response.ok? @@ -84,6 +118,7 @@ def test_render_xml end def test_render_body + @execute_test_if_framework_version_is_supported.call get '/render_rawbody' assert last_response.ok? @@ -94,6 +129,7 @@ def test_render_body end def test_render_js + @execute_test_if_framework_version_is_supported.call get '/render_js' assert last_response.ok? @@ -104,6 +140,7 @@ def test_render_js end def test_render_alternate_layout + @execute_test_if_framework_version_is_supported.call get '/render_alternate_layout' assert last_response.ok? @@ -114,6 +151,7 @@ def test_render_alternate_layout end def test_render_partial + @execute_test_if_framework_version_is_supported.call get '/render_partial' assert last_response.ok? @@ -124,6 +162,7 @@ def test_render_partial end def test_render_partial_that_errors + @execute_test_if_framework_version_is_supported.call get '/render_partial_that_errors' refute last_response.ok? @@ -139,6 +178,7 @@ def test_render_partial_that_errors end def test_render_collection + @execute_test_if_framework_version_is_supported.call get '/render_collection' assert last_response.ok? diff --git a/test/support/apps/action_view/config.ru b/test/support/apps/action_view/config.ru index 7531a26c..bae936d0 100644 --- a/test/support/apps/action_view/config.ru +++ b/test/support/apps/action_view/config.ru @@ -4,6 +4,8 @@ require 'rails' require 'action_controller/railtie' +RAILS_VERSION = Gem::Specification.find_by_name('rails').version + class TestViewApplication < Rails::Application config.eager_load = 'test' config.consider_all_requests_local = true @@ -14,19 +16,36 @@ class TestViewApplication < Rails::Application config.hosts.clear end - routes.append do - get '/render_view' => 'test_view#render_view' - get '/render_view_direct' => 'test_view#render_view_direct' - get '/render_partial' => 'test_view#render_partial' - get '/render_partial_that_errors' => 'test_view#render_partial_that_errors' - get '/render_collection' => 'test_view#render_collection' - get '/render_file' => 'test_view#render_file' - get '/render_alternate_layout' => 'test_view#render_alternate_layout' - get '/render_nothing' => 'test_view#render_nothing' - get '/render_json' => 'test_view#render_json' - get '/render_xml' => 'test_view#render_xml' - get '/render_rawbody' => 'test_view#render_rawbody' - get '/render_js' => 'test_view#render_js' + if Gem::Version.new('6.1.0') > RAILS_VERSION + routes.append do + get '/render_view' => 'test_view#render_view' + get '/render_view_direct' => 'test_view#render_view_direct' + get '/render_partial' => 'test_view#render_partial' + get '/render_partial_that_errors' => 'test_view#render_partial_that_errors' + get '/render_collection' => 'test_view#render_collection' + get '/render_file' => 'test_view#render_file' + get '/render_alternate_layout' => 'test_view#render_alternate_layout' + get '/render_nothing' => 'test_view#render_nothing' + get '/render_json' => 'test_view#render_json' + get '/render_xml' => 'test_view#render_xml' + get '/render_rawbody' => 'test_view#render_rawbody' + get '/render_js' => 'test_view#render_js' + end + else + routes.draw do + get '/render_view', to: 'test_view#render_view' + get '/render_view_direct', to: 'test_view#render_view_direct' + get '/render_partial', to: 'test_view#render_partial' + get '/render_partial_that_errors', to: 'test_view#render_partial_that_errors' + get '/render_collection', to: 'test_view#render_collection' + get '/render_file', to: 'test_view#render_file' + get '/render_alternate_layout', to: 'test_view#render_alternate_layout' + get '/render_nothing', to: 'test_view#render_nothing' + get '/render_json', to: 'test_view#render_json' + get '/render_xml', to: 'test_view#render_xml' + get '/render_rawbody', to: 'test_view#render_rawbody' + get '/render_js', to: 'test_view#render_js' + end end end @@ -104,6 +123,10 @@ class TestViewController < ActionController::Base end end -TestViewApplication.initialize! +# With 6.1 and above explicit initialisation is not possible anymore +# but below that it is required +unless Gem::Version.new('6.1.0') < RAILS_VERSION + TestViewApplication.initialize! +end run TestViewApplication From 7425453fe75bc18468a1d0d2c9c94825e40359a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Thu, 15 Jun 2023 10:00:00 +0000 Subject: [PATCH 3/6] test(rails): Update mysql2 for compatibility with latest Rails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ferenc Géczi --- gemfiles/rails_61.gemfile | 2 +- gemfiles/rails_70.gemfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gemfiles/rails_61.gemfile b/gemfiles/rails_61.gemfile index 36b2eb33..73fdab21 100644 --- a/gemfiles/rails_61.gemfile +++ b/gemfiles/rails_61.gemfile @@ -15,7 +15,7 @@ gem "rack-test" gem "simplecov", "~> 0.21.2" gem "mail", "< 2.8.0" gem "rails", ">= 6.1", "< 7.0" -gem "mysql2", "0.4.10" +gem "mysql2", "0.5.5" gem "pg" gem "sqlite3", "~> 1.4" diff --git a/gemfiles/rails_70.gemfile b/gemfiles/rails_70.gemfile index 2ed02b5b..b5acb1f5 100644 --- a/gemfiles/rails_70.gemfile +++ b/gemfiles/rails_70.gemfile @@ -15,7 +15,7 @@ gem "rack-test" gem "simplecov", "~> 0.21.2" gem "mail", "< 2.8.0" gem "rails", ">= 7.0" -gem "mysql2", "0.4.10" +gem "mysql2", "0.5.5" gem "pg" gem "sqlite3", "~> 1.4" From 5bd972a5fe76239e3c172632ecb27ac31e228f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Thu, 15 Jun 2023 10:00:00 +0000 Subject: [PATCH 4/6] test(rails): Update mail for compatibility with latest Rails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ferenc Géczi --- gemfiles/rails_61.gemfile | 2 +- gemfiles/rails_70.gemfile | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/gemfiles/rails_61.gemfile b/gemfiles/rails_61.gemfile index 73fdab21..27c3d909 100644 --- a/gemfiles/rails_61.gemfile +++ b/gemfiles/rails_61.gemfile @@ -13,7 +13,7 @@ gem "puma" gem "rubocop", "~> 1.9" gem "rack-test" gem "simplecov", "~> 0.21.2" -gem "mail", "< 2.8.0" +gem "mail", ">= 2.8.1" gem "rails", ">= 6.1", "< 7.0" gem "mysql2", "0.5.5" gem "pg" diff --git a/gemfiles/rails_70.gemfile b/gemfiles/rails_70.gemfile index b5acb1f5..14b87fb1 100644 --- a/gemfiles/rails_70.gemfile +++ b/gemfiles/rails_70.gemfile @@ -1,7 +1,4 @@ -# This file was generated by Appraisal - -# (c) Copyright IBM Corp. 2021 -# (c) Copyright Instana Inc. 2021 +# (c) Copyright IBM Corp. 2023 source "https://rubygems.org" @@ -13,7 +10,7 @@ gem "puma" gem "rubocop", "~> 1.9" gem "rack-test" gem "simplecov", "~> 0.21.2" -gem "mail", "< 2.8.0" +gem "mail", ">= 2.8.1" gem "rails", ">= 7.0" gem "mysql2", "0.5.5" gem "pg" From 31362287dd6b3450b333a2c1cb22497b2d064ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Thu, 15 Jun 2023 10:00:00 +0000 Subject: [PATCH 5/6] test(rails): Adapt action mailer test to new "mail" version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ferenc Géczi --- .../rails_action_mailer_test.rb | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/test/instrumentation/rails_action_mailer_test.rb b/test/instrumentation/rails_action_mailer_test.rb index fd0b023c..032c385b 100644 --- a/test/instrumentation/rails_action_mailer_test.rb +++ b/test/instrumentation/rails_action_mailer_test.rb @@ -7,13 +7,24 @@ class RailsActionMailerTest < Minitest::Test class TestMailer < ActionMailer::Base def sample_email - mail( - from: 'test@example.com', - to: 'test@example.com', - subject: 'Test Email', - body: 'Hello', - content_type: "text/html" - ) + mail_version = Gem::Specification.find_by_name('mail').version + if mail_version >= Gem::Version.new('2.8.1') + Mail.new do + from 'test@example.com' + to 'test@example.com' + subject 'Test Email' + body 'Hello' + content_type "text/html" + end + else + mail( + from: 'test@example.com', + to: 'test@example.com', + subject: 'Test Email', + body: 'Hello', + content_type: "text/html" + ) + end end end From 44dab1fcccfa47570b7e4bdcdff15e08c99a68e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20G=C3=A9czi?= Date: Thu, 15 Jun 2023 10:00:00 +0000 Subject: [PATCH 6/6] fix(active_record): Propagate **kwargs and &block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Otherwise *args can have too many arguments, which often happened on Rails 6.1 and above with postgres. ArgumentError: wrong number of arguments (given 6, expected 1..5) [...]lib/active_record/connection_adapters/abstract_adapter.rb:759:in `log' Signed-off-by: Ferenc Géczi --- lib/instana/instrumentation/active_record.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/instana/instrumentation/active_record.rb b/lib/instana/instrumentation/active_record.rb index d3ef375c..35f161ec 100644 --- a/lib/instana/instrumentation/active_record.rb +++ b/lib/instana/instrumentation/active_record.rb @@ -8,7 +8,7 @@ module ActiveRecord IGNORED_SQL = %w[BEGIN COMMIT SET].freeze SANITIZE_REGEXP = /('[\s\S][^']*'|\d*\.\d+|\d+|NULL)/i.freeze - def log(sql, name = 'SQL', binds = [], *args) + def log(sql, name = 'SQL', binds = [], *args, **kwargs, &block) call_payload = { activerecord: { adapter: @config[:adapter], @@ -24,7 +24,7 @@ def log(sql, name = 'SQL', binds = [], *args) call_payload[:activerecord][:binds] = mapped end - maybe_trace(call_payload, name) { super(sql, name, binds, *args) } + maybe_trace(call_payload, name) { super(sql, name, binds, *args, **kwargs, &block) } end private