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
29
30
31
# File 'lib/rails_log_parser/parser.rb', line 24

def initialize
  config_file = File.join(Dir.pwd,'config/rails_log_parser.rb')
  require config_file if File.file?(config_file)

  @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



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

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



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

def actions
  @actions.values
end

#active_job(params) ⇒ Object



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

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

#add_message(params) ⇒ Object



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

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



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

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

#empty_line(params) ⇒ Object



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

def empty_line(params)
  params = params.named_captures
  params['message'] = nil
  action(:request, params)
end

#enable_heuristic(path) ⇒ Object



33
34
35
36
# File 'lib/rails_log_parser/parser.rb', line 33

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

#last_actionObject



117
118
119
# File 'lib/rails_log_parser/parser.rb', line 117

def last_action
  RailsLogParser::Action.last
end

#puts(line) ⇒ Object



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

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

#request(params) ⇒ Object



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

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

#summary(last_minutes: nil) ⇒ Object



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
69
70
71
# File 'lib/rails_log_parser/parser.rb', line 38

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?).reject(&:ignore?)
    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



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

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