logstash-output-scalyr 0.1.17.beta → 0.1.18.beta

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96fd1b3adba21150a05f43d1e8d6510711197da866d3cd6ec8b57bae14e53391
4
- data.tar.gz: 221aac42711955c49c878c324e2570ebb55050cad13f2d4911b99c4b3f1eb5a1
3
+ metadata.gz: 9099fcf20201bf8e3905273393a38bb1addefb219e1874a45a439bbfd2dcddbd
4
+ data.tar.gz: a031faa8657951b66a09c172f6be69b774a2192e661ef99370813abe62250cbb
5
5
  SHA512:
6
- metadata.gz: c8a678e7caf8778dbe9b44e8d8e48c809b016ac6b89424c4c29c29b63578fea61f236ae80a528dab7707c8ee534cfab0f20a252d688f44df53faccdd1ce907b0
7
- data.tar.gz: c263ae0ecffacb454f98f112d384c544cfd68fb0e0e6a0d7339a6b84add2c94b4bb99afd20a815b587f5722e0125d80fc25f9285574187c9f2a0ff2af7f219ec
6
+ metadata.gz: c25cad81473d0224fb5c75558e302f6383d69361d3263aeaf0fe619b8c2a3a6866bf0eaf811588b9235edb4e15e11a2d0b95ecb99e2a3045ee6c6e66998e1627
7
+ data.tar.gz: fed7e02e32c70ce199dbd7ec5841711ff77c65d3a56ebe53eeada8c165d5b8fa603fc15b3c00e0e397682a50899dd141bfdcacdcbb97244e2b26205c92802238
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Beta
2
2
 
3
+ ## 0.1.18.beta
4
+ - Add metrics for successfully sent and failed logstash events, and retries.
5
+ - Make array flattening optional during nested value flattening with the `flatten_nested_arrays` configuration option.
6
+
3
7
  ## 0.1.17.beta
4
8
  - Catch errors relating to Bignum conversions present in the ``json`` library and manually convert to string as
5
9
  a workaround.
data/README.md CHANGED
@@ -10,7 +10,7 @@ You can view documentation for this plugin [on the Scalyr website](https://app.s
10
10
  # Quick start
11
11
 
12
12
  1. Build the gem, run `gem build logstash-output-scalyr.gemspec`
13
- 2. Install the gem into a Logstash installation, run `/usr/share/logstash/bin/logstash-plugin install logstash-output-scalyr-0.1.17.beta.gem` or follow the latest official instructions on working with plugins from Logstash.
13
+ 2. Install the gem into a Logstash installation, run `/usr/share/logstash/bin/logstash-plugin install logstash-output-scalyr-0.1.18.beta.gem` or follow the latest official instructions on working with plugins from Logstash.
14
14
  3. Configure the output plugin (e.g. add it to a pipeline .conf)
15
15
  4. Restart Logstash
16
16
 
@@ -68,7 +68,8 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
68
68
  # If true, nested values will be flattened (which changes keys to delimiter-separated concatenation of all
69
69
  # nested keys).
70
70
  config :flatten_nested_values, :validate => :boolean, :default => false
71
- config :flatten_nested_values_delimiter, :validate => :string, :default => "_"
71
+ config :flatten_nested_values_delimiter, :validate => :string, :default => "_"
72
+ config :flatten_nested_arrays, :validate => :boolean, :default => true
72
73
 
73
74
  # If true, the 'tags' field will be flattened into key-values where each key is a tag and each value is set to
74
75
  # :flat_tag_value
@@ -241,6 +242,10 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
241
242
  # level metrics are handled by the HTTP Client class.
242
243
  @multi_receive_statistics = {
243
244
  :total_multi_receive_secs => 0,
245
+ :total_events_processed => 0,
246
+ :successful_events_processed => 0,
247
+ :failed_events_processed => 0,
248
+ :total_retry_count => 0,
244
249
  :total_java_class_cast_errors => 0
245
250
  }
246
251
  @plugin_metrics = get_new_metrics
@@ -345,6 +350,9 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
345
350
  sleep_interval = sleep_for(sleep_interval)
346
351
  exc_sleep += sleep_interval
347
352
  exc_retries += 1
353
+ @stats_lock.synchronize do
354
+ @multi_receive_statistics[:total_retry_count] += 1
355
+ end
348
356
  message = "Error uploading to Scalyr (will backoff-retry)"
349
357
  exc_data = {
350
358
  :error_class => e.e_class,
@@ -394,11 +402,19 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
394
402
  }
395
403
  exc_sleep += sleep_interval
396
404
  exc_retries += 1
405
+ @stats_lock.synchronize do
406
+ @multi_receive_statistics[:total_retry_count] += 1
407
+ end
397
408
  retry if @running and exc_retries < @max_retries
398
409
  log_retry_failure(multi_event_request, exc_data, exc_retries, exc_sleep)
399
410
  next
400
411
  end
401
412
 
413
+ @stats_lock.synchronize do
414
+ @multi_receive_statistics[:total_events_processed] += multi_event_request[:logstash_events].length
415
+ @multi_receive_statistics[:successful_events_processed] += multi_event_request[:logstash_events].length
416
+ end
417
+
402
418
  if !exc_data.nil?
403
419
  message = "Retry successful after error."
404
420
  if exc_commonly_retried
@@ -437,6 +453,10 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
437
453
 
438
454
 
439
455
  def log_retry_failure(multi_event_request, exc_data, exc_retries, exc_sleep)
456
+ @stats_lock.synchronize do
457
+ @multi_receive_statistics[:total_events_processed] += multi_event_request[:logstash_events].length
458
+ @multi_receive_statistics[:failed_events_processed] += multi_event_request[:logstash_events].length
459
+ end
440
460
  message = "Failed to send #{multi_event_request[:logstash_events].length} events after #{exc_retries} tries."
441
461
  sample_events = Array.new
442
462
  multi_event_request[:logstash_events][0,5].each {|l_event|
@@ -612,7 +632,7 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
612
632
  # flatten record
613
633
  if @flatten_nested_values
614
634
  start_time = Time.now.to_f
615
- record = Scalyr::Common::Util.flatten(record, delimiter=@flatten_nested_values_delimiter)
635
+ record = Scalyr::Common::Util.flatten(record, delimiter=@flatten_nested_values_delimiter, flatten_arrays=@flatten_nested_arrays)
616
636
  end_time = Time.now.to_f
617
637
  flatten_nested_values_duration = end_time - start_time
618
638
  end
@@ -4,7 +4,7 @@ module Scalyr; module Common; module Util;
4
4
  # Flattens a hash or array, returning a hash where keys are a delimiter-separated string concatenation of all
5
5
  # nested keys. Returned keys are always strings. If a non-hash or array is provided, raises TypeError.
6
6
  # Please see rspec util_spec.rb for expected behavior.
7
- def self.flatten(obj, delimiter='_')
7
+ def self.flatten(obj, delimiter='_', flatten_arrays=true)
8
8
 
9
9
  # base case is input object is not enumerable, in which case simply return it
10
10
  if !obj.respond_to?(:each)
@@ -19,8 +19,8 @@ def self.flatten(obj, delimiter='_')
19
19
 
20
20
  # input object is a hash
21
21
  obj.each do |key, value|
22
- if value.respond_to?(:each)
23
- flatten(value).each do |subkey, subvalue|
22
+ if (flatten_arrays and value.respond_to?(:each)) or value.respond_to?(:has_key?)
23
+ flatten(value, delimiter, flatten_arrays).each do |subkey, subvalue|
24
24
  result["#{key}#{delimiter}#{subkey}"] = subvalue
25
25
  end
26
26
  else
@@ -28,18 +28,23 @@ def self.flatten(obj, delimiter='_')
28
28
  end
29
29
  end
30
30
 
31
- else
31
+ elsif flatten_arrays
32
32
 
33
33
  # input object is an array or set
34
34
  obj.each_with_index do |value, index|
35
35
  if value.respond_to?(:each)
36
- flatten(value).each do |subkey, subvalue|
36
+ flatten(value, delimiter, flatten_arrays).each do |subkey, subvalue|
37
37
  result["#{index}#{delimiter}#{subkey}"] = subvalue
38
38
  end
39
39
  else
40
40
  result["#{index}"] = value
41
41
  end
42
42
  end
43
+
44
+ else
45
+
46
+ result = obj
47
+
43
48
  end
44
49
 
45
50
  return result
@@ -1,2 +1,2 @@
1
1
  # encoding: utf-8
2
- PLUGIN_VERSION = "v0.1.17.beta"
2
+ PLUGIN_VERSION = "v0.1.18.beta"
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-scalyr'
3
- s.version = '0.1.17.beta'
3
+ s.version = '0.1.18.beta'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = "Scalyr output plugin for Logstash"
6
6
  s.description = "Sends log data collected by Logstash to Scalyr (https://www.scalyr.com)"
@@ -273,9 +273,41 @@ describe LogStash::Outputs::Scalyr do
273
273
  expect(body['events'].size).to eq(3)
274
274
  expect(body['events'][2]['attrs']).to eq({
275
275
  "nested.a" => 1,
276
- "nested.b_0" => 3,
277
- "nested.b_1" => 4,
278
- "nested.b_2" => 5,
276
+ "nested.b.0" => 3,
277
+ "nested.b.1" => 4,
278
+ "nested.b.2" => 5,
279
+ 'seq' => 3,
280
+ 'source_file' => 'my file 3',
281
+ 'source_host' => 'my host 3',
282
+ 'serverHost' => 'Logstash',
283
+ "tag_prefix_t1" => "true",
284
+ "tag_prefix_t2" => "true",
285
+ "tag_prefix_t3" => "true",
286
+ "parser" => "logstashParser",
287
+ })
288
+ end
289
+ end
290
+
291
+ context "when configured to flatten values with custom delimiter, no array flattening" do
292
+ config = {
293
+ 'api_write_token' => '1234',
294
+ 'flatten_tags' => true,
295
+ 'flat_tag_value' => 'true',
296
+ 'flat_tag_prefix' => 'tag_prefix_',
297
+ 'flatten_nested_values' => true, # this converts into string 'true'
298
+ 'flatten_nested_arrays' => false,
299
+ 'flatten_nested_values_delimiter' => ".",
300
+ }
301
+ plugin = LogStash::Outputs::Scalyr.new(config)
302
+ it "flattens nested values with a period" do
303
+ allow(plugin).to receive(:send_status).and_return(nil)
304
+ plugin.register
305
+ result = plugin.build_multi_event_request_array(sample_events)
306
+ body = JSON.parse(result[0][:body])
307
+ expect(body['events'].size).to eq(3)
308
+ expect(body['events'][2]['attrs']).to eq({
309
+ "nested.a" => 1,
310
+ "nested.b" => [3, 4, 5],
279
311
  'seq' => 3,
280
312
  'source_file' => 'my file 3',
281
313
  'source_host' => 'my host 3',
@@ -132,6 +132,70 @@ describe Scalyr::Common::Util do
132
132
  expect(Scalyr::Common::Util.flatten(din)).to eq(dout)
133
133
  end
134
134
 
135
+ it "flattens a single-level array, no array flattening" do
136
+ din = [1, 2, 3]
137
+ dout = [1, 2, 3]
138
+ expect(Scalyr::Common::Util.flatten(din, "_", flatten_arrays=false)).to eq(dout)
139
+ end
140
+
141
+ it "flattens a multi-level array, no array flattening" do
142
+ din = ['a', 'b', ['c', ['d', 'e', 'f'], 'g'], 'h', 'i']
143
+ dout = ['a', 'b', ['c', ['d', 'e', 'f'], 'g'], 'h', 'i']
144
+ expect(Scalyr::Common::Util.flatten(din, "_", flatten_arrays=false)).to eq(dout)
145
+ end
146
+
147
+ it "flattens a hash that contains an array, no array flattening" do
148
+ din = {
149
+ 'a' => 1,
150
+ 'c' => [100, 200, 300]
151
+ }
152
+ dout = {
153
+ 'a' => 1,
154
+ 'c' => [100, 200, 300]
155
+ }
156
+ expect(Scalyr::Common::Util.flatten(din, "_", flatten_arrays=false)).to eq(dout)
157
+ end
158
+
159
+ it "flattens a hash that contains an array that contains a hash, no array flattening" do
160
+ din = {
161
+ 'a' => 1,
162
+ 'c' => [
163
+ 100,
164
+ {'d' => 1000, 'e' => 2000},
165
+ 300
166
+ ]
167
+ }
168
+ dout = {
169
+ 'a' => 1,
170
+ 'c' => [
171
+ 100,
172
+ {'d' => 1000, 'e' => 2000},
173
+ 300
174
+ ]
175
+ }
176
+ expect(Scalyr::Common::Util.flatten(din, "_", flatten_arrays=false)).to eq(dout)
177
+ end
178
+
179
+ it "flattens a hash that contains an array that contains a hash that contains an array, no array flattening" do
180
+ din = {
181
+ 'a' => 1,
182
+ 'c' => [
183
+ 100,
184
+ {'d' => 1000, 'e' => 2000, 'f' => [4, 5, 6]},
185
+ 300
186
+ ]
187
+ }
188
+ dout = {
189
+ 'a' => 1,
190
+ 'c' => [
191
+ 100,
192
+ {'d' => 1000, 'e' => 2000, 'f' => [4, 5, 6]},
193
+ 300
194
+ ]
195
+ }
196
+ expect(Scalyr::Common::Util.flatten(din, "_", flatten_arrays=false)).to eq(dout)
197
+ end
198
+
135
199
  it "accepts custom delimiters" do
136
200
  din = {
137
201
  'a' => 1,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-scalyr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.17.beta
4
+ version: 0.1.18.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Chee