fluent-plugin-redis-counter 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
 - data/CHANGELOG.md +3 -0
 - data/VERSION +1 -1
 - data/benchmark/performance_test.rb +99 -0
 - data/fluent-plugin-redis-counter.gemspec +1 -1
 - data/lib/fluent/plugin/out_redis_counter.rb +14 -6
 - metadata +2 -1
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,15 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            !binary "U0hBMQ==":
         
     | 
| 
       3 
3 
     | 
    
         
             
              metadata.gz: !binary |-
         
     | 
| 
       4 
     | 
    
         
            -
                 
     | 
| 
      
 4 
     | 
    
         
            +
                YjI2ZDVjZjQ2ZjkyZGE4N2VlZDIxOTdhMGQzNWQ5MTUzYzUwYmIwYw==
         
     | 
| 
       5 
5 
     | 
    
         
             
              data.tar.gz: !binary |-
         
     | 
| 
       6 
     | 
    
         
            -
                 
     | 
| 
      
 6 
     | 
    
         
            +
                MTEyN2U5MDlhZmQ0NmZlNjhiMDEzNmFhNmYwYzdhMjA5NDliMDEwNw==
         
     | 
| 
       7 
7 
     | 
    
         
             
            !binary "U0hBNTEy":
         
     | 
| 
       8 
8 
     | 
    
         
             
              metadata.gz: !binary |-
         
     | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
       10 
     | 
    
         
            -
                 
     | 
| 
       11 
     | 
    
         
            -
                 
     | 
| 
      
 9 
     | 
    
         
            +
                MmEwMjA0YTkxM2NhNWZiMWY5NmY1MzdjNTg0NDA3ZWI5YzQ3NTI5ZjhmNzQz
         
     | 
| 
      
 10 
     | 
    
         
            +
                MGVkZDkxYmZlYjlhM2NjNDY4ZWMwNGE2MWFlODhkNjgzMThjYTliYWFlN2Vm
         
     | 
| 
      
 11 
     | 
    
         
            +
                YmJmOGI2OGRmZGQ5ZmY5YzY4ZTlmYjVhMzIwY2UwNTRlYTYzMmE=
         
     | 
| 
       12 
12 
     | 
    
         
             
              data.tar.gz: !binary |-
         
     | 
| 
       13 
     | 
    
         
            -
                 
     | 
| 
       14 
     | 
    
         
            -
                 
     | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
      
 13 
     | 
    
         
            +
                ZGUyYTI3MjYxZWRmYWVlY2M5OWEzZTI0ODM0MzNlODk4MmI1MGQ2NjU2Mzdj
         
     | 
| 
      
 14 
     | 
    
         
            +
                MTdiYWEyNjAyOTA2MWQwNzQ3NmQxNDhkY2RkOGJmYjc2ZTMzODAzNTk0M2Iz
         
     | 
| 
      
 15 
     | 
    
         
            +
                NWJkMjY3ZWJiZmZmMjRhMTY4NDNmMjEwNzlhMGUyZDA2NTdjMGI=
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0.3. 
     | 
| 
      
 1 
     | 
    
         
            +
            0.3.1
         
     | 
| 
         @@ -0,0 +1,99 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'fluent/test'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'benchmark'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            if ENV["PROFILE"]
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'ruby-prof'
         
     | 
| 
      
 6 
     | 
    
         
            +
            end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "lib")))
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'fluent/plugin/out_redis_counter'
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            module PerformanceTestApp
         
     | 
| 
      
 12 
     | 
    
         
            +
              class Benchmarker
         
     | 
| 
      
 13 
     | 
    
         
            +
                def initialize
         
     | 
| 
      
 14 
     | 
    
         
            +
                  Fluent::Test.setup
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @fluent = Fluent::Test::BufferedOutputTestDriver.new(Fluent::RedisCounterOutput).configure(%[
         
     | 
| 
      
 16 
     | 
    
         
            +
                      host localhost
         
     | 
| 
      
 17 
     | 
    
         
            +
                      port 6379
         
     | 
| 
      
 18 
     | 
    
         
            +
                      db_number 1
         
     | 
| 
      
 19 
     | 
    
         
            +
                      <pattern>
         
     | 
| 
      
 20 
     | 
    
         
            +
                        match_status ^2[0-9]{2}$
         
     | 
| 
      
 21 
     | 
    
         
            +
                        count_key_format status-normal:item_id:%_{item_id}
         
     | 
| 
      
 22 
     | 
    
         
            +
                        count_value 1
         
     | 
| 
      
 23 
     | 
    
         
            +
                      </pattern>
         
     | 
| 
      
 24 
     | 
    
         
            +
                  ])
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def prepare
         
     | 
| 
      
 28 
     | 
    
         
            +
                  10_0000.times do
         
     | 
| 
      
 29 
     | 
    
         
            +
                    item_id = ( rand * 10_0000 ).to_i
         
     | 
| 
      
 30 
     | 
    
         
            +
                    @fluent.emit({ "status" => "200", "item_id" => item_id })
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                def run
         
     | 
| 
      
 35 
     | 
    
         
            +
                  result = nil
         
     | 
| 
      
 36 
     | 
    
         
            +
                  profile = nil
         
     | 
| 
      
 37 
     | 
    
         
            +
                  Benchmark.bm do |x|
         
     | 
| 
      
 38 
     | 
    
         
            +
                    result = x.report {
         
     | 
| 
      
 39 
     | 
    
         
            +
                      if ENV["PROFILE"]
         
     | 
| 
      
 40 
     | 
    
         
            +
                        profile = RubyProf.profile do
         
     | 
| 
      
 41 
     | 
    
         
            +
                          @fluent.run
         
     | 
| 
      
 42 
     | 
    
         
            +
                        end
         
     | 
| 
      
 43 
     | 
    
         
            +
                      else
         
     | 
| 
      
 44 
     | 
    
         
            +
                          @fluent.run
         
     | 
| 
      
 45 
     | 
    
         
            +
                      end
         
     | 
| 
      
 46 
     | 
    
         
            +
                    }
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  if ENV["PROFILE"]
         
     | 
| 
      
 50 
     | 
    
         
            +
                    profile_printer = RubyProf::GraphPrinter.new(profile)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    profile_printer.print(STDOUT, {})
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                  $log.info("benchmark result: #{result}")
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
              class MemoryWatcher
         
     | 
| 
      
 58 
     | 
    
         
            +
                def initialize
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                def run(&block)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  start_memory = get_memory(Process.pid)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  pid = Process.fork do
         
     | 
| 
      
 64 
     | 
    
         
            +
                    block.call
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  @max_memory = 0
         
     | 
| 
      
 67 
     | 
    
         
            +
                  th = Thread.new do
         
     | 
| 
      
 68 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 69 
     | 
    
         
            +
                      loop do
         
     | 
| 
      
 70 
     | 
    
         
            +
                        sleep(0.01)
         
     | 
| 
      
 71 
     | 
    
         
            +
                        msize = get_memory(pid)
         
     | 
| 
      
 72 
     | 
    
         
            +
                        if msize > @max_memory
         
     | 
| 
      
 73 
     | 
    
         
            +
                          @max_memory = msize
         
     | 
| 
      
 74 
     | 
    
         
            +
                        end
         
     | 
| 
      
 75 
     | 
    
         
            +
                      end
         
     | 
| 
      
 76 
     | 
    
         
            +
                    ensure
         
     | 
| 
      
 77 
     | 
    
         
            +
                      $log.info("start memory size:\t#{sprintf("%#10d", start_memory / 1024)}KB")
         
     | 
| 
      
 78 
     | 
    
         
            +
                      $log.info("max memory size:\t#{sprintf("%#10d", @max_memory / 1024)}KB")
         
     | 
| 
      
 79 
     | 
    
         
            +
                    end
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
                  Process.waitall
         
     | 
| 
      
 82 
     | 
    
         
            +
                  th.kill
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                def get_memory(pid)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  `ps -h -o rss= -p #{pid}`.to_i * 1024
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
            end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            if $0 == __FILE__
         
     | 
| 
      
 92 
     | 
    
         
            +
              parent = PerformanceTestApp::MemoryWatcher.new
         
     | 
| 
      
 93 
     | 
    
         
            +
              app = PerformanceTestApp::Benchmarker.new
         
     | 
| 
      
 94 
     | 
    
         
            +
              parent.run do
         
     | 
| 
      
 95 
     | 
    
         
            +
                app.prepare
         
     | 
| 
      
 96 
     | 
    
         
            +
                app.run
         
     | 
| 
      
 97 
     | 
    
         
            +
              end
         
     | 
| 
      
 98 
     | 
    
         
            +
            end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
         @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       5 
5 
     | 
    
         
             
              s.name        = "fluent-plugin-redis-counter"
         
     | 
| 
       6 
     | 
    
         
            -
              s.version     = "0.3. 
     | 
| 
      
 6 
     | 
    
         
            +
              s.version     = "0.3.1"
         
     | 
| 
       7 
7 
     | 
    
         
             
              s.description = "fluent-plugin-redis-counter is a fluent plugin to count-up/down redis keys."
         
     | 
| 
       8 
8 
     | 
    
         
             
              s.platform    = Gem::Platform::RUBY
         
     | 
| 
       9 
9 
     | 
    
         
             
              s.authors     = ["Buntaro Okada"]
         
     | 
| 
         @@ -3,6 +3,8 @@ module Fluent 
     | 
|
| 
       3 
3 
     | 
    
         
             
                Fluent::Plugin.register_output('redis_counter', self)
         
     | 
| 
       4 
4 
     | 
    
         
             
                attr_reader :host, :port, :db_number, :redis, :patterns
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
      
 6 
     | 
    
         
            +
                config_param :max_pipelining, :integer, :default => 1000
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       6 
8 
     | 
    
         
             
                def initialize
         
     | 
| 
       7 
9 
     | 
    
         
             
                  super
         
     | 
| 
       8 
10 
     | 
    
         
             
                  require 'redis'
         
     | 
| 
         @@ -61,8 +63,12 @@ module Fluent 
     | 
|
| 
       61 
63 
     | 
    
         
             
                  }
         
     | 
| 
       62 
64 
     | 
    
         
             
                  table.each_pair.select { |key, value|
         
     | 
| 
       63 
65 
     | 
    
         
             
                    value != 0
         
     | 
| 
       64 
     | 
    
         
            -
                  }. 
     | 
| 
       65 
     | 
    
         
            -
                    @redis. 
     | 
| 
      
 66 
     | 
    
         
            +
                  }.each_slice(@max_pipelining) { |items|
         
     | 
| 
      
 67 
     | 
    
         
            +
                    @redis.pipelined do
         
     | 
| 
      
 68 
     | 
    
         
            +
                      items.each do |key, value|
         
     | 
| 
      
 69 
     | 
    
         
            +
                        @redis.incrby(key, value)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      end
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
       66 
72 
     | 
    
         
             
                  }
         
     | 
| 
       67 
73 
     | 
    
         
             
                end
         
     | 
| 
       68 
74 
     | 
    
         | 
| 
         @@ -75,10 +81,11 @@ module Fluent 
     | 
|
| 
       75 
81 
     | 
    
         
             
                    @format = format
         
     | 
| 
       76 
82 
     | 
    
         
             
                  end
         
     | 
| 
       77 
83 
     | 
    
         | 
| 
      
 84 
     | 
    
         
            +
                  CUSTOM_KEY_EXPRESSION_RE = /(%_\{([^\}]+)\})/
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
       78 
86 
     | 
    
         
             
                  def key(record)
         
     | 
| 
       79 
     | 
    
         
            -
                    @format.gsub( 
     | 
| 
       80 
     | 
    
         
            -
                       
     | 
| 
       81 
     | 
    
         
            -
                      record[key]
         
     | 
| 
      
 87 
     | 
    
         
            +
                    @format.gsub(CUSTOM_KEY_EXPRESSION_RE) do |s|
         
     | 
| 
      
 88 
     | 
    
         
            +
                      record[$2]
         
     | 
| 
       82 
89 
     | 
    
         
             
                    end
         
     | 
| 
       83 
90 
     | 
    
         
             
                  end
         
     | 
| 
       84 
91 
     | 
    
         
             
                end
         
     | 
| 
         @@ -105,6 +112,7 @@ module Fluent 
     | 
|
| 
       105 
112 
     | 
    
         
             
                        is_localtime = false
         
     | 
| 
       106 
113 
     | 
    
         
             
                      end
         
     | 
| 
       107 
114 
     | 
    
         
             
                      @count_key_format = [conf_element['count_key_format'], is_localtime]
         
     | 
| 
      
 115 
     | 
    
         
            +
                      @record_value_formatter = RecordValueFormatter.new(@count_key_format[0])
         
     | 
| 
       108 
116 
     | 
    
         
             
                    end
         
     | 
| 
       109 
117 
     | 
    
         | 
| 
       110 
118 
     | 
    
         
             
                    if conf_element.has_key?('count_value_key')
         
     | 
| 
         @@ -142,7 +150,7 @@ module Fluent 
     | 
|
| 
       142 
150 
     | 
    
         
             
                    if @count_key_format == nil
         
     | 
| 
       143 
151 
     | 
    
         
             
                      @count_key
         
     | 
| 
       144 
152 
     | 
    
         
             
                    else
         
     | 
| 
       145 
     | 
    
         
            -
                      count_key =  
     | 
| 
      
 153 
     | 
    
         
            +
                      count_key = @record_value_formatter.key(record)
         
     | 
| 
       146 
154 
     | 
    
         
             
                      formatter = TimeFormatter.new(count_key, @count_key_format[1])
         
     | 
| 
       147 
155 
     | 
    
         
             
                      formatter.format(time)
         
     | 
| 
       148 
156 
     | 
    
         
             
                    end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: fluent-plugin-redis-counter
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.3.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Buntaro Okada
         
     | 
| 
         @@ -52,6 +52,7 @@ files: 
     | 
|
| 
       52 
52 
     | 
    
         
             
            - README.md
         
     | 
| 
       53 
53 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       54 
54 
     | 
    
         
             
            - VERSION
         
     | 
| 
      
 55 
     | 
    
         
            +
            - benchmark/performance_test.rb
         
     | 
| 
       55 
56 
     | 
    
         
             
            - fluent-plugin-redis-counter.gemspec
         
     | 
| 
       56 
57 
     | 
    
         
             
            - lib/fluent/plugin/out_redis_counter.rb
         
     | 
| 
       57 
58 
     | 
    
         
             
            - test/plugin/out_redis_counter.rb
         
     |