fluent-plugin-kinesis 1.3.0 → 2.0.0
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 +4 -4
- data/.travis.yml +2 -23
- data/CHANGELOG.md +13 -0
- data/Gemfile +9 -9
- data/LICENSE.txt +201 -40
- data/Makefile +24 -31
- data/README.md +179 -308
- data/Rakefile +9 -13
- data/benchmark/task.rake +96 -58
- data/fluent-plugin-kinesis.gemspec +15 -19
- data/gemfiles/Gemfile.fluentd-0.12 +10 -10
- data/lib/fluent/plugin/kinesis.rb +166 -0
- data/lib/fluent/plugin/kinesis_helper/aggregator.rb +99 -0
- data/lib/fluent/plugin/kinesis_helper/api.rb +152 -121
- data/lib/fluent/plugin/kinesis_helper/client.rb +125 -12
- data/lib/fluent/plugin/out_kinesis_firehose.rb +40 -27
- data/lib/fluent/plugin/out_kinesis_streams.rb +51 -30
- data/lib/fluent/plugin/out_kinesis_streams_aggregated.rb +76 -0
- data/lib/fluent_plugin_kinesis/version.rb +10 -10
- metadata +18 -70
- data/README-v0.4.md +0 -348
- data/benchmark/dummy.conf +0 -0
- data/gemfiles/Gemfile.aws-sdk-2.4 +0 -20
- data/gemfiles/Gemfile.fluentd-0.10.58 +0 -20
- data/gemfiles/Gemfile.fluentd-0.14.11 +0 -20
- data/gemfiles/Gemfile.ruby-2.0 +0 -21
- data/gemfiles/Gemfile.ruby-2.1 +0 -21
- data/lib/fluent/plugin/kinesis_helper.rb +0 -36
- data/lib/fluent/plugin/kinesis_helper/class_methods.rb +0 -123
- data/lib/fluent/plugin/kinesis_helper/credentials.rb +0 -51
- data/lib/fluent/plugin/kinesis_helper/error.rb +0 -43
- data/lib/fluent/plugin/kinesis_helper/format.rb +0 -85
- data/lib/fluent/plugin/kinesis_helper/initialize.rb +0 -59
- data/lib/fluent/plugin/kinesis_helper/kpl.rb +0 -82
- data/lib/fluent/plugin/out_kinesis.rb +0 -323
- data/lib/fluent/plugin/out_kinesis_producer.rb +0 -48
- data/lib/fluent/plugin/patched_detach_process_impl.rb +0 -103
- data/lib/kinesis_producer.rb +0 -24
- data/lib/kinesis_producer/binary.rb +0 -10
- data/lib/kinesis_producer/daemon.rb +0 -270
- data/lib/kinesis_producer/library.rb +0 -122
- data/lib/kinesis_producer/protobuf/config.pb.rb +0 -66
- data/lib/kinesis_producer/protobuf/messages.pb.rb +0 -151
- data/lib/kinesis_producer/tasks/binary.rake +0 -73
    
        data/lib/kinesis_producer.rb
    DELETED
    
    | @@ -1,24 +0,0 @@ | |
| 1 | 
            -
            #
         | 
| 2 | 
            -
            #  Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
         | 
| 3 | 
            -
            # 
         | 
| 4 | 
            -
            #  Licensed under the Amazon Software License (the "License").
         | 
| 5 | 
            -
            #  You may not use this file except in compliance with the License.
         | 
| 6 | 
            -
            #  A copy of the License is located at
         | 
| 7 | 
            -
            # 
         | 
| 8 | 
            -
            #  http://aws.amazon.com/asl/
         | 
| 9 | 
            -
            # 
         | 
| 10 | 
            -
            #  or in the "license" file accompanying this file. This file is distributed
         | 
| 11 | 
            -
            #  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
         | 
| 12 | 
            -
            #  express or implied. See the License for the specific language governing
         | 
| 13 | 
            -
            #  permissions and limitations under the License.
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            require 'protobuf'
         | 
| 16 | 
            -
            require 'kinesis_producer/binary'
         | 
| 17 | 
            -
            require 'kinesis_producer/library'
         | 
| 18 | 
            -
            require 'kinesis_producer/daemon'
         | 
| 19 | 
            -
            require 'kinesis_producer/protobuf/config.pb'
         | 
| 20 | 
            -
            require 'kinesis_producer/protobuf/messages.pb'
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            module KinesisProducer
         | 
| 23 | 
            -
              ConfigurationFields = Protobuf::Configuration.all_fields.reject(&:repeated?)
         | 
| 24 | 
            -
            end
         | 
| @@ -1,10 +0,0 @@ | |
| 1 | 
            -
            module KinesisProducer
         | 
| 2 | 
            -
              class Binary
         | 
| 3 | 
            -
                Dir = 'amazon-kinesis-producer-native-binaries'
         | 
| 4 | 
            -
                Files = {
         | 
| 5 | 
            -
                  'linux'   => File.join(Dir, 'linux',   'kinesis_producer'),
         | 
| 6 | 
            -
                  'osx'     => File.join(Dir, 'osx',     'kinesis_producer'),
         | 
| 7 | 
            -
                  'windows' => File.join(Dir, 'windows', 'kinesis_producer.exe'),
         | 
| 8 | 
            -
                }
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
            end
         | 
| @@ -1,270 +0,0 @@ | |
| 1 | 
            -
            #
         | 
| 2 | 
            -
            #  Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
         | 
| 3 | 
            -
            #
         | 
| 4 | 
            -
            #  Licensed under the Amazon Software License (the "License").
         | 
| 5 | 
            -
            #  You may not use this file except in compliance with the License.
         | 
| 6 | 
            -
            #  A copy of the License is located at
         | 
| 7 | 
            -
            #
         | 
| 8 | 
            -
            #  http://aws.amazon.com/asl/
         | 
| 9 | 
            -
            #
         | 
| 10 | 
            -
            #  or in the "license" file accompanying this file. This file is distributed
         | 
| 11 | 
            -
            #  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
         | 
| 12 | 
            -
            #  express or implied. See the License for the specific language governing
         | 
| 13 | 
            -
            #  permissions and limitations under the License.
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            require 'tempfile'
         | 
| 16 | 
            -
            require 'concurrent'
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            module KinesisProducer
         | 
| 19 | 
            -
              class Daemon
         | 
| 20 | 
            -
                FixnumMax = (2 ** (64 - 2)) - 1
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                def initialize(binary, handler, options)
         | 
| 23 | 
            -
                  @binary  = binary
         | 
| 24 | 
            -
                  @handler = handler
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                  @configuration             = options[:configuration] || {}
         | 
| 27 | 
            -
                  @credentials               = options[:credentials]
         | 
| 28 | 
            -
                  @metrics_credentials       = options[:metrics_credentials]
         | 
| 29 | 
            -
                  @credentials_refresh_delay = options[:credentials_refresh_delay] || 5000
         | 
| 30 | 
            -
                  @logger                    = options[:logger]
         | 
| 31 | 
            -
                  @debug                     = options[:debug]
         | 
| 32 | 
            -
                  @enable_kpl_logging        = options[:enable_kpl_logging]
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                  @executor = Concurrent::CachedThreadPool.new
         | 
| 35 | 
            -
                  @shutdown = Concurrent::AtomicBoolean.new(false)
         | 
| 36 | 
            -
                  @outgoing_messages = Queue.new
         | 
| 37 | 
            -
                  @incoming_messages = Queue.new
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                  if debug?
         | 
| 40 | 
            -
                    @meters = {
         | 
| 41 | 
            -
                      add_message:     Meter.new,
         | 
| 42 | 
            -
                      send_message:    Meter.new,
         | 
| 43 | 
            -
                      receive_message: Meter.new,
         | 
| 44 | 
            -
                      return_message:  Meter.new,
         | 
| 45 | 
            -
                    }
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
                end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                def start
         | 
| 50 | 
            -
                  @executor.post do
         | 
| 51 | 
            -
                    create_pipes
         | 
| 52 | 
            -
                    start_child
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                def destroy
         | 
| 57 | 
            -
                  @shutdown.make_true
         | 
| 58 | 
            -
                  if @pid
         | 
| 59 | 
            -
                    Process.kill("TERM", @pid)
         | 
| 60 | 
            -
                    Process.waitpid(@pid)
         | 
| 61 | 
            -
                    sleep 1 # TODO
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
                  delete_pipes
         | 
| 64 | 
            -
                end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                def add(message)
         | 
| 67 | 
            -
                  @outgoing_messages.push(message)
         | 
| 68 | 
            -
                  @meters[:add_message].mark if debug?
         | 
| 69 | 
            -
                end
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                private
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                def create_pipes
         | 
| 74 | 
            -
                  @in_pipe  = temp_pathname('amz-aws-kpl-in-pipe-')
         | 
| 75 | 
            -
                  @out_pipe = temp_pathname('amz-aws-kpl-out-pipe-')
         | 
| 76 | 
            -
                  system("mkfifo", @in_pipe.to_path, @out_pipe.to_path)
         | 
| 77 | 
            -
                  sleep 1 # TODO
         | 
| 78 | 
            -
                end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                def delete_pipes
         | 
| 81 | 
            -
                  @in_channel.close  unless @in_channel.nil?
         | 
| 82 | 
            -
                  @out_channel.close unless @out_channel.nil?
         | 
| 83 | 
            -
                  @in_pipe.unlink
         | 
| 84 | 
            -
                  @out_pipe.unlink
         | 
| 85 | 
            -
                rescue Errno::ENOENT
         | 
| 86 | 
            -
                end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                def temp_pathname(basename)
         | 
| 89 | 
            -
                  tempfile = Tempfile.new(basename)
         | 
| 90 | 
            -
                  ObjectSpace.undefine_finalizer(tempfile)
         | 
| 91 | 
            -
                  file = tempfile.path
         | 
| 92 | 
            -
                  File.delete(file)
         | 
| 93 | 
            -
                  Pathname.new(file)
         | 
| 94 | 
            -
                end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                def start_child
         | 
| 97 | 
            -
                  start_child_daemon
         | 
| 98 | 
            -
                  connect_to_child
         | 
| 99 | 
            -
                  start_loops
         | 
| 100 | 
            -
                end
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                def start_child_daemon
         | 
| 103 | 
            -
                  @child_stdout, stdout = IO.pipe
         | 
| 104 | 
            -
                  @child_stderr, stderr = IO.pipe
         | 
| 105 | 
            -
                  @pid = Process.fork do
         | 
| 106 | 
            -
                    Process.setsid
         | 
| 107 | 
            -
                    STDOUT.sync = true
         | 
| 108 | 
            -
                    $stdout.reopen stdout
         | 
| 109 | 
            -
                    $stderr.reopen stderr
         | 
| 110 | 
            -
                    @child_stdout.close
         | 
| 111 | 
            -
                    @child_stderr.close
         | 
| 112 | 
            -
                    configuration = make_configuration_message
         | 
| 113 | 
            -
                    credentials = make_set_credentials_message
         | 
| 114 | 
            -
                    command = [@binary, @out_pipe.to_path, @in_pipe.to_path, to_hex(configuration), to_hex(credentials)]
         | 
| 115 | 
            -
                    if @metrics_credentials
         | 
| 116 | 
            -
                      metrics_credentials = make_set_metrics_credentials_message
         | 
| 117 | 
            -
                      command.push(to_hex(metrics_credentials))
         | 
| 118 | 
            -
                    end
         | 
| 119 | 
            -
                    exec(*command)
         | 
| 120 | 
            -
                  end
         | 
| 121 | 
            -
                  stdout.close
         | 
| 122 | 
            -
                  stderr.close
         | 
| 123 | 
            -
                  sleep 1 # TODO
         | 
| 124 | 
            -
                end
         | 
| 125 | 
            -
             | 
| 126 | 
            -
                def connect_to_child
         | 
| 127 | 
            -
                  @in_channel  = @in_pipe.open('r')
         | 
| 128 | 
            -
                  @out_channel = @out_pipe.open('w')
         | 
| 129 | 
            -
                end
         | 
| 130 | 
            -
             | 
| 131 | 
            -
                def enable_kpl_logging?
         | 
| 132 | 
            -
                  @enable_kpl_logging
         | 
| 133 | 
            -
                end
         | 
| 134 | 
            -
             | 
| 135 | 
            -
                def start_loops
         | 
| 136 | 
            -
                  start_loop_for(:log_stdout) if enable_kpl_logging?
         | 
| 137 | 
            -
                  start_loop_for(:log_stderr) if enable_kpl_logging?
         | 
| 138 | 
            -
                  start_loop_for(:send_message)
         | 
| 139 | 
            -
                  start_loop_for(:receive_message)
         | 
| 140 | 
            -
                  start_loop_for(:return_message)
         | 
| 141 | 
            -
                  start_loop_for(:update_credentials)
         | 
| 142 | 
            -
                  start_loop_for(:tick) if debug?
         | 
| 143 | 
            -
                end
         | 
| 144 | 
            -
             | 
| 145 | 
            -
                def start_loop_for(method)
         | 
| 146 | 
            -
                  @executor.post do
         | 
| 147 | 
            -
                    while @shutdown.false?
         | 
| 148 | 
            -
                      send(method)
         | 
| 149 | 
            -
                      @meters[method].mark if debug? and @meters.include?(method)
         | 
| 150 | 
            -
                    end
         | 
| 151 | 
            -
                  end
         | 
| 152 | 
            -
                end
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                def log_stdout
         | 
| 155 | 
            -
                  line = @child_stdout.readline.chomp
         | 
| 156 | 
            -
                  @logger.info(line)
         | 
| 157 | 
            -
                end
         | 
| 158 | 
            -
             | 
| 159 | 
            -
                def log_stderr
         | 
| 160 | 
            -
                  line = @child_stderr.readline.chomp
         | 
| 161 | 
            -
                  if line.include? ' [info] '
         | 
| 162 | 
            -
                    @logger.info(line)
         | 
| 163 | 
            -
                  elsif line.include? ' [warn] '
         | 
| 164 | 
            -
                    @logger.warn(line)
         | 
| 165 | 
            -
                  else
         | 
| 166 | 
            -
                    @logger.error(line)
         | 
| 167 | 
            -
                  end
         | 
| 168 | 
            -
                end
         | 
| 169 | 
            -
             | 
| 170 | 
            -
                def send_message
         | 
| 171 | 
            -
                  message = @outgoing_messages.pop
         | 
| 172 | 
            -
                  size = [message.size].pack('N*')
         | 
| 173 | 
            -
                  @out_channel.write(size)
         | 
| 174 | 
            -
                  @out_channel.write(message)
         | 
| 175 | 
            -
                  @out_channel.flush
         | 
| 176 | 
            -
                end
         | 
| 177 | 
            -
             | 
| 178 | 
            -
                def receive_message
         | 
| 179 | 
            -
                  size = @in_channel.read(4)
         | 
| 180 | 
            -
                  data = @in_channel.read(size.unpack('N*').first)
         | 
| 181 | 
            -
                  @incoming_messages.push(data)
         | 
| 182 | 
            -
                end
         | 
| 183 | 
            -
             | 
| 184 | 
            -
                def return_message
         | 
| 185 | 
            -
                  data = @incoming_messages.pop
         | 
| 186 | 
            -
                  message = KinesisProducer::Protobuf::Message.decode(data)
         | 
| 187 | 
            -
                  @handler.on_message(message)
         | 
| 188 | 
            -
                end
         | 
| 189 | 
            -
             | 
| 190 | 
            -
                def update_credentials
         | 
| 191 | 
            -
                  add(make_set_credentials_message)
         | 
| 192 | 
            -
                  add(make_set_metrics_credentials_message) if @metrics_credentials
         | 
| 193 | 
            -
                  sleep(@credentials_refresh_delay.to_f/1000)
         | 
| 194 | 
            -
                end
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                def make_configuration_message
         | 
| 197 | 
            -
                  configuration = @configuration
         | 
| 198 | 
            -
                  KinesisProducer::ConfigurationFields.each do |field|
         | 
| 199 | 
            -
                    if configuration[field.name].nil?
         | 
| 200 | 
            -
                      configuration[field.name] = field.default_value
         | 
| 201 | 
            -
                    end
         | 
| 202 | 
            -
                  end
         | 
| 203 | 
            -
                  config = KinesisProducer::Protobuf::Configuration.new(configuration)
         | 
| 204 | 
            -
                  make_message(0, :configuration, config)
         | 
| 205 | 
            -
                end
         | 
| 206 | 
            -
             | 
| 207 | 
            -
                def make_set_credentials_message
         | 
| 208 | 
            -
                  make_set_credential_message(@credentials)
         | 
| 209 | 
            -
                end
         | 
| 210 | 
            -
             | 
| 211 | 
            -
                def make_set_metrics_credentials_message
         | 
| 212 | 
            -
                  make_set_credential_message(@metrics_credentials, true)
         | 
| 213 | 
            -
                end
         | 
| 214 | 
            -
             | 
| 215 | 
            -
                def make_set_credential_message(credentials, for_metrics = false)
         | 
| 216 | 
            -
                  return nil if credentials.nil?
         | 
| 217 | 
            -
                  cred = KinesisProducer::Protobuf::Credentials.new(
         | 
| 218 | 
            -
                    akid:       credentials.credentials.access_key_id,
         | 
| 219 | 
            -
                    secret_key: credentials.credentials.secret_access_key,
         | 
| 220 | 
            -
                    token:      credentials.credentials.session_token
         | 
| 221 | 
            -
                  )
         | 
| 222 | 
            -
                  set_credentials = KinesisProducer::Protobuf::SetCredentials.new(credentials: cred, for_metrics: for_metrics)
         | 
| 223 | 
            -
                  make_message(FixnumMax, :set_credentials, set_credentials)
         | 
| 224 | 
            -
                end
         | 
| 225 | 
            -
             | 
| 226 | 
            -
                def make_message(id, target, value)
         | 
| 227 | 
            -
                  KinesisProducer::Protobuf::Message.new(id: id, target => value).encode
         | 
| 228 | 
            -
                end
         | 
| 229 | 
            -
             | 
| 230 | 
            -
                def to_hex(message)
         | 
| 231 | 
            -
                  message.unpack('H*').first
         | 
| 232 | 
            -
                end
         | 
| 233 | 
            -
             | 
| 234 | 
            -
                def tick
         | 
| 235 | 
            -
                  out = @meters.each_value.map do |meter|
         | 
| 236 | 
            -
                    sprintf("%5d", meter.tick)
         | 
| 237 | 
            -
                  end
         | 
| 238 | 
            -
                  @logger.debug("[#{Thread.current.object_id}] "+out.join(" ")) if debug?
         | 
| 239 | 
            -
                  sleep 1
         | 
| 240 | 
            -
                end
         | 
| 241 | 
            -
             | 
| 242 | 
            -
                def debug?
         | 
| 243 | 
            -
                  @debug
         | 
| 244 | 
            -
                end
         | 
| 245 | 
            -
             | 
| 246 | 
            -
                class Meter
         | 
| 247 | 
            -
                  def initialize
         | 
| 248 | 
            -
                    @count = Concurrent::AtomicFixnum.new(0)
         | 
| 249 | 
            -
                    @previous_tick_time = Time.now.to_f
         | 
| 250 | 
            -
                    @current_rate = 0.0
         | 
| 251 | 
            -
                    tick
         | 
| 252 | 
            -
                  end
         | 
| 253 | 
            -
             | 
| 254 | 
            -
                  def mark(count = 1)
         | 
| 255 | 
            -
                    @count.increment(count)
         | 
| 256 | 
            -
                  end
         | 
| 257 | 
            -
             | 
| 258 | 
            -
                  def tick
         | 
| 259 | 
            -
                    @current_rate = @count.value.to_f / (Time.now.to_f - @previous_tick_time)
         | 
| 260 | 
            -
                    @count.value = 0
         | 
| 261 | 
            -
                    @previous_tick_time = Time.now.to_f
         | 
| 262 | 
            -
                    current_rate
         | 
| 263 | 
            -
                  end
         | 
| 264 | 
            -
             | 
| 265 | 
            -
                  def current_rate
         | 
| 266 | 
            -
                    @current_rate
         | 
| 267 | 
            -
                  end
         | 
| 268 | 
            -
                end
         | 
| 269 | 
            -
              end
         | 
| 270 | 
            -
            end
         | 
| @@ -1,122 +0,0 @@ | |
| 1 | 
            -
            #
         | 
| 2 | 
            -
            #  Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
         | 
| 3 | 
            -
            #
         | 
| 4 | 
            -
            #  Licensed under the Amazon Software License (the "License").
         | 
| 5 | 
            -
            #  You may not use this file except in compliance with the License.
         | 
| 6 | 
            -
            #  A copy of the License is located at
         | 
| 7 | 
            -
            #
         | 
| 8 | 
            -
            #  http://aws.amazon.com/asl/
         | 
| 9 | 
            -
            #
         | 
| 10 | 
            -
            #  or in the "license" file accompanying this file. This file is distributed
         | 
| 11 | 
            -
            #  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
         | 
| 12 | 
            -
            #  express or implied. See the License for the specific language governing
         | 
| 13 | 
            -
            #  permissions and limitations under the License.
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            require 'concurrent'
         | 
| 16 | 
            -
            require 'os'
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            module KinesisProducer
         | 
| 19 | 
            -
              class Library
         | 
| 20 | 
            -
                class Handler
         | 
| 21 | 
            -
                  def initialize(futures)
         | 
| 22 | 
            -
                    @futures = futures
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  def on_message(message)
         | 
| 26 | 
            -
                    if !message.put_record_result.nil?
         | 
| 27 | 
            -
                      on_put_record_result(message)
         | 
| 28 | 
            -
                    elsif !message.metrics_response.nil?
         | 
| 29 | 
            -
                      on_metrics_response(message)
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
                  end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  def on_put_record_result(message)
         | 
| 34 | 
            -
                    source_id = message.source_id
         | 
| 35 | 
            -
                    result = message.put_record_result
         | 
| 36 | 
            -
                    f = @futures.fetch(source_id)
         | 
| 37 | 
            -
                    @futures.delete(source_id)
         | 
| 38 | 
            -
                    if result.success
         | 
| 39 | 
            -
                      f.set(result)
         | 
| 40 | 
            -
                    else
         | 
| 41 | 
            -
                      f.fail(StandardError.new(result.to_hash))
         | 
| 42 | 
            -
                    end
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  def on_metrics_response(message)
         | 
| 46 | 
            -
                    source_id = message.source_id
         | 
| 47 | 
            -
                    response = message.metrics_response
         | 
| 48 | 
            -
                    f = @futures.fetch(source_id)
         | 
| 49 | 
            -
                    @futures.delete(source_id)
         | 
| 50 | 
            -
                    f.set(response.metrics)
         | 
| 51 | 
            -
                  end
         | 
| 52 | 
            -
                end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                class << self
         | 
| 55 | 
            -
                  def binary
         | 
| 56 | 
            -
                    case
         | 
| 57 | 
            -
                    when OS.linux?;   Binary::Files['linux']
         | 
| 58 | 
            -
                    when OS.osx?;     Binary::Files['osx']
         | 
| 59 | 
            -
                    when OS.windows?; Binary::Files['windows']
         | 
| 60 | 
            -
                    else; raise
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                  def default_binary_path
         | 
| 65 | 
            -
                    root_dir = File.expand_path('../../..', __FILE__)
         | 
| 66 | 
            -
                    File.join(root_dir, binary)
         | 
| 67 | 
            -
                  end
         | 
| 68 | 
            -
                end
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                def initialize(options)
         | 
| 71 | 
            -
                  @binary_path = options.delete(:binary_path) || self.class.default_binary_path
         | 
| 72 | 
            -
                  @message_id = Concurrent::AtomicFixnum.new(1)
         | 
| 73 | 
            -
                  @futures = Concurrent::Map.new
         | 
| 74 | 
            -
                  @child = Daemon.new(@binary_path, Handler.new(@futures), options)
         | 
| 75 | 
            -
                  @child.start
         | 
| 76 | 
            -
                end
         | 
| 77 | 
            -
             | 
| 78 | 
            -
                def destroy
         | 
| 79 | 
            -
                  flush_sync
         | 
| 80 | 
            -
                  @child.destroy
         | 
| 81 | 
            -
                end
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                def put_record(options)
         | 
| 84 | 
            -
                  f = Concurrent::IVar.new
         | 
| 85 | 
            -
                  id = add_message(:put_record, KinesisProducer::Protobuf::PutRecord.new(options))
         | 
| 86 | 
            -
                  @futures[id] = f
         | 
| 87 | 
            -
                  f
         | 
| 88 | 
            -
                end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                def get_metrics(options = {})
         | 
| 91 | 
            -
                  f = Concurrent::IVar.new
         | 
| 92 | 
            -
                  id = add_message(:metrics_request, KinesisProducer::Protobuf::MetricsRequest.new(options))
         | 
| 93 | 
            -
                  @futures[id] = f
         | 
| 94 | 
            -
                  f.wait
         | 
| 95 | 
            -
                  f.value
         | 
| 96 | 
            -
                end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                def flush(options = {})
         | 
| 99 | 
            -
                  add_message(:flush, KinesisProducer::Protobuf::Flush.new(options))
         | 
| 100 | 
            -
                end
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                def flush_sync
         | 
| 103 | 
            -
                  while @futures.size > 0
         | 
| 104 | 
            -
                    flush()
         | 
| 105 | 
            -
                    sleep 0.5
         | 
| 106 | 
            -
                  end
         | 
| 107 | 
            -
                end
         | 
| 108 | 
            -
             | 
| 109 | 
            -
                private
         | 
| 110 | 
            -
             | 
| 111 | 
            -
                def add_message(target, value)
         | 
| 112 | 
            -
                  id = get_and_inc_message_id
         | 
| 113 | 
            -
                  message = KinesisProducer::Protobuf::Message.new(id: id, target => value)
         | 
| 114 | 
            -
                  @child.add(message.encode)
         | 
| 115 | 
            -
                  id
         | 
| 116 | 
            -
                end
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                def get_and_inc_message_id
         | 
| 119 | 
            -
                  @message_id.increment
         | 
| 120 | 
            -
                end
         | 
| 121 | 
            -
              end
         | 
| 122 | 
            -
            end
         | 
| @@ -1,66 +0,0 @@ | |
| 1 | 
            -
            #
         | 
| 2 | 
            -
            #  Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
         | 
| 3 | 
            -
            #
         | 
| 4 | 
            -
            #  Licensed under the Amazon Software License (the "License").
         | 
| 5 | 
            -
            #  You may not use this file except in compliance with the License.
         | 
| 6 | 
            -
            #  A copy of the License is located at
         | 
| 7 | 
            -
            #
         | 
| 8 | 
            -
            #  http://aws.amazon.com/asl/
         | 
| 9 | 
            -
            #
         | 
| 10 | 
            -
            #  or in the "license" file accompanying this file. This file is distributed
         | 
| 11 | 
            -
            #  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
         | 
| 12 | 
            -
            #  express or implied. See the License for the specific language governing
         | 
| 13 | 
            -
            #  permissions and limitations under the License.
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            ##
         | 
| 16 | 
            -
            # This file is auto-generated. DO NOT EDIT!
         | 
| 17 | 
            -
            #
         | 
| 18 | 
            -
            require 'protobuf/message'
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            module KinesisProducer
         | 
| 21 | 
            -
              module Protobuf
         | 
| 22 | 
            -
                ##
         | 
| 23 | 
            -
                # Message Classes
         | 
| 24 | 
            -
                #
         | 
| 25 | 
            -
                class AdditionalDimension < ::Protobuf::Message; end
         | 
| 26 | 
            -
                class Configuration < ::Protobuf::Message; end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
                ##
         | 
| 30 | 
            -
                # Message Fields
         | 
| 31 | 
            -
                #
         | 
| 32 | 
            -
                class AdditionalDimension
         | 
| 33 | 
            -
                  required :string, :key, 1
         | 
| 34 | 
            -
                  required :string, :value, 2
         | 
| 35 | 
            -
                  required :string, :granularity, 3
         | 
| 36 | 
            -
                end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                class Configuration
         | 
| 39 | 
            -
                  repeated ::KinesisProducer::Protobuf::AdditionalDimension, :additional_metric_dims, 128
         | 
| 40 | 
            -
                  optional :bool, :aggregation_enabled, 1, :default => true
         | 
| 41 | 
            -
                  optional :uint64, :aggregation_max_count, 2, :default => 4294967295
         | 
| 42 | 
            -
                  optional :uint64, :aggregation_max_size, 3, :default => 51200
         | 
| 43 | 
            -
                  optional :uint64, :collection_max_count, 4, :default => 500
         | 
| 44 | 
            -
                  optional :uint64, :collection_max_size, 5, :default => 5242880
         | 
| 45 | 
            -
                  optional :uint64, :connect_timeout, 6, :default => 6000
         | 
| 46 | 
            -
                  optional :string, :custom_endpoint, 7
         | 
| 47 | 
            -
                  optional :bool, :fail_if_throttled, 8, :default => false
         | 
| 48 | 
            -
                  optional :string, :log_level, 9, :default => "info"
         | 
| 49 | 
            -
                  optional :uint64, :max_connections, 10, :default => 24
         | 
| 50 | 
            -
                  optional :string, :metrics_granularity, 11, :default => "shard"
         | 
| 51 | 
            -
                  optional :string, :metrics_level, 12, :default => "detailed"
         | 
| 52 | 
            -
                  optional :string, :metrics_namespace, 13, :default => "KinesisProducerLibrary"
         | 
| 53 | 
            -
                  optional :uint64, :metrics_upload_delay, 14, :default => 60000
         | 
| 54 | 
            -
                  optional :uint64, :min_connections, 15, :default => 1
         | 
| 55 | 
            -
                  optional :uint64, :port, 16, :default => 443
         | 
| 56 | 
            -
                  optional :uint64, :rate_limit, 17, :default => 150
         | 
| 57 | 
            -
                  optional :uint64, :record_max_buffered_time, 18, :default => 100
         | 
| 58 | 
            -
                  optional :uint64, :record_ttl, 19, :default => 30000
         | 
| 59 | 
            -
                  optional :string, :region, 20
         | 
| 60 | 
            -
                  optional :uint64, :request_timeout, 21, :default => 6000
         | 
| 61 | 
            -
                  optional :bool, :verify_certificate, 22, :default => true
         | 
| 62 | 
            -
                end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
              end
         | 
| 65 | 
            -
            end
         | 
| 66 | 
            -
             |