logstash-mixin-rabbitmq_connection 1.0.0.beta1-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: be261e8112ff1e011b6191a7440ae5cb8850220b
4
+ data.tar.gz: cd9acfffc0d2ead393dc9c952373bba3d663e52b
5
+ SHA512:
6
+ metadata.gz: ca50bdcf451390ee94103af05253eecb613b96ae5872e0f893e68cb7dce684c8d3fd9e62ba207d6ce5456be18e532a4bbb58e740d143377a976241309f92e1ae
7
+ data.tar.gz: b552fae802db33fbf7ff6a4b79d22149c27dda4942acb71b4eaeb5111d6ebd2f7eb0d29732b24d1275196bc54b6377e9ccb0acb36526a31f7591de8e44fb147b
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ Gemfile.lock
3
+ .bundle
4
+ vendor
5
+ .idea
6
+
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # About This Mixin
2
+
3
+ This is a mixin supporting the logstash rabbitmq inputs and outputs. If you plan on writing a logstash plugin using
4
+ rabbitmq this may be useful.
@@ -0,0 +1,147 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+ require "march_hare"
5
+ require "java"
6
+
7
+ # Common functionality for the rabbitmq input/output
8
+ module LogStash
9
+ module PluginMixins
10
+ module RabbitMQConnection
11
+ EXCHANGE_TYPES = ["fanout", "direct", "topic"]
12
+
13
+ HareInfo = Struct.new(:connection, :channel, :exchange, :queue)
14
+
15
+ def self.included(base)
16
+ base.extend(self)
17
+ base.setup_rabbitmq_connection_config
18
+ end
19
+
20
+ def setup_rabbitmq_connection_config
21
+ # RabbitMQ server address
22
+ config :host, :validate => :string, :required => true
23
+
24
+ # RabbitMQ port to connect on
25
+ config :port, :validate => :number, :default => 5672
26
+
27
+ # RabbitMQ username
28
+ config :user, :validate => :string, :default => "guest"
29
+
30
+ # RabbitMQ password
31
+ config :password, :validate => :password, :default => "guest"
32
+
33
+ # The vhost to use. If you don't know what this is, leave the default.
34
+ config :vhost, :validate => :string, :default => "/"
35
+
36
+ # Enable or disable SSL
37
+ config :ssl, :validate => :boolean, :default => false
38
+
39
+ # Validate SSL certificate
40
+ config :verify_ssl, :validate => :boolean, :default => false
41
+
42
+ # Enable or disable logging
43
+ config :debug, :validate => :boolean, :default => false, :deprecated => "Use the logstash --debug flag for this instead."
44
+
45
+ # Set this to automatically recover from a broken connection. You almost certainly don't want to override this!!!
46
+ config :automatic_recovery, :validate => :boolean, :default => true
47
+
48
+ # Time in seconds to wait before retrying a connection
49
+ config :connect_retry_interval, :validate => :number, :default => 1
50
+
51
+ # Passive queue creation? Useful for checking queue existance without modifying server state
52
+ config :passive, :validate => :boolean, :default => false
53
+
54
+ # Extra queue arguments as an array.
55
+ # To make a RabbitMQ queue mirrored, use: `{"x-ha-policy" => "all"}`
56
+ config :arguments, :validate => :array, :default => {}
57
+
58
+ end
59
+
60
+ def conn_str
61
+ "amqp://#{@user}@#{@host}:#{@port}#{@vhost}"
62
+ end
63
+
64
+ def teardown
65
+ @hare_info.channel.close if channel_open?
66
+ @hare_info.connection.close if connection_open?
67
+
68
+ finished
69
+ end
70
+
71
+ def rabbitmq_settings
72
+ return @rabbitmq_settings if @rabbitmq_settings
73
+
74
+ s = {
75
+ :vhost => @vhost,
76
+ :host => @host,
77
+ :port => @port,
78
+ :user => @user,
79
+ :automatic_recovery => @automatic_recovery,
80
+ :pass => @password ? @password.value : "guest",
81
+ }
82
+ s[:tls] = @ssl if @ssl
83
+ @rabbitmq_settings = s
84
+ end
85
+
86
+ def connect!
87
+ @hare_info = connect() unless @hare_info # Don't duplicate the conn!
88
+ rescue MarchHare::Exception => e
89
+ return if terminating?
90
+
91
+ @logger.error("RabbitMQ connection error, will retry.",
92
+ :message => e.message,
93
+ :exception => e.class.name,
94
+ :backtrace => e.backtrace)
95
+
96
+ sleep_for_retry
97
+ retry
98
+ end
99
+
100
+ def channel_open?
101
+ @hare_info && @hare_info.channel && @hare_info.channel.open?
102
+ end
103
+
104
+ def connection_open?
105
+ @hare_info && @hare_info.connection && @hare_info.connection.open?
106
+ end
107
+
108
+ def connected?
109
+ return nil unless @hare_info && @hare_info.connection
110
+ @hare_info.connection.connected?
111
+ end
112
+
113
+ private
114
+
115
+ def declare_exchange!(channel, exchange, exchange_type, durable)
116
+ @logger.debug("Declaring an exchange", :name => exchange,
117
+ :type => exchange_type, :durable => durable)
118
+ exchange = channel.exchange(exchange, :type => exchange_type.to_sym, :durable => durable)
119
+ @logger.debug("Exchange declared")
120
+ exchange
121
+ rescue StandardError => e
122
+ @logger.error("Could not declare exchange!",
123
+ :exchange => exchange, :type => exchange_type,
124
+ :durable => durable, :error_class => e.class.name,
125
+ :error_message => e.message, :backtrace => e.backtrace)
126
+ raise e
127
+ end
128
+
129
+ def connect
130
+ @logger.debug? && @logger.debug("Connecting to RabbitMQ. Settings: #{rabbitmq_settings.inspect}")
131
+
132
+ connection = MarchHare.connect(rabbitmq_settings)
133
+ connection.on_blocked { @logger.warn("RabbitMQ output blocked! Check your RabbitMQ instance!") }
134
+ connection.on_unblocked { @logger.warn("RabbitMQ output unblocked!") }
135
+
136
+ channel = connection.create_channel
137
+ @logger.info("Connected to RabbitMQ at #{rabbitmq_settings[:host]}")
138
+
139
+ HareInfo.new(connection, channel)
140
+ end
141
+
142
+ def sleep_for_retry
143
+ sleep @connect_retry_interval
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,29 @@
1
+ Gem::Specification.new do |s|
2
+
3
+ s.name = 'logstash-mixin-rabbitmq_connection'
4
+ s.version = '1.0.0.beta1'
5
+ s.licenses = ['Apache License (2.0)']
6
+ s.summary = "Common functionality for RabbitMQ plugins"
7
+ s.description = "This is used to provide configuration options and connection settings for logstash plugins working with RabbitMQ"
8
+ s.authors = ["Elastic"]
9
+ s.email = 'info@elastic.co'
10
+ s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
11
+ s.require_paths = ["lib"]
12
+
13
+ # Files
14
+ s.files = `git ls-files`.split($\)+::Dir.glob('vendor/*')
15
+
16
+ # Tests
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
+
19
+ # Gem dependencies
20
+ s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 2.0.0'
21
+
22
+ s.platform = RUBY_PLATFORM
23
+ s.add_runtime_dependency 'march_hare', ['~> 2.11.0'] #(MIT license)
24
+
25
+ s.add_development_dependency 'logstash-devutils'
26
+ s.add_development_dependency 'logstash-input-generator'
27
+ s.add_development_dependency 'logstash-codec-json'
28
+ end
29
+
@@ -0,0 +1,102 @@
1
+ require "logstash/devutils/rspec/spec_helper"
2
+ require "logstash/pipeline"
3
+ require "logstash/plugin_mixins/rabbitmq_connection"
4
+
5
+ class TestPlugin < LogStash::Outputs::Base
6
+ include LogStash::PluginMixins::RabbitMQConnection
7
+
8
+ def register
9
+ connect!
10
+ end
11
+ end
12
+
13
+ describe LogStash::PluginMixins::RabbitMQConnection do
14
+ let(:klass) { TestPlugin }
15
+ let(:host) { "localhost" }
16
+ let(:port) { 5672 }
17
+ let(:rabbitmq_settings) {
18
+ {
19
+ "host" => host,
20
+ "port" => port,
21
+ }
22
+ }
23
+ let(:instance) {
24
+ klass.new(rabbitmq_settings)
25
+ }
26
+ let(:hare_info) { instance.instance_variable_get(:@hare_info) }
27
+
28
+ context "when connected" do
29
+ let(:connection) { double("MarchHare Connection") }
30
+ let(:channel) { double("Channel") }
31
+
32
+ before do
33
+ allow(instance).to receive(:connect!).and_call_original
34
+ allow(::MarchHare).to receive(:connect).and_return(connection)
35
+ allow(connection).to receive(:create_channel).and_return(channel)
36
+ allow(connection).to receive(:on_blocked)
37
+ allow(connection).to receive(:on_unblocked)
38
+
39
+ instance.register
40
+ end
41
+
42
+ describe "#register" do
43
+ subject { instance }
44
+
45
+ it "should create cleanly" do
46
+ expect(subject).to be_a(klass)
47
+ end
48
+
49
+ it "should connect" do
50
+ expect(subject).to have_received(:connect!).once
51
+ end
52
+ end
53
+
54
+ describe "#connect!" do
55
+ subject { hare_info }
56
+
57
+ it "should set @hare_info correctly" do
58
+ expect(subject).to be_a(LogStash::PluginMixins::RabbitMQConnection::HareInfo)
59
+ end
60
+
61
+ it "should set @connection correctly" do
62
+ expect(subject.connection).to eql(connection)
63
+ end
64
+
65
+ it "should set the channel correctly" do
66
+ expect(subject.channel).to eql(channel)
67
+ end
68
+ end
69
+ end
70
+
71
+ # If the connection encounters an exception during its initial
72
+ # connection attempt we must handle that. Subsequent errors should be
73
+ # handled by the automatic retry mechanism built-in to MarchHare
74
+ describe "initial connection exceptions" do
75
+ subject { instance }
76
+
77
+ before do
78
+ allow(subject).to receive(:sleep_for_retry)
79
+
80
+
81
+ i = 0
82
+ allow(subject).to receive(:connect) do
83
+ i += 1
84
+ if i == 1
85
+ raise(MarchHare::ConnectionRefused, "Error!")
86
+ else
87
+ double("connection")
88
+ end
89
+ end
90
+
91
+ subject.send(:connect!)
92
+ end
93
+
94
+ it "should retry its connection when conn fails" do
95
+ expect(subject).to have_received(:connect).twice
96
+ end
97
+
98
+ it "should sleep between retries" do
99
+ expect(subject).to have_received(:sleep_for_retry).once
100
+ end
101
+ end
102
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logstash-mixin-rabbitmq_connection
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.beta1
5
+ platform: java
6
+ authors:
7
+ - Elastic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-09-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 1.4.0
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.0
22
+ name: logstash-core
23
+ prerelease: false
24
+ type: :runtime
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.4.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - "~>"
37
+ - !ruby/object:Gem::Version
38
+ version: 2.11.0
39
+ name: march_hare
40
+ prerelease: false
41
+ type: :runtime
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 2.11.0
47
+ - !ruby/object:Gem::Dependency
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ name: logstash-devutils
54
+ prerelease: false
55
+ type: :development
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ name: logstash-input-generator
68
+ prerelease: false
69
+ type: :development
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ name: logstash-codec-json
82
+ prerelease: false
83
+ type: :development
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description: This is used to provide configuration options and connection settings for logstash plugins working with RabbitMQ
90
+ email: info@elastic.co
91
+ executables: []
92
+ extensions: []
93
+ extra_rdoc_files: []
94
+ files:
95
+ - ".gitignore"
96
+ - Gemfile
97
+ - README.md
98
+ - lib/logstash/plugin_mixins/rabbitmq_connection.rb
99
+ - logstash-mixin-rabbitmq_connection.gemspec
100
+ - spec/plugin_mixins/rabbitmq_connection_spec.rb
101
+ homepage: http://www.elastic.co/guide/en/logstash/current/index.html
102
+ licenses:
103
+ - Apache License (2.0)
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">"
117
+ - !ruby/object:Gem::Version
118
+ version: 1.3.1
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.4.8
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: Common functionality for RabbitMQ plugins
125
+ test_files:
126
+ - spec/plugin_mixins/rabbitmq_connection_spec.rb
127
+ has_rdoc: