module Justlogging class Transaction def self.create(key, env) Thread.current[:justlogging_transaction_id] = key Justlogging.transactions[key] = Justlogging::Transaction.new(key, env) end def self.current Justlogging.transactions[Thread.current[:justlogging_transaction_id]] end attr_reader :id, :events, :exception, :env, :log_entry def initialize(id, env) @id = id @events = [] @log_entry = nil @exception = nil @env = env end def request ActionDispatch::Request.new(@env) end def set_log_entry(event) @log_entry = event end def add_event(event) @events << event end def add_exception(ex) @exception = ex end def formatted_exception return {} unless @exception { :backtrace => @exception.backtrace, :exception => @exception.name, :message => @exception.message } end def formatted_events @events.map do |event| { :name => event.name, :duration => event.duration, :time => event.time, :end => event.end, :payload => event.payload } end end def formatted_log_entry @log_entry.payload.merge( :duration => @log_entry.duration, :time => @log_entry.time, :end => @log_entry.end, :name => request.fullpath, :environment => Rails.env, :server => @env['SERVER_NAME'], :kind => 'http_request' ) end def to_hash { :request_id => @id, :log_entry => formatted_log_entry, :events => formatted_events, :exception => formatted_exception, :failed => exception.present? } end def complete! Thread.current[:justlogging_transaction_id] = nil current_transaction = Justlogging.transactions.delete(@id) if @events.any? || @exception.present? Justlogging.agent.add_to_queue( current_transaction.to_hash ) end end end end