lib/rorvswild.rb in rorvswild-0.2.1 vs lib/rorvswild.rb in rorvswild-0.2.2

- old
+ new

@@ -1,6 +1,9 @@ require "rorvswild/version" +require "json/ext" +require "net/http" +require "uri" module RorVsWild def self.new(*args) warn "WARNING: RorVsWild.new is deprecated. Use RorVsWild::Client.new instead." Client.new(*args) # Compatibility with 0.0.1 @@ -57,15 +60,17 @@ RorVsWild.register_default_client(self) end def setup_callbacks client = self - ActiveSupport::Notifications.subscribe("sql.active_record", &method(:after_sql_query)) - ActiveSupport::Notifications.subscribe("render_template.action_view", &method(:after_view_rendering)) - ActiveSupport::Notifications.subscribe("process_action.action_controller", &method(:after_http_request)) - ActiveSupport::Notifications.subscribe("start_processing.action_controller", &method(:before_http_request)) - ActionController::Base.rescue_from(StandardError) { |exception| client.after_exception(exception, self) } + if defined?(Rails) + ActiveSupport::Notifications.subscribe("sql.active_record", &method(:after_sql_query)) + ActiveSupport::Notifications.subscribe("render_template.action_view", &method(:after_view_rendering)) + ActiveSupport::Notifications.subscribe("process_action.action_controller", &method(:after_http_request)) + ActiveSupport::Notifications.subscribe("start_processing.action_controller", &method(:before_http_request)) + ActionController::Base.rescue_from(StandardError) { |exception| client.after_exception(exception, self) } + end Resque::Job.send(:extend, ResquePlugin) if defined?(Resque::Job) Delayed::Worker.lifecycle.around(:invoke_job, &method(:around_delayed_job)) if defined?(Delayed::Worker) Sidekiq.configure_server { |config| config.server_middleware { |chain| chain.add(SidekiqPlugin) } } if defined?(Sidekiq) end @@ -85,11 +90,11 @@ end def after_sql_query(name, start, finish, id, payload) return if !queries || payload[:name] == "EXPLAIN".freeze runtime, sql, plan = compute_duration(start, finish), nil, nil - file, line, method = extract_query_location(caller) + file, line, method = extract_most_relevant_location(caller) # I can't figure out the exact location which triggered the query, so at least the SQL is logged. sql, file, line, method = payload[:sql], "Unknow", 0, "Unknow" if !file sql = payload[:sql] if runtime >= log_sql_threshold plan = explain(payload[:sql], payload[:binds]) if runtime >= explain_sql_threshold push_query(file: file, line: line, method: method, sql: sql, plan: plan, runtime: runtime, times: 1) @@ -216,11 +221,11 @@ end SELECT_REGEX = /\Aselect/i.freeze def explain(sql, binds) - ActiveRecord::Base.connection.explain(sql, binds) if (sql =~ SELECT_REGEX) == 0 + ActiveRecord::Base.connection.explain(sql, binds) if sql =~ SELECT_REGEX end def post_request attributes = request.merge(queries: slowest_queries, views: slowest_views) Thread.new { post("/requests".freeze, request: attributes) } @@ -238,18 +243,15 @@ def post_error(hash) post("/errors".freeze, error: hash) end - def extract_query_location(stack) - if location = stack.find { |str| str.include?(Rails.root.to_s) } - split_file_location(location.sub(Rails.root.to_s, "".freeze)) - end - end + GEM_HOME_REGEX = ENV["GEM_HOME"] ? /\A#{ENV["GEM_HOME"]}/.freeze : nil - def extract_error_location(stack) - extract_query_location(stack) || split_file_location(stack.first) + def extract_most_relevant_location(stack) + location = stack.find { |str| !(str =~ GEM_HOME_REGEX) } if GEM_HOME_REGEX + split_file_location(relative_path(location || stack.first)) end def split_file_location(location) file, line, method = location.split(":") method = cleanup_method_name(method) if method @@ -266,15 +268,15 @@ def compute_duration(start, finish) ((finish - start) * 1000) end def relative_path(path) - path.sub(Rails.root.to_s, "".freeze) + defined?(Rails) ? path.sub(Rails.root.to_s, "".freeze) : path end def exception_to_hash(exception, extra_details = nil) - file, line, method = extract_error_location(exception.backtrace) + file, line, method = extract_most_relevant_location(exception.backtrace) { method: method, line: line.to_i, file: relative_path(file), message: exception.message, @@ -294,24 +296,29 @@ http.request(post) end end def filter_sensitive_data(hash) - @sensitive_filter ||= ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters) - @sensitive_filter.filter(hash) + if defined?(Rails) + @sensitive_filter ||= ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters) + @sensitive_filter.filter(hash) + else + hash + end end def filter_environment_variables(hash) hash.clone.keep_if { |key,value| key == key.upcase } end - def logger - Rails.logger - end - def log_error(exception) - logger.error("[RorVsWild] " + exception.inspect) - logger.error("[RorVsWild] " + exception.backtrace.join("\n[RorVsWild] ")) + if defined?(Rails) + Rails.logger.error("[RorVsWild] " + exception.inspect) + Rails.logger.error("[RorVsWild] " + exception.backtrace.join("\n[RorVsWild] ")) + else + $stderr.puts("[RorVsWild] " + exception.inspect) + $stderr.puts("[RorVsWild] " + exception.backtrace.join("\n[RorVsWild] ")) + end end end DASH_PERFORM = "#perform".freeze