Class: RailsLogParser::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_log_parser/parser.rb

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeParser

Returns a new instance of Parser.



24
25
26
27
28
# File 'lib/rails_log_parser/parser.rb', line 24

def initialize
  @actions = {}
  @not_parseable_lines = []
  @heuristic = nil
end

Class Attribute Details

.log_pathObject



7
8
9
# File 'lib/rails_log_parser/parser.rb', line 7

def log_path
  @log_path || ENV['LOG_PATH']
end

Instance Attribute Details

#not_parseable_linesObject (readonly)

Returns the value of attribute not_parseable_lines.



22
23
24
# File 'lib/rails_log_parser/parser.rb', line 22

def not_parseable_lines
  @not_parseable_lines
end

Class Method Details

.from_file(path) ⇒ Object



11
12
13
14
15
16
17
18
19
# File 'lib/rails_log_parser/parser.rb', line 11

def from_file(path)
  parser = new
  File.open(path, 'r') do |handle|
    while (line = handle.gets)
      parser.puts(line)
    end
  end
  parser
end

Instance Method Details

#action(type, params) ⇒ Object



77
78
79
80
81
82
# File 'lib/rails_log_parser/parser.rb', line 77

def action(type, params)
  @actions[params['id']] ||= RailsLogParser::Action.new(type, params['id'])
  @actions[params['id']].severity = params['severity_label']
  @actions[params['id']].datetime = params['datetime']
  @actions[params['id']].add_message(params['message'])
end

#actionsObject



69
70
71
# File 'lib/rails_log_parser/parser.rb', line 69

def actions
  @actions.values
end

#active_job(params) ⇒ Object



94
95
96
# File 'lib/rails_log_parser/parser.rb', line 94

def active_job(params)
  action(:active_job, params)
end

#add_message(params) ⇒ Object



102
103
104
105
# File 'lib/rails_log_parser/parser.rb', line 102

def add_message(params)
  @actions[params['id']] ||= RailsLogParser::Action.new(type, params['id'])
  @actions[params['id']].add_message(params['message'])
end

#delayed_job(params) ⇒ Object



98
99
100
# File 'lib/rails_log_parser/parser.rb', line 98

def delayed_job(params)
  action(:delayed_job, params)
end

#enable_heuristic(path) ⇒ Object



30
31
32
33
# File 'lib/rails_log_parser/parser.rb', line 30

def enable_heuristic(path)
  @heuristic = path
  @heuristic_today = RailsLogParser::HeuristicStatFile.new(@heuristic, Date.today).tap { |p| p.write_stats(actions) }
end

#last_actionObject



107
108
109
# File 'lib/rails_log_parser/parser.rb', line 107

def last_action
  RailsLogParser::Action.last
end

#puts(line) ⇒ Object



73
74
75
# File 'lib/rails_log_parser/parser.rb', line 73

def puts(line)
  RailsLogParser::Line.new(self, line.encode('UTF-8', invalid: :replace))
end

#request(params) ⇒ Object



84
85
86
# File 'lib/rails_log_parser/parser.rb', line 84

def request(params)
  action(:request, params)
end

#summary(last_minutes: nil) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rails_log_parser/parser.rb', line 35

def summary(last_minutes: nil)
  relevant = actions
  if last_minutes.present?
    from = last_minutes.to_i.minutes.ago
    relevant = relevant.select { |a| a.after?(from) }
  end
  summary_output = []
  if @not_parseable_lines.present?
    summary_output.push('Not parseable lines:')
    summary_output += @not_parseable_lines.map { |line| "  #{line}" }
    summary_output.push("\n\n")
  end

  %i[warn error fatal].each do |severity|
    selected = relevant.select { |a| a.public_send("#{severity}?") }.reject(&:known_exception?)
    next if selected.blank?

    summary_output.push("#{selected.count} lines with #{severity}:")
    summary_output += selected.map(&:headline).map { |line| "  #{line}" }
    summary_output.push("\n\n")
  end

  unless @heuristic.nil?
    stats = RailsLogParser::HeuristicStatFile.build_heuristic(@heuristic, @heuristic_today)
    if stats.present?
      summary_output.push("Heuristic match! (threshold: #{RailsLogParser::HeuristicStatFile.heuristic_threshold})")
      stats.each { |k, v| summary_output.push("- #{k}: #{v.round(4)}") }
      summary_output.push("\n\n")
    end
  end

  summary_output.join("\n")
end

#without_request(params) ⇒ Object



88
89
90
91
92
# File 'lib/rails_log_parser/parser.rb', line 88

def without_request(params)
  params = params.named_captures
  params['id'] = SecureRandom.uuid
  action(:without_request, params)
end