require 'datadog/statsd' require 'socket' require 'singleton' require 'active_support/notifications' require 'active_support/core_ext/string/inflections' require 'datadog/notifications/version' require 'datadog/notifications/reporter' require 'datadog/notifications/config' require 'datadog/notifications/plugins' module Datadog class Notifications include Singleton # Configure and install datadog instrumentation. Example: # # Datadog::Notifications.configure do |c| # c.hostname = "my-host" # c.tags = ["app:mine"] # # c.use Datadog::Notifications::Plugins::Grape, metric_name: "api.request", tags: ["grape:specific"] # end # # Settings: # * hostname - the hostname used for instrumentation, defaults to system hostname, respects +INSTRUMENTATION_HOSTNAME+ env variable # * namespace - set a namespace to be prepended to every metric name # * tags - set an array of tags to be added to every metric # * statsd_host - the statsD host, defaults to "localhost", respects +STATSD_HOST+ env variable # * statsd_port - the statsD port, defaults to 8125, respects +STATSD_PORT+ env variable # * reporter - custom reporter class, defaults to `Datadog::Notifications::Reporter` def self.configure(&block) if instance.instance_variable_defined?(:@reporter) warn "#{self.name} cannot be reconfigured once it has subscribed to notifications, called from: #{caller[1]}" return end block.call instance.config if block end # You can subscribe to events exactly as with ActiveSupport::Notifications, but there will be an # additional `statsd` block parameter available: # # Datadog::Notifications.subscribe('render') do |reporter, event| # reporter # => Reporter instance # event # => ActiveSupport::Notifications::Event object # end # # Example: # # Datadog::Notifications.subscribe('render') do |reporter, _, start, finish, _, payload| # status = payload[:status] # reporter.seconds('myapp.render', finish-start, tags: ["status:#{status}"]) # end # def self.subscribe(pattern, &block) instance.subscribe(pattern, &block) end attr_reader :config def initialize @config = Config.new end def subscribe(pattern, &block) ActiveSupport::Notifications.subscribe(pattern) do |*args| block.call reporter, ActiveSupport::Notifications::Event.new(*args) end end def reporter @reporter ||= config.send(:connect!) end private :reporter end end