diff --git a/lib/semian.rb b/lib/semian.rb index c329425fd..7258a0f55 100644 --- a/lib/semian.rb +++ b/lib/semian.rb @@ -155,6 +155,14 @@ def to_s end end + module AdapterResourceBusyError + include AdapterError + end + + module AdapterCircuitOpenError + include AdapterError + end + attr_accessor :logger self.logger = Logger.new($stderr) diff --git a/lib/semian/activerecord_postgresql_adapter.rb b/lib/semian/activerecord_postgresql_adapter.rb index 29f0fc74c..361b554d6 100644 --- a/lib/semian/activerecord_postgresql_adapter.rb +++ b/lib/semian/activerecord_postgresql_adapter.rb @@ -15,8 +15,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } end end end diff --git a/lib/semian/activerecord_trilogy_adapter.rb b/lib/semian/activerecord_trilogy_adapter.rb index 12ac80979..8ab228b0c 100644 --- a/lib/semian/activerecord_trilogy_adapter.rb +++ b/lib/semian/activerecord_trilogy_adapter.rb @@ -15,8 +15,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } end end end diff --git a/lib/semian/grpc.rb b/lib/semian/grpc.rb index 9560591ef..0335fdc43 100644 --- a/lib/semian/grpc.rb +++ b/lib/semian/grpc.rb @@ -18,8 +18,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } end module Semian diff --git a/lib/semian/mysql2.rb b/lib/semian/mysql2.rb index 4b4a755db..c1a68fc39 100644 --- a/lib/semian/mysql2.rb +++ b/lib/semian/mysql2.rb @@ -13,8 +13,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } end module Semian diff --git a/lib/semian/net_http.rb b/lib/semian/net_http.rb index c0ef63ca5..9bbfc4e6a 100644 --- a/lib/semian/net_http.rb +++ b/lib/semian/net_http.rb @@ -13,8 +13,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } end module Semian diff --git a/lib/semian/redis.rb b/lib/semian/redis.rb index 37d2a744f..02ba29868 100644 --- a/lib/semian/redis.rb +++ b/lib/semian/redis.rb @@ -50,8 +50,8 @@ def marks_semian_circuits? end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } ResolveError = Class.new(SemianError) alias_method :_original_initialize, :initialize diff --git a/lib/semian/redis/v5.rb b/lib/semian/redis/v5.rb index 69d1e1de2..49b77691d 100644 --- a/lib/semian/redis/v5.rb +++ b/lib/semian/redis/v5.rb @@ -31,8 +31,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } Client::ERROR_MAPPING.merge!( RedisClient::CircuitOpenError => Redis::CircuitOpenError, diff --git a/lib/semian/redis_client.rb b/lib/semian/redis_client.rb index 9df283e0a..ceea9c05c 100644 --- a/lib/semian/redis_client.rb +++ b/lib/semian/redis_client.rb @@ -40,8 +40,8 @@ def initialize(semian_identifier, *args) end end - ResourceBusyError = Class.new(SemianError) - CircuitOpenError = Class.new(SemianError) + ResourceBusyError = Class.new(SemianError) { include ::Semian::AdapterResourceBusyError } + CircuitOpenError = Class.new(SemianError) { include ::Semian::AdapterCircuitOpenError } module SemianConfig def initialize(semian: nil, **kwargs) diff --git a/test/error_modules_test.rb b/test/error_modules_test.rb new file mode 100644 index 000000000..d2558f2c1 --- /dev/null +++ b/test/error_modules_test.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "test_helper" +require "semian/activerecord_trilogy_adapter" +require "semian/activerecord_postgresql_adapter" +require "semian/net_http" +require "semian/grpc" +require "semian/redis" +require "semian/redis_client" +require "semian/mysql2" + +class ErrorModulesTest < Minitest::Test + ERRORS = [ + ActiveRecord::ConnectionAdapters::TrilogyAdapter, + ActiveRecord::ConnectionAdapters::PostgreSQLAdapter, + Net, + GRPC, + Redis, + RedisClient, + Mysql2, + ].map { |mod| [mod.const_get(:ResourceBusyError), mod.const_get(:CircuitOpenError)] } + + def test_adapter_errors_rescue + ERRORS.each do |busy_error, circuit_error| + assert_kind_of(busy_error.new, Semian::AdapterResourceBusyError) + assert_kind_of(circuit_error.new, Semian::AdapterCircuitOpenError) + end + end + + def test_markers_do_not_match_unrelated_activerecord_errors + [ActiveRecord::RecordNotFound, ActiveRecord::StatementInvalid, ActiveRecord::AdapterTimeout].each do |record_error| + error = record_error.new + + refute_kind_of(error.is_a?(Semian::AdapterResourceBusyError)) + refute_kind_of(error.is_a?(Semian::AdapterCircuitOpenError)) + end + end +end