logstash-integration-kafka 10.2.0-java → 10.5.2-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/CONTRIBUTORS +1 -0
- data/docs/index.asciidoc +7 -2
- data/docs/input-kafka.asciidoc +49 -9
- data/docs/output-kafka.asciidoc +51 -13
- data/lib/logstash/inputs/kafka.rb +12 -0
- data/lib/logstash/outputs/kafka.rb +34 -16
- data/logstash-integration-kafka.gemspec +1 -1
- data/spec/unit/outputs/kafka_spec.rb +40 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 877f38709d9280199d61c2c7755461223a9695bd966d8d7ad77676b40c071102
|
4
|
+
data.tar.gz: 34d9f91fc7ae51cc4419ef19ada731b8a122006338371daf0d5c6b23c692a46c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1587ee36b4e8038c17c8ed9182d7e25e040447df017917bc4b8dc69f1ffe0c3ab9c624bccabe6ba4439d9ac7ffa38dfab417ac93ee46e0aef6308a303ba5dee
|
7
|
+
data.tar.gz: 45c48cf5e734e86e9454b4084a83289d89ae51613d100c8b02587d7be4ce9914cb7956b0a2fa51bfd1dea2d9929081becf9ebc1c5f90cf4e03d6076bf3ed8f63
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 10.5.2
|
2
|
+
- Docs: explain group_id in case of multiple inputs [#59](https://github.com/logstash-plugins/logstash-integration-kafka/pull/59)
|
3
|
+
|
4
|
+
## 10.5.1
|
5
|
+
- [DOC]Replaced plugin_header file with plugin_header-integration file. [#46](https://github.com/logstash-plugins/logstash-integration-kafka/pull/46)
|
6
|
+
- [DOC]Update kafka client version across kafka integration docs [#47](https://github.com/logstash-plugins/logstash-integration-kafka/pull/47)
|
7
|
+
- [DOC]Replace hard-coded kafka client and doc path version numbers with attributes to simplify doc maintenance [#48](https://github.com/logstash-plugins/logstash-integration-kafka/pull/48)
|
8
|
+
|
9
|
+
## 10.5.0
|
10
|
+
- Changed: retry sending messages only for retriable exceptions [#27](https://github.com/logstash-plugins/logstash-integration-kafka/pull/29)
|
11
|
+
|
12
|
+
## 10.4.1
|
13
|
+
- [DOC] Fixed formatting issues and made minor content edits [#43](https://github.com/logstash-plugins/logstash-integration-kafka/pull/43)
|
14
|
+
|
15
|
+
## 10.4.0
|
16
|
+
- added the input `isolation_level` to allow fine control of whether to return transactional messages [#44](https://github.com/logstash-plugins/logstash-integration-kafka/pull/44)
|
17
|
+
|
18
|
+
## 10.3.0
|
19
|
+
- added the input and output `client_dns_lookup` parameter to allow control of how DNS requests are made [#28](https://github.com/logstash-plugins/logstash-integration-kafka/pull/28)
|
20
|
+
|
1
21
|
## 10.2.0
|
2
22
|
- Changed: config defaults to be aligned with Kafka client defaults [#30](https://github.com/logstash-plugins/logstash-integration-kafka/pull/30)
|
3
23
|
|
data/CONTRIBUTORS
CHANGED
@@ -12,6 +12,7 @@ Contributors:
|
|
12
12
|
* Kurt Hurtado (kurtado)
|
13
13
|
* Ry Biesemeyer (yaauie)
|
14
14
|
* Rob Cowart (robcowart)
|
15
|
+
* Tim te Beek (timtebeek)
|
15
16
|
|
16
17
|
Note: If you've sent us patches, bug reports, or otherwise contributed to
|
17
18
|
Logstash, and you aren't on the list above and want to be, please let us know
|
data/docs/index.asciidoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
:plugin: kafka
|
2
2
|
:type: integration
|
3
3
|
:no_codec:
|
4
|
+
:kafka_client: 2.4
|
4
5
|
|
5
6
|
///////////////////////////////////////////
|
6
7
|
START - GENERATED VARIABLES, DO NOT EDIT!
|
@@ -21,11 +22,15 @@ include::{include_path}/plugin_header.asciidoc[]
|
|
21
22
|
|
22
23
|
==== Description
|
23
24
|
|
24
|
-
The Kafka Integration Plugin provides integrated plugins for working with the
|
25
|
+
The Kafka Integration Plugin provides integrated plugins for working with the
|
26
|
+
https://kafka.apache.org/[Kafka] distributed streaming platform.
|
25
27
|
|
26
28
|
- {logstash-ref}/plugins-inputs-kafka.html[Kafka Input Plugin]
|
27
29
|
- {logstash-ref}/plugins-outputs-kafka.html[Kafka Output Plugin]
|
28
30
|
|
29
|
-
This plugin uses Kafka Client
|
31
|
+
This plugin uses Kafka Client {kafka_client}. For broker compatibility, see the official
|
32
|
+
https://cwiki.apache.org/confluence/display/KAFKA/Compatibility+Matrix[Kafka
|
33
|
+
compatibility reference]. If the linked compatibility wiki is not up-to-date,
|
34
|
+
please contact Kafka support/community to confirm compatibility.
|
30
35
|
|
31
36
|
:no_codec!:
|
data/docs/input-kafka.asciidoc
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
:integration: kafka
|
1
2
|
:plugin: kafka
|
2
3
|
:type: input
|
3
4
|
:default_codec: plain
|
5
|
+
:kafka_client: 2.4
|
6
|
+
:kafka_client_doc: 24
|
4
7
|
|
5
8
|
///////////////////////////////////////////
|
6
9
|
START - GENERATED VARIABLES, DO NOT EDIT!
|
@@ -17,15 +20,20 @@ END - GENERATED VARIABLES, DO NOT EDIT!
|
|
17
20
|
|
18
21
|
=== Kafka input plugin
|
19
22
|
|
20
|
-
include::{include_path}/plugin_header.asciidoc[]
|
23
|
+
include::{include_path}/plugin_header-integration.asciidoc[]
|
21
24
|
|
22
25
|
==== Description
|
23
26
|
|
24
27
|
This input will read events from a Kafka topic.
|
25
28
|
|
26
|
-
This plugin uses Kafka Client
|
29
|
+
This plugin uses Kafka Client {kafka_client}. For broker compatibility, see the
|
30
|
+
official
|
31
|
+
https://cwiki.apache.org/confluence/display/KAFKA/Compatibility+Matrix[Kafka
|
32
|
+
compatibility reference]. If the linked compatibility wiki is not up-to-date,
|
33
|
+
please contact Kafka support/community to confirm compatibility.
|
27
34
|
|
28
|
-
If you require features not yet available in this plugin (including client
|
35
|
+
If you require features not yet available in this plugin (including client
|
36
|
+
version upgrades), please file an issue with details about what you need.
|
29
37
|
|
30
38
|
This input supports connecting to Kafka over:
|
31
39
|
|
@@ -46,9 +54,9 @@ the same `group_id`.
|
|
46
54
|
Ideally you should have as many threads as the number of partitions for a perfect balance --
|
47
55
|
more threads than partitions means that some threads will be idle
|
48
56
|
|
49
|
-
For more information see https://kafka.apache.org/
|
57
|
+
For more information see https://kafka.apache.org/{kafka_client_doc}/documentation.html#theconsumer
|
50
58
|
|
51
|
-
Kafka consumer configuration: https://kafka.apache.org/
|
59
|
+
Kafka consumer configuration: https://kafka.apache.org/{kafka_client_doc}/documentation.html#consumerconfigs
|
52
60
|
|
53
61
|
==== Metadata fields
|
54
62
|
|
@@ -59,7 +67,11 @@ The following metadata from Kafka broker are added under the `[@metadata]` field
|
|
59
67
|
* `[@metadata][kafka][partition]`: Partition info for this message.
|
60
68
|
* `[@metadata][kafka][offset]`: Original record offset for this message.
|
61
69
|
* `[@metadata][kafka][key]`: Record key, if any.
|
62
|
-
* `[@metadata][kafka][timestamp]`: Timestamp in the Record.
|
70
|
+
* `[@metadata][kafka][timestamp]`: Timestamp in the Record.
|
71
|
+
Depending on your broker configuration, this can be
|
72
|
+
either when the record was created (default) or when it was received by the
|
73
|
+
broker. See more about property log.message.timestamp.type at
|
74
|
+
https://kafka.apache.org/{kafka_client_doc}/documentation.html#brokerconfigs
|
63
75
|
|
64
76
|
Metadata is only added to the event if the `decorate_events` option is set to true (it defaults to false).
|
65
77
|
|
@@ -73,7 +85,7 @@ This plugin supports these configuration options plus the <<plugins-{type}s-{plu
|
|
73
85
|
|
74
86
|
NOTE: Some of these options map to a Kafka option. Defaults usually reflect the Kafka default setting,
|
75
87
|
and might change if Kafka's consumer defaults change.
|
76
|
-
See the https://kafka.apache.org/
|
88
|
+
See the https://kafka.apache.org/{kafka_client_doc}/documentation for more details.
|
77
89
|
|
78
90
|
[cols="<,<,<",options="header",]
|
79
91
|
|=======================================================================
|
@@ -82,6 +94,7 @@ See the https://kafka.apache.org/24/documentation for more details.
|
|
82
94
|
| <<plugins-{type}s-{plugin}-auto_offset_reset>> |<<string,string>>|No
|
83
95
|
| <<plugins-{type}s-{plugin}-bootstrap_servers>> |<<string,string>>|No
|
84
96
|
| <<plugins-{type}s-{plugin}-check_crcs>> |<<boolean,boolean>>|No
|
97
|
+
| <<plugins-{type}s-{plugin}-client_dns_lookup>> |<<string,string>>|No
|
85
98
|
| <<plugins-{type}s-{plugin}-client_id>> |<<string,string>>|No
|
86
99
|
| <<plugins-{type}s-{plugin}-client_rack>> |<<string,string>>|No
|
87
100
|
| <<plugins-{type}s-{plugin}-connections_max_idle_ms>> |<<number,number>>|No
|
@@ -94,6 +107,7 @@ See the https://kafka.apache.org/24/documentation for more details.
|
|
94
107
|
| <<plugins-{type}s-{plugin}-fetch_min_bytes>> |<<number,number>>|No
|
95
108
|
| <<plugins-{type}s-{plugin}-group_id>> |<<string,string>>|No
|
96
109
|
| <<plugins-{type}s-{plugin}-heartbeat_interval_ms>> |<<number,number>>|No
|
110
|
+
| <<plugins-{type}s-{plugin}-isolation_level>> |<<string,string>>|No
|
97
111
|
| <<plugins-{type}s-{plugin}-jaas_path>> |a valid filesystem path|No
|
98
112
|
| <<plugins-{type}s-{plugin}-kerberos_config>> |a valid filesystem path|No
|
99
113
|
| <<plugins-{type}s-{plugin}-key_deserializer_class>> |<<string,string>>|No
|
@@ -174,6 +188,17 @@ Automatically check the CRC32 of the records consumed.
|
|
174
188
|
This ensures no on-the-wire or on-disk corruption to the messages occurred.
|
175
189
|
This check adds some overhead, so it may be disabled in cases seeking extreme performance.
|
176
190
|
|
191
|
+
[id="plugins-{type}s-{plugin}-client_dns_lookup"]
|
192
|
+
===== `client_dns_lookup`
|
193
|
+
|
194
|
+
* Value type is <<string,string>>
|
195
|
+
* Default value is `"default"`
|
196
|
+
|
197
|
+
How DNS lookups should be done. If set to `use_all_dns_ips`, when the lookup returns multiple
|
198
|
+
IP addresses for a hostname, they will all be attempted to connect to before failing the
|
199
|
+
connection. If the value is `resolve_canonical_bootstrap_servers_only` each entry will be
|
200
|
+
resolved and expanded into a list of canonical names.
|
201
|
+
|
177
202
|
[id="plugins-{type}s-{plugin}-client_id"]
|
178
203
|
===== `client_id`
|
179
204
|
|
@@ -289,7 +314,11 @@ before answering the request.
|
|
289
314
|
|
290
315
|
The identifier of the group this consumer belongs to. Consumer group is a single logical subscriber
|
291
316
|
that happens to be made up of multiple processors. Messages in a topic will be distributed to all
|
292
|
-
Logstash instances with the same `group_id
|
317
|
+
Logstash instances with the same `group_id`.
|
318
|
+
|
319
|
+
NOTE: In cases when multiple inputs are being used in a single pipeline, reading from different topics,
|
320
|
+
it's essential to set a different `group_id => ...` for each input. Setting a unique `client_id => ...`
|
321
|
+
is also recommended.
|
293
322
|
|
294
323
|
[id="plugins-{type}s-{plugin}-heartbeat_interval_ms"]
|
295
324
|
===== `heartbeat_interval_ms`
|
@@ -303,6 +332,17 @@ consumers join or leave the group. The value must be set lower than
|
|
303
332
|
`session.timeout.ms`, but typically should be set no higher than 1/3 of that value.
|
304
333
|
It can be adjusted even lower to control the expected time for normal rebalances.
|
305
334
|
|
335
|
+
[id="plugins-{type}s-{plugin}-isolation_level"]
|
336
|
+
===== `isolation_level`
|
337
|
+
|
338
|
+
* Value type is <<string,string>>
|
339
|
+
* Default value is `"read_uncommitted"`
|
340
|
+
|
341
|
+
Controls how to read messages written transactionally. If set to `read_committed`, polling messages will only return
|
342
|
+
transactional messages which have been committed. If set to `read_uncommitted` (the default), polling messages will
|
343
|
+
return all messages, even transactional messages which have been aborted. Non-transactional messages will be returned
|
344
|
+
unconditionally in either mode.
|
345
|
+
|
306
346
|
[id="plugins-{type}s-{plugin}-jaas_path"]
|
307
347
|
===== `jaas_path`
|
308
348
|
|
@@ -397,7 +437,7 @@ partition ownership amongst consumer instances, supported options are:
|
|
397
437
|
* `sticky`
|
398
438
|
* `cooperative_sticky`
|
399
439
|
|
400
|
-
These map to Kafka's corresponding https://kafka.apache.org/
|
440
|
+
These map to Kafka's corresponding https://kafka.apache.org/{kafka_client_doc}/javadoc/org/apache/kafka/clients/consumer/ConsumerPartitionAssignor.html[`ConsumerPartitionAssignor`]
|
401
441
|
implementations.
|
402
442
|
|
403
443
|
[id="plugins-{type}s-{plugin}-poll_timeout_ms"]
|
data/docs/output-kafka.asciidoc
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
:integration: kafka
|
1
2
|
:plugin: kafka
|
2
3
|
:type: output
|
3
4
|
:default_codec: plain
|
5
|
+
:kafka_client: 2.4
|
6
|
+
:kafka_client_doc: 24
|
4
7
|
|
5
8
|
///////////////////////////////////////////
|
6
9
|
START - GENERATED VARIABLES, DO NOT EDIT!
|
@@ -17,15 +20,20 @@ END - GENERATED VARIABLES, DO NOT EDIT!
|
|
17
20
|
|
18
21
|
=== Kafka output plugin
|
19
22
|
|
20
|
-
include::{include_path}/plugin_header.asciidoc[]
|
23
|
+
include::{include_path}/plugin_header-integration.asciidoc[]
|
21
24
|
|
22
25
|
==== Description
|
23
26
|
|
24
27
|
Write events to a Kafka topic.
|
25
28
|
|
26
|
-
This plugin uses Kafka Client
|
29
|
+
This plugin uses Kafka Client {kafka_client}. For broker compatibility, see the
|
30
|
+
official
|
31
|
+
https://cwiki.apache.org/confluence/display/KAFKA/Compatibility+Matrix[Kafka
|
32
|
+
compatibility reference]. If the linked compatibility wiki is not up-to-date,
|
33
|
+
please contact Kafka support/community to confirm compatibility.
|
27
34
|
|
28
|
-
If you require features not yet available in this plugin (including client
|
35
|
+
If you require features not yet available in this plugin (including client
|
36
|
+
version upgrades), please file an issue with details about what you need.
|
29
37
|
|
30
38
|
This output supports connecting to Kafka over:
|
31
39
|
|
@@ -36,9 +44,12 @@ By default security is disabled but can be turned on as needed.
|
|
36
44
|
|
37
45
|
The only required configuration is the topic_id.
|
38
46
|
|
39
|
-
The default codec is plain. Logstash will encode your events with not only the
|
47
|
+
The default codec is plain. Logstash will encode your events with not only the
|
48
|
+
message field but also with a timestamp and hostname.
|
49
|
+
|
50
|
+
If you want the full content of your events to be sent as json, you should set
|
51
|
+
the codec in the output configuration like this:
|
40
52
|
|
41
|
-
If you want the full content of your events to be sent as json, you should set the codec in the output configuration like this:
|
42
53
|
[source,ruby]
|
43
54
|
output {
|
44
55
|
kafka {
|
@@ -47,9 +58,11 @@ If you want the full content of your events to be sent as json, you should set t
|
|
47
58
|
}
|
48
59
|
}
|
49
60
|
|
50
|
-
For more information see
|
61
|
+
For more information see
|
62
|
+
https://kafka.apache.org/{kafka_client_doc}/documentation.html#theproducer
|
51
63
|
|
52
|
-
Kafka producer configuration:
|
64
|
+
Kafka producer configuration:
|
65
|
+
https://kafka.apache.org/{kafka_client_doc}/documentation.html#producerconfigs
|
53
66
|
|
54
67
|
[id="plugins-{type}s-{plugin}-options"]
|
55
68
|
==== Kafka Output Configuration Options
|
@@ -58,7 +71,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
|
|
58
71
|
|
59
72
|
NOTE: Some of these options map to a Kafka option. Defaults usually reflect the Kafka default setting,
|
60
73
|
and might change if Kafka's producer defaults change.
|
61
|
-
See the https://kafka.apache.org/
|
74
|
+
See the https://kafka.apache.org/{kafka_client_doc}/documentation for more details.
|
62
75
|
|
63
76
|
[cols="<,<,<",options="header",]
|
64
77
|
|=======================================================================
|
@@ -67,6 +80,7 @@ See the https://kafka.apache.org/24/documentation for more details.
|
|
67
80
|
| <<plugins-{type}s-{plugin}-batch_size>> |<<number,number>>|No
|
68
81
|
| <<plugins-{type}s-{plugin}-bootstrap_servers>> |<<string,string>>|No
|
69
82
|
| <<plugins-{type}s-{plugin}-buffer_memory>> |<<number,number>>|No
|
83
|
+
| <<plugins-{type}s-{plugin}-client_dns_lookup>> |<<string,string>>|No
|
70
84
|
| <<plugins-{type}s-{plugin}-client_id>> |<<string,string>>|No
|
71
85
|
| <<plugins-{type}s-{plugin}-compression_type>> |<<string,string>>, one of `["none", "gzip", "snappy", "lz4"]`|No
|
72
86
|
| <<plugins-{type}s-{plugin}-jaas_path>> |a valid filesystem path|No
|
@@ -114,10 +128,13 @@ output plugins.
|
|
114
128
|
The number of acknowledgments the producer requires the leader to have received
|
115
129
|
before considering a request complete.
|
116
130
|
|
117
|
-
acks=0
|
118
|
-
|
119
|
-
|
120
|
-
|
131
|
+
`acks=0`. The producer will not wait for any acknowledgment from the server.
|
132
|
+
|
133
|
+
`acks=1`. The leader will write the record to its local log, but will respond
|
134
|
+
without waiting for full acknowledgement from all followers.
|
135
|
+
|
136
|
+
`acks=all`. The leader will wait for the full set of in-sync replicas before
|
137
|
+
acknowledging the record.
|
121
138
|
|
122
139
|
[id="plugins-{type}s-{plugin}-batch_size"]
|
123
140
|
===== `batch_size`
|
@@ -149,6 +166,18 @@ subset of brokers.
|
|
149
166
|
|
150
167
|
The total bytes of memory the producer can use to buffer records waiting to be sent to the server.
|
151
168
|
|
169
|
+
[id="plugins-{type}s-{plugin}-client_dns_lookup"]
|
170
|
+
===== `client_dns_lookup`
|
171
|
+
|
172
|
+
* Value type is <<string,string>>
|
173
|
+
* Valid options are `use_all_dns_ips`, `resolve_canonical_bootstrap_servers_only`, `default`
|
174
|
+
* Default value is `"default"`
|
175
|
+
|
176
|
+
Controls how DNS lookups are done. If set to `use_all_dns_ips`, Logstash tries
|
177
|
+
all IP addresses returned for a hostname before failing the connection.
|
178
|
+
If set to `resolve_canonical_bootstrap_servers_only`, each entry will be
|
179
|
+
resolved and expanded into a list of canonical names.
|
180
|
+
|
152
181
|
[id="plugins-{type}s-{plugin}-client_id"]
|
153
182
|
===== `client_id`
|
154
183
|
|
@@ -166,7 +195,7 @@ ip/port by allowing a logical application name to be included with the request
|
|
166
195
|
* Default value is `"none"`
|
167
196
|
|
168
197
|
The compression type for all data generated by the producer.
|
169
|
-
The default is none (i.e. no compression). Valid values are none, gzip, or
|
198
|
+
The default is none (i.e. no compression). Valid values are none, gzip, snappy, or lz4.
|
170
199
|
|
171
200
|
[id="plugins-{type}s-{plugin}-jaas_path"]
|
172
201
|
===== `jaas_path`
|
@@ -311,6 +340,15 @@ Kafka down, etc).
|
|
311
340
|
|
312
341
|
A value less than zero is a configuration error.
|
313
342
|
|
343
|
+
Starting with version 10.5.0, this plugin will only retry exceptions that are a subclass of
|
344
|
+
https://kafka.apache.org/{kafka_client_doc}/javadoc/org/apache/kafka/common/errors/RetriableException.html[RetriableException]
|
345
|
+
and
|
346
|
+
https://kafka.apache.org/{kafka_client_doc}/javadoc/org/apache/kafka/common/errors/InterruptException.html[InterruptException].
|
347
|
+
If producing a message throws any other exception, an error is logged and the message is dropped without retrying.
|
348
|
+
This prevents the Logstash pipeline from hanging indefinitely.
|
349
|
+
|
350
|
+
In versions prior to 10.5.0, any exception is retried indefinitely unless the `retries` option is configured.
|
351
|
+
|
314
352
|
[id="plugins-{type}s-{plugin}-retry_backoff_ms"]
|
315
353
|
===== `retry_backoff_ms`
|
316
354
|
|
@@ -71,6 +71,11 @@ class LogStash::Inputs::Kafka < LogStash::Inputs::Base
|
|
71
71
|
# corruption to the messages occurred. This check adds some overhead, so it may be
|
72
72
|
# disabled in cases seeking extreme performance.
|
73
73
|
config :check_crcs, :validate => :boolean, :default => true
|
74
|
+
# How DNS lookups should be done. If set to `use_all_dns_ips`, when the lookup returns multiple
|
75
|
+
# IP addresses for a hostname, they will all be attempted to connect to before failing the
|
76
|
+
# connection. If the value is `resolve_canonical_bootstrap_servers_only` each entry will be
|
77
|
+
# resolved and expanded into a list of canonical names.
|
78
|
+
config :client_dns_lookup, :validate => ["default", "use_all_dns_ips", "resolve_canonical_bootstrap_servers_only"], :default => "default"
|
74
79
|
# The id string to pass to the server when making requests. The purpose of this
|
75
80
|
# is to be able to track the source of requests beyond just ip/port by allowing
|
76
81
|
# a logical application name to be included.
|
@@ -109,6 +114,11 @@ class LogStash::Inputs::Kafka < LogStash::Inputs::Base
|
|
109
114
|
# `session.timeout.ms`, but typically should be set no higher than 1/3 of that value.
|
110
115
|
# It can be adjusted even lower to control the expected time for normal rebalances.
|
111
116
|
config :heartbeat_interval_ms, :validate => :number, :default => 3000 # Kafka default
|
117
|
+
# Controls how to read messages written transactionally. If set to read_committed, consumer.poll()
|
118
|
+
# will only return transactional messages which have been committed. If set to read_uncommitted'
|
119
|
+
# (the default), consumer.poll() will return all messages, even transactional messages which have
|
120
|
+
# been aborted. Non-transactional messages will be returned unconditionally in either mode.
|
121
|
+
config :isolation_level, :validate => ["read_uncommitted", "read_committed"], :default => "read_uncommitted" # Kafka default
|
112
122
|
# Java Class used to deserialize the record's key
|
113
123
|
config :key_deserializer_class, :validate => :string, :default => "org.apache.kafka.common.serialization.StringDeserializer"
|
114
124
|
# The maximum delay between invocations of poll() when using consumer group management. This places
|
@@ -296,6 +306,7 @@ class LogStash::Inputs::Kafka < LogStash::Inputs::Base
|
|
296
306
|
props.put(kafka::AUTO_OFFSET_RESET_CONFIG, auto_offset_reset) unless auto_offset_reset.nil?
|
297
307
|
props.put(kafka::BOOTSTRAP_SERVERS_CONFIG, bootstrap_servers)
|
298
308
|
props.put(kafka::CHECK_CRCS_CONFIG, check_crcs.to_s) unless check_crcs.nil?
|
309
|
+
props.put(kafka::CLIENT_DNS_LOOKUP_CONFIG, client_dns_lookup)
|
299
310
|
props.put(kafka::CLIENT_ID_CONFIG, client_id)
|
300
311
|
props.put(kafka::CONNECTIONS_MAX_IDLE_MS_CONFIG, connections_max_idle_ms.to_s) unless connections_max_idle_ms.nil?
|
301
312
|
props.put(kafka::ENABLE_AUTO_COMMIT_CONFIG, enable_auto_commit.to_s)
|
@@ -305,6 +316,7 @@ class LogStash::Inputs::Kafka < LogStash::Inputs::Base
|
|
305
316
|
props.put(kafka::FETCH_MIN_BYTES_CONFIG, fetch_min_bytes.to_s) unless fetch_min_bytes.nil?
|
306
317
|
props.put(kafka::GROUP_ID_CONFIG, group_id)
|
307
318
|
props.put(kafka::HEARTBEAT_INTERVAL_MS_CONFIG, heartbeat_interval_ms.to_s) unless heartbeat_interval_ms.nil?
|
319
|
+
props.put(kafka::ISOLATION_LEVEL_CONFIG, isolation_level)
|
308
320
|
props.put(kafka::KEY_DESERIALIZER_CLASS_CONFIG, key_deserializer_class)
|
309
321
|
props.put(kafka::MAX_PARTITION_FETCH_BYTES_CONFIG, max_partition_fetch_bytes.to_s) unless max_partition_fetch_bytes.nil?
|
310
322
|
props.put(kafka::MAX_POLL_RECORDS_CONFIG, max_poll_records.to_s) unless max_poll_records.nil?
|
@@ -79,6 +79,11 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
|
|
79
79
|
# The compression type for all data generated by the producer.
|
80
80
|
# The default is none (i.e. no compression). Valid values are none, gzip, or snappy.
|
81
81
|
config :compression_type, :validate => ["none", "gzip", "snappy", "lz4"], :default => "none"
|
82
|
+
# How DNS lookups should be done. If set to `use_all_dns_ips`, when the lookup returns multiple
|
83
|
+
# IP addresses for a hostname, they will all be attempted to connect to before failing the
|
84
|
+
# connection. If the value is `resolve_canonical_bootstrap_servers_only` each entry will be
|
85
|
+
# resolved and expanded into a list of canonical names.
|
86
|
+
config :client_dns_lookup, :validate => ["default", "use_all_dns_ips", "resolve_canonical_bootstrap_servers_only"], :default => "default"
|
82
87
|
# The id string to pass to the server when making requests.
|
83
88
|
# The purpose of this is to be able to track the source of requests beyond just
|
84
89
|
# ip/port by allowing a logical application name to be included with the request
|
@@ -231,7 +236,7 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
|
|
231
236
|
remaining = @retries
|
232
237
|
|
233
238
|
while batch.any?
|
234
|
-
|
239
|
+
unless remaining.nil?
|
235
240
|
if remaining < 0
|
236
241
|
# TODO(sissel): Offer to DLQ? Then again, if it's a transient fault,
|
237
242
|
# DLQing would make things worse (you dlq data that would be successful
|
@@ -250,27 +255,39 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
|
|
250
255
|
begin
|
251
256
|
# send() can throw an exception even before the future is created.
|
252
257
|
@producer.send(record)
|
253
|
-
rescue org.apache.kafka.common.errors.
|
258
|
+
rescue org.apache.kafka.common.errors.InterruptException,
|
259
|
+
org.apache.kafka.common.errors.RetriableException => e
|
260
|
+
logger.info("producer send failed, will retry sending", :exception => e.class, :message => e.message)
|
254
261
|
failures << record
|
255
262
|
nil
|
256
|
-
rescue org.apache.kafka.common.
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
# TODO(sissel): Let's add DLQ here.
|
262
|
-
failures << record
|
263
|
+
rescue org.apache.kafka.common.KafkaException => e
|
264
|
+
# This error is not retriable, drop event
|
265
|
+
# TODO: add DLQ support
|
266
|
+
logger.warn("producer send failed, dropping record",:exception => e.class, :message => e.message,
|
267
|
+
:record_value => record.value)
|
263
268
|
nil
|
264
269
|
end
|
265
|
-
end
|
270
|
+
end
|
266
271
|
|
267
272
|
futures.each_with_index do |future, i|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
273
|
+
# We cannot skip nils using `futures.compact` because then our index `i` will not align with `batch`
|
274
|
+
unless future.nil?
|
275
|
+
begin
|
276
|
+
future.get
|
277
|
+
rescue java.util.concurrent.ExecutionException => e
|
278
|
+
# TODO(sissel): Add metric to count failures, possibly by exception type.
|
279
|
+
if e.get_cause.is_a? org.apache.kafka.common.errors.RetriableException or
|
280
|
+
e.get_cause.is_a? org.apache.kafka.common.errors.InterruptException
|
281
|
+
logger.info("producer send failed, will retry sending", :exception => e.cause.class,
|
282
|
+
:message => e.cause.message)
|
283
|
+
failures << batch[i]
|
284
|
+
elsif e.get_cause.is_a? org.apache.kafka.common.KafkaException
|
285
|
+
# This error is not retriable, drop event
|
286
|
+
# TODO: add DLQ support
|
287
|
+
logger.warn("producer send failed, dropping record", :exception => e.cause.class,
|
288
|
+
:message => e.cause.message, :record_value => batch[i].value)
|
289
|
+
end
|
290
|
+
end
|
274
291
|
end
|
275
292
|
end
|
276
293
|
|
@@ -318,6 +335,7 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
|
|
318
335
|
props.put(kafka::BOOTSTRAP_SERVERS_CONFIG, bootstrap_servers)
|
319
336
|
props.put(kafka::BUFFER_MEMORY_CONFIG, buffer_memory.to_s)
|
320
337
|
props.put(kafka::COMPRESSION_TYPE_CONFIG, compression_type)
|
338
|
+
props.put(kafka::CLIENT_DNS_LOOKUP_CONFIG, client_dns_lookup)
|
321
339
|
props.put(kafka::CLIENT_ID_CONFIG, client_id) unless client_id.nil?
|
322
340
|
props.put(kafka::KEY_SERIALIZER_CLASS_CONFIG, key_serializer)
|
323
341
|
props.put(kafka::LINGER_MS_CONFIG, linger_ms.to_s)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-integration-kafka'
|
3
|
-
s.version = '10.2
|
3
|
+
s.version = '10.5.2'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = "Integration with Kafka - input and output plugins"
|
6
6
|
s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline "+
|
@@ -56,14 +56,15 @@ describe "outputs/kafka" do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context "when KafkaProducer#send() raises
|
59
|
+
context "when KafkaProducer#send() raises a retriable exception" do
|
60
60
|
let(:failcount) { (rand * 10).to_i }
|
61
61
|
let(:sendcount) { failcount + 1 }
|
62
62
|
|
63
63
|
let(:exception_classes) { [
|
64
64
|
org.apache.kafka.common.errors.TimeoutException,
|
65
|
+
org.apache.kafka.common.errors.DisconnectException,
|
66
|
+
org.apache.kafka.common.errors.CoordinatorNotAvailableException,
|
65
67
|
org.apache.kafka.common.errors.InterruptException,
|
66
|
-
org.apache.kafka.common.errors.SerializationException
|
67
68
|
] }
|
68
69
|
|
69
70
|
before do
|
@@ -88,6 +89,37 @@ describe "outputs/kafka" do
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
92
|
+
context "when KafkaProducer#send() raises a non-retriable exception" do
|
93
|
+
let(:failcount) { (rand * 10).to_i }
|
94
|
+
|
95
|
+
let(:exception_classes) { [
|
96
|
+
org.apache.kafka.common.errors.SerializationException,
|
97
|
+
org.apache.kafka.common.errors.RecordTooLargeException,
|
98
|
+
org.apache.kafka.common.errors.InvalidTopicException
|
99
|
+
] }
|
100
|
+
|
101
|
+
before do
|
102
|
+
count = 0
|
103
|
+
expect_any_instance_of(org.apache.kafka.clients.producer.KafkaProducer).to receive(:send)
|
104
|
+
.exactly(1).times
|
105
|
+
.and_wrap_original do |m, *args|
|
106
|
+
if count < failcount # fail 'failcount' times in a row.
|
107
|
+
count += 1
|
108
|
+
# Pick an exception at random
|
109
|
+
raise exception_classes.shuffle.first.new("injected exception for testing")
|
110
|
+
else
|
111
|
+
m.call(*args) # call original
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should not retry" do
|
117
|
+
kafka = LogStash::Outputs::Kafka.new(simple_kafka_config)
|
118
|
+
kafka.register
|
119
|
+
kafka.multi_receive([event])
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
91
123
|
context "when a send fails" do
|
92
124
|
context "and the default retries behavior is used" do
|
93
125
|
# Fail this many times and then finally succeed.
|
@@ -107,7 +139,7 @@ describe "outputs/kafka" do
|
|
107
139
|
# inject some failures.
|
108
140
|
|
109
141
|
# Return a custom Future that will raise an exception to simulate a Kafka send() problem.
|
110
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
142
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
111
143
|
future.run
|
112
144
|
future
|
113
145
|
else
|
@@ -129,7 +161,7 @@ describe "outputs/kafka" do
|
|
129
161
|
.once
|
130
162
|
.and_wrap_original do |m, *args|
|
131
163
|
# Always fail.
|
132
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
164
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
133
165
|
future.run
|
134
166
|
future
|
135
167
|
end
|
@@ -143,7 +175,7 @@ describe "outputs/kafka" do
|
|
143
175
|
.once
|
144
176
|
.and_wrap_original do |m, *args|
|
145
177
|
# Always fail.
|
146
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
178
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
147
179
|
future.run
|
148
180
|
future
|
149
181
|
end
|
@@ -164,7 +196,7 @@ describe "outputs/kafka" do
|
|
164
196
|
.at_most(max_sends).times
|
165
197
|
.and_wrap_original do |m, *args|
|
166
198
|
# Always fail.
|
167
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
199
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
168
200
|
future.run
|
169
201
|
future
|
170
202
|
end
|
@@ -175,10 +207,10 @@ describe "outputs/kafka" do
|
|
175
207
|
|
176
208
|
it 'should only sleep retries number of times' do
|
177
209
|
expect_any_instance_of(org.apache.kafka.clients.producer.KafkaProducer).to receive(:send)
|
178
|
-
.at_most(max_sends)
|
210
|
+
.at_most(max_sends).times
|
179
211
|
.and_wrap_original do |m, *args|
|
180
212
|
# Always fail.
|
181
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
213
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
182
214
|
future.run
|
183
215
|
future
|
184
216
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-integration-kafka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 10.2
|
4
|
+
version: 10.5.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|