lib/stackify/logs_sender.rb in stackify-api-ruby-1.0.15 vs lib/stackify/logs_sender.rb in stackify-api-ruby-1.1.0

- old
+ new

@@ -1,16 +1,105 @@ module Stackify class LogsSender < HttpClient LOGS_URI = URI("#{Stackify.configuration.base_api_url}/Log/Save") + def initialize + @@errors_governor = Stackify::ErrorsGovernor.new + end + + def log level, msg, call_trace, task + Stackify::Utils.do_only_if_authorized_and_mode_is_on Stackify::MODES[:logging] do + if acceptable?(level, msg) && Stackify.working? + worker = Stackify::AddMsgWorker.new + worker.async_perform ScheduleDelay.new, task + end + end + end + + def log_exception level= :error, ex, task + if ex.is_a?(Stackify::StackifiedError) + Stackify::Utils.do_only_if_authorized_and_mode_is_on Stackify::MODES[:logging] do + if acceptable?(level, ex.message) && Stackify.working? + if @@errors_governor.can_send? ex + worker = Stackify::AddMsgWorker.new + worker.async_perform ScheduleDelay.new, task + else + Stackify.internal_log :warn, + "LoggerClient: logging of exception with message \"#{ex.message}\" is skipped - flood_limit is exceeded" + end + end + end + else + Stackify.log_internal_error 'LoggerClient: log_exception should get StackifiedError object' + end + end + + def has_error msg + !msg['Ex'].nil? + end + + def get_epoch msg + msg['EpochMs'] + end + + def log_message_task level, msg, call_trace, trans_id=nil, log_uuid=nil + Stackify::ScheduleTask.new ({limit: 1}) do + if %w(error fatal).include?(level) + ex = if ruby_exception?(msg) && msg.class != Class + msg.set_backtrace(call_trace) + msg + else + e = StringException.new(msg) + e.set_backtrace(call_trace) + e + end + ex = StackifiedError.new(ex, binding()) + Stackify.msgs_queue << Stackify::MsgObject.new(level, ex.message, caller[0], trans_id, log_uuid, ex).to_h + else + Stackify.msgs_queue << Stackify::MsgObject.new(level, msg, caller[0], trans_id, log_uuid).to_h + end + end + end + + def log_exception_task level, ex, trans_id=nil, log_uuid=nil + Stackify::ScheduleTask.new ({limit: 1}) do + Stackify.msgs_queue << Stackify::MsgObject.new(level, ex.message, caller[0], trans_id, log_uuid, ex).to_h + end + end + def send_logs msgs, attempts = 3 worker = Stackify::LogsSenderWorker.new task = send_logs_task attempts, msgs worker.async_perform ScheduleDelay.new, task end - private + private + + def acceptable? level, msg + Stackify.is_valid? && is_correct_log_level?(level) && + is_not_internal_log_message?(msg) + end + + def is_not_internal_log_message? msg + msg.try(:index, ::Stackify::INTERNAL_LOG_PREFIX).nil? + end + + def is_correct_log_level? level + config_level = Logger.const_get Stackify.configuration.log_level.to_s.upcase + current_level = Logger.const_get level.to_s.upcase + current_level >= config_level + end + + def ruby_exception? klass + klass = klass.class == Class ? klass : klass.class + klasses = [klass] + while klass != Object do + klasses << klass.superclass + klass = klass.superclass + end + klasses.include?(Exception) + end def properties { success_condition: lambda { |result| result.try(:status) == 200 }, limit: 1