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
current_tags() click to toggle source
# File lib/active_tracker/plugin/request.rb, line 91
def self.current_tags
  @tags || {}
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
nav_svg() click to toggle source
nav_title() click to toggle source
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