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 = RailsLogParser::NotParseableLines.new
  @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



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

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']) unless params['message'].nil?
end

#actionsObject



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

def actions
  @actions.values
end

#active_job(params) ⇒ Object



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

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

#add_message(params) ⇒ Object



109
110
111
112
# File 'lib/rails_log_parser/parser.rb', line 109

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



105
106
107
# File 'lib/rails_log_parser/parser.rb', line 105

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

#empty_line(params) ⇒ Object



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

def empty_line(params)
  params = params.named_captures
  params['message'] = nil
  action(:request, 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



114
115
116
# File 'lib/rails_log_parser/parser.rb', line 114

def last_action
  RailsLogParser::Action.last
end

#puts(line) ⇒ Object



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

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

#request(params) ⇒ Object



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

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
68
# 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.lines.present?
    summary_output.push('Not parseable lines:')
    summary_output += @not_parseable_lines.lines.map { |line| "  #{line}" }
    summary_output.push("\n\n")
    @not_parseable_lines.save
  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



95
96
97
98
99
# File 'lib/rails_log_parser/parser.rb', line 95

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