[Groonga-commit] groonga/groonga [master] [query-log][analyzer] support streaming report.

Back to archive index

null+****@clear***** null+****@clear*****
2011年 6月 3日 (金) 16:00:23 JST


Kouhei Sutou	2011-06-03 07:00:23 +0000 (Fri, 03 Jun 2011)

  New Revision: d21a1fdc104c4e1a0a5bcd99864fd5e8c44bf08c

  Log:
    [query-log][analyzer] support streaming report.

  Modified files:
    tools/groonga-query-log-analyzer.rb

  Modified: tools/groonga-query-log-analyzer.rb (+96 -15)
===================================================================
--- tools/groonga-query-log-analyzer.rb    2011-06-03 05:09:12 +0000 (b49c754)
+++ tools/groonga-query-log-analyzer.rb    2011-06-03 07:00:23 +0000 (c223d34)
@@ -13,9 +13,14 @@ class GroongaQueryLogAnaylzer
   def run(argv=nil)
     log_paths = @option_parser.parse!(argv || ARGV)
 
+    stream = @options[:stream]
     dynamic_sort = @options[:dynamic_sort]
     statistics = SizedStatistics.new(@options[:n_entries], @options[:order])
-    if dynamic_sort
+    if stream
+      streamer = Streamer.new(create_reporter(statistics))
+      streamer.start
+      parser = QueryLogParser.new(streamer)
+    elsif dynamic_sort
       parser = QueryLogParser.new(statistics)
     else
       full_statistics = []
@@ -26,6 +31,10 @@ class GroongaQueryLogAnaylzer
         parser.parse(log)
       end
     end
+    if stream
+      streamer.finish
+      return
+    end
     statistics.replace(full_statistics) unless dynamic_sort
 
     reporter = create_reporter(statistics)
@@ -43,6 +52,7 @@ class GroongaQueryLogAnaylzer
     @options[:slow_threshold] = 0.05
     @options[:reporter] = "console"
     @options[:dynamic_sort] = true
+    @options[:stream] = false
 
     @option_parser = OptionParser.new do |parser|
       parser.banner += " LOG1 ..."
@@ -112,6 +122,13 @@ class GroongaQueryLogAnaylzer
                 "(#{@options[:dynamic_sort]})") do |sort|
         @options[:dynamic_sort] = sort
       end
+
+      parser.on("--[no-]stream",
+                "Outputs analyzed query on the fly.",
+                "NOTE: --n-entries and --order are ignored.",
+                "(#{@options[:stream]})") do |stream|
+        @options[:stream] = stream
+      end
     end
 
     def create_reporter(statistics)
@@ -123,6 +140,16 @@ class GroongaQueryLogAnaylzer
         ConsoleQueryLogReporter.new(statistics)
       end
     end
+
+    def create_stream_reporter
+      case @options[:reporter]
+      when "json"
+        require 'json'
+        StreamJSONQueryLogReporter.new
+      else
+        StreamConsoleQueryLogReporter.new
+      end
+    end
   end
 
   class Command
@@ -403,6 +430,24 @@ class GroongaQueryLogAnaylzer
     end
   end
 
+  class Streamer
+    def initialize(reporter)
+      @reporter = reporter
+    end
+
+    def start
+      @reporter.start
+    end
+
+    def <<(statistic)
+      @reporter.report_statistic(statistic)
+    end
+
+    def finish
+      @reporter.finish
+    end
+  end
+
   class QueryLogReporter
     include Enumerable
 
@@ -436,13 +481,17 @@ class GroongaQueryLogAnaylzer
     end
 
     def setup_output
+      original_output = @output
       if****@outpu*****_a?(String)
         File.open(@output, "w") do |output|
-          yield(output)
+          @output = output
+          yield(@output)
         end
       else
         yield(@output)
       end
+    ensure
+      @output = original_output
     end
   end
 
@@ -556,19 +605,37 @@ class GroongaQueryLogAnaylzer
       @color = options[:color] || @color
     end
 
+    def start
+      @index = 0
+      if****@stati*****?
+        @digit = 1
+      else
+        @digit = Math.log10(@statistics.size).truncate + 1
+      end
+    end
+
     def report
       setup_output do |output|
         setup_color(output) do
-          digit = Math.log10(@statistics.size).truncate + 1
-          each_with_index do |statistic, i|
-            output.puts "%*d) %s" % [digit, i + 1, format_heading(statistic)]
-            report_parameters(output, statistic)
-            report_steps(output, statistic)
+          start
+          each do |statistic|
+            report_statistic(statistic)
           end
+          finish
         end
       end
     end
 
+    def finish
+    end
+
+    def report_statistic(statistic)
+      @index += 1
+      @output.puts "%*d) %s" % [@digit, @index, format_heading(statistic)]
+      report_parameters(@output, statistic)
+      report_steps(@output, statistic)
+    end
+
     private
     def report_parameters(output, statistic)
       command = statistic.command
@@ -654,19 +721,33 @@ class GroongaQueryLogAnaylzer
   end
 
   class JSONQueryLogReporter < QueryLogReporter
+    def start
+      @index = 0
+      @output.print("[")
+    end
+
     def report
-      setup_output do |output|
-        output.print("[")
-        each_with_index do |statistic, i|
-          output.print(",") if i > 0
-          output.print("\n")
-          output.print(format_statistic(statistic))
+      setup_output do
+        start
+        each do |statistic|
+          report_statistic(statistic)
         end
-        output.puts
-        output.puts("]")
+        finish
       end
     end
 
+    def finish
+      @output.puts
+      @output.puts("]")
+    end
+
+    def report_statistic(statistic)
+      @output.print(",") if @index > 0
+      @output.print("\n")
+      @output.print(format_statistic(statistic))
+      @index += 1
+    end
+
     private
     def format_statistic(statistic)
       data = {




Groonga-commit メーリングリストの案内
Back to archive index