Module: Safely

Extended by:
Methods
Defined in:
lib/safely/core.rb,
lib/safely/version.rb,
lib/safely/services.rb

Defined Under Namespace

Modules: Methods

Constant Summary collapse

VERSION =
"1.0.0"
DEFAULT_EXCEPTION_METHOD =
proc do |e, info|
  begin
    if defined?(Airbrake)
      Airbrake.notify(e, info)
    end

    if defined?(Appsignal)
      Appsignal.send_error(e) do |transaction|
        transaction.set_tags(info)
      end
    end

    if defined?(Bugsnag)
      Bugsnag.notify(e) do |report|
        report.add_tab(:info, info) if info.any?
      end
    end

    if defined?(Datadog::Tracing)
      Datadog::Tracing.active_span&.set_tags(info)
      Datadog::Tracing.active_span&.set_error(e)
    end

    if defined?(ExceptionNotifier)
      ExceptionNotifier.notify_exception(e, data: info)
    end

    if defined?(Google::Cloud::ErrorReporting)
      # TODO add info
      Google::Cloud::ErrorReporting.report(e)
    end

    if defined?(Honeybadger)
      Honeybadger.notify(e, context: info)
    end

    if defined?(NewRelic::Agent)
      NewRelic::Agent.notice_error(e, custom_params: info)
    end

    if defined?(Raygun)
      Raygun.track_exception(e, custom_data: info)
    end

    if defined?(Rollbar)
      Rollbar.error(e, info)
    end

    if defined?(ScoutApm::Error)
      # no way to add context for a single call
      # ScoutApm::Context.add(info)
      ScoutApm::Error.capture(e)
    end

    if defined?(Sentry)
      Sentry.capture_exception(e, extra: info)
    end
  rescue => e
    $stderr.puts "[safely] Error reporting exception: #{e.class.name}: #{e.message}"
  end
end

Class Attribute Summary collapse

Class Method Summary collapse

Methods included from Methods

safely

Class Attribute Details

.envObject



26
27
28
# File 'lib/safely/core.rb', line 26

def env
  @env ||= ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
end

.raise_envsObject

Returns the value of attribute raise_envs.



7
8
9
# File 'lib/safely/core.rb', line 7

def raise_envs
  @raise_envs
end

.report_exception_methodObject

Returns the value of attribute report_exception_method.



7
8
9
# File 'lib/safely/core.rb', line 7

def report_exception_method
  @report_exception_method
end

.tagObject

Returns the value of attribute tag.



7
8
9
# File 'lib/safely/core.rb', line 7

def tag
  @tag
end

.throttle_counterObject

Returns the value of attribute throttle_counter.



7
8
9
# File 'lib/safely/core.rb', line 7

def throttle_counter
  @throttle_counter
end

Class Method Details

.report_exception(e, tag: nil, context: {}) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/safely/core.rb', line 10

def report_exception(e, tag: nil, context: {})
  tag = Safely.tag if tag.nil?
  if tag && e.message
    e = e.dup # leave original exception unmodified
    message = e.message
    e.define_singleton_method(:message) do
      "[#{tag == true ? "safely" : tag}] #{message}"
    end
  end
  if report_exception_method.arity == 1
    report_exception_method.call(e)
  else
    report_exception_method.call(e, context)
  end
end

.throttled?(e, options) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
38
# File 'lib/safely/core.rb', line 30

def throttled?(e, options)
  return false unless options
  key = [
    options[:key] || [e.class.name, e.message, e.backtrace.join("\n")].hash,
    (Time.now.to_i / options[:period]) * options[:period]
  ]
  throttle_counter.clear if throttle_counter.size > 1000 # prevent from growing indefinitely
  (throttle_counter[key] += 1) > options[:limit]
end