logstash-input-twitter 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/logstash/inputs/twitter/patches.rb +80 -0
- data/lib/logstash/inputs/twitter.rb +18 -14
- data/logstash-input-twitter.gemspec +2 -2
- data/spec/inputs/twitter_spec.rb +0 -1
- data/spec/integration/twitter_spec.rb +31 -0
- data/spec/spec_helper.rb +0 -1
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ded0fb06a53cdd6b628e29f8adcd942c7375da1e
|
4
|
+
data.tar.gz: bc9905695444a89e7d347250f6d91b84d860afec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11ba55f9584d1bbd0d81b739b7c2a30b16f822204d72037c7b23fa8c90ad15853d9eb80dc65cf0c8d1637522b442827f7642ead1ca05d917ba30680be67301f9
|
7
|
+
data.tar.gz: dd86f9b3956e406e35fadd8dd7242550e0297d398ec576055547ef1171c334f2c778036b1397a5271770df0c0b739a08f87eea03ffbd228d1986d041b64aa4b4
|
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'twitter/streaming/connection'
|
3
|
+
require 'twitter/streaming/response'
|
4
|
+
require 'twitter/streaming/message_parser'
|
5
|
+
|
6
|
+
module LogStash
|
7
|
+
module Inputs
|
8
|
+
class TwitterPatches
|
9
|
+
|
10
|
+
def self.patch
|
11
|
+
verify_version
|
12
|
+
patch_json
|
13
|
+
patch_connection_stream
|
14
|
+
patch_request
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def self.verify_version
|
20
|
+
raise("Incompatible Twitter gem version and the LogStash::Json.load") unless ::Twitter::Version.to_s == "5.15.0"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.patch_connection_stream
|
24
|
+
::Twitter::Streaming::Connection.class_eval do
|
25
|
+
def stream(request, response)
|
26
|
+
socket = @tcp_socket_class.new(Resolv.getaddress(request.socket_host), request.socket_port)
|
27
|
+
socket = ssl_stream(socket) if !request.using_proxy?
|
28
|
+
|
29
|
+
request.stream(socket)
|
30
|
+
while body = socket.readpartial(1024) # rubocop:disable AssignmentInCondition
|
31
|
+
response << body
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def ssl_stream(client)
|
36
|
+
client_context = OpenSSL::SSL::SSLContext.new
|
37
|
+
ssl_client = @ssl_socket_class.new(client, client_context)
|
38
|
+
ssl_client.connect
|
39
|
+
end
|
40
|
+
|
41
|
+
def normalized_port(scheme)
|
42
|
+
HTTP::URI.port_mapping[scheme]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.patch_request
|
48
|
+
::Twitter::Streaming::Client.class_eval do
|
49
|
+
def request(method, uri, params)
|
50
|
+
before_request.call
|
51
|
+
headers = ::Twitter::Headers.new(self, method, uri, params).request_headers
|
52
|
+
request = ::HTTP::Request.new(method, uri + '?' + to_url_params(params), headers, proxy)
|
53
|
+
response = ::Twitter::Streaming::Response.new do |data|
|
54
|
+
if item = ::Twitter::Streaming::MessageParser.parse(data) # rubocop:disable AssignmentInCondition
|
55
|
+
yield(item)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
@connection.stream(request, response)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.patch_json
|
64
|
+
::Twitter::Streaming::Response.module_eval do
|
65
|
+
def on_body(data)
|
66
|
+
@tokenizer.extract(data).each do |line|
|
67
|
+
next if line.empty?
|
68
|
+
begin
|
69
|
+
@block.call(LogStash::Json.load(line, :symbolize_keys => true))
|
70
|
+
rescue LogStash::Json::ParserError
|
71
|
+
# silently ignore json parsing errors
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -5,6 +5,7 @@ require "logstash/timestamp"
|
|
5
5
|
require "logstash/util"
|
6
6
|
require "logstash/json"
|
7
7
|
require "stud/interval"
|
8
|
+
require "logstash/inputs/twitter/patches"
|
8
9
|
|
9
10
|
# Ingest events from the Twitter Streaming API.
|
10
11
|
class LogStash::Inputs::Twitter < LogStash::Inputs::Base
|
@@ -88,6 +89,15 @@ class LogStash::Inputs::Twitter < LogStash::Inputs::Base
|
|
88
89
|
# Lets you ingore the retweets coming out of the Twitter API. Default => false
|
89
90
|
config :ignore_retweets, :validate => :boolean, :default => false
|
90
91
|
|
92
|
+
# When to use a proxy to handle the connections
|
93
|
+
config :use_proxy, :validate => :boolean, :default => false
|
94
|
+
|
95
|
+
# Location of the proxy, by default the same machine as the one running this LS instance
|
96
|
+
config :proxy_address, :validate => :string, :default => "127.0.0.1"
|
97
|
+
|
98
|
+
# Port where the proxy is listening, by default 3128 (squid)
|
99
|
+
config :proxy_port, :validate => :number, :default => 3128
|
100
|
+
|
91
101
|
def register
|
92
102
|
require "twitter"
|
93
103
|
|
@@ -98,20 +108,8 @@ class LogStash::Inputs::Twitter < LogStash::Inputs::Base
|
|
98
108
|
# monkey patch twitter gem to ignore json parsing error.
|
99
109
|
# at the same time, use our own json parser
|
100
110
|
# this has been tested with a specific gem version, raise if not the same
|
101
|
-
|
102
|
-
|
103
|
-
Twitter::Streaming::Response.module_eval do
|
104
|
-
def on_body(data)
|
105
|
-
@tokenizer.extract(data).each do |line|
|
106
|
-
next if line.empty?
|
107
|
-
begin
|
108
|
-
@block.call(LogStash::Json.load(line, :symbolize_keys => true))
|
109
|
-
rescue LogStash::Json::ParserError
|
110
|
-
# silently ignore json parsing errors
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
111
|
+
|
112
|
+
LogStash::Inputs::TwitterPatches.patch
|
115
113
|
|
116
114
|
@rest_client = Twitter::REST::Client.new { |c| configure(c) }
|
117
115
|
@stream_client = Twitter::Streaming::Client.new { |c| configure(c) }
|
@@ -207,6 +205,12 @@ class LogStash::Inputs::Twitter < LogStash::Inputs::Base
|
|
207
205
|
c.consumer_secret = @consumer_secret.value
|
208
206
|
c.access_token = @oauth_token
|
209
207
|
c.access_token_secret = @oauth_token_secret.value
|
208
|
+
if @use_proxy
|
209
|
+
c.proxy = {
|
210
|
+
proxy_address: @proxy_address,
|
211
|
+
proxy_port: @proxy_port,
|
212
|
+
}
|
213
|
+
end
|
210
214
|
end
|
211
215
|
|
212
216
|
def build_options
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-twitter'
|
4
|
-
s.version = '2.
|
4
|
+
s.version = '2.2.0'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Read events from the twitter streaming api."
|
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"
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
# Gem dependencies
|
23
23
|
s.add_runtime_dependency "logstash-core", ">= 2.0.0.beta2", "< 3.0.0"
|
24
|
-
s.add_runtime_dependency 'twitter', '5.
|
24
|
+
s.add_runtime_dependency 'twitter', '5.15.0'
|
25
25
|
s.add_runtime_dependency 'stud', '>= 0.0.22', '< 0.1'
|
26
26
|
|
27
27
|
s.add_development_dependency 'logstash-devutils'
|
data/spec/inputs/twitter_spec.rb
CHANGED
@@ -71,5 +71,36 @@ describe LogStash::Inputs::Twitter do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
end
|
74
|
+
|
75
|
+
context "when using a proxy" do
|
76
|
+
let(:config) do
|
77
|
+
<<-CONFIG
|
78
|
+
input {
|
79
|
+
twitter {
|
80
|
+
consumer_key => '#{ENV['TWITTER_CONSUMER_KEY']}'
|
81
|
+
consumer_secret => '#{ENV['TWITTER_CONSUMER_SECRET']}'
|
82
|
+
keywords => [ "London", "Barcelona" ]
|
83
|
+
oauth_token => '#{ENV['TWITTER_OAUTH_TOKEN']}'
|
84
|
+
oauth_token_secret => '#{ENV['TWITTER_OAUTH_TOKEN_SECRET']}'
|
85
|
+
full_tweet => true
|
86
|
+
use_proxy => true
|
87
|
+
proxy_address => '127.0.0.1'
|
88
|
+
proxy_port => 8123
|
89
|
+
}
|
90
|
+
}
|
91
|
+
CONFIG
|
92
|
+
end
|
93
|
+
|
94
|
+
let(:events) do
|
95
|
+
input(config) do |pipeline, queue|
|
96
|
+
3.times.collect { queue.pop }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it "receive a list of events from the twitter stream" do
|
101
|
+
expect(events.count).to eq(3)
|
102
|
+
end
|
103
|
+
end
|
74
104
|
end
|
105
|
+
|
75
106
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
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-
|
11
|
+
date: 2015-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-core
|
@@ -36,12 +36,12 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - '='
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 5.
|
39
|
+
version: 5.15.0
|
40
40
|
requirement: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
42
|
- - '='
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
version: 5.
|
44
|
+
version: 5.15.0
|
45
45
|
prerelease: false
|
46
46
|
type: :runtime
|
47
47
|
- !ruby/object:Gem::Dependency
|
@@ -98,17 +98,18 @@ executables: []
|
|
98
98
|
extensions: []
|
99
99
|
extra_rdoc_files: []
|
100
100
|
files:
|
101
|
-
- lib/logstash/inputs/twitter.rb
|
102
|
-
- spec/spec_helper.rb
|
103
|
-
- spec/inputs/twitter_spec.rb
|
104
|
-
- spec/integration/twitter_spec.rb
|
105
|
-
- logstash-input-twitter.gemspec
|
106
101
|
- CHANGELOG.md
|
107
|
-
- README.md
|
108
102
|
- CONTRIBUTORS
|
109
103
|
- Gemfile
|
110
104
|
- LICENSE
|
111
105
|
- NOTICE.TXT
|
106
|
+
- README.md
|
107
|
+
- lib/logstash/inputs/twitter.rb
|
108
|
+
- lib/logstash/inputs/twitter/patches.rb
|
109
|
+
- logstash-input-twitter.gemspec
|
110
|
+
- spec/inputs/twitter_spec.rb
|
111
|
+
- spec/integration/twitter_spec.rb
|
112
|
+
- spec/spec_helper.rb
|
112
113
|
homepage: http://www.elastic.co/guide/en/logstash/current/index.html
|
113
114
|
licenses:
|
114
115
|
- Apache License (2.0)
|
@@ -131,11 +132,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
132
|
version: '0'
|
132
133
|
requirements: []
|
133
134
|
rubyforge_project:
|
134
|
-
rubygems_version: 2.
|
135
|
+
rubygems_version: 2.4.8
|
135
136
|
signing_key:
|
136
137
|
specification_version: 4
|
137
138
|
summary: Read events from the twitter streaming api.
|
138
139
|
test_files:
|
139
|
-
- spec/spec_helper.rb
|
140
140
|
- spec/inputs/twitter_spec.rb
|
141
141
|
- spec/integration/twitter_spec.rb
|
142
|
+
- spec/spec_helper.rb
|