Sha256: d6e189ec87603f446a398b3f0b2c94e587b1d89ae88732150722d4794e14e293

Contents?: true

Size: 1.63 KB

Versions: 2

Compression:

Stored size: 1.63 KB

Contents

# typed: false

require 'datadog/core'

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.message} at #{Array(e.backtrace).first}"
            end
          end
        end

        true
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ddtrace-1.0.0 lib/datadog/tracing/event.rb
ddtrace-1.0.0.beta2 lib/datadog/tracing/event.rb