class Nadir::Notification

Public Class Methods

new(exception, params = {}) click to toggle source
# File lib/nadir/notification.rb, line 5
def initialize(exception, params = {})
  @exception = exception
  @params = params
end

Public Instance Methods

to_params() click to toggle source
# File lib/nadir/notification.rb, line 10
def to_params
  {
    class: @exception.class.name,
    message: @exception.message,
    location: location,
    backtrace: backtrace.join("\n"),
    environment: Nadir.config.env,
    timestamp: Time.current,
    fingerprint: fingerprint,
    host: Socket.gethostname,
    pid: Process.pid,
    request_params: @params.dig(:request, :params),
    request_remote_ip: @params.dig(:request, :remote_ip),
    request_headers: @params.dig(:request, :headers),
    user: @params.dig(:request, :user),
    job: @params.dig(:job),
    revision: revision
  }
end

Private Instance Methods

backtrace() click to toggle source
# File lib/nadir/notification.rb, line 36
def backtrace
  @_backtrace ||=
    begin
      cleaner = ActiveSupport::BacktraceCleaner.new
      cleaner.remove_filters!
      gem_paths.each { |gem_path| cleaner.add_filter { |line| line.sub(gem_path, '[GEM_ROOT]') } }
      cleaner.add_filter { |line| ruby_path ? line.sub(ruby_path, '[RUBY_ROOT]') : line }
      cleaner.add_filter { |line| line.sub(Nadir.config.root.to_s, '') }
      cleaner.add_filter { |line| line.start_with?('/') ? line.sub('/', '') : line }
      cleaner.add_filter { |line| line.start_with?('.') ? line.sub('.', '') : line  }

      cleaner.clean(@exception.backtrace)
    end
end
fingerprint() click to toggle source
# File lib/nadir/notification.rb, line 51
def fingerprint
  first_backtrace_line = backtrace.find { |trace| trace !~ /pry|irb/ }
  checksum = [first_backtrace_line, @exception.class].join('|')

  Digest::SHA1.hexdigest checksum
end
from_env() click to toggle source
# File lib/nadir/notification.rb, line 88
def from_env
  ENV['COMMIT_HASH']
end
from_git() click to toggle source
# File lib/nadir/notification.rb, line 74
def from_git
  revision, _stderr, status = Open3.capture3('git rev-parse HEAD')

  status.success? ? revision.strip : nil
end
from_revision_file() click to toggle source
# File lib/nadir/notification.rb, line 80
def from_revision_file
  revision_file = Nadir.config.root.join('REVISION')

  if File.exist? revision_file
    File.read(revision_file)&.strip
  end
end
gem_paths() click to toggle source
# File lib/nadir/notification.rb, line 58
def gem_paths
  @gem_paths ||= Gem.path | [Gem.default_dir]
end
location() click to toggle source
# File lib/nadir/notification.rb, line 32
def location
  @params[:location] || $PROGRAM_NAME
end
revision() click to toggle source
# File lib/nadir/notification.rb, line 68
def revision
  from_git || from_revision_file || from_env
end
ruby_path() click to toggle source
# File lib/nadir/notification.rb, line 62
def ruby_path
  ruby_path, _stderr, _status = Open3.capture3('which ruby')

  ENV['RUBY_ROOT'] || ruby_path.strip.presence
end