Sha256: 88fc19c898604d4fcc2637b21433749f2019d54961ecbb439c76b0d7be7a688c

Contents?: true

Size: 1.63 KB

Versions: 19

Compression:

Stored size: 1.63 KB

Contents

module Datadog
  module Tracing
    # Event behavior and DSL
    module Events
      def self.included(base)
        base.extend(ClassMethods)
        base.include(InstanceMethods)
      end

      # Class methods
      module ClassMethods
        def build(**event_handlers)
          events = new
          events.subscribe(**event_handlers)
          events
        end
      end

      # Instance methods
      module InstanceMethods
        def subscribe(**event_handlers)
          return unless event_handlers

          event_handlers.each do |event_name, handlers|
            handlers.each do |handler_name, handler|
              events.send(event_name).subscribe(handler_name, &handler)
            end
          end

          event_handlers
        end
      end
    end

    # A simple pub-sub event model for components to exchange messages through.
    class Event
      attr_reader \
        :name,
        :subscriptions

      def initialize(name)
        @name = name
        @subscriptions = []
      end

      def subscribe(&block)
        raise ArgumentError, 'Must give a block to subscribe!' unless block

        subscriptions << block
      end

      def unsubscribe_all!
        subscriptions.clear

        true
      end

      def publish(*args)
        subscriptions.each do |block|
          begin
            block.call(*args)
          rescue StandardError => e
            Datadog.logger.debug do
              "Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
              "at #{Array(e.backtrace).first}"
            end
          end
        end

        true
      end
    end
  end
end

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
ddtrace-1.23.3 lib/datadog/tracing/event.rb
ddtrace-1.23.2 lib/datadog/tracing/event.rb
ddtrace-1.23.1 lib/datadog/tracing/event.rb
ddtrace-1.22.0 lib/datadog/tracing/event.rb
ddtrace-1.21.1 lib/datadog/tracing/event.rb
ddtrace-1.21.0 lib/datadog/tracing/event.rb
ddtrace-1.20.0 lib/datadog/tracing/event.rb
ddtrace-1.19.0 lib/datadog/tracing/event.rb
ddtrace-1.18.0 lib/datadog/tracing/event.rb
ddtrace-1.17.0 lib/datadog/tracing/event.rb
ddtrace-1.16.2 lib/datadog/tracing/event.rb
ddtrace-1.16.1 lib/datadog/tracing/event.rb
ddtrace-1.16.0 lib/datadog/tracing/event.rb
ddtrace-1.15.0 lib/datadog/tracing/event.rb
ddtrace-1.14.0 lib/datadog/tracing/event.rb
ddtrace-1.13.1 lib/datadog/tracing/event.rb
ddtrace-1.13.0 lib/datadog/tracing/event.rb
ddtrace-1.12.1 lib/datadog/tracing/event.rb
ddtrace-1.12.0 lib/datadog/tracing/event.rb