logstash-output-scalyr 0.1.25.beta → 0.1.26.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +1 -0
  4. data/README.md +1 -2
  5. data/lib/logstash/outputs/scalyr.rb +26 -7
  6. data/lib/scalyr/constants.rb +1 -1
  7. data/logstash-output-scalyr.gemspec +3 -2
  8. data/spec/benchmarks/flattening_and_serialization.rb +1 -26
  9. data/spec/benchmarks/json_serialization.rb +85 -0
  10. data/spec/benchmarks/util.rb +24 -0
  11. data/spec/logstash/outputs/scalyr_spec.rb +54 -0
  12. data/vendor/bundle/jruby/2.5.0/cache/jrjackson-0.4.14-java.gem +0 -0
  13. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/Gemfile +0 -0
  14. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/Mavenfile +1 -7
  15. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/README.md +0 -0
  16. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/Rakefile +8 -2
  17. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/alt_bench.rb +0 -0
  18. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/changelog.md +25 -2
  19. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/jrjackson.gemspec +2 -1
  20. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.14-java/lib/com/fasterxml/jackson/core/jackson-annotations/2.9.10/jackson-annotations-2.9.10.jar +0 -0
  21. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.14-java/lib/com/fasterxml/jackson/core/jackson-core/2.9.10/jackson-core-2.9.10.jar +0 -0
  22. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.14-java/lib/com/fasterxml/jackson/core/jackson-databind/2.9.10.8/jackson-databind-2.9.10.8.jar +0 -0
  23. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.14-java/lib/com/fasterxml/jackson/module/jackson-module-afterburner/2.9.10/jackson-module-afterburner-2.9.10.jar +0 -0
  24. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/lib/jrjackson/build_info.rb +9 -5
  25. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java/lib/jrjackson/jars/jrjackson-1.2.26.jar → jrjackson-0.4.14-java/lib/jrjackson/jars/jrjackson-1.2.32.jar} +0 -0
  26. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/lib/jrjackson/jrjackson.rb +0 -0
  27. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/lib/jrjackson.rb +0 -0
  28. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/lib/jrjackson_jars.rb +8 -8
  29. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/lib/require_relative_patch.rb +0 -0
  30. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/pom.xml +8 -25
  31. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/profiling/profiled.rb +0 -0
  32. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/run_all_individual_bench.sh +0 -0
  33. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/run_jruby_individual_bench.sh +0 -0
  34. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/run_mri_individual_bench.sh +0 -0
  35. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/IParseHandler.java +0 -0
  36. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JavaBigDecimalValueConverter.java +0 -0
  37. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JavaBigIntValueConverter.java +0 -0
  38. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JavaConverter.java +0 -0
  39. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JavaFloatValueConverter.java +0 -0
  40. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JavaHandler.java +0 -0
  41. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JavaLongValueConverter.java +0 -0
  42. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JjParse.java +0 -0
  43. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonBase.java +0 -0
  44. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonJava.java +0 -0
  45. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonRaw.java +0 -0
  46. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonRuby.java +0 -0
  47. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonSaj.java +0 -0
  48. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonSch.java +0 -0
  49. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrJacksonService.java +0 -0
  50. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/JrParse.java +0 -0
  51. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/ParseError.java +0 -0
  52. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyAnySerializer.java +4 -4
  53. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyBigDecimalValueConverter.java +0 -0
  54. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyBigIntValueConverter.java +0 -0
  55. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyConverter.java +0 -0
  56. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyDateFormat.java +0 -0
  57. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyFloatValueConverter.java +0 -0
  58. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyHandler.java +0 -0
  59. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyIntValueConverter.java +0 -0
  60. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyJacksonModule.java +18 -6
  61. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyKeyConverter.java +0 -0
  62. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyNameConverter.java +0 -0
  63. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyObjectDeserializer.java +0 -0
  64. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyStringConverter.java +0 -0
  65. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyStringKeyConverter.java +0 -0
  66. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyStringNameConverter.java +0 -0
  67. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubySymbolKeyConverter.java +0 -0
  68. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubySymbolNameConverter.java +0 -0
  69. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/RubyUtils.java +0 -0
  70. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/SajParse.java +0 -0
  71. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/SchParse.java +0 -0
  72. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/main/java/com/jrjackson/StreamParse.java +0 -0
  73. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/src/test/java/com/jrjackson/RubyAnySerializerTest.java +0 -0
  74. data/vendor/bundle/jruby/2.5.0/gems/{jrjackson-0.4.8-java → jrjackson-0.4.14-java}/test/jrjackson_test.rb +15 -0
  75. data/vendor/bundle/jruby/2.5.0/specifications/{jrjackson-0.4.8-java.gemspec → jrjackson-0.4.14-java.gemspec} +7 -7
  76. metadata +97 -65
  77. data/vendor/bundle/jruby/2.5.0/cache/jrjackson-0.4.8-java.gem +0 -0
  78. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.8-java/lib/com/fasterxml/jackson/core/jackson-annotations/2.9.7/jackson-annotations-2.9.7.jar +0 -0
  79. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.8-java/lib/com/fasterxml/jackson/core/jackson-core/2.9.7/jackson-core-2.9.7.jar +0 -0
  80. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.8-java/lib/com/fasterxml/jackson/core/jackson-databind/2.9.7/jackson-databind-2.9.7.jar +0 -0
  81. data/vendor/bundle/jruby/2.5.0/gems/jrjackson-0.4.8-java/lib/com/fasterxml/jackson/module/jackson-module-afterburner/2.9.7/jackson-module-afterburner-2.9.7.jar +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d84626fc9f17fb9cc549552722612e2620c10ead3700689cb5625715a5441bc
4
- data.tar.gz: a49c2c03b3f97678df4a20f66ceec0ec2fdcf4fedcac732a130abe642a469057
3
+ metadata.gz: 5593e93dedad0ddb545f8911e7f1cd8cabde4043a6a76b8c5b78d99c0c4d12a5
4
+ data.tar.gz: 6c821768c3d780529d00bc1f58c4ec8841ecba2758a46c71ecf17201fb8ba3d1
5
5
  SHA512:
6
- metadata.gz: 015e7216df91f4bcc696038ea305936275194d87eb68f5fe5d067e704932663ab5a0cdbb8440810682964c6bfa7a9f052774065ed9fb498fc175900b77eaf161
7
- data.tar.gz: e08e06532da18aaf597937482fdee0561ea816b09f3b77c3eee259aeaaaaececcdded5e4dbd2101aacf02018167764c8e98faa7db1c9abe76e4f1094d7fc68ca
6
+ metadata.gz: 57901dc94f49aa844130f4b2a7ac084c95d473c1a948902b699cbaba8d63049d1e960b69b49b20cf8ffa8b2c1f5f68a53ad9687b72867799f113a384f490e01d
7
+ data.tar.gz: 329f985e8121d49bab836381861ca878c229f2b316e160792263461900a8fc4cf7f46bdc2aba889174a0f35b0c67f567b0e5a09d429f888948b788707ab3c0b7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Beta
2
2
 
3
+ ## 0.1.26.beta
4
+ - Add support for new ``json_library`` config option. Valid values are ``stdlib`` (default) are ``jrjackson``. The later may offer 2-4x faster JSON serialization.
5
+
6
+
3
7
  ## 0.1.23.beta
4
8
  - Add testing support for disabling estimation of serialized event size for each event in the batch.
5
9
 
data/Gemfile CHANGED
@@ -18,3 +18,4 @@ gem 'pry'
18
18
  gem 'pry-nav'
19
19
  gem 'quantile', '~> 0.2.1'
20
20
  gem 'manticore', '~> 0.7.1', platform: :jruby
21
+ gem 'jrjackson', '~> 0.4.14', platform: :jruby
data/README.md CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  [![CircleCI](https://circleci.com/gh/scalyr/logstash-output-scalyr.svg?style=svg)](https://circleci.com/gh/scalyr/logstash-output-scalyr)
3
2
 
4
3
  # [Scalyr output plugin for Logstash (Beta release)]
@@ -10,7 +9,7 @@ You can view documentation for this plugin [on the Scalyr website](https://app.s
10
9
  # Quick start
11
10
 
12
11
  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.22.beta.gem` or follow the latest official instructions on working with plugins from Logstash.
12
+ 2. Install the gem into a Logstash installation, run `/usr/share/logstash/bin/logstash-plugin install logstash-output-scalyr-0.1.25.beta.gem` or follow the latest official instructions on working with plugins from Logstash.
14
13
  3. Configure the output plugin (e.g. add it to a pipeline .conf)
15
14
  4. Restart Logstash
16
15
 
@@ -13,6 +13,7 @@ require 'rbzip2'
13
13
  require 'zlib'
14
14
  require 'stringio'
15
15
  require 'quantile'
16
+ require 'jrjackson'
16
17
 
17
18
  require 'scalyr/common/client'
18
19
  require "scalyr/common/util"
@@ -151,6 +152,10 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
151
152
  # Scalyr single request limit won't be reached.
152
153
  config :estimate_each_event_size, :validate => :boolean, :default => true
153
154
 
155
+ # Library to use for JSON serialization. Valid values are "stdlib" and "jrjackson". The later may offer 2-4 performance
156
+ # improvements on serialization.
157
+ config :json_library, :validate => :string, :default => "stdlib"
158
+
154
159
  # Manticore related options
155
160
  config :http_connect_timeout, :validate => :number, :default => 10
156
161
  config :http_socket_timeout, :validate => :number, :default => 10
@@ -194,6 +199,20 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
194
199
  @logger.warn("estimate_each_event_size config option is false, this means very large batches may be rejected or partially processed by the server")
195
200
  end
196
201
 
202
+ if @json_library != "stdlib" and @json_library != "jrjackson"
203
+ raise LogStash::ConfigurationError, "json_library config option needs to be either stdlib or jrjackson"
204
+ end
205
+
206
+ if @json_library == "stdlib"
207
+ define_singleton_method "json_encode" do |data|
208
+ data.to_json
209
+ end
210
+ elsif @json_library == "jrjackson"
211
+ define_singleton_method "json_encode" do |data|
212
+ JrJackson::Json.dump(data)
213
+ end
214
+ end
215
+
197
216
  @dlq_writer = dlq_enabled? ? execution_context.dlq_writer : nil
198
217
 
199
218
  @message_encoding = nil
@@ -685,10 +704,10 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
685
704
  if @estimate_each_event_size
686
705
  # get json string of event to keep track of how many bytes we are sending
687
706
  begin
688
- event_json = scalyr_event.to_json
707
+ event_json = self.json_encode(scalyr_event)
689
708
  log_json = nil
690
709
  if add_log
691
- log_json = logs[log_identifier].to_json
710
+ log_json = self.json_encode(logs[log_identifier])
692
711
  end
693
712
  rescue JSON::GeneratorError, Encoding::UndefinedConversionError => e
694
713
  @logger.warn "#{e.class}: #{e.message}"
@@ -704,7 +723,7 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
704
723
  "UTF-8", :invalid => :replace, :undef => :replace, :replace => "<?>"
705
724
  ).force_encoding('UTF-8')
706
725
  end
707
- event_json = scalyr_event.to_json
726
+ event_json = self.json_encode(scalyr_event)
708
727
  rescue Java::JavaLang::ClassCastException => e
709
728
  # Most likely we ran into the issue described here: https://github.com/flori/json/issues/336
710
729
  # Because of the version of jruby logstash works with we don't have the option to just update this away,
@@ -715,10 +734,10 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
715
734
  @multi_receive_statistics[:total_java_class_cast_errors] += 1
716
735
  end
717
736
  Scalyr::Common::Util.convert_bignums(scalyr_event)
718
- event_json = scalyr_event.to_json
737
+ event_json = self.json_encode(scalyr_event)
719
738
  log_json = nil
720
739
  if add_log
721
- log_json = logs[log_identifier].to_json
740
+ log_json = self.json_encode(logs[log_identifier])
722
741
  end
723
742
  end
724
743
 
@@ -819,14 +838,14 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
819
838
  # We time serialization to get some insight on how long it takes to serialize the request body
820
839
  start_time = Time.now.to_f
821
840
  begin
822
- serialized_body = body.to_json
841
+ serialized_body = self.json_encode(body)
823
842
  rescue Java::JavaLang::ClassCastException => e
824
843
  @logger.warn("Error serializing events to JSON, likely due to the presence of Bignum values. Converting Bignum values to strings.")
825
844
  @stats_lock.synchronize do
826
845
  @multi_receive_statistics[:total_java_class_cast_errors] += 1
827
846
  end
828
847
  Scalyr::Common::Util.convert_bignums(body)
829
- serialized_body = body.to_json
848
+ serialized_body = self.json_encode(body)
830
849
  end
831
850
  end_time = Time.now.to_f
832
851
  serialization_duration = end_time - start_time
@@ -1,2 +1,2 @@
1
1
  # encoding: utf-8
2
- PLUGIN_VERSION = "v0.1.25.beta"
2
+ PLUGIN_VERSION = "v0.1.26.beta"
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-scalyr'
3
- s.version = '0.1.25.beta'
3
+ s.version = '0.1.26.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)"
@@ -18,11 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
19
19
 
20
20
  # Gem dependencies
21
- #
22
21
  s.add_runtime_dependency 'net-http-persistent'
23
22
  s.add_runtime_dependency 'logstash-core-plugin-api', '>= 1.60', '<= 2.99'
24
23
  s.add_runtime_dependency 'logstash-codec-plain'
25
24
  s.add_runtime_dependency 'quantile'
25
+ s.add_runtime_dependency 'jrjackson'
26
+ s.add_runtime_dependency 'manticore'
26
27
  s.add_runtime_dependency 'ffi', '>= 1.9.18'
27
28
  s.add_runtime_dependency 'rbzip2', '0.3.0'
28
29
  s.add_development_dependency 'logstash-devutils'
@@ -2,6 +2,7 @@ require 'benchmark'
2
2
  require 'json'
3
3
 
4
4
  require_relative '../../lib/scalyr/common/util'
5
+ require_relative './util'
5
6
 
6
7
  # NOTE: When using jRuby using multiple iterations with the same dataset doesn't make
7
8
  # sense since it will just use JITed version of the code which will be very fast. If we
@@ -9,31 +10,6 @@ require_relative '../../lib/scalyr/common/util'
9
10
  # input data for each iteration.
10
11
  ITERATIONS = 500
11
12
 
12
- def rand_str(len)
13
- return (0...len).map { (65 + rand(26)).chr }.join
14
- end
15
-
16
- def generate_hash(widths)
17
- result = {}
18
- if widths.empty?
19
- return rand_str(20)
20
- else
21
- widths[0].times do
22
- result[rand_str(9)] = generate_hash(widths[1..widths.length])
23
- end
24
- return result
25
- end
26
- end
27
-
28
- def generate_data_array_for_spec(spec)
29
- data = []
30
- ITERATIONS.times do
31
- data << generate_hash(spec)
32
- end
33
-
34
- data
35
- end
36
-
37
13
  def run_benchmark_and_print_results(data, run_benchmark_func)
38
14
  puts ""
39
15
  puts "Using %s total keys in a hash" % [Scalyr::Common::Util.flatten(data[0]).count]
@@ -70,7 +46,6 @@ DATASETS = {
70
46
  :keys_2700 => generate_data_array_for_spec([14, 8, 6, 4])
71
47
  }
72
48
 
73
-
74
49
  puts "Using %s iterations" % [ITERATIONS]
75
50
  puts ""
76
51
 
@@ -0,0 +1,85 @@
1
+ require 'benchmark'
2
+ require 'json'
3
+ require 'jrjackson'
4
+
5
+ require_relative '../../lib/scalyr/common/util'
6
+ require_relative './util'
7
+
8
+ ITERATIONS = 500
9
+
10
+ def json_serialize_data_native(data)
11
+ data.to_json
12
+ end
13
+
14
+ def json_serialize_data_jrjackson(data)
15
+ JrJackson::Json.dump(data)
16
+ end
17
+
18
+ DATASETS = {
19
+ :keys_50 => generate_data_array_for_spec([3, 3, 3, 2]),
20
+ :keys_200 => generate_data_array_for_spec([4, 4, 3, 4]),
21
+ :keys_200_flat => generate_data_array_for_spec([200]),
22
+ :keys_512 => generate_data_array_for_spec([8, 4, 4, 4]),
23
+ :keys_960 => generate_data_array_for_spec([12, 5, 4, 4]),
24
+ :keys_2700 => generate_data_array_for_spec([14, 8, 6, 4])
25
+ }
26
+
27
+ def run_benchmark_and_print_results(data, run_benchmark_func)
28
+ puts ""
29
+ puts "Using %s total keys in a hash" % [Scalyr::Common::Util.flatten(data[0]).count]
30
+ puts ""
31
+
32
+ result = []
33
+ ITERATIONS.times do |i|
34
+ result << Benchmark.measure { run_benchmark_func.(data[0]) }
35
+ end
36
+
37
+ sum = result.inject(nil) { |sum, t| sum.nil? ? sum = t : sum += t }
38
+ avg = sum / result.size
39
+
40
+ Benchmark.bm(7, "sum:", "avg:") do |b|
41
+ [sum, avg]
42
+ end
43
+ puts ""
44
+ end
45
+
46
+ puts "Using %s iterations" % [ITERATIONS]
47
+ puts ""
48
+
49
+ puts "native"
50
+ puts "==============================="
51
+
52
+ # Around ~50 keys in a hash
53
+ data = DATASETS[:keys_50]
54
+ run_benchmark_and_print_results(data, method(:json_serialize_data_native))
55
+
56
+ # Around ~200 keys in a hash
57
+ data = DATASETS[:keys_200]
58
+ run_benchmark_and_print_results(data, method(:json_serialize_data_native))
59
+
60
+ # Around ~200 keys in a hash (single level)
61
+ data = DATASETS[:keys_200_flat]
62
+ run_benchmark_and_print_results(data, method(:json_serialize_data_native))
63
+
64
+ # Around ~2700 keys in a hash
65
+ data = DATASETS[:keys_2700]
66
+ run_benchmark_and_print_results(data, method(:json_serialize_data_native))
67
+
68
+ puts "jrjackson"
69
+ puts "==============================="
70
+
71
+ # Around ~50 keys in a hash
72
+ data = DATASETS[:keys_50]
73
+ run_benchmark_and_print_results(data, method(:json_serialize_data_jrjackson))
74
+
75
+ # Around ~200 keys in a hash
76
+ data = DATASETS[:keys_200]
77
+ run_benchmark_and_print_results(data, method(:json_serialize_data_jrjackson))
78
+
79
+ # Around ~200 keys in a hash (single level)
80
+ data = DATASETS[:keys_200_flat]
81
+ run_benchmark_and_print_results(data, method(:json_serialize_data_jrjackson))
82
+
83
+ # Around ~2700 keys in a hash
84
+ data = DATASETS[:keys_2700]
85
+ run_benchmark_and_print_results(data, method(:json_serialize_data_jrjackson))
@@ -0,0 +1,24 @@
1
+ def rand_str(len)
2
+ return (0...len).map { (65 + rand(26)).chr }.join
3
+ end
4
+
5
+ def generate_hash(widths)
6
+ result = {}
7
+ if widths.empty?
8
+ return rand_str(20)
9
+ else
10
+ widths[0].times do
11
+ result[rand_str(9)] = generate_hash(widths[1..widths.length])
12
+ end
13
+ return result
14
+ end
15
+ end
16
+
17
+ def generate_data_array_for_spec(spec)
18
+ data = []
19
+ ITERATIONS.times do
20
+ data << generate_hash(spec)
21
+ end
22
+
23
+ data
24
+ end
@@ -60,6 +60,7 @@ describe LogStash::Outputs::Scalyr do
60
60
  'log_constants' => ['tags'],
61
61
  'flatten_nested_values' => true,
62
62
  })
63
+ plugin.register
63
64
 
64
65
  mock_client_session = MockClientSession.new
65
66
 
@@ -75,6 +76,7 @@ describe LogStash::Outputs::Scalyr do
75
76
  'log_constants' => ['tags'],
76
77
  'flatten_nested_values' => false,
77
78
  })
79
+ plugin1.register()
78
80
  mock_client_session = MockClientSession.new
79
81
  plugin1.instance_variable_set(:@last_status_transmit_time, 100)
80
82
  plugin1.instance_variable_set(:@client_session, mock_client_session)
@@ -582,5 +584,57 @@ describe LogStash::Outputs::Scalyr do
582
584
  expect(plugin.instance_variable_get(:@logger)).to_not receive(:error)
583
585
  end
584
586
  end
587
+
588
+ context "when using custom json library" do
589
+ it "stdlib (implicit)" do
590
+ config = {
591
+ 'api_write_token' => '1234',
592
+ }
593
+ plugin = LogStash::Outputs::Scalyr.new(config)
594
+
595
+ allow(plugin).to receive(:send_status).and_return(nil)
596
+ plugin.register
597
+ e = LogStash::Event.new
598
+ e.set('bignumber', 20)
599
+ result = plugin.build_multi_event_request_array([e])
600
+ body = JSON.parse(result[0][:body])
601
+ expect(result[0][:body]).to include('{"monitor":"pluginLogstash"}')
602
+ expect(body['events'].size).to eq(1)
603
+ end
604
+
605
+ it "stdlib (explicit)" do
606
+ config = {
607
+ 'api_write_token' => '1234',
608
+ 'json_library' => 'stdlib'
609
+ }
610
+ plugin = LogStash::Outputs::Scalyr.new(config)
611
+
612
+ allow(plugin).to receive(:send_status).and_return(nil)
613
+ plugin.register
614
+ e = LogStash::Event.new
615
+ e.set('bignumber', 20)
616
+ result = plugin.build_multi_event_request_array([e])
617
+ body = JSON.parse(result[0][:body])
618
+ expect(result[0][:body]).to include('{"monitor":"pluginLogstash"}')
619
+ expect(body['events'].size).to eq(1)
620
+ end
621
+
622
+ it "jrjackson" do
623
+ config = {
624
+ 'api_write_token' => '1234',
625
+ 'json_library' => 'jrjackson'
626
+ }
627
+ plugin = LogStash::Outputs::Scalyr.new(config)
628
+
629
+ allow(plugin).to receive(:send_status).and_return(nil)
630
+ plugin.register
631
+ e = LogStash::Event.new
632
+ e.set('bignumber', 20)
633
+ result = plugin.build_multi_event_request_array([e])
634
+ body = JSON.parse(result[0][:body])
635
+ expect(result[0][:body]).to include('{"monitor":"pluginLogstash"}')
636
+ expect(body['events'].size).to eq(1)
637
+ end
638
+ end
585
639
  end
586
640
  end
@@ -14,7 +14,7 @@ properties 'project.build.sourceEncoding' => 'UTF-8',
14
14
 
15
15
  jar 'junit:junit', '4.11', :scope => :test
16
16
 
17
- jar 'org.jruby:jruby', '9.2.4.0', :scope => :provided
17
+ jar 'org.jruby:jruby', '9.2.13.0', :scope => :provided
18
18
 
19
19
  plugin :compiler, '3.1', :source => '1.8', :target => '1.8',
20
20
  :showDeprecation => false,
@@ -23,9 +23,3 @@ plugin :compiler, '3.1', :source => '1.8', :target => '1.8',
23
23
  :fork => true
24
24
 
25
25
  plugin :surefire, '2.17', :skipTests => true
26
-
27
- # since bundle install does not vendor our jars we need to it manually
28
- plugin 'org.torquebox.mojo:jruby9-exec-maven-plugin', '0.3.1' do
29
- execute_goal :exec, :id => 'vendor-jars', :phase => 'prepare-package',
30
- :script => "require 'jars/installer';Jars::Installer.vendor_jars!"
31
- end
@@ -10,12 +10,19 @@ end
10
10
 
11
11
  desc "Run benchmarks"
12
12
  task :benchmark do
13
- load 'benchmarking/benchmark.rb'
13
+ load 'benchmarking/benchmark_threaded.rb'
14
14
  end
15
15
 
16
16
  desc "Pack jar after compiling classes, use this to rebuild the pom.xml"
17
17
  task :compile do
18
18
  RubyMaven.exec('prepare-package')
19
+ # after packaging the jrjackson-x.y.z.jar vendor jar dependencies
20
+ Rake::Task['vendor_jars'].invoke
21
+ end
22
+
23
+ task :vendor_jars do
24
+ require 'jars/installer'
25
+ Jars::Installer.vendor_jars!
19
26
  end
20
27
 
21
28
  desc "Clean build"
@@ -30,4 +37,3 @@ Gem::PackageTask.new( eval File.read( 'jrjackson.gemspec' ) ) do
30
37
  desc 'Pack gem'
31
38
  task :package => [:compile]
32
39
  end
33
-