logstash-input-azureeventhub 0.9.7-java → 0.9.8-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 73a61719253d1cf4d9a302b34e5085f4b4a296ef
4
- data.tar.gz: 6333763f8de1ff33ad6dfde0e80c421684a7e3ed
2
+ SHA256:
3
+ metadata.gz: 924c45dec9708f85316b26facc34c9308f73f0773bbc056703fb4816ae1d72a1
4
+ data.tar.gz: 6a0eed913702d19b82d1f1fc8deb7036202f1f941bc30d3d0bff66ad5e722426
5
5
  SHA512:
6
- metadata.gz: 612c3610534f016259ad133f42806783b80b2f446e4f2ac61ffaf0ed4f2ed7eb9496c93ecd5fe8cbebebd5f17afc5f8601823d8ca8d97bd640a1240222675cc1
7
- data.tar.gz: 556505e4589f34e2dc9a3f8ca2d53ddd590d7afee93bfe1e1e75a31895ee242f21ae9130a11d35e3c74f170823dcee6ae5acb807cddb6216be0ff640edba0325
6
+ metadata.gz: b3462e2f63501a9183916ba6f366205c73bf2dd671686747b0b77f0a37d6b086706123c40c6bfb6638e35fa435312fd847cfba25833e3a445b3f6e72ae81fa39
7
+ data.tar.gz: 35bdb5244ba4abaacba931d8960d056198a6f37770d8d84c449fdaa9b77257b7f3e2c433b1d42ac699db7abe53edf3e22f85b5e5a35c21ee088d6230ec5251bd
data/README.md CHANGED
@@ -43,7 +43,7 @@ Port of the target Event Hub. Default value is 5671.
43
43
 
44
44
  __*receive_credits*__
45
45
 
46
- The credit number to limit the number of messages to receive in a processing cycle. Default value is 1000.
46
+ The credit number to limit the number of messages to receive in a processing cycle. Value must be between 10 and 999. Default is 999.
47
47
 
48
48
  __*consumer_group*__
49
49
 
@@ -59,6 +59,10 @@ __*thread_wait_sec*__
59
59
 
60
60
  Specifies the time (in seconds) to wait before another try if no message was received.
61
61
 
62
+ __*partition_receiver_epochs*__
63
+
64
+ A map from partition (string) to epoch (integer). By default each partition doesn't have an epoch defined. For more information read https://blogs.msdn.microsoft.com/gyan/2014/09/02/event-hubs-receiver-epoch/ .
65
+
62
66
  ### Examples
63
67
  ```
64
68
  input
@@ -70,6 +74,7 @@ input
70
74
  namespace => "mysbns"
71
75
  eventhub => "myeventhub"
72
76
  partitions => 4
77
+ partition_receiver_epochs => { '2' => 42 '0' => 15 }
73
78
  }
74
79
  }
75
80
  ```
@@ -0,0 +1,14 @@
1
+ # this is a generated file, to avoid over-writing it just delete this comment
2
+ begin
3
+ require 'jar_dependencies'
4
+ rescue LoadError
5
+ require 'org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar'
6
+ require 'com/microsoft/azure/azure-eventhubs/0.15.0/azure-eventhubs-0.15.0.jar'
7
+ require 'org/apache/qpid/proton-j/0.22.0/proton-j-0.22.0.jar'
8
+ end
9
+
10
+ if defined? Jars
11
+ require_jar( 'org.slf4j', 'slf4j-api', '1.7.25' )
12
+ require_jar( 'com.microsoft.azure', 'azure-eventhubs', '0.15.0' )
13
+ require_jar( 'org.apache.qpid', 'proton-j', '0.22.0' )
14
+ end
@@ -16,19 +16,21 @@ class LogStash::Inputs::Azureeventhub < LogStash::Inputs::Base
16
16
 
17
17
  default :codec, "json"
18
18
 
19
- config :key, :validate => :string
20
- config :username, :validate => :string
21
- config :namespace, :validate => :string
19
+ config :key, :validate => :string, :required => true
20
+ config :username, :validate => :string, :required => true
21
+ config :namespace, :validate => :string, :required => true
22
22
  config :domain, :validate => :string, :default => "servicebus.windows.net"
23
23
  config :port, :validate => :number, :default => 5671
24
- config :receive_credits, :validate => :number, :default => 1000
24
+ config :receive_credits, :validate => :number, :default => 999
25
25
 
26
- config :eventhub, :validate => :string
27
- config :partitions, :validate => :number
26
+ config :eventhub, :validate => :string, :required => true
27
+ config :partitions, :validate => :number, :required => true
28
28
  config :consumer_group, :validate => :string, :default => "$default"
29
29
 
30
30
  config :time_since_epoch_millis, :validate => :number, :default => Time.now.utc.to_i * 1000
31
31
  config :thread_wait_sec, :validate => :number, :default => 5
32
+
33
+ config :partition_receiver_epochs, :validate => :hash, :default => {}
32
34
 
33
35
 
34
36
  def initialize(*args)
@@ -37,72 +39,94 @@ class LogStash::Inputs::Azureeventhub < LogStash::Inputs::Base
37
39
 
38
40
  public
39
41
  def register
42
+ user_agent = "logstash-input-azureeventhub"
43
+ user_agent << "/" << Gem.latest_spec_for("logstash-input-azureeventhub").version.to_s
44
+ com::microsoft::azure::eventhubs::EventHubClient.userAgent = user_agent
40
45
  end # def register
41
46
 
42
- def get_pay_load(message)
43
- return nil if not message
44
- message.getPayload().each do |section|
45
- if section.java_kind_of? org::apache::qpid::amqp_1_0::type::messaging::Data or section.java_kind_of? org::apache::qpid::amqp_1_0::type::messaging::AmqpValue
46
- return section.getValue().to_s.gsub("\\x5c", "\\")
47
- end
48
- end
49
- return nil
50
- end
51
-
52
- def process(output_queue, receiver, partition)
47
+ def process(output_queue, receiver, partition, last_event_offset)
53
48
  while !stop?
54
49
  begin
55
- msg = receiver.receive(10)
56
- if msg
57
- codec.decode(get_pay_load(msg)) do |event|
58
- decorate(event)
59
- output_queue << event
60
- end
61
- receiver.acknowledge(msg)
50
+ events = receiver.receiveSync(10)
51
+ if events
52
+ events.each{ |msg|
53
+ body = msg.getBytes().to_s.gsub("\\x5c", "\\")
54
+ props = msg.getSystemProperties()
55
+
56
+ last_event_offset = props.getOffset()
57
+
58
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] Event: #{body[0..50] unless body.nil?}... " <<
59
+ "Offset: #{props.getOffset()} " <<
60
+ "Time: #{props.getEnqueuedTime()} " <<
61
+ "Sequence: #{props.getSequenceNumber()}")
62
+
63
+ codec.decode(body) do |event|
64
+ decorate(event)
65
+ output_queue << event
66
+ end
67
+ }
62
68
  else
63
- @logger.debug(" " + partition.to_s.rjust(2,"0") + " --- " + "No message")
64
- sleep(@thread_wait_sec)
69
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] No message")
65
70
  end
66
- rescue LogStash::ShutdownSignal => e
67
- raise e
68
- rescue org::apache::qpid::amqp_1_0::client::ConnectionErrorException => e
69
- raise e
70
- rescue => e
71
- @logger.error(" " + partition.to_s.rjust(2,"0") + " --- " + "Oh My, An error occurred.", :exception => e)
72
71
  end
73
- end # process
72
+ end
73
+ rescue LogStash::ShutdownSignal => e
74
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] ShutdownSignal received")
75
+ raise e
76
+ rescue => e
77
+ @logger.error("[#{partition.to_s.rjust(2,"0")}] Oh My, An error occurred. Error:#{e}: Trace: #{e.backtrace}", :exception => e)
78
+ raise e
79
+ ensure
80
+ return last_event_offset
74
81
  end # process
75
82
 
76
- def process_partition(output_queue, partition)
83
+ def process_partition(output_queue, partition, epoch)
84
+ last_event_offset = nil
77
85
  while !stop?
78
86
  begin
79
- filter = SelectorFilter.new "amqp.annotation.x-opt-enqueuedtimeutc > '" + @time_since_epoch_millis.to_s + "'"
80
- filters = { org::apache::qpid::amqp_1_0::type::Symbol.valueOf("apache.org:selector-filter:string") => filter }
87
+ host = java::net::URI.new("amqps://" << @namespace << "." << @domain)
88
+ connStr = com::microsoft::azure::eventhubs::ConnectionStringBuilder.new(host, @eventhub, @username, @key).toString()
89
+ ehClient = com::microsoft::azure::eventhubs::EventHubClient.createFromConnectionStringSync(connStr)
90
+
91
+ if !epoch.nil?
92
+ if !last_event_offset.nil?
93
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] Create receiver with epoch=#{epoch} & offset > #{last_event_offset}")
94
+ receiver = ehClient.createEpochReceiverSync(@consumer_group, partition.to_s, last_event_offset, false, epoch)
95
+ else
96
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] Create receiver with epoch=#{epoch} & timestamp > #{@time_since_epoch_millis}")
97
+ receiver = ehClient.createEpochReceiverSync(@consumer_group, partition.to_s, java::time::Instant::ofEpochMilli(@time_since_epoch_millis), epoch)
98
+ end
99
+ else
100
+ if !last_event_offset.nil?
101
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] Create receiver with offset > #{last_event_offset}")
102
+ receiver = ehClient.createReceiverSync(@consumer_group, partition.to_s, last_event_offset, false)
103
+ else
104
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] Create receiver with timestamp > #{@time_since_epoch_millis}")
105
+ receiver = ehClient.createReceiverSync(@consumer_group, partition.to_s, java::time::Instant::ofEpochMilli(@time_since_epoch_millis))
106
+ end
107
+ end
108
+ receiver.setReceiveTimeout(java::time::Duration::ofSeconds(@thread_wait_sec));
109
+ receiver.setPrefetchCount(@receive_credits)
81
110
 
82
- host = @namespace + "." + @domain
83
- connection = org::apache::qpid::amqp_1_0::client::Connection.new(host, @port, @username, @key, host, true)
84
- connection.getEndpoint().getDescribedTypeRegistry().register(filter.java_class, WriterFactory.new)
85
- receiveSession = connection.createSession()
86
- receiver = receiveSession.createReceiver(@eventhub + "/ConsumerGroups/" + @consumer_group + "/Partitions/" + partition.to_s, org::apache::qpid::amqp_1_0::client::AcknowledgeMode::ALO, "eventhubs-receiver-link-" + partition.to_s, false, filters, nil)
87
- receiver.setCredit(org::apache::qpid::amqp_1_0::type::UnsignedInteger.valueOf(@receive_credits), true)
88
- process(output_queue,receiver,partition)
89
- rescue org::apache::qpid::amqp_1_0::client::ConnectionErrorException => e
90
- @logger.debug(" " + partition.to_s.rjust(2,"0") + " --- " + "resetting connection")
91
- @time_since_epoch_millis = Time.now.utc.to_i * 1000
111
+ last_event_offset = process(output_queue, receiver, partition, last_event_offset)
112
+ rescue com::microsoft::azure::eventhubs::EventHubException => e
113
+ sleep(@thread_wait_sec)
114
+ @logger.debug("[#{partition.to_s.rjust(2,"0")}] resetting connection. Error:#{e}: Trace: #{e.backtrace}", :exception => e)
92
115
  end
93
116
  end
94
117
  rescue LogStash::ShutdownSignal => e
95
118
  receiver.close()
96
119
  raise e
97
120
  rescue => e
98
- @logger.error(" " + partition.to_s.rjust(2,"0") + " --- Oh My, An error occurred.", :exception => e)
99
- end # process
121
+ @logger.error("[#{partition.to_s.rjust(2,"0")}] Oh My, An error occurred. Error:#{e}: Trace: #{e.backtrace}", :exception => e)
122
+ end # process_partition
100
123
 
101
124
  public
102
125
  def run(output_queue)
103
126
  threads = []
104
127
  (0..(@partitions-1)).each do |p_id|
105
- threads << Thread.new { process_partition(output_queue, p_id) }
128
+ epoch = partition_receiver_epochs[p_id.to_s] if @partition_receiver_epochs.key?(p_id.to_s)
129
+ threads << Thread.new { process_partition(output_queue, p_id, epoch) }
106
130
  end
107
131
  threads.each { |thr| thr.join }
108
132
  end # def run
@@ -110,51 +134,4 @@ class LogStash::Inputs::Azureeventhub < LogStash::Inputs::Base
110
134
  public
111
135
  def teardown
112
136
  end # def teardown
113
- end # class LogStash::Inputs::Azureeventhub
114
-
115
-
116
- class SelectorFilter
117
- include org::apache::qpid::amqp_1_0::type::messaging::Filter
118
-
119
- def initialize(value)
120
- @value = value
121
- end
122
-
123
- def getValue
124
- return @value
125
- end
126
-
127
- def toString
128
- return @value
129
- end
130
- end
131
-
132
- class SelectorFilterWriter < org::apache::qpid::amqp_1_0::codec::AbstractDescribedTypeWriter
133
- def initialize(registry)
134
- super(registry)
135
- end
136
-
137
- def onSetValue(value)
138
- @value = value
139
- end
140
-
141
- def clear
142
- @value = nil
143
- end
144
-
145
- def getDescriptor
146
- return org::apache::qpid::amqp_1_0::type::UnsignedLong.valueOf(83483426826);
147
- end
148
-
149
- def createDescribedWriter
150
- return getRegistry().getValueWriter(@value.getValue());
151
- end
152
- end
153
-
154
- class WriterFactory
155
- include org::apache::qpid::amqp_1_0::codec::ValueWriter::Factory
156
-
157
- def newInstance(registry)
158
- return SelectorFilterWriter.new registry
159
- end
160
- end
137
+ end # class LogStash::Inputs::Azureeventhub
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-azureeventhub'
3
- s.version = '0.9.7'
3
+ s.version = '0.9.8'
4
4
  s.platform = "java"
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "This plugin collects data from Azure Event Hubs."
@@ -24,9 +24,6 @@ Gem::Specification.new do |s|
24
24
  s.add_development_dependency 'logstash-devutils'
25
25
 
26
26
  #Jar dependencies
27
- s.requirements << "jar 'org.apache.qpid:qpid-amqp-1-0-common', '0.32'"
28
- s.requirements << "jar 'org.apache.qpid:qpid-amqp-1-0-client-jms', '0.32'"
29
- s.requirements << "jar 'org.apache.qpid:qpid-client', '0.32'"
30
- s.requirements << "jar 'org.apache.geronimo.specs:geronimo-jms_1.1_spec', '1.1.1'"
27
+ s.requirements << "jar 'com.microsoft.azure:azure-eventhubs', '0.15.0'"
31
28
  s.add_runtime_dependency 'jar-dependencies', '~> 0.3.2'
32
29
  end
metadata CHANGED
@@ -1,18 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-azureeventhub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.7
4
+ version: 0.9.8
5
5
  platform: java
6
6
  authors:
7
7
  - Microsoft Corporation
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-10 00:00:00.000000000 Z
11
+ date: 2017-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: logstash-core-plugin-api
15
- version_requirements: !ruby/object:Gem::Requirement
14
+ requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
@@ -20,7 +19,10 @@ dependencies:
20
19
  - - "<="
21
20
  - !ruby/object:Gem::Version
22
21
  version: '2.99'
23
- requirement: !ruby/object:Gem::Requirement
22
+ name: logstash-core-plugin-api
23
+ prerelease: false
24
+ type: :runtime
25
+ version_requirements: !ruby/object:Gem::Requirement
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
@@ -28,50 +30,48 @@ dependencies:
28
30
  - - "<="
29
31
  - !ruby/object:Gem::Version
30
32
  version: '2.99'
31
- prerelease: false
32
- type: :runtime
33
33
  - !ruby/object:Gem::Dependency
34
- name: azure
35
- version_requirements: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: 0.7.1
40
34
  requirement: !ruby/object:Gem::Requirement
41
35
  requirements:
42
36
  - - "~>"
43
37
  - !ruby/object:Gem::Version
44
38
  version: 0.7.1
39
+ name: azure
45
40
  prerelease: false
46
41
  type: :runtime
47
- - !ruby/object:Gem::Dependency
48
- name: logstash-devutils
49
42
  version_requirements: !ruby/object:Gem::Requirement
50
43
  requirements:
51
- - - ">="
44
+ - - "~>"
52
45
  - !ruby/object:Gem::Version
53
- version: '0'
46
+ version: 0.7.1
47
+ - !ruby/object:Gem::Dependency
54
48
  requirement: !ruby/object:Gem::Requirement
55
49
  requirements:
56
50
  - - ">="
57
51
  - !ruby/object:Gem::Version
58
52
  version: '0'
53
+ name: logstash-devutils
59
54
  prerelease: false
60
55
  type: :development
61
- - !ruby/object:Gem::Dependency
62
- name: jar-dependencies
63
56
  version_requirements: !ruby/object:Gem::Requirement
64
57
  requirements:
65
- - - "~>"
58
+ - - ">="
66
59
  - !ruby/object:Gem::Version
67
- version: 0.3.2
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
68
62
  requirement: !ruby/object:Gem::Requirement
69
63
  requirements:
70
64
  - - "~>"
71
65
  - !ruby/object:Gem::Version
72
66
  version: 0.3.2
67
+ name: jar-dependencies
73
68
  prerelease: false
74
69
  type: :runtime
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 0.3.2
75
75
  description: This gem is a Logstash plugin. It reads data from Azure Event Hubs.
76
76
  email: azdiag@microsoft.com
77
77
  executables: []
@@ -82,7 +82,11 @@ files:
82
82
  - Gemfile
83
83
  - LICENSE
84
84
  - README.md
85
+ - lib/com/microsoft/azure/azure-eventhubs/0.15.0/azure-eventhubs-0.15.0.jar
86
+ - lib/logstash-input-azureeventhub_jars.rb
85
87
  - lib/logstash/inputs/azureeventhub.rb
88
+ - lib/org/apache/qpid/proton-j/0.22.0/proton-j-0.22.0.jar
89
+ - lib/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
86
90
  - logstash-input-azureeventhub.gemspec
87
91
  - spec/inputs/azureeventhub_spec.rb
88
92
  homepage: https://github.com/Azure/azure-diagnostics-tools
@@ -106,12 +110,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
110
  - !ruby/object:Gem::Version
107
111
  version: '0'
108
112
  requirements:
109
- - jar 'org.apache.qpid:qpid-amqp-1-0-common', '0.32'
110
- - jar 'org.apache.qpid:qpid-amqp-1-0-client-jms', '0.32'
111
- - jar 'org.apache.qpid:qpid-client', '0.32'
112
- - jar 'org.apache.geronimo.specs:geronimo-jms_1.1_spec', '1.1.1'
113
+ - jar 'com.microsoft.azure:azure-eventhubs', '0.15.0'
113
114
  rubyforge_project:
114
- rubygems_version: 2.4.8
115
+ rubygems_version: 2.6.13
115
116
  signing_key:
116
117
  specification_version: 4
117
118
  summary: This plugin collects data from Azure Event Hubs.