class ActiveTracker::Plugin::Request
Public Class Methods
app_name()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 99 def self.app_name ENV["APP_NAME"] || Rails.application.class.parent.to_s end
apply_redactions(value)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 155 def self.apply_redactions(value) (@redactions || []).each do |redaction| value = value.gsub(redaction, "[REDACTED]") end value end
clear_context()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 82 def self.clear_context @tags = {} @redactions = [] end
filter_request?(path)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 139 def self.filter_request?(path) ActiveTracker::Plugin::Request.filters.each do |filter| if filter.is_a?(Regexp) if filter.match(path) return true end else if path.start_with?(filter) return true end end end false end
filters()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 78 def self.filters @filters ||= ["/#{ActiveTracker::Configuration.mountpoint}"] end
filters=(value)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 74 def self.filters=(value) @filters = value end
output_capture(output, content_type)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 111 def self.output_capture(output, content_type) @output = output @content_type = content_type end
record_duration(duration)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 116 def self.record_duration(duration) return if ActiveTracker::Plugin::Request.current_tags[:url] && filter_request?(ActiveTracker::Plugin::Request.current_tags[:url]) @duration = duration log = @logger.lines[0, 65535] rescue "" _, status, duration = (@logger&.lines || "").force_encoding("UTF-8").match(/Completed (\d+) .*? in (\d+)ms/m).to_a tag_current status: status tag_current duration: "#{duration.to_i}ms" log = apply_redactions(log) @output = apply_redactions(@output) ActiveTracker::Model.save("Request", {log: log, output: @output, content_type: @content_type}, tags: ActiveTracker::Plugin::Request.current_tags, data_type: "full", expiry: 7.days, log_at: Time.now ) if ActiveTracker::Plugin::Request.current_tags.any? && ActiveTracker::Plugin::Request.current_tags[:id].present? clear_context end
redact(value)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 95 def self.redact(value) @redactions << value end
register()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 4 def self.register @logger = ActiveTracker::RailsLogger.new @logger.level = Rails.logger.level Rails.logger.extend(ActiveSupport::Logger.broadcast(@logger)) ActiveSupport::Notifications.subscribe "start_processing.action_controller" do |event| clear_context @logger.reset tag_current(id: SecureRandom.uuid) @output = "" end ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args| event = ActiveSupport::Notifications::Event.new(*args) request_processed(event) end Rails.application.middleware.insert_before Rack::Sendfile, ActiveTracker::OutputCapturer @@registered = true end
registered?()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 26 def self.registered? @@registered rescue false end
request_processed(event)
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 103 def self.request_processed(event) tag_current status: event.payload[:status] tag_current duration: "#{@duration.to_i}ms" tag_current url: event.payload[:path] tag_current method: event.payload[:method] tag_current app: app_name end
resources_name()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 30 def self.resources_name :requests end
statistics()
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 47 def self.statistics ret = [] @requests = ActiveTracker::Model.all("Request") @requests = @requests.select {|e| e.log_at >= 60.minutes.ago} num_requests = @requests.count percentage_error = 0 avg_milliseconds = 0 if num_requests > 0 num_errors = @requests.map {|r| r.tags[:status][0]}.select {|s| s=="4" || s=="5"}.count percentage_error = num_errors / @requests.count.to_f * 100.0 avg_milliseconds = @requests.map {|r| r.tags[:duration].to_i}.sum / num_requests end ret << {plugin: self, label: "Requests/hour", value: num_requests} if percentage_error < 1.0 ret << {plugin: self, label: "Error percentage", value: "%.1f%%" % percentage_error} else ret << {plugin: self, label: "Error percentage", value: "%.1f%%" % percentage_error, error: true} end ret << {plugin: self, label: "Avg time/request", value: "#{avg_milliseconds}ms"} if avg_milliseconds ret end
tag_current(tags = {})
click to toggle source
# File lib/active_tracker/plugin/request.rb, line 87 def self.tag_current(tags = {}) @tags = current_tags.merge(tags) end