diff --git a/lib/arkency/command_bus.rb b/lib/arkency/command_bus.rb index 790fac2..7eb5c6b 100644 --- a/lib/arkency/command_bus.rb +++ b/lib/arkency/command_bus.rb @@ -6,23 +6,45 @@ class CommandBus UnregisteredHandler = Class.new(StandardError) MultipleHandlers = Class.new(StandardError) - def initialize - @handlers = - Concurrent::Map.new + def initialize(instrumentation = nil) + @handlers = Concurrent::Map.new + @instrumentation = instrumentation || NoOpInstrumentation.new end def register(klass, handler) - raise MultipleHandlers.new("Multiple handlers not allowed for #{klass}") if handlers[klass] - handlers[klass] = handler + raise MultipleHandlers, "Multiple handlers not allowed for #{klass}" if handlers[klass] + + instrumentation.instrument( + 'register.command_bus', + handler: handler, + klass: klass + ) do + handlers[klass] = handler + end end def call(command) - handlers - .fetch(command.class) { raise UnregisteredHandler.new("Missing handler for #{command.class}") } - .(command) + handler = handlers.fetch(command.class) do + raise UnregisteredHandler, "Missing handler for #{command.class}" + end + + instrumentation.instrument( + 'call.command_bus', + handler: handler, + command: command + ) do + handler.call(command) + end end private - attr_reader :handlers + + attr_reader :handlers, :instrumentation + + class NoOpInstrumentation + def instrument(_name, payload = {}) + yield payload if block_given? + end + end end end