request-log-analyzer 1.1.4 → 1.1.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -96,6 +96,11 @@ module RequestLogAnalyzer::Aggregator
96
96
  class_name = "#{name}_line".camelize
97
97
  klass = Class.new(ActiveRecord::Base)
98
98
  klass.send(:belongs_to, :request)
99
+
100
+ definition.captures.each do |capture|
101
+ klass.send(:serialize, capture[:name], Hash) if capture[:provides]
102
+ end
103
+
99
104
  @orm_module.const_set(class_name, klass) unless @orm_module.const_defined?(class_name)
100
105
  @request_class.send(:has_many, "#{name}_lines".to_sym)
101
106
  end
@@ -148,11 +153,20 @@ module RequestLogAnalyzer::Aggregator
148
153
  # TODO: make more robust / include in file-format definition
149
154
  def column_type(type_indicator)
150
155
  case type_indicator
151
- when :eval; :text
152
- when :sec; :double
153
- when :msec; :double
154
- when :float; :double
155
- else type_indicator
156
+ when :eval; :text
157
+ when :text; :text
158
+ when :string; :string
159
+ when :sec; :double
160
+ when :msec; :double
161
+ when :duration; :double
162
+ when :float; :double
163
+ when :double; :double
164
+ when :integer; :integer
165
+ when :int; :int
166
+ when :timestamp; :datetime
167
+ when :datetime; :datetime
168
+ when :date; :date
169
+ else :string
156
170
  end
157
171
  end
158
172
  end
@@ -78,12 +78,11 @@ module RequestLogAnalyzer
78
78
  value_hash = {}
79
79
  captures.each_with_index do |capture, index|
80
80
  converted = request.convert_value(values[index], capture)
81
- if converted.kind_of?(Hash)
82
- value_hash[capture[:name]] = values[index]
83
- converted = converted.inject({}) { |h, (key, value)| h[key.to_sym] = value; h }
84
- value_hash = converted.merge(value_hash)
85
- else
86
- value_hash[capture[:name]] ||= converted
81
+ value_hash[capture[:name]] ||= converted
82
+ if converted.kind_of?(Hash) && capture[:provides].kind_of?(Hash)
83
+ capture[:provides].each do |name, type|
84
+ value_hash[name] ||= request.convert_value(converted[name], { :type => type })
85
+ end
87
86
  end
88
87
  end
89
88
  return value_hash
@@ -31,7 +31,9 @@ module RequestLogAnalyzer
31
31
  end
32
32
 
33
33
  def convert_eval(value, capture_definition)
34
- eval(value)
34
+ eval(value).inject({}) { |h, (k, v)| h[k.to_sym] = v; h}
35
+ rescue SyntaxError
36
+ nil
35
37
  end
36
38
 
37
39
  # Slow default method to parse timestamps
@@ -0,0 +1,76 @@
1
+ require 'rubygems'
2
+ require 'activerecord'
3
+
4
+ module RequestLogAnalyzer::Source
5
+
6
+ # Active Resource hook
7
+ class CompletedLine < ActiveRecord::Base
8
+ def convert(file_format)
9
+ RequestLogAnalyzer::Request.create(file_format, self.attributes)
10
+ end
11
+ end
12
+
13
+ # The Database class gets log data from the database.
14
+ class Database < Base
15
+
16
+ attr_reader :source_files
17
+ attr_reader :requests
18
+
19
+ # Initializes the log file parser instance.
20
+ # It will apply the language specific FileFormat module to this instance. It will use the line
21
+ # definitions in this module to parse any input that it is given (see parse_io).
22
+ #
23
+ # <tt>format</tt>:: The current file format instance
24
+ # <tt>options</tt>:: A hash of options that are used by the parser
25
+ def initialize(format, options = {})
26
+ @line_definitions = {}
27
+ @options = options
28
+ @source_files = options[:source_files]
29
+ @parsed_requests = 0
30
+ @requests = []
31
+
32
+ self.register_file_format(format)
33
+ end
34
+
35
+ # Reads the input, which can either be a file, sequence of files or STDIN to parse
36
+ # lines specified in the FileFormat. This lines will be combined into Request instances,
37
+ # that will be yielded. The actual parsing occurs in the parse_io method.
38
+ # <tt>options</tt>:: A Hash of options that will be pased to parse_io.
39
+ def each_request(options = {}, &block) # :yields: request
40
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => @source_files)
41
+
42
+ @progress_handler.call(:started, @source_files) if @progress_handler
43
+ RequestLogAnalyzer::Source::CompletedLine.find(:all).each do |request|
44
+ @parsed_requests += 1
45
+ yield(request.convert(self.file_format))
46
+ end
47
+
48
+ @progress_handler.call(:finished, @source_files) if @progress_handler
49
+ end
50
+
51
+ # Add a block to this method to install a progress handler while parsing.
52
+ # <tt>proc</tt>:: The proc that will be called to handle progress update messages
53
+ def progress=(proc)
54
+ @progress_handler = proc
55
+ end
56
+
57
+ # Add a block to this method to install a warning handler while parsing,
58
+ # <tt>proc</tt>:: The proc that will be called to handle parse warning messages
59
+ def warning=(proc)
60
+ @warning_handler = proc
61
+ end
62
+
63
+ # This method is called by the parser if it encounteres any parsing problems.
64
+ # It will call the installed warning handler if any.
65
+ #
66
+ # By default, RequestLogAnalyzer::Controller will install a warning handler
67
+ # that will pass the warnings to each aggregator so they can do something useful
68
+ # with it.
69
+ #
70
+ # <tt>type</tt>:: The warning type (a Symbol)
71
+ # <tt>message</tt>:: A message explaining the warning
72
+ def warn(type, message)
73
+ @warning_handler.call(type, message, @current_io.lineno) if @warning_handler
74
+ end
75
+ end
76
+ end
@@ -48,7 +48,7 @@ module RequestLogAnalyzer::Tracker
48
48
  category = options[:category].respond_to?(:call) ? options[:category].call(request) : request[options[:category]]
49
49
  duration = options[:duration].respond_to?(:call) ? options[:duration].call(request) : request[options[:duration]]
50
50
 
51
- if !duration.nil? && !category.nil?
51
+ if duration.kind_of?(Float) && category.kind_of?(String)
52
52
  @categories[category] ||= {:hits => 0, :cumulative => 0.0, :min => duration, :max => duration }
53
53
  @categories[category][:hits] += 1
54
54
  @categories[category][:cumulative] += duration
@@ -72,9 +72,8 @@ module RequestLogAnalyzer::Tracker
72
72
  output.table({}, {:align => :right}, {:type => :ratio, :width => :rest, :treshold => 0.15}) do |rows|
73
73
  @request_time_graph.each_with_index do |requests, index|
74
74
  ratio = requests.to_f / total_requests.to_f
75
- requests_per_day = requests / days
76
-
77
- rows << ["#{index.to_s.rjust(3)}:00", "#{requests_per_day} hits", ratio]
75
+ requests_per_day = (requests / days).ceil
76
+ rows << ["#{index.to_s.rjust(3)}:00", "%d hits" % requests_per_day, ratio]
78
77
  end
79
78
  end
80
79
  end
@@ -79,7 +79,7 @@ describe RequestLogAnalyzer::Aggregator::Database, "record insertion" do
79
79
  @completed_request = testing_format.request( {:line_type => :first, :request_no => 564},
80
80
  {:line_type => :test, :test_capture => "awesome"},
81
81
  {:line_type => :test, :test_capture => "indeed"},
82
- {:line_type => :eval, :evaluated => "{ 'greating' => 'howdy'}", :greating => 'howdy' },
82
+ {:line_type => :eval, :evaluated => { :greating => 'howdy'}, :greating => 'howdy' },
83
83
  {:line_type => :last, :request_no => 564})
84
84
  end
85
85
 
@@ -55,7 +55,7 @@ describe RequestLogAnalyzer::LineDefinition, :converting do
55
55
 
56
56
  it "should merge a hash capture into the line hash" do
57
57
  hash = @file_format.line_definitions[:eval].convert_captured_values(["{ 'greating' => 'hello', 'what' => 'world'}"], @request)
58
- hash[:evaluated].should == "{ 'greating' => 'hello', 'what' => 'world'}"
58
+ hash[:evaluated].should == { :greating => "hello", :what => "world"}
59
59
  hash[:greating].should == 'hello'
60
60
  hash[:what].should == 'world'
61
61
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: request-log-analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-02-08 00:00:00 +01:00
13
+ date: 2009-02-10 00:00:00 +01:00
14
14
  default_executable: request-log-analyzer
15
15
  dependencies: []
16
16
 
@@ -62,6 +62,7 @@ files:
62
62
  - lib/request_log_analyzer/request.rb
63
63
  - lib/request_log_analyzer/source
64
64
  - lib/request_log_analyzer/source.rb
65
+ - lib/request_log_analyzer/source/database.rb
65
66
  - lib/request_log_analyzer/source/log_parser.rb
66
67
  - lib/request_log_analyzer/tracker
67
68
  - lib/request_log_analyzer/tracker.rb