logstash-input-redis 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/logstash/inputs/redis.rb +166 -79
- data/logstash-input-redis.gemspec +1 -1
- data/spec/inputs/redis_spec.rb +178 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddb2a94b6e3c3cff06790e2434bc9f6aaad46760
|
4
|
+
data.tar.gz: e251dbde7ef57f43b921c6ebf2d6cd3d897d1889
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea5587b7e19d151161b5065a1efaff804d62621e58c919feac72b01c6f3d7e5e2915422f18e3afcbe721ecf8a6dec69252a92b0fa215aab2c7f9b614502345d6
|
7
|
+
data.tar.gz: bdf90d25cef6ac38a917251428a057c7007f6226058985a18f97d58509412689c4eb630ea328ce469c6b07b1c7d9a84849133448dd807de22415529893ac7af2
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "logstash/namespace"
|
2
3
|
require "logstash/inputs/base"
|
3
4
|
require "logstash/inputs/threadable"
|
4
|
-
require "logstash/namespace"
|
5
5
|
|
6
6
|
# This input will read events from a Redis instance; it supports both Redis channels and lists.
|
7
7
|
# The list command (BLPOP) used by Logstash is supported in Redis v1.3.1+, and
|
@@ -15,7 +15,9 @@ require "logstash/namespace"
|
|
15
15
|
# `batch_count` note: If you use the `batch_count` setting, you *must* use a Redis version 2.6.0 or
|
16
16
|
# newer. Anything older does not support the operations used by batching.
|
17
17
|
#
|
18
|
-
class
|
18
|
+
module Logstash module Inputs class Redis < LogStash::Inputs::Threadable
|
19
|
+
# class LogStash::Inputs::Redis < LogStash::Inputs::Threadable
|
20
|
+
|
19
21
|
config_name "redis"
|
20
22
|
|
21
23
|
default :codec, "json"
|
@@ -57,14 +59,30 @@ class LogStash::Inputs::Redis < LogStash::Inputs::Threadable
|
|
57
59
|
config :batch_count, :validate => :number, :default => 1
|
58
60
|
|
59
61
|
public
|
62
|
+
# public API
|
63
|
+
# use to store a proc that can provide a redis instance or mock
|
64
|
+
def add_external_redis_builder(builder) #callable
|
65
|
+
@redis_builder = builder
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
# use to apply an instance directly and bypass the builder
|
70
|
+
def use_redis(instance)
|
71
|
+
@redis = instance
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def new_redis_instance
|
76
|
+
@redis_builder.call
|
77
|
+
end
|
78
|
+
|
60
79
|
def register
|
61
80
|
require 'redis'
|
62
|
-
@redis = nil
|
63
81
|
@redis_url = "redis://#{@password}@#{@host}:#{@port}/#{@db}"
|
64
82
|
|
65
83
|
# TODO remove after setting key and data_type to true
|
66
84
|
if @queue
|
67
|
-
if @key
|
85
|
+
if @key || @data_type
|
68
86
|
raise RuntimeError.new(
|
69
87
|
"Cannot specify queue parameter and key or data_type"
|
70
88
|
)
|
@@ -73,38 +91,79 @@ class LogStash::Inputs::Redis < LogStash::Inputs::Threadable
|
|
73
91
|
@data_type = 'list'
|
74
92
|
end
|
75
93
|
|
76
|
-
if
|
94
|
+
if !@key || !@data_type
|
77
95
|
raise RuntimeError.new(
|
78
96
|
"Must define queue, or key and data_type parameters"
|
79
97
|
)
|
80
98
|
end
|
81
99
|
# end TODO
|
82
100
|
|
83
|
-
@
|
101
|
+
@redis_builder ||= method(:internal_redis_builder)
|
102
|
+
|
103
|
+
# just switch on data_type once
|
104
|
+
if @data_type == 'list' || @data_type == 'dummy'
|
105
|
+
@run_method = method(:list_runner)
|
106
|
+
@teardown_method = method(:list_teardown)
|
107
|
+
elsif @data_type == 'channel'
|
108
|
+
@run_method = method(:channel_runner)
|
109
|
+
@teardown_method = method(:subscribe_teardown)
|
110
|
+
elsif @data_type == 'pattern_channel'
|
111
|
+
@run_method = method(:pattern_channel_runner)
|
112
|
+
@teardown_method = method(:subscribe_teardown)
|
113
|
+
end
|
114
|
+
|
115
|
+
# TODO(sissel, boertje): set @identity directly when @name config option is removed.
|
116
|
+
@identity = @name != 'default' ? @name : "#{@redis_url} #{@data_type}:#{@key}"
|
117
|
+
@logger.info("Registering Redis", :identity => @identity)
|
84
118
|
end # def register
|
85
119
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
def
|
91
|
-
|
120
|
+
def run(output_queue)
|
121
|
+
@run_method.call(output_queue)
|
122
|
+
rescue LogStash::ShutdownSignal
|
123
|
+
# ignore and quit
|
124
|
+
end # def run
|
125
|
+
|
126
|
+
def teardown
|
127
|
+
@shutdown_requested = true
|
128
|
+
@teardown_method.call
|
92
129
|
end
|
93
130
|
|
131
|
+
# private methods -----------------------------
|
94
132
|
private
|
95
|
-
|
96
|
-
|
133
|
+
|
134
|
+
def batched?
|
135
|
+
@batch_count > 1
|
136
|
+
end
|
137
|
+
|
138
|
+
# private
|
139
|
+
def is_list_type?
|
140
|
+
@data_type == 'list'
|
141
|
+
end
|
142
|
+
|
143
|
+
# private
|
144
|
+
def redis_params
|
145
|
+
{
|
97
146
|
:host => @host,
|
98
147
|
:port => @port,
|
99
148
|
:timeout => @timeout,
|
100
149
|
:db => @db,
|
101
150
|
:password => @password.nil? ? nil : @password.value
|
102
|
-
|
103
|
-
|
104
|
-
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
# private
|
155
|
+
def internal_redis_builder
|
156
|
+
::Redis.new(redis_params)
|
157
|
+
end
|
158
|
+
|
159
|
+
# private
|
160
|
+
def connect
|
161
|
+
redis = new_redis_instance
|
162
|
+
load_batch_script(redis) if batched? && is_list_type?
|
163
|
+
redis
|
105
164
|
end # def connect
|
106
165
|
|
107
|
-
private
|
166
|
+
# private
|
108
167
|
def load_batch_script(redis)
|
109
168
|
#A Redis Lua EVAL script to fetch a count of keys
|
110
169
|
#in case count is bigger than current items in queue whole queue will be returned without extra nil values
|
@@ -126,7 +185,7 @@ EOF
|
|
126
185
|
@redis_script_sha = redis.script(:load, redis_script)
|
127
186
|
end
|
128
187
|
|
129
|
-
private
|
188
|
+
# private
|
130
189
|
def queue_event(msg, output_queue)
|
131
190
|
begin
|
132
191
|
@codec.decode(msg) do |event|
|
@@ -141,7 +200,40 @@ EOF
|
|
141
200
|
end
|
142
201
|
end
|
143
202
|
|
144
|
-
private
|
203
|
+
# private
|
204
|
+
def shutting_down?
|
205
|
+
@shutdown_requested
|
206
|
+
end
|
207
|
+
|
208
|
+
# private
|
209
|
+
def running?
|
210
|
+
!@shutdown_requested
|
211
|
+
end
|
212
|
+
|
213
|
+
# private
|
214
|
+
def list_teardown
|
215
|
+
return if @redis.nil? || !@redis.connected?
|
216
|
+
|
217
|
+
@redis.quit rescue nil
|
218
|
+
@redis = nil
|
219
|
+
end
|
220
|
+
|
221
|
+
# private
|
222
|
+
def list_runner(output_queue)
|
223
|
+
while running?
|
224
|
+
begin
|
225
|
+
@redis ||= connect
|
226
|
+
list_listener(@redis, output_queue)
|
227
|
+
rescue ::Redis::BaseError => e
|
228
|
+
@logger.warn("Redis connection problem", :exception => e)
|
229
|
+
# Reset the redis variable to trigger reconnect
|
230
|
+
@redis = nil
|
231
|
+
sleep 1
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
# private
|
145
237
|
def list_listener(redis, output_queue)
|
146
238
|
|
147
239
|
item = redis.blpop(@key, 0, :timeout => 1)
|
@@ -149,10 +241,10 @@ EOF
|
|
149
241
|
|
150
242
|
# blpop returns the 'key' read from as well as the item result
|
151
243
|
# we only care about the result (2nd item in the list).
|
152
|
-
queue_event(item
|
244
|
+
queue_event(item.last, output_queue)
|
153
245
|
|
154
246
|
# If @batch_count is 1, there's no need to continue.
|
155
|
-
return if
|
247
|
+
return if !batched?
|
156
248
|
|
157
249
|
begin
|
158
250
|
redis.evalsha(@redis_script_sha, [@key], [@batch_count-1]).each do |item|
|
@@ -173,7 +265,7 @@ EOF
|
|
173
265
|
#queue_event(item, output_queue) if item
|
174
266
|
#end
|
175
267
|
# --- End commented out implementation of 'batch fetch'
|
176
|
-
rescue Redis::CommandError => e
|
268
|
+
rescue ::Redis::CommandError => e
|
177
269
|
if e.to_s =~ /NOSCRIPT/ then
|
178
270
|
@logger.warn("Redis may have been restarted, reloading Redis batch EVAL script", :exception => e);
|
179
271
|
load_batch_script(redis)
|
@@ -184,15 +276,49 @@ EOF
|
|
184
276
|
end
|
185
277
|
end
|
186
278
|
|
187
|
-
private
|
188
|
-
def
|
189
|
-
redis.
|
279
|
+
# private
|
280
|
+
def subscribe_teardown
|
281
|
+
return if @redis.nil? || !@redis.connected?
|
282
|
+
# if its a SubscribedClient then:
|
283
|
+
# it does not have a disconnect method (yet)
|
284
|
+
if @redis.client.is_a?(::Redis::SubscribedClient)
|
285
|
+
@redis.client.unsubscribe
|
286
|
+
else
|
287
|
+
@redis.client.disconnect
|
288
|
+
end
|
289
|
+
@redis = nil
|
290
|
+
end
|
291
|
+
|
292
|
+
# private
|
293
|
+
def redis_runner
|
294
|
+
begin
|
295
|
+
@redis ||= connect
|
296
|
+
yield
|
297
|
+
rescue ::Redis::BaseError => e
|
298
|
+
@logger.warn("Redis connection problem", :exception => e)
|
299
|
+
# Reset the redis variable to trigger reconnect
|
300
|
+
@redis = nil
|
301
|
+
sleep 1
|
302
|
+
retry
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
# private
|
307
|
+
def channel_runner(output_queue)
|
308
|
+
redis_runner do
|
309
|
+
channel_listener(output_queue)
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# private
|
314
|
+
def channel_listener(output_queue)
|
315
|
+
@redis.subscribe(@key) do |on|
|
190
316
|
on.subscribe do |channel, count|
|
191
317
|
@logger.info("Subscribed", :channel => channel, :count => count)
|
192
318
|
end
|
193
319
|
|
194
320
|
on.message do |channel, message|
|
195
|
-
queue_event
|
321
|
+
queue_event(message, output_queue)
|
196
322
|
end
|
197
323
|
|
198
324
|
on.unsubscribe do |channel, count|
|
@@ -201,15 +327,21 @@ EOF
|
|
201
327
|
end
|
202
328
|
end
|
203
329
|
|
204
|
-
|
205
|
-
|
206
|
-
|
330
|
+
def pattern_channel_runner(output_queue)
|
331
|
+
redis_runner do
|
332
|
+
pattern_channel_listener(output_queue)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
# private
|
337
|
+
def pattern_channel_listener(output_queue)
|
338
|
+
@redis.psubscribe @key do |on|
|
207
339
|
on.psubscribe do |channel, count|
|
208
340
|
@logger.info("Subscribed", :channel => channel, :count => count)
|
209
341
|
end
|
210
342
|
|
211
|
-
on.pmessage do |
|
212
|
-
queue_event
|
343
|
+
on.pmessage do |pattern, channel, message|
|
344
|
+
queue_event(message, output_queue)
|
213
345
|
end
|
214
346
|
|
215
347
|
on.punsubscribe do |channel, count|
|
@@ -218,51 +350,6 @@ EOF
|
|
218
350
|
end
|
219
351
|
end
|
220
352
|
|
221
|
-
|
222
|
-
# loop.
|
223
|
-
private
|
224
|
-
def listener_loop(listener, output_queue)
|
225
|
-
while !@shutdown_requested
|
226
|
-
begin
|
227
|
-
@redis ||= connect
|
228
|
-
self.send listener, @redis, output_queue
|
229
|
-
rescue Redis::BaseError => e
|
230
|
-
@logger.warn("Redis connection problem", :exception => e)
|
231
|
-
# Reset the redis variable to trigger reconnect
|
232
|
-
@redis = nil
|
233
|
-
sleep 1
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end # listener_loop
|
237
|
-
|
238
|
-
public
|
239
|
-
def run(output_queue)
|
240
|
-
if @data_type == 'list'
|
241
|
-
listener_loop :list_listener, output_queue
|
242
|
-
elsif @data_type == 'channel'
|
243
|
-
listener_loop :channel_listener, output_queue
|
244
|
-
else
|
245
|
-
listener_loop :pattern_channel_listener, output_queue
|
246
|
-
end
|
247
|
-
rescue LogStash::ShutdownSignal
|
248
|
-
# ignore and quit
|
249
|
-
end # def run
|
250
|
-
|
251
|
-
public
|
252
|
-
def teardown
|
253
|
-
@shutdown_requested = true
|
353
|
+
# end
|
254
354
|
|
255
|
-
|
256
|
-
if @data_type == 'list'
|
257
|
-
@redis.quit rescue nil
|
258
|
-
elsif @data_type == 'channel'
|
259
|
-
@redis.unsubscribe rescue nil
|
260
|
-
@redis.connection.disconnect
|
261
|
-
elsif @data_type == 'pattern_channel'
|
262
|
-
@redis.punsubscribe rescue nil
|
263
|
-
@redis.connection.disconnect
|
264
|
-
end
|
265
|
-
@redis = nil
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end # class LogStash::Inputs::Redis
|
355
|
+
end end end # Redis Inputs LogStash
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-redis'
|
4
|
-
s.version = '1.0.
|
4
|
+
s.version = '1.0.1'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "This input will read events from a Redis instance"
|
7
7
|
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
data/spec/inputs/redis_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "logstash/devutils/rspec/spec_helper"
|
2
2
|
require "redis"
|
3
3
|
require "stud/try"
|
4
|
+
require 'logstash/inputs/redis'
|
4
5
|
|
5
6
|
def populate(key, event_count)
|
6
7
|
require "logstash/event"
|
@@ -23,6 +24,8 @@ def process(conf, event_count)
|
|
23
24
|
end
|
24
25
|
end # process
|
25
26
|
|
27
|
+
# integration tests ---------------------
|
28
|
+
|
26
29
|
describe "inputs/redis", :redis => true do
|
27
30
|
|
28
31
|
it "should read events from a list" do
|
@@ -61,3 +64,178 @@ describe "inputs/redis", :redis => true do
|
|
61
64
|
process(conf, event_count)
|
62
65
|
end
|
63
66
|
end
|
67
|
+
|
68
|
+
# unit tests ---------------------
|
69
|
+
|
70
|
+
describe Logstash::Inputs::Redis do
|
71
|
+
let(:redis) { double('redis') }
|
72
|
+
let(:builder) { ->{ redis } }
|
73
|
+
let(:connection) { double('redis_connection') }
|
74
|
+
let(:connected) { [true] }
|
75
|
+
let(:data_type) { 'list' }
|
76
|
+
let(:cfg) { {'key' => 'foo', 'data_type' => data_type} }
|
77
|
+
let(:quit_calls) { [:quit] }
|
78
|
+
let(:accumulator) { [] }
|
79
|
+
|
80
|
+
subject do
|
81
|
+
described_class.new(cfg).add_external_redis_builder(builder)
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'construction' do
|
85
|
+
it 'registers the input' do
|
86
|
+
expect {subject.register}.not_to raise_error
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'runtime for list data_type' do
|
91
|
+
before do
|
92
|
+
subject.register
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'teardown when redis is unset' do
|
96
|
+
let(:quit_calls) { [:quit, :unsubscribe, :punsubscribe, :connection, :disconnect!] }
|
97
|
+
|
98
|
+
it 'does not attempt to quit' do
|
99
|
+
allow(redis).to receive(:nil?).and_return(true)
|
100
|
+
quit_calls.each do |call|
|
101
|
+
expect(redis).not_to receive(call)
|
102
|
+
end
|
103
|
+
expect {subject.teardown}.not_to raise_error
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'calling the run method, adds events to the queue' do
|
108
|
+
expect(redis).to receive(:blpop).at_least(:once).and_return(['foo', 'l1'])
|
109
|
+
|
110
|
+
allow(redis).to receive(:connected?).and_return(connected.last)
|
111
|
+
allow(redis).to receive(:quit)
|
112
|
+
|
113
|
+
tt = Thread.new do
|
114
|
+
sleep 0.01
|
115
|
+
subject.teardown
|
116
|
+
end
|
117
|
+
|
118
|
+
subject.run(accumulator)
|
119
|
+
|
120
|
+
tt.join
|
121
|
+
|
122
|
+
expect(accumulator.size).to be > 0
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'multiple teardown calls, calls to redis once' do
|
126
|
+
subject.use_redis(redis)
|
127
|
+
allow(redis).to receive(:blpop).and_return(['foo', 'l1'])
|
128
|
+
expect(redis).to receive(:connected?).and_return(connected.last)
|
129
|
+
quit_calls.each do |call|
|
130
|
+
expect(redis).to receive(call).at_most(:once)
|
131
|
+
end
|
132
|
+
|
133
|
+
subject.teardown
|
134
|
+
connected.push(false) #can't use let block here so push to array
|
135
|
+
expect {subject.teardown}.not_to raise_error
|
136
|
+
subject.teardown
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'for the subscribe data_types' do
|
141
|
+
def run_it_thread(inst)
|
142
|
+
Thread.new(inst) do |subj|
|
143
|
+
subj.run(accumulator)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def publish_thread(new_redis, prefix)
|
148
|
+
Thread.new(new_redis, prefix) do |r, p|
|
149
|
+
sleep 0.1
|
150
|
+
2.times do |i|
|
151
|
+
r.publish('foo', "#{p}#{i.next}")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def teardown_thread(inst, rt)
|
157
|
+
Thread.new(inst, rt) do |subj, runner|
|
158
|
+
sleep 0.4 # allow the messages through
|
159
|
+
runner.raise(LogStash::ShutdownSignal)
|
160
|
+
subj.teardown
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
let(:instance) do
|
165
|
+
inst = described_class.new(cfg)
|
166
|
+
inst.register
|
167
|
+
inst
|
168
|
+
end
|
169
|
+
|
170
|
+
before do
|
171
|
+
subject.register
|
172
|
+
subject.use_redis(redis)
|
173
|
+
allow(connection).to receive(:is_a?).and_return(true)
|
174
|
+
allow(redis).to receive(:client).and_return(connection)
|
175
|
+
end
|
176
|
+
|
177
|
+
before(:example, type: :mocked) do
|
178
|
+
expect(redis).to receive(:connected?).and_return(connected.last)
|
179
|
+
expect(connection).to receive(:unsubscribe)
|
180
|
+
|
181
|
+
quit_calls.each do |call|
|
182
|
+
expect(redis).to receive(call).at_most(:once)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context 'runtime for channel data_type' do
|
187
|
+
let(:data_type) { 'channel' }
|
188
|
+
let(:quit_calls) { [:unsubscribe, :connection] }
|
189
|
+
|
190
|
+
context 'mocked redis' do
|
191
|
+
it 'multiple teardown calls, calls to redis once', type: :mocked do
|
192
|
+
subject.teardown
|
193
|
+
connected.push(false) #can't use let block here so push to array
|
194
|
+
expect {subject.teardown}.not_to raise_error
|
195
|
+
subject.teardown
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context 'real redis', :redis => true do
|
200
|
+
it 'calling the run method, adds events to the queue' do
|
201
|
+
#simulate the input thread
|
202
|
+
rt = run_it_thread(instance)
|
203
|
+
#simulate the other system thread
|
204
|
+
publish_thread(instance.new_redis_instance, 'c').join
|
205
|
+
#simulate the pipeline thread
|
206
|
+
teardown_thread(instance, rt).join
|
207
|
+
|
208
|
+
expect(accumulator.size).to eq(2)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context 'runtime for pattern_channel data_type' do
|
214
|
+
let(:data_type) { 'pattern_channel' }
|
215
|
+
let(:quit_calls) { [:punsubscribe, :connection] }
|
216
|
+
|
217
|
+
context 'mocked redis' do
|
218
|
+
it 'multiple teardown calls, calls to redis once', type: :mocked do
|
219
|
+
subject.teardown
|
220
|
+
connected.push(false) #can't use let block here so push to array
|
221
|
+
expect {subject.teardown}.not_to raise_error
|
222
|
+
subject.teardown
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
context 'real redis', :redis => true do
|
227
|
+
it 'calling the run method, adds events to the queue' do
|
228
|
+
#simulate the input thread
|
229
|
+
rt = run_it_thread(instance)
|
230
|
+
#simulate the other system thread
|
231
|
+
publish_thread(instance.new_redis_instance, 'pc').join
|
232
|
+
#simulate the pipeline thread
|
233
|
+
teardown_thread(instance, rt).join
|
234
|
+
|
235
|
+
expect(accumulator.size).to eq(2)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-redis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-core
|
@@ -111,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
111
|
version: '0'
|
112
112
|
requirements: []
|
113
113
|
rubyforge_project:
|
114
|
-
rubygems_version: 2.
|
114
|
+
rubygems_version: 2.1.9
|
115
115
|
signing_key:
|
116
116
|
specification_version: 4
|
117
117
|
summary: This input will read events from a Redis instance
|