logstash-input-twitter 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/lib/logstash/inputs/twitter.rb +31 -24
- data/logstash-input-twitter.gemspec +5 -3
- data/spec/inputs/twitter_spec.rb +24 -0
- metadata +45 -19
- data/.gitignore +0 -4
- data/Rakefile +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0b170b14458a9666e7e7e955436bfef0fb8d552
|
4
|
+
data.tar.gz: e6f78010789cdc8a0cd57102e81315abbbca7920
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cda6d687bbe47db50f5b8648027f9d23dd5a62d4cc552e86fe66fe50e604976d4621cbc83196ddc009bdfa81f065fa76bb4ff1bcb1f33425b13fca54ed453dda
|
7
|
+
data.tar.gz: 25e7b7288b5adb62350dbebdd620298590deb8909ca68346b6e6c27878766da090b4c512f81c3c2d75be228164d580ba0d3e2e0fb3d039fd10a531509f23dd18
|
data/README.md
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Logstash Plugin
|
2
2
|
|
3
|
-
This is a plugin for [Logstash](https://github.com/
|
3
|
+
This is a plugin for [Logstash](https://github.com/elastic/logstash).
|
4
4
|
|
5
5
|
It is fully free and fully open source. The license is Apache 2.0, meaning you are pretty much free to use it however you want in whatever way.
|
6
6
|
|
7
7
|
## Documentation
|
8
8
|
|
9
|
-
Logstash provides infrastructure to automatically generate documentation for this plugin. We use the asciidoc format to write documentation so any comments in the source code will be first converted into asciidoc and then into html. All plugin documentation are placed under one [central location](http://www.
|
9
|
+
Logstash provides infrastructure to automatically generate documentation for this plugin. We use the asciidoc format to write documentation so any comments in the source code will be first converted into asciidoc and then into html. All plugin documentation are placed under one [central location](http://www.elastic.co/guide/en/logstash/current/).
|
10
10
|
|
11
11
|
- For formatting code or config example, you can use the asciidoc `[source,ruby]` directive
|
12
|
-
- For more asciidoc formatting tips, see the excellent reference here https://github.com/
|
12
|
+
- For more asciidoc formatting tips, see the excellent reference here https://github.com/elastic/docs#asciidoc-guide
|
13
13
|
|
14
14
|
## Need Help?
|
15
15
|
|
@@ -83,4 +83,4 @@ Programming is not a required skill. Whatever you've seen about open source and
|
|
83
83
|
|
84
84
|
It is more important to the community that you are able to contribute.
|
85
85
|
|
86
|
-
For more information about contributing, see the [CONTRIBUTING](https://github.com/
|
86
|
+
For more information about contributing, see the [CONTRIBUTING](https://github.com/elastic/logstash/blob/master/CONTRIBUTING.md) file.
|
@@ -4,6 +4,7 @@ require "logstash/namespace"
|
|
4
4
|
require "logstash/timestamp"
|
5
5
|
require "logstash/util"
|
6
6
|
require "logstash/json"
|
7
|
+
require "stud/interval"
|
7
8
|
|
8
9
|
# Read events from the twitter streaming api.
|
9
10
|
class LogStash::Inputs::Twitter < LogStash::Inputs::Base
|
@@ -86,41 +87,47 @@ class LogStash::Inputs::Twitter < LogStash::Inputs::Base
|
|
86
87
|
@logger.info("Starting twitter tracking", :keywords => @keywords)
|
87
88
|
begin
|
88
89
|
@client.filter(:track => @keywords.join(",")) do |tweet|
|
90
|
+
return if stop?
|
89
91
|
if tweet.is_a?(Twitter::Tweet)
|
90
|
-
|
91
|
-
if @full_tweet
|
92
|
-
event = LogStash::Event.new(LogStash::Util.stringify_symbols(tweet.to_hash))
|
93
|
-
event.timestamp = LogStash::Timestamp.new(tweet.created_at)
|
94
|
-
else
|
95
|
-
event = LogStash::Event.new(
|
96
|
-
LogStash::Event::TIMESTAMP => LogStash::Timestamp.new(tweet.created_at),
|
97
|
-
"message" => tweet.full_text,
|
98
|
-
"user" => tweet.user.screen_name,
|
99
|
-
"client" => tweet.source,
|
100
|
-
"retweeted" => tweet.retweeted?,
|
101
|
-
"source" => "http://twitter.com/#{tweet.user.screen_name}/status/#{tweet.id}"
|
102
|
-
)
|
103
|
-
event["in-reply-to"] = tweet.in_reply_to_status_id if tweet.reply?
|
104
|
-
unless tweet.urls.empty?
|
105
|
-
event["urls"] = tweet.urls.map(&:expanded_url).map(&:to_s)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
# Work around bugs in JrJackson. The standard serializer won't work till we upgrade
|
110
|
-
event["in-reply-to"] = nil if event["in-reply-to"].is_a?(Twitter::NullObject)
|
92
|
+
event = from_tweet(tweet)
|
111
93
|
decorate(event)
|
112
94
|
queue << event
|
113
95
|
end
|
114
96
|
end # client.filter
|
115
|
-
rescue LogStash::ShutdownSignal
|
116
|
-
return
|
117
97
|
rescue Twitter::Error::TooManyRequests => e
|
118
98
|
@logger.warn("Twitter too many requests error, sleeping for #{e.rate_limit.reset_in}s")
|
119
|
-
|
99
|
+
Stud.stoppable_sleep(e.rate_limit.reset_in) { stop? }
|
120
100
|
retry
|
121
101
|
rescue => e
|
122
102
|
@logger.warn("Twitter client error", :message => e.message, :exception => e, :backtrace => e.backtrace)
|
123
103
|
retry
|
124
104
|
end
|
125
105
|
end # def run
|
106
|
+
|
107
|
+
private
|
108
|
+
def from_tweet(tweet)
|
109
|
+
@logger.debug? && @logger.debug("Got tweet", :user => tweet.user.screen_name, :text => tweet.text)
|
110
|
+
if @full_tweet
|
111
|
+
event = LogStash::Event.new(LogStash::Util.stringify_symbols(tweet.to_hash))
|
112
|
+
event.timestamp = LogStash::Timestamp.new(tweet.created_at)
|
113
|
+
else
|
114
|
+
event = LogStash::Event.new(
|
115
|
+
LogStash::Event::TIMESTAMP => LogStash::Timestamp.new(tweet.created_at),
|
116
|
+
"message" => tweet.full_text,
|
117
|
+
"user" => tweet.user.screen_name,
|
118
|
+
"client" => tweet.source,
|
119
|
+
"retweeted" => tweet.retweeted?,
|
120
|
+
"source" => "http://twitter.com/#{tweet.user.screen_name}/status/#{tweet.id}"
|
121
|
+
)
|
122
|
+
event["in-reply-to"] = tweet.in_reply_to_status_id if tweet.reply?
|
123
|
+
unless tweet.urls.empty?
|
124
|
+
event["urls"] = tweet.urls.map(&:expanded_url).map(&:to_s)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# Work around bugs in JrJackson. The standard serializer won't work till we upgrade
|
129
|
+
event["in-reply-to"] = nil if event["in-reply-to"].is_a?(Twitter::NullObject)
|
130
|
+
|
131
|
+
event
|
132
|
+
end
|
126
133
|
end # class LogStash::Inputs::Twitter
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-twitter'
|
4
|
-
s.version = '
|
4
|
+
s.version = '2.0.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"
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.require_paths = ["lib"]
|
12
12
|
|
13
13
|
# Files
|
14
|
-
s.files =
|
14
|
+
s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
|
15
15
|
|
16
16
|
# Tests
|
17
17
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
@@ -20,8 +20,10 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
|
21
21
|
|
22
22
|
# Gem dependencies
|
23
|
-
s.add_runtime_dependency "logstash-core",
|
23
|
+
s.add_runtime_dependency "logstash-core", "~> 2.0.0.snapshot"
|
24
24
|
s.add_runtime_dependency 'twitter', ['5.12.0']
|
25
|
+
s.add_runtime_dependency 'stud', '>= 0.0.22', '< 0.1'
|
25
26
|
|
26
27
|
s.add_development_dependency 'logstash-devutils'
|
28
|
+
s.add_development_dependency 'logstash-codec-plain'
|
27
29
|
end
|
data/spec/inputs/twitter_spec.rb
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
require "logstash/devutils/rspec/spec_helper"
|
2
2
|
require 'logstash/inputs/twitter'
|
3
|
+
require 'twitter'
|
4
|
+
|
5
|
+
class MockClient
|
6
|
+
def filter(options)
|
7
|
+
loop { yield }
|
8
|
+
end
|
9
|
+
end
|
3
10
|
|
4
11
|
describe LogStash::Inputs::Twitter do
|
12
|
+
context "when told to shutdown" do
|
13
|
+
before :each do
|
14
|
+
allow(Twitter::Streaming::Client).to receive(:new).and_return(MockClient.new)
|
15
|
+
end
|
16
|
+
|
17
|
+
it_behaves_like "an interruptible input plugin" do
|
18
|
+
let(:config) do
|
19
|
+
{
|
20
|
+
'consumer_key' => 'foo',
|
21
|
+
'consumer_secret' => 'foo',
|
22
|
+
'oauth_token' => 'foo',
|
23
|
+
'oauth_token_secret' => 'foo',
|
24
|
+
'keywords' => ['foo', 'bar']
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
5
29
|
end
|
metadata
CHANGED
@@ -1,77 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.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
|
+
date: 2015-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ~>
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: 2.0.0.snapshot
|
14
19
|
name: logstash-core
|
20
|
+
prerelease: false
|
21
|
+
type: :runtime
|
15
22
|
version_requirements: !ruby/object:Gem::Requirement
|
16
23
|
requirements:
|
17
|
-
- -
|
24
|
+
- - ~>
|
18
25
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
-
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 2.0.0
|
26
|
+
version: 2.0.0.snapshot
|
27
|
+
- !ruby/object:Gem::Dependency
|
23
28
|
requirement: !ruby/object:Gem::Requirement
|
24
29
|
requirements:
|
25
|
-
- - '
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: 1.4.0
|
28
|
-
- - <
|
30
|
+
- - '='
|
29
31
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
32
|
+
version: 5.12.0
|
33
|
+
name: twitter
|
31
34
|
prerelease: false
|
32
35
|
type: :runtime
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: twitter
|
35
36
|
version_requirements: !ruby/object:Gem::Requirement
|
36
37
|
requirements:
|
37
38
|
- - '='
|
38
39
|
- !ruby/object:Gem::Version
|
39
40
|
version: 5.12.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
40
42
|
requirement: !ruby/object:Gem::Requirement
|
41
43
|
requirements:
|
42
|
-
- - '
|
44
|
+
- - '>='
|
43
45
|
- !ruby/object:Gem::Version
|
44
|
-
version:
|
46
|
+
version: 0.0.22
|
47
|
+
- - <
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.1'
|
50
|
+
name: stud
|
45
51
|
prerelease: false
|
46
52
|
type: :runtime
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.0.22
|
58
|
+
- - <
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.1'
|
47
61
|
- !ruby/object:Gem::Dependency
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
48
67
|
name: logstash-devutils
|
68
|
+
prerelease: false
|
69
|
+
type: :development
|
49
70
|
version_requirements: !ruby/object:Gem::Requirement
|
50
71
|
requirements:
|
51
72
|
- - '>='
|
52
73
|
- !ruby/object:Gem::Version
|
53
74
|
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
54
76
|
requirement: !ruby/object:Gem::Requirement
|
55
77
|
requirements:
|
56
78
|
- - '>='
|
57
79
|
- !ruby/object:Gem::Version
|
58
80
|
version: '0'
|
81
|
+
name: logstash-codec-plain
|
59
82
|
prerelease: false
|
60
83
|
type: :development
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
61
89
|
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
|
62
90
|
email: info@elastic.co
|
63
91
|
executables: []
|
64
92
|
extensions: []
|
65
93
|
extra_rdoc_files: []
|
66
94
|
files:
|
67
|
-
- .gitignore
|
68
95
|
- CHANGELOG.md
|
69
96
|
- CONTRIBUTORS
|
70
97
|
- Gemfile
|
71
98
|
- LICENSE
|
72
99
|
- NOTICE.TXT
|
73
100
|
- README.md
|
74
|
-
- Rakefile
|
75
101
|
- lib/logstash/inputs/twitter.rb
|
76
102
|
- logstash-input-twitter.gemspec
|
77
103
|
- spec/inputs/twitter_spec.rb
|
@@ -97,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
123
|
version: '0'
|
98
124
|
requirements: []
|
99
125
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.4.8
|
101
127
|
signing_key:
|
102
128
|
specification_version: 4
|
103
129
|
summary: Read events from the twitter streaming api.
|
data/.gitignore
DELETED