logstash-filter-kafka_time_machine 2.0.0 → 3.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +63 -10
- data/lib/logstash/filters/kafka_time_machine.rb +71 -42
- data/logstash-filter-kafka_time_machine.gemspec +1 -2
- metadata +5 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 051f813a378da7788b0731000d62645d1475d70672c1845244504f55a0d4b7a9
|
4
|
+
data.tar.gz: c0259a2da821f3da532e97db28a14d7f5e02da5afc21448adb4e50683ff9c305
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32a0b27107ac983b22cc863d555ce9076f065d5faa01fbf64c83cf30083009cb613c8dfe989d2338863f4d52d83851b747ab76d745e768f322ffdab88258d0f4
|
7
|
+
data.tar.gz: 21ce90deb6265a9af0d33dfdb630f3562a2840d097a1d62b4b414b9fd6298ec943fabaa91f66a847fa681ea47bc3b64b19607aaf109ed482611761e2faee9339
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/logstash-filter-kafka_time_machine.svg)](https://badge.fury.io/rb/logstash-filter-kafka_time_machine)
|
2
|
+
[![Build Status](https://drone.lma.wbx2.com/api/badges/post-deployment/logstash-filter-kafka_time_machine/status.svg)](https://drone.lma.wbx2.com/post-deployment/logstash-filter-kafka_time_machine)
|
2
3
|
|
3
4
|
# Logstash Plugin: logstash-filter-kafka_time_machine
|
4
5
|
|
@@ -23,20 +24,20 @@ The filter leverages metadata inserted into the log event on both `logstash_ship
|
|
23
24
|
When the `kafka_time_machine` executes it will return a [InfluxDB Line Protocol](https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_tutorial/) formatted metric, i.e.:
|
24
25
|
|
25
26
|
```
|
26
|
-
ktm,datacenter=kafka_datacenter_shipper-test,lag_type=total,owner=ktm_test@cisco.com lag_ms=300i,payload_size_bytes=40i 1634662795000000000
|
27
|
+
ktm,datacenter=kafka_datacenter_shipper-test,es_cluster=some_cluster_name,es_cluster_index=some_cluster_index_name,lag_type=total,owner=ktm_test@cisco.com lag_ms=300i,payload_size_bytes=40i 1634662795000000000
|
27
28
|
```
|
28
29
|
|
29
30
|
The plugin will also emit a metric if an error was encountered, i.e.:
|
30
31
|
|
31
32
|
```
|
32
|
-
ktm_error,datacenter=kafka_datacenter_shipper-test,owner=ktm_test@cisco.com,source=shipper count=1i 1634662795000000000
|
33
|
+
ktm_error,datacenter=kafka_datacenter_shipper-test,es_cluster=some_cluster_name,es_cluster_index=some_cluster_index_name,owner=ktm_test@cisco.com,source=shipper count=1i 1634662795000000000
|
33
34
|
```
|
34
35
|
|
35
36
|
To ensure a logstash `output{}` block can properly route this metric, the new event are tagged with a `[@metadata][ktm_tag][ktm_metric]` field, i.e.:
|
36
37
|
|
37
38
|
```
|
38
39
|
{
|
39
|
-
"ktm_metric" => "ktm,datacenter=kafka_datacenter_shipper-test,lag_type=total,owner=ktm_test@cisco.com lag_ms=300i,payload_size_bytes=40i 1634662795000000000",
|
40
|
+
"ktm_metric" => "ktm,datacenter=kafka_datacenter_shipper-test,lag_type=total,es_cluster=some_cluster_name,es_cluster_index=some_cluster_index_name,owner=ktm_test@cisco.com lag_ms=300i,payload_size_bytes=40i 1634662795000000000",
|
40
41
|
"@timestamp" => 2021-10-20T23:46:24.704Z,
|
41
42
|
"@metadata" => {
|
42
43
|
"ktm_tags" => {
|
@@ -59,6 +60,8 @@ In the case of `ktm` the metric breakdown is:
|
|
59
60
|
| Line Protocol Element | Line Protocol Type | Description |
|
60
61
|
| --------------------- | ------------------ | ------------------------------------------- |
|
61
62
|
| datacenter | tag | Echo of `kafka_datacenter_shipper` |
|
63
|
+
| es_cluster | tag | Echo of `elasticsearch_cluster` |
|
64
|
+
| es_cluster_index | tag | Echo of `elasticsearch_cluster_index` |
|
62
65
|
| lag_type | tag | Calculated lag type |
|
63
66
|
| owner | tag | Echo of `event_owner` |
|
64
67
|
| lag_ms | field | Calculated lag in milliseconds |
|
@@ -72,12 +75,14 @@ Meaning of `lag_type`:
|
|
72
75
|
|
73
76
|
In the case of `ktm_error` the metric breakdown is:
|
74
77
|
|
75
|
-
| Line Protocol Element | Line Protocol Type | Description
|
76
|
-
| --------------------- | ------------------ |
|
77
|
-
| datacenter | tag | Echo of `kafka_datacenter_shipper`
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
| Line Protocol Element | Line Protocol Type | Description |
|
79
|
+
| --------------------- | ------------------ | ------------------------------------- |
|
80
|
+
| datacenter | tag | Echo of `kafka_datacenter_shipper` |
|
81
|
+
| es_cluster | tag | Echo of `elasticsearch_cluster` |
|
82
|
+
| es_cluster_index | tag | Echo of `elasticsearch_cluster_index` |
|
83
|
+
| source | tag | Source of the error metric |
|
84
|
+
| owner | tag | Echo of `event_owner` |
|
85
|
+
| count | field | Count to track error; not cumulative |
|
81
86
|
|
82
87
|
Meaning of `source`:
|
83
88
|
|
@@ -113,6 +118,8 @@ This plugin requires the following configurations:
|
|
113
118
|
| [logstash_kafka_read_time_indexer](#logstash_kafka_read_time_indexer) | string | Yes |
|
114
119
|
| [event_owner](#event_owner) | string | Yes |
|
115
120
|
| [event_time_ms](#event_time_ms) | string | Yes |
|
121
|
+
| [elasticsearch_cluster](#elasticsearch_cluster) | string | Yes |
|
122
|
+
| [elasticsearch_cluster_index](#elasticsearch_cluster_index) | string | Yes |
|
116
123
|
|
117
124
|
> Why are all settings required?
|
118
125
|
>
|
@@ -371,4 +378,50 @@ filter {
|
|
371
378
|
event_time_ms => "%{[dynamic_field]}"
|
372
379
|
}
|
373
380
|
}
|
374
|
-
```
|
381
|
+
```
|
382
|
+
|
383
|
+
### elasticsearch_cluster
|
384
|
+
|
385
|
+
- Value type is [string](https://www.elastic.co/guide/en/logstash/7.13/configuration-file-structure.html#string)
|
386
|
+
- There is no default value for this setting.
|
387
|
+
|
388
|
+
Provide identifier for ElasticSearch cluster log was sent to; represents the owner of the log. Field values can be static or dynamic:
|
389
|
+
|
390
|
+
```
|
391
|
+
filter {
|
392
|
+
kafka_time_machine {
|
393
|
+
elasticsearch_cluster => "static_field"
|
394
|
+
}
|
395
|
+
}
|
396
|
+
```
|
397
|
+
|
398
|
+
```
|
399
|
+
filter {
|
400
|
+
kafka_time_machine {
|
401
|
+
elasticsearch_cluster => "%{[dynamic_field]}"
|
402
|
+
}
|
403
|
+
}
|
404
|
+
```
|
405
|
+
|
406
|
+
### elasticsearch_cluster_index
|
407
|
+
|
408
|
+
- Value type is [string](https://www.elastic.co/guide/en/logstash/7.13/configuration-file-structure.html#string)
|
409
|
+
- There is no default value for this setting.
|
410
|
+
|
411
|
+
Provide identifier for ElasticSearch cluster index log will be indexed in; represents the owner of the log. Field values can be static or dynamic:
|
412
|
+
|
413
|
+
```
|
414
|
+
filter {
|
415
|
+
kafka_time_machine {
|
416
|
+
elasticsearch_cluster_index => "static_field"
|
417
|
+
}
|
418
|
+
}
|
419
|
+
```
|
420
|
+
|
421
|
+
```
|
422
|
+
filter {
|
423
|
+
kafka_time_machine {
|
424
|
+
elasticsearch_cluster_index => "%{[dynamic_field]}"
|
425
|
+
}
|
426
|
+
}
|
427
|
+
```
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require "logstash/filters/base"
|
3
3
|
require "logstash/namespace"
|
4
4
|
require "logstash/event"
|
5
|
-
require "
|
5
|
+
require "json"
|
6
6
|
|
7
7
|
class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
8
8
|
|
@@ -38,9 +38,15 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
38
38
|
# Owner of the event currenty being process.
|
39
39
|
config :event_owner, :validate => :string, :required => true
|
40
40
|
|
41
|
-
# Current time since EPOCH in ms that should be set in the
|
41
|
+
# Current time since EPOCH in ms that should be set in the generated metric
|
42
42
|
config :event_time_ms, :validate => :string, :required => true
|
43
43
|
|
44
|
+
# Current time since EPOCH in ms that should be set in the generated metric
|
45
|
+
config :elasticsearch_cluster, :validate => :string, :required => true
|
46
|
+
|
47
|
+
# Current time since EPOCH in ms that should be set in the generated metric
|
48
|
+
config :elasticsearch_cluster_index, :validate => :string, :required => true
|
49
|
+
|
44
50
|
public
|
45
51
|
def register
|
46
52
|
|
@@ -61,6 +67,8 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
61
67
|
shipper_kafka_consumer_group = event.sprintf(@kafka_consumer_group_shipper)
|
62
68
|
indexer_kafka_topic = event.sprintf(@kafka_topic_indexer)
|
63
69
|
indexer_kafka_consumer_group = event.sprintf(@kafka_consumer_group_indexer)
|
70
|
+
elasticsearch_cluster = event.sprintf(@elasticsearch_cluster)
|
71
|
+
elasticsearch_cluster_index = event.sprintf(@elasticsearch_cluster_index)
|
64
72
|
|
65
73
|
# Extract all the "time" related values to local variables. This need special handling due to the Float() operation.
|
66
74
|
#
|
@@ -72,10 +80,11 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
72
80
|
indexer_logstash_kafka_read_time = get_numeric(event.sprintf(@logstash_kafka_read_time_indexer))
|
73
81
|
|
74
82
|
# Validate the shipper data
|
75
|
-
shipper_kafka_array = Array[shipper_kafka_datacenter, shipper_kafka_topic, shipper_kafka_consumer_group, shipper_kafka_append_time, shipper_logstash_kafka_read_time, event_owner, event_time_ms]
|
83
|
+
shipper_kafka_array = Array[shipper_kafka_datacenter, shipper_kafka_topic, shipper_kafka_consumer_group, shipper_kafka_append_time, shipper_logstash_kafka_read_time, event_owner, event_time_ms, elasticsearch_cluster, elasticsearch_cluster_index]
|
76
84
|
if (shipper_kafka_array.any? { |text| text.nil? || text.to_s.empty? })
|
77
85
|
@logger.debug("shipper_kafka_array invalid: Found null")
|
78
86
|
error_string_shipper = sprintf("Error in shipper data: %s", shipper_kafka_array)
|
87
|
+
@logger.debug(error_string_shipper)
|
79
88
|
shipper_valid = false
|
80
89
|
else
|
81
90
|
@logger.debug("shipper_kafka_array valid")
|
@@ -86,10 +95,11 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
86
95
|
end
|
87
96
|
|
88
97
|
# Validate the indexer data
|
89
|
-
indexer_kafka_array = Array[shipper_kafka_datacenter, indexer_kafka_topic, indexer_kafka_consumer_group, indexer_kafka_append_time, indexer_logstash_kafka_read_time, event_owner, event_time_ms]
|
98
|
+
indexer_kafka_array = Array[shipper_kafka_datacenter, indexer_kafka_topic, indexer_kafka_consumer_group, indexer_kafka_append_time, indexer_logstash_kafka_read_time, event_owner, event_time_ms, elasticsearch_cluster, elasticsearch_cluster_index]
|
90
99
|
if (indexer_kafka_array.any? { |text| text.nil? || text.to_s.empty? })
|
91
100
|
@logger.debug("indexer_kafka_array invalid: Found null")
|
92
101
|
error_string_indexer = sprintf("Error in indexer data: %s", indexer_kafka_array)
|
102
|
+
@logger.debug(error_string_indexer)
|
93
103
|
indexer_valid = false
|
94
104
|
else
|
95
105
|
@logger.debug("indexer_kafka_array valid")
|
@@ -100,12 +110,12 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
100
110
|
end
|
101
111
|
|
102
112
|
# Add in the size of the payload field
|
103
|
-
|
113
|
+
payload_size_bytes = 0
|
104
114
|
if event.get("[payload]")
|
105
|
-
|
115
|
+
payload_size_bytes = event.get("[payload]").bytesize
|
106
116
|
end
|
107
117
|
|
108
|
-
# Set time (nanoseconds) for
|
118
|
+
# Set time (nanoseconds) for event that is generated
|
109
119
|
epoch_time_ns = nil
|
110
120
|
if (event_time_ms != nil )
|
111
121
|
epoch_time_ns = event_time_ms * 1000000
|
@@ -118,35 +128,35 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
118
128
|
if (shipper_valid == true && indexer_valid == true && epoch_time_ns != nil)
|
119
129
|
total_kafka_lag_ms = indexer_logstash_kafka_read_time - shipper_kafka_append_time
|
120
130
|
|
121
|
-
|
122
|
-
ktm_metric_event_array.push
|
131
|
+
point_ktm = create_point_ktm(shipper_kafka_datacenter, event_owner, payload_size_bytes, "total", total_kafka_lag_ms, epoch_time_ns, elasticsearch_cluster, elasticsearch_cluster_index)
|
132
|
+
ktm_metric_event_array.push point_ktm
|
123
133
|
|
124
134
|
elsif (shipper_valid == true && indexer_valid == false && epoch_time_ns != nil)
|
125
|
-
|
126
|
-
ktm_metric_event_array.push
|
135
|
+
point_ktm = create_point_ktm(shipper_kafka_datacenter, event_owner, payload_size_bytes, "shipper", shipper_kafka_lag_ms, epoch_time_ns, elasticsearch_cluster, elasticsearch_cluster_index)
|
136
|
+
ktm_metric_event_array.push point_ktm
|
127
137
|
|
128
|
-
|
129
|
-
ktm_metric_event_array.push
|
138
|
+
point_ktm = create_point_ktm_error(shipper_kafka_datacenter, event_owner, epoch_time_ns, "indexer", elasticsearch_cluster, elasticsearch_cluster_index)
|
139
|
+
ktm_metric_event_array.push point_ktm
|
130
140
|
|
131
141
|
elsif (indexer_valid == true && shipper_valid == false && epoch_time_ns != nil)
|
132
|
-
|
133
|
-
ktm_metric_event_array.push
|
142
|
+
point_ktm = create_point_ktm(shipper_kafka_datacenter, event_owner, payload_size_bytes, "indexer", indexer_kafka_lag_ms, epoch_time_ns, elasticsearch_cluster, elasticsearch_cluster_index)
|
143
|
+
ktm_metric_event_array.push point_ktm
|
134
144
|
|
135
|
-
|
136
|
-
ktm_metric_event_array.push
|
145
|
+
point_ktm = create_point_ktm_error(shipper_kafka_datacenter, event_owner, epoch_time_ns, "shipper", elasticsearch_cluster, elasticsearch_cluster_index)
|
146
|
+
ktm_metric_event_array.push point_ktm
|
137
147
|
|
138
148
|
elsif (indexer_valid == false && shipper_valid == false)
|
139
149
|
|
140
|
-
|
141
|
-
ktm_metric_event_array.push
|
150
|
+
point_ktm = create_point_ktm_error(shipper_kafka_datacenter, event_owner, epoch_time_ns, "insufficient_data", elasticsearch_cluster, elasticsearch_cluster_index)
|
151
|
+
ktm_metric_event_array.push point_ktm
|
142
152
|
|
143
153
|
error_string = sprintf("Error kafka_time_machine: Could not build valid response --> %s, %s", error_string_shipper, error_string_indexer)
|
144
154
|
@logger.debug(error_string)
|
145
155
|
|
146
156
|
else
|
147
157
|
|
148
|
-
|
149
|
-
ktm_metric_event_array.push
|
158
|
+
point_ktm = create_point_ktm_error(shipper_kafka_datacenter, event_owner, epoch_time_ns, "unknown", elasticsearch_cluster, elasticsearch_cluster_index)
|
159
|
+
ktm_metric_event_array.push point_ktm
|
150
160
|
|
151
161
|
error_string = "Unknown error encountered"
|
152
162
|
@logger.debug(error_string)
|
@@ -157,9 +167,7 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
157
167
|
ktm_metric_event_array.each do |metric_event|
|
158
168
|
|
159
169
|
# Create new event for KTM metric
|
160
|
-
event_ktm = LogStash::Event.new
|
161
|
-
|
162
|
-
event_ktm.set("ktm_metric", metric_event)
|
170
|
+
event_ktm = LogStash::Event.new(metric_event)
|
163
171
|
event_ktm.set("[@metadata][ktm_tags][ktm_metric]", "true")
|
164
172
|
|
165
173
|
filter_matched(event_ktm)
|
@@ -169,23 +177,34 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
169
177
|
|
170
178
|
end # def filter
|
171
179
|
|
172
|
-
# Creates
|
180
|
+
# Creates hash with ktm data point to return
|
173
181
|
public
|
174
|
-
def
|
182
|
+
def create_point_ktm(datacenter, event_owner, payload_size_bytes, lag_type, lag_ms, epoch_time_ns, elasticsearch_cluster, elasticsearch_cluster_index)
|
183
|
+
|
184
|
+
point = Hash.new
|
185
|
+
|
186
|
+
# Name of point and time created
|
187
|
+
point["name"] = "ktm"
|
188
|
+
point["epotch_time_ns"] = epoch_time_ns
|
175
189
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
190
|
+
# tags
|
191
|
+
point["datacenter"] = datacenter
|
192
|
+
point["owner"] = event_owner
|
193
|
+
point["lag_type"] = lag_type
|
194
|
+
point["es_cluster"] = elasticsearch_cluster
|
195
|
+
point["es_cluster_index"] = elasticsearch_cluster_index
|
180
196
|
|
181
|
-
|
182
|
-
|
197
|
+
# fields
|
198
|
+
point["payload_size_bytes"] = payload_size_bytes
|
199
|
+
point["lag_ms"] = lag_ms
|
183
200
|
|
184
|
-
|
201
|
+
return point
|
185
202
|
|
186
|
-
#
|
203
|
+
end # def create_point_ktm
|
204
|
+
|
205
|
+
# Creates hash with ktm data point to return
|
187
206
|
public
|
188
|
-
def
|
207
|
+
def create_point_ktm_error(datacenter, event_owner, epoch_time_ns, type, elasticsearch_cluster, elasticsearch_cluster_index)
|
189
208
|
|
190
209
|
# Check for nil values
|
191
210
|
if (nil == datacenter)
|
@@ -201,15 +220,25 @@ class LogStash::Filters::KafkaTimeMachine < LogStash::Filters::Base
|
|
201
220
|
epoch_time_ns = ((Time.now.to_f * 1000).to_i)*1000000
|
202
221
|
end
|
203
222
|
|
204
|
-
point =
|
205
|
-
tags: {datacenter: datacenter, owner: event_owner, source: type},
|
206
|
-
fields: {count: 1},
|
207
|
-
time: epoch_time_ns)
|
223
|
+
point = Hash.new
|
208
224
|
|
209
|
-
|
210
|
-
|
225
|
+
# Name of point and time created
|
226
|
+
point["name"] = "ktm_error"
|
227
|
+
point["epotch_time_ns"] = epoch_time_ns
|
228
|
+
|
229
|
+
# tags
|
230
|
+
point["datacenter"] = datacenter
|
231
|
+
point["owner"] = event_owner
|
232
|
+
point["source"] = type
|
233
|
+
point["es_cluster"] = elasticsearch_cluster
|
234
|
+
point["es_cluster_index"] = elasticsearch_cluster_index
|
235
|
+
|
236
|
+
# fields
|
237
|
+
point["count"] = 1
|
238
|
+
|
239
|
+
return point
|
211
240
|
|
212
|
-
end # def
|
241
|
+
end # def create_point_ktm_error
|
213
242
|
|
214
243
|
# Ensures the provided value is numeric; if not returns 'nil'
|
215
244
|
public
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-filter-kafka_time_machine'
|
3
|
-
s.version = '
|
3
|
+
s.version = '3.0.0.pre'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = "Calculate total time of logstash event that traversed 2 Kafka queues from a shipper site to an indexer site"
|
6
6
|
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
|
@@ -20,6 +20,5 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
# Gem dependencies
|
22
22
|
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
|
23
|
-
s.add_runtime_dependency "influxdb-client", "~> 2.0.0"
|
24
23
|
s.add_development_dependency 'logstash-devutils', '~> 0'
|
25
24
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-kafka_time_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Foster
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-core-plugin-api
|
@@ -30,20 +30,6 @@ dependencies:
|
|
30
30
|
- - "<="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '2.99'
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: influxdb-client
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: 2.0.0
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 2.0.0
|
47
33
|
- !ruby/object:Gem::Dependency
|
48
34
|
name: logstash-devutils
|
49
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,11 +73,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
73
|
version: '0'
|
88
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
75
|
requirements:
|
90
|
-
- - "
|
76
|
+
- - ">"
|
91
77
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
78
|
+
version: 1.3.1
|
93
79
|
requirements: []
|
94
|
-
rubygems_version: 3.0.3
|
80
|
+
rubygems_version: 3.0.3.1
|
95
81
|
signing_key:
|
96
82
|
specification_version: 4
|
97
83
|
summary: Calculate total time of logstash event that traversed 2 Kafka queues from
|