logstash-output-scalyr 0.1.6 → 0.1.11.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 +4 -4
- data/CHANGELOG.md +33 -0
- data/Gemfile +6 -0
- data/README.md +57 -4
- data/lib/logstash/outputs/scalyr.rb +284 -107
- data/lib/scalyr/common/client.rb +117 -43
- data/lib/scalyr/constants.rb +2 -0
- data/logstash-output-scalyr.gemspec +2 -1
- data/spec/benchmarks/flattening_and_serialization.rb +125 -0
- data/spec/benchmarks/metrics_overhead.rb +48 -0
- data/spec/logstash/outputs/scalyr_integration_spec.rb +188 -0
- data/spec/logstash/outputs/scalyr_spec.rb +141 -71
- data/vendor/bundle/jruby/2.5.0/cache/addressable-2.7.0.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/connection_pool-2.2.5.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/crack-0.4.5.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/hashdiff-1.0.1.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/net-http-persistent-4.0.1.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/public_suffix-4.0.6.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/quantile-0.2.1.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/rexml-3.2.5.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/webmock-3.13.0.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/CHANGELOG.md +235 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/Gemfile +32 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/LICENSE.txt +202 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/README.md +121 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/Rakefile +34 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/data/unicode.data +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable.rb +4 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/idna.rb +27 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/idna/native.rb +61 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/idna/pure.rb +676 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/template.rb +1045 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/uri.rb +2529 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/version.rb +32 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/idna_spec.rb +300 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/net_http_compat_spec.rb +30 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/rack_mount_compat_spec.rb +106 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/security_spec.rb +59 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/template_spec.rb +1451 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/uri_spec.rb +6603 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/spec_helper.rb +24 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/clobber.rake +4 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/gem.rake +93 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/git.rake +47 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/metrics.rake +24 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/rspec.rake +23 -0
- data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/yard.rake +29 -0
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/Changes.md +11 -0
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/Gemfile +0 -2
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/LICENSE +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/README.md +29 -5
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/Rakefile +0 -1
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/connection_pool.gemspec +1 -0
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/lib/connection_pool.rb +16 -0
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/lib/connection_pool/timed_stack.rb +9 -5
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/lib/connection_pool/version.rb +1 -1
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/lib/connection_pool/wrapper.rb +17 -3
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/test/helper.rb +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/test/test_connection_pool.rb +16 -2
- data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/test/test_connection_pool_timed_stack.rb +10 -0
- data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack.rb +7 -0
- data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/json.rb +98 -0
- data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/util.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/version.rb +3 -0
- data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/xml.rb +238 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/Gemfile +8 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/LICENSE +19 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/README.md +276 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/Rakefile +18 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/changelog.md +100 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/hashdiff.gemspec +39 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff.rb +10 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/compare_hashes.rb +69 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/diff.rb +177 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs.rb +66 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs_compare_arrays.rb +32 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/linear_compare_array.rb +159 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/patch.rb +88 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/util.rb +155 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/version.rb +5 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/best_diff_spec.rb +75 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_array_spec.rb +60 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_spec.rb +360 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/lcs_spec.rb +76 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/linear_compare_array_spec.rb +50 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/patch_spec.rb +185 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/readme_spec.rb +15 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/util_spec.rb +116 -0
- data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/spec_helper.rb +15 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/Gemfile +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/History.txt +6 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/Manifest.txt +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/README.rdoc +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/Rakefile +1 -1
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/lib/net/http/persistent.rb +1 -1
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/lib/net/http/persistent/connection.rb +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/lib/net/http/persistent/pool.rb +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/lib/net/http/persistent/timed_stack_multi.rb +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/test/test_net_http_persistent.rb +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/test/test_net_http_persistent_timed_stack_multi.rb +0 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/2.0-Upgrade.md +52 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/CHANGELOG.md +406 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/Gemfile +15 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/LICENSE.txt +22 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/README.md +207 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/Rakefile +51 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/SECURITY.md +104 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/bin/console +15 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/codecov.yml +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/data/list.txt +13380 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix.rb +179 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/domain.rb +235 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/errors.rb +41 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/list.rb +247 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/rule.rb +350 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/version.rb +13 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/public_suffix.gemspec +29 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/acceptance_test.rb +131 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find.rb +66 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find_all.rb +102 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_names.rb +91 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select.rb +26 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select_incremental.rb +25 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_valid.rb +101 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/domain_profiler.rb +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler.rb +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler_jp.rb +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/initialization_profiler.rb +11 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/list_profsize.rb +11 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/object_binsize.rb +57 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/psl_test.rb +52 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/test_helper.rb +18 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/tests.txt +98 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/domain_test.rb +106 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/errors_test.rb +25 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/list_test.rb +241 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/public_suffix_test.rb +188 -0
- data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/rule_test.rb +222 -0
- data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/LICENSE +191 -0
- data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/README.md +55 -0
- data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile/estimator.rb +186 -0
- data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile/quantile.rb +66 -0
- data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile/version.rb +16 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/LICENSE.txt +22 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/NEWS.md +178 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/README.md +48 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/context.rdoc +143 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc +87 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc +276 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc +602 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc +97 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc +267 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc +30 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc +55 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc +135 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc +16 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc +25 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml.rb +3 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attlistdecl.rb +63 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attribute.rb +205 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/cdata.rb +68 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/child.rb +97 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/comment.rb +80 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/doctype.rb +311 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/document.rb +451 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/attlistdecl.rb +11 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/dtd.rb +47 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/elementdecl.rb +18 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/entitydecl.rb +57 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/notationdecl.rb +40 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/element.rb +2599 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/encoding.rb +51 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/entity.rb +171 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/default.rb +116 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/pretty.rb +142 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/transitive.rb +58 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/functions.rb +447 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/instruction.rb +79 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/light/node.rb +188 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/namespace.rb +59 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/node.rb +76 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/output.rb +30 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parent.rb +166 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parseexception.rb +52 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb +694 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/lightparser.rb +59 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb +197 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb +273 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/streamparser.rb +61 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/treeparser.rb +101 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/ultralightparser.rb +57 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/xpathparser.rb +689 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/quickpath.rb +266 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/rexml.rb +37 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/sax2listener.rb +98 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/security.rb +28 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/source.rb +298 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/streamlistener.rb +93 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/text.rb +424 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/undefinednamespaceexception.rb +9 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/relaxng.rb +539 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validation.rb +144 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validationexception.rb +10 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmldecl.rb +130 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmltokens.rb +85 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath.rb +81 -0
- data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath_parser.rb +974 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/CHANGELOG.md +1894 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/Gemfile +9 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/LICENSE +20 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/README.md +1176 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/Rakefile +38 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock.rb +59 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/api.rb +109 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/assertion_failure.rb +11 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/callback_registry.rb +35 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/config.rb +18 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/cucumber.rb +10 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/deprecation.rb +9 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/errors.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +216 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/curb_adapter.rb +351 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +231 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/excon_adapter.rb +165 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_lib_adapter.rb +7 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +19 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/client.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/request.rb +16 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/response.rb +64 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/streamer.rb +29 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/webmock.rb +68 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb_adapter.rb +37 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/httpclient_adapter.rb +259 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/manticore_adapter.rb +145 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/net_http.rb +385 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/net_http_response.rb +34 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/patron_adapter.rb +130 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +174 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/any_arg_matcher.rb +13 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/hash_argument_matcher.rb +21 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/hash_excluding_matcher.rb +15 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/hash_including_matcher.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/minitest.rb +41 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rack_response.rb +69 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_body_diff.rb +64 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_execution_verifier.rb +77 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_pattern.rb +405 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_registry.rb +35 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_signature.rb +54 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_signature_snippet.rb +61 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_stub.rb +100 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/response.rb +159 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/responses_sequence.rb +40 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec.rb +42 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec/matchers.rb +27 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec/matchers/request_pattern_matcher.rb +78 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec/matchers/webmock_matcher.rb +67 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/stub_registry.rb +82 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/stub_request_snippet.rb +38 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/test_unit.rb +20 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/hash_counter.rb +39 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/hash_keys_stringifier.rb +25 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/hash_validator.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/headers.rb +64 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/json.rb +67 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/query_mapper.rb +281 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/uri.rb +111 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/values_stringifier.rb +20 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/version_checker.rb +111 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/version.rb +3 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/webmock.rb +163 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/minitest/test_helper.rb +34 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/minitest/test_webmock.rb +9 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/minitest/webmock_spec.rb +60 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/async_http_client/async_http_client_spec.rb +375 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +73 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/curb/curb_spec.rb +499 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/curb/curb_spec_helper.rb +147 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/em_http_request/em_http_request_spec.rb +462 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +77 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/excon/excon_spec.rb +77 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/excon/excon_spec_helper.rb +52 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/http_rb/http_rb_spec.rb +93 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/http_rb/http_rb_spec_helper.rb +54 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/httpclient/httpclient_spec.rb +217 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/httpclient/httpclient_spec_helper.rb +57 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/manticore/manticore_spec.rb +107 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/manticore/manticore_spec_helper.rb +35 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/net_http_shared.rb +153 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/net_http_spec.rb +369 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/net_http_spec_helper.rb +64 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/real_net_http_spec.rb +20 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/patron/patron_spec.rb +125 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/patron/patron_spec_helper.rb +54 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +313 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/callbacks.rb +148 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/complex_cross_concern_behaviors.rb +36 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/enabling_and_disabling_webmock.rb +95 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/precedence_of_stubs.rb +15 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/request_expectations.rb +930 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/returning_declared_responses.rb +409 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/stubbing_requests.rb +678 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +135 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +60 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/webmock_shared.rb +41 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/fixtures/test.txt +1 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/quality_spec.rb +84 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/spec_helper.rb +48 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/example_curl_output.txt +22 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/failures.rb +9 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/my_rack_app.rb +53 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/network_connection.rb +19 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/webmock_server.rb +70 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/api_spec.rb +175 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/errors_spec.rb +129 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +17 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/matchers/hash_excluding_matcher_spec.rb +61 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/matchers/hash_including_matcher_spec.rb +87 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/rack_response_spec.rb +112 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_body_diff_spec.rb +90 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_execution_verifier_spec.rb +208 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_pattern_spec.rb +736 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_registry_spec.rb +95 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_signature_snippet_spec.rb +89 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_signature_spec.rb +155 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_stub_spec.rb +199 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/response_spec.rb +286 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/stub_registry_spec.rb +103 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/stub_request_snippet_spec.rb +115 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/hash_counter_spec.rb +39 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/hash_keys_stringifier_spec.rb +27 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/headers_spec.rb +28 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/json_spec.rb +33 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/query_mapper_spec.rb +157 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/uri_spec.rb +371 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/version_checker_spec.rb +65 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/webmock_spec.rb +60 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/http_request.rb +24 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/shared_test.rb +108 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/test_helper.rb +23 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/test_webmock.rb +12 -0
- data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/webmock.gemspec +54 -0
- data/vendor/bundle/jruby/2.5.0/specifications/addressable-2.7.0.gemspec +39 -0
- data/vendor/bundle/jruby/2.5.0/specifications/{connection_pool-2.2.3.gemspec → connection_pool-2.2.5.gemspec} +4 -3
- data/vendor/bundle/jruby/2.5.0/specifications/crack-0.4.5.gemspec +32 -0
- data/vendor/bundle/jruby/2.5.0/specifications/hashdiff-1.0.1.gemspec +46 -0
- data/vendor/bundle/jruby/2.5.0/specifications/{net-http-persistent-4.0.0.gemspec → net-http-persistent-4.0.1.gemspec} +4 -5
- data/vendor/bundle/jruby/2.5.0/specifications/public_suffix-4.0.6.gemspec +24 -0
- data/vendor/bundle/jruby/2.5.0/specifications/quantile-0.2.1.gemspec +20 -0
- data/vendor/bundle/jruby/2.5.0/specifications/rexml-3.2.5.gemspec +42 -0
- data/vendor/bundle/jruby/2.5.0/specifications/webmock-3.13.0.gemspec +85 -0
- metadata +367 -32
- data/vendor/bundle/jruby/2.5.0/cache/connection_pool-2.2.3.gem +0 -0
- data/vendor/bundle/jruby/2.5.0/cache/net-http-persistent-4.0.0.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6df8debd88e7675c00715a8b4fa2888e14cea861436c0049c1cbb99b96f2d0c
|
4
|
+
data.tar.gz: f07b38d925f732664390d391da3e84b3930644b77197b871043cabbf28bfd218
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 542cacbdb0ecb8d9fbabfd955b3c88dcd826af141ded1924eeb9863b8a075fcb8c323448bf0dbf4ac06254309309cdc8a60b1899e5aaa9a51f167243ff1fb818
|
7
|
+
data.tar.gz: f19aeb46e95f7207e11dccd1b89aa6927e9bec88276cc1a5393ac144139b559c40ac2102da0a22624ac532c27dc753fca7b83f860b6b4763b9f28f67e4662555
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,37 @@
|
|
1
1
|
# Beta
|
2
|
+
|
3
|
+
## 0.1.11.beta
|
4
|
+
- Fixes to retry mechanisms.
|
5
|
+
- More thorough catching of events, preferring to retry requests rather than crashing the plugin.
|
6
|
+
|
7
|
+
## 0.1.10.beta
|
8
|
+
|
9
|
+
- Switch to shared concurrency to allow the use of multiple worker threads for increased
|
10
|
+
throughput.
|
11
|
+
- Switch HTTP client library to `manticore` to work better with new shared concurrency.
|
12
|
+
|
13
|
+
## 0.1.9
|
14
|
+
|
15
|
+
- Add support for logging status messages with metrics to stdout in addition to sending this
|
16
|
+
data to Scalyr by setting ``log_status_messages_to_stdout`` config option. By default those
|
17
|
+
lines are logged under INFO log level and you may need to enable / configure pluggin logging
|
18
|
+
as per https://www.elastic.co/guide/en/logstash/current/logging.html.
|
19
|
+
- Update metric reporting code to round float values to 4 decimal points so we also record sub
|
20
|
+
millisecond values for per event metrics.
|
21
|
+
|
22
|
+
## 0.1.8
|
23
|
+
|
24
|
+
- Add additional metrics.
|
25
|
+
- Correctly handle flatten_nested_values_duration metric
|
26
|
+
- Add support for setting sampling rate for per event level metrics. It defaults to %5 (``0.05``.)
|
27
|
+
- Status log line format has been updated so it doesn't include comma between key=value pair to
|
28
|
+
make parser definition a bit simpler.
|
29
|
+
|
30
|
+
## 0.1.7
|
31
|
+
- Tracking of new statistics such as `multi_receive` method duration and batch sizes.
|
32
|
+
- Addition of percentiles for both existing and new stats.
|
33
|
+
- Add ability to define a parser name for status messages using the `status_parser` configuration option.
|
34
|
+
|
2
35
|
## 0.1.6
|
3
36
|
- Allow for a customer delimiter when flattening values using the `flatten_nested_values_delimiter` configuration option
|
4
37
|
|
data/Gemfile
CHANGED
@@ -10,5 +10,11 @@ if Dir.exist?(logstash_path) && use_logstash_source
|
|
10
10
|
gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
|
11
11
|
end
|
12
12
|
|
13
|
+
group :test do
|
14
|
+
gem "webmock"
|
15
|
+
end
|
16
|
+
|
13
17
|
gem 'pry'
|
14
18
|
gem 'pry-nav'
|
19
|
+
gem 'quantile'
|
20
|
+
gem 'manticore', platform: :jruby
|
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.
|
13
|
+
2. Install the gem into a Logstash installation, run `/usr/share/logstash/bin/logstash-plugin install logstash-output-scalyr-0.1.11.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
|
|
@@ -48,7 +48,7 @@ In the above example, the Logstash pipeline defines a file input that reads from
|
|
48
48
|
|
49
49
|
---
|
50
50
|
|
51
|
-
- If
|
51
|
+
- If you have an EU-based Scalyr account, please use https://eu.scalyr.com/
|
52
52
|
|
53
53
|
`config :scalyr_server, :validate => :string, :default => "https://agent.scalyr.com/"`
|
54
54
|
|
@@ -158,7 +158,6 @@ In the above example, the Logstash pipeline defines a file input that reads from
|
|
158
158
|
|
159
159
|
# Conceptual Overview
|
160
160
|
|
161
|
-
|
162
161
|
## Persistence
|
163
162
|
|
164
163
|
Logstash itself supports [Persistent Queues](https://www.elastic.co/guide/en/logstash/current/persistent-queues.html) with at-least-once delivery semantics. It expects output plugins to retry uploads until success or else to write failures into a Dead-Letter Queue (DLQ). Since Logstash offers Persistent Queues, the Scalyr plugin does not perform its own buffering or persistence. More specifically, invocation of `multi_receive` is synchronously retried until success or written to the DLQ upon failure. Note: the `multi_receive` interface does not provide a feedback mechanism (outcome codes etc).
|
@@ -312,12 +311,65 @@ sudo bundle exec rspec
|
|
312
311
|
|
313
312
|
in the root of the repo.
|
314
313
|
|
314
|
+
By default this will run all the tests (including integration ones which require sudo access and
|
315
|
+
may not pass everywhere).
|
316
|
+
|
317
|
+
If you want to run just the unit tests, you can run the command displayed below.
|
318
|
+
|
319
|
+
|
320
|
+
```bash
|
321
|
+
bundle exec rspec spec/logstash/outputs/scalyr_spec.rb spec/scalyr/common/util_spec.rb
|
322
|
+
```
|
323
|
+
|
324
|
+
## Instrumentation and metrics
|
325
|
+
|
326
|
+
By default, plugin logs a special line with metrics to Scalyr every 5 minutes. This line contains
|
327
|
+
various batch, request and event level metrics.
|
328
|
+
|
329
|
+
Example line is shown below:
|
330
|
+
|
331
|
+
```bash
|
332
|
+
plugin_status: total_requests_sent=6 total_requests_failed=0 total_request_bytes_sent=240586 total_compressed_request_bytes_sent=6396 total_response_bytes_received=222 total_request_latency_secs=1.018 total_serialization_duration_secs=0.024 total_compression_duration_secs=0.046 compression_type=deflate compression_level=6 request_latency_p50=0.048 request_latency_p90=0.104 request_latency_p99=0.104 serialization_duration_secs_p50=0.003 serialization_duration_secs_p90=0.005 serialization_duration_secs_p99=0.005 compression_duration_secs_p50=0.006 compression_duration_secs_p90=0.013 compression_duration_secs_p99=0.013 bytes_sent_p50=40116 bytes_sent_p90=40116 bytes_sent_p99=40116 total_multi_receive_secs=1.404 multi_receive_duration_p50=0.083 multi_receive_duration_p90=0.192 multi_receive_duration_p99=0.192 multi_receive_event_count_p50=100 multi_receive_event_count_p90=100 multi_receive_event_count_p99=100 event_attributes_count_p50=8 event_attributes_count_p90=8 event_attributes_count_p99=8 flatten_values_duration_secs_p50=0 flatten_values_duration_secs_p90=0 flatten_values_duration_secs_p99=0
|
333
|
+
```
|
334
|
+
|
335
|
+
Those lines also have ``logstash_plugin_metrics`` ``parser`` attribute defined which means you
|
336
|
+
can easily parse them using a parser definition similar to the one below.
|
337
|
+
|
338
|
+
```javascript
|
339
|
+
{
|
340
|
+
patterns: {
|
341
|
+
nonQuoted: "[^\"\n ]+"
|
342
|
+
},
|
343
|
+
|
344
|
+
formats: [
|
345
|
+
{
|
346
|
+
format: ".* $_=identifier$=$_=nonQuoted$", repeat: true
|
347
|
+
}
|
348
|
+
]
|
349
|
+
}
|
350
|
+
```
|
351
|
+
|
352
|
+
Do keep in mind that this line contains quite a lot of metrics so parsing it may make it more likely
|
353
|
+
to hit server side defined per 5 minute period unique number of attributes limit in case you are already
|
354
|
+
very close to tke limit.
|
355
|
+
|
356
|
+
For various request level metrics we track totals (either counts or duration). Those metrics names start
|
357
|
+
with ``total_`` (e.g. ``total_requests_failed``). To be able to derive average per request values you
|
358
|
+
can do that by dividing the total value with the value of ``total_requests_sent`` metrics.
|
359
|
+
|
360
|
+
Because averages are not all that useful we also track percentiles for various request, batch and
|
361
|
+
event level metrics. Those metrics names end with ``_p{percentile}``. For example ``_p50`` represents
|
362
|
+
50th percentile and ``_p99`` represents 99th percentile (e.g. ``request_latency_p99``).
|
363
|
+
|
364
|
+
If you want to change status reporting interval you can do that by changing the
|
365
|
+
``status_report_interval`` config option (in seconds).
|
366
|
+
|
315
367
|
# Releasing
|
316
368
|
|
317
369
|
## Updating version
|
318
370
|
|
319
371
|
Currently references to the version need to be manually updated, files to look in for this are `logstash-putput-scalyr.gemspec`,
|
320
|
-
`
|
372
|
+
`lib/scalyr/constants.rb`, and under "Quick Start" in this `README.md`.
|
321
373
|
|
322
374
|
The changelog should also be updated with the latest version and changes of note.
|
323
375
|
|
@@ -326,6 +378,7 @@ The changelog should also be updated with the latest version and changes of note
|
|
326
378
|
To deploy the current code on your machine run these commands:
|
327
379
|
|
328
380
|
```
|
381
|
+
rm -rf vendor/
|
329
382
|
bundle check --path vendor/bundle || bundle install --deployment
|
330
383
|
curl -u RUBY_USER:RUBY_PASSWORD https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
|
331
384
|
chmod 0600 ~/.gem/credentials
|
@@ -8,15 +8,15 @@ require "thread" # for safe queueing
|
|
8
8
|
require "uri" # for escaping user input
|
9
9
|
require 'json' # for converting event object to JSON for upload
|
10
10
|
|
11
|
-
require '
|
12
|
-
require 'net/http/persistent'
|
13
|
-
require 'net/https'
|
11
|
+
require 'manticore'
|
14
12
|
require 'rbzip2'
|
15
13
|
require 'zlib'
|
16
14
|
require 'stringio'
|
15
|
+
require 'quantile'
|
17
16
|
|
18
17
|
require 'scalyr/common/client'
|
19
18
|
require "scalyr/common/util"
|
19
|
+
require "scalyr/constants"
|
20
20
|
|
21
21
|
|
22
22
|
#---------------------------------------------------------------------------------------------------------------------
|
@@ -26,22 +26,14 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
26
26
|
|
27
27
|
config_name "scalyr"
|
28
28
|
|
29
|
-
|
30
|
-
# anyway but we should be explicit.
|
31
|
-
concurrency :single
|
29
|
+
concurrency :shared
|
32
30
|
|
33
31
|
# The Scalyr API write token, these are available at https://www.scalyr.com/keys. This is the only compulsory configuration field required for proper upload
|
34
32
|
config :api_write_token, :validate => :string, :required => true
|
35
33
|
|
36
|
-
# If
|
34
|
+
# If you have an EU-based Scalyr account, please use https://eu.scalyr.com/
|
37
35
|
config :scalyr_server, :validate => :string, :default => "https://agent.scalyr.com/"
|
38
36
|
|
39
|
-
# Path to SSL bundle file.
|
40
|
-
config :ssl_ca_bundle_path, :validate => :string, :default => "/etc/ssl/certs/ca-bundle.crt"
|
41
|
-
|
42
|
-
# If we should append our built-in Scalyr cert to the one we find at `ssl_ca_bundle_path`.
|
43
|
-
config :append_builtin_cert, :validate => :boolean, :default => true
|
44
|
-
|
45
37
|
# server_attributes is a dictionary of key value pairs that represents/identifies the logstash aggregator server
|
46
38
|
# (where this plugin is running). Keys are arbitrary except for the 'serverHost' key which holds special meaning to
|
47
39
|
# Scalyr and is given special treatment in the Scalyr UI. All of these attributes are optional (not required for logs
|
@@ -90,9 +82,14 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
90
82
|
# Set max interval in seconds between bulk retries.
|
91
83
|
config :retry_max_interval, :validate => :number, :default => 64
|
92
84
|
|
93
|
-
#
|
85
|
+
# Whether or not to verify the connection to Scalyr, only set to false for debugging.
|
94
86
|
config :ssl_verify_peer, :validate => :boolean, :default => true
|
95
|
-
|
87
|
+
|
88
|
+
# Path to SSL bundle file.
|
89
|
+
config :ssl_ca_bundle_path, :validate => :string, :default => "/etc/ssl/certs/ca-bundle.crt"
|
90
|
+
|
91
|
+
# If we should append our built-in Scalyr cert to the one we find at `ssl_ca_bundle_path`.
|
92
|
+
config :append_builtin_cert, :validate => :boolean, :default => true
|
96
93
|
|
97
94
|
config :max_request_buffer, :validate => :number, :default => 5500000 # echee TODO: eliminate?
|
98
95
|
config :force_message_encoding, :validate => :string, :default => nil
|
@@ -104,6 +101,52 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
104
101
|
# An int containing the compression level of compression to use, from 1-9. Defaults to 6
|
105
102
|
config :compression_level, :validate => :number, :default => 6
|
106
103
|
|
104
|
+
# How often to log and report status metrics to Scalyr. Defaults to every 5
|
105
|
+
# minutes.
|
106
|
+
config :status_report_interval, :validate => :number, :default => 300
|
107
|
+
|
108
|
+
# Set to true to also log status messages with various metrics to stdout in addition to sending
|
109
|
+
# this data to Scalyr
|
110
|
+
config :log_status_messages_to_stdout, :validate => :boolean, :default => false
|
111
|
+
|
112
|
+
# Whether or not to count status event uploads in the statistics such as request latency etc.
|
113
|
+
config :record_stats_for_status, :validate => :boolean, :default => false
|
114
|
+
|
115
|
+
# Sample rate for event level metrics (flattening time, number of attributes per event, etc,).
|
116
|
+
# It's important to set this in case there are many events coming in per seconds, because
|
117
|
+
# instrumentation does add some overhead. By default, we sample 5% of the events. Keep in
|
118
|
+
# mind that we use simple random based sampling. Maximum possible value is 1 (aka no sampling
|
119
|
+
# - record metrics for every single event).
|
120
|
+
# We use sampling since Quantile.observe() operation is more expensive than simple counter
|
121
|
+
# based metric so we need to ensure recording a metric doesn't add too much overhead.
|
122
|
+
# Based on micro benchmark, random based sampler is about 5x faster than quantile.observe()
|
123
|
+
config :event_metrics_sample_rate, :validate => :number, :default => 0.05
|
124
|
+
|
125
|
+
# Parser to attach to status events
|
126
|
+
config :status_parser, :validate => :string, :default => "logstash_plugin_metrics"
|
127
|
+
|
128
|
+
# Whether or not to create fresh quantile estimators after a status send. Depending on what you want to gather from
|
129
|
+
# these stas this might be wanted or not.
|
130
|
+
config :flush_quantile_estimates_on_status_send, :validate => :boolean, :default => false
|
131
|
+
|
132
|
+
# Causes this plugin to act as if it successfully uploaded the logs, while actually returning as quickly as possible
|
133
|
+
# after no work being done.
|
134
|
+
config :noop_mode, :validate => :boolean, :default => false
|
135
|
+
|
136
|
+
# Manticore related options
|
137
|
+
config :http_connect_timeout, :validate => :number, :default => 10
|
138
|
+
config :http_socket_timeout, :validate => :number, :default => 10
|
139
|
+
config :http_request_timeout, :validate => :number, :default => 60
|
140
|
+
config :http_pool_max, :validate => :number, :default => 50
|
141
|
+
config :http_pool_max_per_route, :validate => :number, :default => 25
|
142
|
+
|
143
|
+
def initialize(*params)
|
144
|
+
super
|
145
|
+
# Request statistics are accumulated across multiple threads and must be accessed through a mutex
|
146
|
+
@stats_lock = Mutex.new
|
147
|
+
@send_stats = Mutex.new
|
148
|
+
end
|
149
|
+
|
107
150
|
def close
|
108
151
|
@running = false
|
109
152
|
@client_session.close if @client_session
|
@@ -111,6 +154,14 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
111
154
|
|
112
155
|
public
|
113
156
|
def register
|
157
|
+
# This prng is used exclusively to determine when to sample statistics and no security related purpose, for this
|
158
|
+
# reason we do not ensure thread safety for it.
|
159
|
+
@prng = Random.new
|
160
|
+
|
161
|
+
if @event_metrics_sample_rate < 0 or @event_metrics_sample_rate > 1
|
162
|
+
raise LogStash::ConfigurationError, "Minimum possible value for 'event_metrics_sample_rate' is 0 (dont sample any events) and maximum is 1 (sample every event)"
|
163
|
+
end
|
164
|
+
|
114
165
|
@node_hostname = Socket.gethostname
|
115
166
|
|
116
167
|
if @log_constants and not @log_constants.all? { |x| x.is_a? String }
|
@@ -177,22 +228,39 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
177
228
|
@last_status_transmit_time = nil
|
178
229
|
@last_status_ = false
|
179
230
|
|
231
|
+
# Plugin level (either per batch or event level metrics). Other request
|
232
|
+
# level metrics are handled by the HTTP Client class.
|
233
|
+
@multi_receive_statistics = {
|
234
|
+
:total_multi_receive_secs => 0
|
235
|
+
}
|
236
|
+
@plugin_metrics = get_new_metrics
|
237
|
+
|
180
238
|
# create a client session for uploading to Scalyr
|
181
239
|
@running = true
|
182
240
|
@client_session = Scalyr::Common::Client::ClientSession.new(
|
183
241
|
@logger, @add_events_uri,
|
184
|
-
@compression_type, @compression_level,
|
185
|
-
@
|
186
|
-
@
|
242
|
+
@compression_type, @compression_level, @ssl_verify_peer, @ssl_ca_bundle_path, @append_builtin_cert,
|
243
|
+
@record_stats_for_status, @flush_quantile_estimates_on_status_send,
|
244
|
+
@http_connect_timeout, @http_socket_timeout, @http_request_timeout, @http_pool_max, @http_pool_max_per_route
|
187
245
|
)
|
188
246
|
|
189
|
-
@logger.info("Started Scalyr output plugin", :class => self.class.name)
|
247
|
+
@logger.info(sprintf("Started Scalyr output plugin (%s)." % [PLUGIN_VERSION]), :class => self.class.name)
|
190
248
|
|
191
249
|
# Finally, send a status line to Scalyr
|
192
250
|
send_status
|
193
251
|
|
194
252
|
end # def register
|
195
253
|
|
254
|
+
# Convenience method to create a fresh quantile estimator
|
255
|
+
def get_new_metrics
|
256
|
+
return {
|
257
|
+
:multi_receive_duration_secs => Quantile::Estimator.new,
|
258
|
+
:multi_receive_event_count => Quantile::Estimator.new,
|
259
|
+
:event_attributes_count => Quantile::Estimator.new,
|
260
|
+
:flatten_values_duration_secs => Quantile::Estimator.new,
|
261
|
+
:batches_per_multi_receive => Quantile::Estimator.new
|
262
|
+
}
|
263
|
+
end
|
196
264
|
|
197
265
|
# Receive an array of events and immediately upload them (without buffering).
|
198
266
|
# The Logstash framework will call this plugin method whenever there is a list of events to upload to Scalyr.
|
@@ -206,75 +274,96 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
206
274
|
#
|
207
275
|
public
|
208
276
|
def multi_receive(events)
|
277
|
+
# Just return and pretend we did something if running in noop mode
|
278
|
+
return events if @noop_mode
|
209
279
|
|
210
|
-
|
211
|
-
|
280
|
+
begin
|
281
|
+
start_time = Time.now.to_f
|
212
282
|
|
213
|
-
|
214
|
-
|
215
|
-
total_batches = multi_event_request_array.length unless multi_event_request_array.nil?
|
283
|
+
multi_event_request_array = build_multi_event_request_array(events)
|
284
|
+
# Loop over all array of multi-event requests, sending each multi-event to Scalyr
|
216
285
|
|
217
|
-
|
218
|
-
|
219
|
-
|
286
|
+
sleep_interval = @retry_initial_interval
|
287
|
+
batch_num = 1
|
288
|
+
total_batches = multi_event_request_array.length unless multi_event_request_array.nil?
|
289
|
+
|
290
|
+
result = []
|
291
|
+
records_count = events.to_a.length
|
292
|
+
|
293
|
+
while !multi_event_request_array.to_a.empty?
|
220
294
|
multi_event_request = multi_event_request_array.pop
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
295
|
+
begin
|
296
|
+
# For some reason a retry on the multi_receive may result in the request array containing `nil` elements, we
|
297
|
+
# ignore these.
|
298
|
+
if !multi_event_request.nil?
|
299
|
+
@client_session.post_add_events(multi_event_request[:body], false, multi_event_request[:serialization_duration])
|
300
|
+
|
301
|
+
sleep_interval = @retry_initial_interval
|
302
|
+
batch_num += 1
|
303
|
+
result.push(multi_event_request)
|
304
|
+
end
|
305
|
+
|
306
|
+
rescue Scalyr::Common::Client::ServerError, Scalyr::Common::Client::ClientError => e
|
307
|
+
sleep_interval = sleep_for(sleep_interval)
|
308
|
+
message = "Error uploading to Scalyr (will backoff-retry)"
|
309
|
+
exc_data = {
|
310
|
+
:url => e.url.to_s,
|
311
|
+
:message => e.message,
|
312
|
+
:batch_num => batch_num,
|
313
|
+
:total_batches => total_batches,
|
314
|
+
:record_count => multi_event_request[:record_count],
|
315
|
+
:payload_size => multi_event_request[:body].bytesize,
|
316
|
+
:will_retry_in_seconds => sleep_interval,
|
317
|
+
}
|
318
|
+
exc_data[:code] = e.code if e.code
|
319
|
+
exc_data[:body] = e.body if @logger.debug? and e.body
|
320
|
+
exc_data[:payload] = "\tSample payload: #{request[:body][0,1024]}..." if @logger.debug?
|
321
|
+
if e.is_commonly_retried?
|
322
|
+
# well-known retriable errors should be debug
|
323
|
+
@logger.debug(message, exc_data)
|
324
|
+
else
|
325
|
+
# all other failed uploads should be errors
|
326
|
+
@logger.error(message, exc_data)
|
327
|
+
end
|
328
|
+
sleep_interval *= 2
|
329
|
+
retry if @running
|
330
|
+
|
331
|
+
rescue => e
|
332
|
+
# Any unexpected errors should be fully logged
|
333
|
+
@logger.error(
|
334
|
+
"Unexpected error occurred while uploading to Scalyr (will backoff-retry)",
|
335
|
+
:error_message => e.message,
|
336
|
+
:error_class => e.class.name,
|
337
|
+
:backtrace => e.backtrace
|
338
|
+
)
|
339
|
+
@logger.debug("Failed multi_event_request", :multi_event_request => multi_event_request)
|
340
|
+
sleep_interval = sleep_for(sleep_interval)
|
341
|
+
sleep_interval *= 2
|
342
|
+
retry if @running
|
227
343
|
end
|
344
|
+
end
|
228
345
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
@logger.error e.message
|
236
|
-
@logger.error "Discarding buffer chunk without retrying."
|
237
|
-
|
238
|
-
rescue Scalyr::Common::Client::ServerError, Scalyr::Common::Client::ClientError => e
|
239
|
-
sleep_interval = sleep_for(sleep_interval)
|
240
|
-
message = "Error uploading to Scalyr (will backoff-retry)"
|
241
|
-
exc_data = {
|
242
|
-
:url => e.url.to_s,
|
243
|
-
:message => e.message,
|
244
|
-
:batch_num => batch_num,
|
245
|
-
:total_batches => total_batches,
|
246
|
-
:record_count => multi_event_request[:record_count],
|
247
|
-
:payload_size => multi_event_request[:body].bytesize,
|
248
|
-
:will_retry_in_seconds => sleep_interval,
|
249
|
-
}
|
250
|
-
exc_data[:code] = e.response_code if e.code
|
251
|
-
exc_data[:body] = e.response_body if @logger.debug? and e.body
|
252
|
-
exc_data[:payload] = "\tSample payload: #{request[:body][0,1024]}..." if @logger.debug?
|
253
|
-
if e.is_commonly_retried?
|
254
|
-
# well-known retriable errors should be debug
|
255
|
-
@logger.debug(message, exc_data)
|
256
|
-
else
|
257
|
-
# all other failed uploads should be errors
|
258
|
-
@logger.error(message, exc_data)
|
346
|
+
if records_count > 0
|
347
|
+
@stats_lock.synchronize do
|
348
|
+
@multi_receive_statistics[:total_multi_receive_secs] += (Time.now.to_f - start_time)
|
349
|
+
@plugin_metrics[:multi_receive_duration_secs].observe(Time.now.to_f - start_time)
|
350
|
+
@plugin_metrics[:multi_receive_event_count].observe(records_count)
|
351
|
+
@plugin_metrics[:batches_per_multi_receive].observe(total_batches)
|
259
352
|
end
|
260
|
-
retry if @running
|
261
|
-
|
262
|
-
rescue => e
|
263
|
-
# Any unexpected errors should be fully logged
|
264
|
-
@logger.error(
|
265
|
-
"Unexpected error occurred while uploading to Scalyr (will backoff-retry)",
|
266
|
-
:error_message => e.message,
|
267
|
-
:error_class => e.class.name,
|
268
|
-
:backtrace => e.backtrace
|
269
|
-
)
|
270
|
-
@logger.debug("Failed multi_event_request", :multi_event_request => multi_event_request)
|
271
|
-
sleep_interval = sleep_for(sleep_interval)
|
272
|
-
retry if @running
|
273
353
|
end
|
274
|
-
end
|
275
354
|
|
276
|
-
|
277
|
-
|
355
|
+
send_status
|
356
|
+
return result
|
357
|
+
|
358
|
+
rescue => e
|
359
|
+
# Any unexpected errors should be fully logged
|
360
|
+
@logger.error(
|
361
|
+
"Unexpected error occurred while executing multi_receive.",
|
362
|
+
:error_message => e.message,
|
363
|
+
:error_class => e.class.name,
|
364
|
+
:backtrace => e.backtrace
|
365
|
+
)
|
366
|
+
end
|
278
367
|
end # def multi_receive
|
279
368
|
|
280
369
|
|
@@ -296,6 +385,9 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
296
385
|
# Tags are either propagated as a comma-separated string, or optionally transposed into key-values where the keys
|
297
386
|
# are tag names and the values are 1 (may be configured.)
|
298
387
|
def build_multi_event_request_array(logstash_events)
|
388
|
+
if logstash_events.nil? or logstash_events.empty?
|
389
|
+
return []
|
390
|
+
end
|
299
391
|
|
300
392
|
multi_event_request_array = Array.new
|
301
393
|
total_bytes = 0
|
@@ -338,8 +430,8 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
338
430
|
if standard_field != renamed_field
|
339
431
|
if record.key? renamed_field
|
340
432
|
if record.key? standard_field
|
341
|
-
@logger.warn "Overwriting log record field '#{standard_field}'. You are seeing this warning because in "
|
342
|
-
"your LogStash config file you have configured the '#{renamed_field}' field to be converted to the "
|
433
|
+
@logger.warn "Overwriting log record field '#{standard_field}'. You are seeing this warning because in " +
|
434
|
+
"your LogStash config file you have configured the '#{renamed_field}' field to be converted to the " +
|
343
435
|
"'#{standard_field}' field, but the event already contains a field called '#{standard_field}' and "
|
344
436
|
"this is now being overwritten."
|
345
437
|
end
|
@@ -425,8 +517,27 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
425
517
|
record.delete('tags')
|
426
518
|
end
|
427
519
|
|
520
|
+
# Record per-event level metrics (flatten duration, event attributes count). Doing this for every single
|
521
|
+
# event would be somewhat expensive so we use sampling.
|
522
|
+
should_sample_event_metrics = should_sample?
|
523
|
+
|
428
524
|
# flatten record
|
429
|
-
|
525
|
+
if @flatten_nested_values
|
526
|
+
start_time = Time.now.to_f
|
527
|
+
record = Scalyr::Common::Util.flatten(record, delimiter=@flatten_nested_values_delimiter)
|
528
|
+
end_time = Time.now.to_f
|
529
|
+
flatten_nested_values_duration = end_time - start_time
|
530
|
+
end
|
531
|
+
|
532
|
+
if should_sample_event_metrics
|
533
|
+
@stats_lock.synchronize do
|
534
|
+
@plugin_metrics[:event_attributes_count].observe(record.count)
|
535
|
+
|
536
|
+
if @flatten_nested_values
|
537
|
+
@plugin_metrics[:flatten_values_duration_secs].observe(flatten_nested_values_duration)
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
430
541
|
|
431
542
|
# Use LogStash event.timestamp as the 'ts' Scalyr timestamp. Note that this may be overwritten by input
|
432
543
|
# filters so may not necessarily reflect the actual originating timestamp.
|
@@ -503,7 +614,6 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
503
614
|
end
|
504
615
|
|
505
616
|
|
506
|
-
|
507
617
|
# Helper method that adds a client_timestamp to a batch addEvents request body
|
508
618
|
def add_client_timestamp_to_body(body)
|
509
619
|
current_time_millis = DateTime.now.strftime('%Q').to_i
|
@@ -513,14 +623,13 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
513
623
|
end
|
514
624
|
|
515
625
|
|
516
|
-
|
517
626
|
# A request comprises multiple Scalyr Events. This function creates a request hash for
|
518
627
|
# final upload to Scalyr (from an array of events, and an optional hash of current threads)
|
519
628
|
# Note: The request body field will be json-encoded.
|
520
629
|
def create_multi_event_request(scalyr_events, current_threads, current_logs)
|
521
630
|
|
522
631
|
body = {
|
523
|
-
:session => @session_id,
|
632
|
+
:session => @session_id + Thread.current.object_id.to_s,
|
524
633
|
:token => @api_write_token,
|
525
634
|
:events => scalyr_events,
|
526
635
|
}
|
@@ -548,11 +657,52 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
548
657
|
# add serverAttributes
|
549
658
|
body[:sessionInfo] = @server_attributes if @server_attributes
|
550
659
|
|
551
|
-
|
660
|
+
# We time serialization to get some insight on how long it takes to serialize the request body
|
661
|
+
start_time = Time.now.to_f
|
662
|
+
serialized_body = body.to_json
|
663
|
+
end_time = Time.now.to_f
|
664
|
+
serialization_duration = end_time - start_time
|
665
|
+
{ :body => serialized_body, :record_count => scalyr_events.size, :serialization_duration => serialization_duration }
|
552
666
|
|
553
667
|
end # def create_multi_event_request
|
554
668
|
|
555
669
|
|
670
|
+
# Retrieve batch and other event level metric values
|
671
|
+
def get_stats
|
672
|
+
@stats_lock.synchronize do
|
673
|
+
current_stats = @multi_receive_statistics.clone
|
674
|
+
|
675
|
+
current_stats[:multi_receive_duration_p50] = @plugin_metrics[:multi_receive_duration_secs].query(0.5)
|
676
|
+
current_stats[:multi_receive_duration_p90] = @plugin_metrics[:multi_receive_duration_secs].query(0.9)
|
677
|
+
current_stats[:multi_receive_duration_p99] = @plugin_metrics[:multi_receive_duration_secs].query(0.99)
|
678
|
+
|
679
|
+
current_stats[:multi_receive_event_count_p50] = @plugin_metrics[:multi_receive_event_count].query(0.5)
|
680
|
+
current_stats[:multi_receive_event_count_p90] = @plugin_metrics[:multi_receive_event_count].query(0.9)
|
681
|
+
current_stats[:multi_receive_event_count_p99] = @plugin_metrics[:multi_receive_event_count].query(0.99)
|
682
|
+
|
683
|
+
current_stats[:event_attributes_count_p50] = @plugin_metrics[:event_attributes_count].query(0.5)
|
684
|
+
current_stats[:event_attributes_count_p90] = @plugin_metrics[:event_attributes_count].query(0.9)
|
685
|
+
current_stats[:event_attributes_count_p99] = @plugin_metrics[:event_attributes_count].query(0.99)
|
686
|
+
|
687
|
+
current_stats[:batches_per_multi_receive_p50] = @plugin_metrics[:batches_per_multi_receive].query(0.5)
|
688
|
+
current_stats[:batches_per_multi_receive_p90] = @plugin_metrics[:batches_per_multi_receive].query(0.9)
|
689
|
+
current_stats[:batches_per_multi_receive_p99] = @plugin_metrics[:batches_per_multi_receive].query(0.99)
|
690
|
+
|
691
|
+
if @flatten_nested_values
|
692
|
+
# We only return those metrics in case flattening is enabled
|
693
|
+
current_stats[:flatten_values_duration_secs_p50] = @plugin_metrics[:flatten_values_duration_secs].query(0.5)
|
694
|
+
current_stats[:flatten_values_duration_secs_p90] = @plugin_metrics[:flatten_values_duration_secs].query(0.9)
|
695
|
+
current_stats[:flatten_values_duration_secs_p99] = @plugin_metrics[:flatten_values_duration_secs].query(0.99)
|
696
|
+
end
|
697
|
+
|
698
|
+
if @flush_quantile_estimates_on_status_send
|
699
|
+
@logger.debug "Recreating / reseting quantile estimator classes for plugin metrics"
|
700
|
+
@plugin_metrics = get_new_metrics
|
701
|
+
end
|
702
|
+
|
703
|
+
current_stats
|
704
|
+
end
|
705
|
+
end
|
556
706
|
|
557
707
|
|
558
708
|
# Sends a status update to Scalyr by posting a log entry under the special logfile of 'logstash_plugin.log'
|
@@ -570,37 +720,66 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
570
720
|
'plugin_id' => self.id,
|
571
721
|
}
|
572
722
|
}
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
723
|
+
@send_stats.synchronize do
|
724
|
+
if !@last_status_transmit_time
|
725
|
+
status_event[:attrs]['message'] = sprintf("Started Scalyr LogStash output plugin (%s)." % [PLUGIN_VERSION])
|
726
|
+
status_event[:attrs]['serverHost'] = @node_hostname
|
727
|
+
else
|
728
|
+
cur_time = Time.now()
|
729
|
+
return if (cur_time.to_i - @last_status_transmit_time.to_i) < @status_report_interval
|
730
|
+
# echee TODO: get instance stats from session and create a status log line
|
731
|
+
msg = 'plugin_status: '
|
732
|
+
cnt = 0
|
733
|
+
@client_session.get_stats.each do |k, v|
|
734
|
+
val = v.instance_of?(Float) ? sprintf("%.4f", v) : v
|
735
|
+
val = val.nil? ? 0 : val
|
736
|
+
msg << ' ' if cnt > 0
|
737
|
+
msg << "#{k.to_s}=#{val}"
|
738
|
+
cnt += 1
|
739
|
+
end
|
740
|
+
get_stats.each do |k, v|
|
741
|
+
val = v.instance_of?(Float) ? sprintf("%.4f", v) : v
|
742
|
+
val = val.nil? ? 0 : val
|
743
|
+
msg << ' ' if cnt > 0
|
744
|
+
msg << "#{k.to_s}=#{val}"
|
745
|
+
cnt += 1
|
746
|
+
end
|
747
|
+
status_event[:attrs]['message'] = msg
|
748
|
+
status_event[:attrs]['serverHost'] = @node_hostname
|
749
|
+
status_event[:attrs]['parser'] = @status_parser
|
588
750
|
end
|
589
|
-
status_event[:attrs]['message'] = msg
|
590
|
-
status_event[:attrs]['serverHost'] = @node_hostname
|
591
751
|
end
|
592
752
|
multi_event_request = create_multi_event_request([status_event], nil, nil)
|
593
|
-
|
753
|
+
begin
|
754
|
+
@client_session.post_add_events(multi_event_request[:body], true, 0)
|
755
|
+
rescue => e
|
756
|
+
@logger.warn(
|
757
|
+
"Unexpected error occurred while uploading status to Scalyr",
|
758
|
+
:error_message => e.message,
|
759
|
+
:error_class => e.class.name
|
760
|
+
)
|
761
|
+
return
|
762
|
+
end
|
594
763
|
@last_status_transmit_time = Time.now()
|
764
|
+
|
765
|
+
if @log_status_messages_to_stdout
|
766
|
+
@logger.info msg
|
767
|
+
end
|
768
|
+
status_event
|
595
769
|
end
|
596
770
|
|
771
|
+
# Returns true if we should sample and record metrics for a specific event based on the sampling
|
772
|
+
# rate and random value
|
773
|
+
def should_sample?
|
774
|
+
return @prng.rand(0.0..1.0) < @event_metrics_sample_rate
|
775
|
+
end
|
597
776
|
|
598
777
|
|
599
778
|
# Returns true if it is time to transmit status
|
600
779
|
def should_transmit_status?
|
601
780
|
@last_status_transmit_time_lock.synchronize do
|
602
781
|
saved_last_time = @last_status_transmit_time
|
603
|
-
if Time.now.to_i - saved_last_time.to_i >
|
782
|
+
if Time.now.to_i - saved_last_time.to_i > @status_report_interval
|
604
783
|
@last_status_transmit_time = Float::INFINITY
|
605
784
|
return saved_last_time
|
606
785
|
end
|
@@ -622,12 +801,10 @@ class LogStash::Outputs::Scalyr < LogStash::Outputs::Base
|
|
622
801
|
end
|
623
802
|
|
624
803
|
|
625
|
-
|
626
804
|
# Helper method to check if the dead-letter queue is enabled
|
627
805
|
def dlq_enabled?
|
628
806
|
# echee TODO submit to DLQ
|
629
807
|
respond_to?(:execution_context) && execution_context.respond_to?(:dlq_writer) &&
|
630
808
|
!execution_context.dlq_writer.inner_writer.is_a?(::LogStash::Util::DummyDeadLetterQueueWriter)
|
631
809
|
end
|
632
|
-
|
633
810
|
end
|