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.
Files changed (357) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/Gemfile +6 -0
  4. data/README.md +57 -4
  5. data/lib/logstash/outputs/scalyr.rb +284 -107
  6. data/lib/scalyr/common/client.rb +117 -43
  7. data/lib/scalyr/constants.rb +2 -0
  8. data/logstash-output-scalyr.gemspec +2 -1
  9. data/spec/benchmarks/flattening_and_serialization.rb +125 -0
  10. data/spec/benchmarks/metrics_overhead.rb +48 -0
  11. data/spec/logstash/outputs/scalyr_integration_spec.rb +188 -0
  12. data/spec/logstash/outputs/scalyr_spec.rb +141 -71
  13. data/vendor/bundle/jruby/2.5.0/cache/addressable-2.7.0.gem +0 -0
  14. data/vendor/bundle/jruby/2.5.0/cache/connection_pool-2.2.5.gem +0 -0
  15. data/vendor/bundle/jruby/2.5.0/cache/crack-0.4.5.gem +0 -0
  16. data/vendor/bundle/jruby/2.5.0/cache/hashdiff-1.0.1.gem +0 -0
  17. data/vendor/bundle/jruby/2.5.0/cache/net-http-persistent-4.0.1.gem +0 -0
  18. data/vendor/bundle/jruby/2.5.0/cache/public_suffix-4.0.6.gem +0 -0
  19. data/vendor/bundle/jruby/2.5.0/cache/quantile-0.2.1.gem +0 -0
  20. data/vendor/bundle/jruby/2.5.0/cache/rexml-3.2.5.gem +0 -0
  21. data/vendor/bundle/jruby/2.5.0/cache/webmock-3.13.0.gem +0 -0
  22. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/CHANGELOG.md +235 -0
  23. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/Gemfile +32 -0
  24. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/LICENSE.txt +202 -0
  25. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/README.md +121 -0
  26. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/Rakefile +34 -0
  27. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/data/unicode.data +0 -0
  28. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable.rb +4 -0
  29. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/idna.rb +27 -0
  30. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/idna/native.rb +61 -0
  31. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/idna/pure.rb +676 -0
  32. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/template.rb +1045 -0
  33. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/uri.rb +2529 -0
  34. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/lib/addressable/version.rb +32 -0
  35. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/idna_spec.rb +300 -0
  36. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/net_http_compat_spec.rb +30 -0
  37. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/rack_mount_compat_spec.rb +106 -0
  38. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/security_spec.rb +59 -0
  39. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/template_spec.rb +1451 -0
  40. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/addressable/uri_spec.rb +6603 -0
  41. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/spec/spec_helper.rb +24 -0
  42. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/clobber.rake +4 -0
  43. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/gem.rake +93 -0
  44. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/git.rake +47 -0
  45. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/metrics.rake +24 -0
  46. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/rspec.rake +23 -0
  47. data/vendor/bundle/jruby/2.5.0/gems/addressable-2.7.0/tasks/yard.rake +29 -0
  48. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/Changes.md +11 -0
  49. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/Gemfile +0 -2
  50. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/LICENSE +0 -0
  51. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/README.md +29 -5
  52. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/Rakefile +0 -1
  53. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/connection_pool.gemspec +1 -0
  54. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/lib/connection_pool.rb +16 -0
  55. 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
  56. 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
  57. 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
  58. data/vendor/bundle/jruby/2.5.0/gems/{connection_pool-2.2.3 → connection_pool-2.2.5}/test/helper.rb +0 -0
  59. 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
  60. 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
  61. data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack.rb +7 -0
  62. data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/json.rb +98 -0
  63. data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/util.rb +17 -0
  64. data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/version.rb +3 -0
  65. data/vendor/bundle/jruby/2.5.0/gems/crack-0.4.5/lib/crack/xml.rb +238 -0
  66. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/Gemfile +8 -0
  67. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/LICENSE +19 -0
  68. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/README.md +276 -0
  69. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/Rakefile +18 -0
  70. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/changelog.md +100 -0
  71. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/hashdiff.gemspec +39 -0
  72. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff.rb +10 -0
  73. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/compare_hashes.rb +69 -0
  74. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/diff.rb +177 -0
  75. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs.rb +66 -0
  76. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/lcs_compare_arrays.rb +32 -0
  77. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/linear_compare_array.rb +159 -0
  78. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/patch.rb +88 -0
  79. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/util.rb +155 -0
  80. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/lib/hashdiff/version.rb +5 -0
  81. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/best_diff_spec.rb +75 -0
  82. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_array_spec.rb +60 -0
  83. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/diff_spec.rb +360 -0
  84. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/lcs_spec.rb +76 -0
  85. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/linear_compare_array_spec.rb +50 -0
  86. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/patch_spec.rb +185 -0
  87. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/readme_spec.rb +15 -0
  88. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/hashdiff/util_spec.rb +116 -0
  89. data/vendor/bundle/jruby/2.5.0/gems/hashdiff-1.0.1/spec/spec_helper.rb +15 -0
  90. data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/Gemfile +0 -0
  91. data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/History.txt +6 -0
  92. data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/Manifest.txt +0 -0
  93. data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/README.rdoc +0 -0
  94. data/vendor/bundle/jruby/2.5.0/gems/{net-http-persistent-4.0.0 → net-http-persistent-4.0.1}/Rakefile +1 -1
  95. 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
  96. 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
  97. 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
  98. 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
  99. 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
  100. 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
  101. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/2.0-Upgrade.md +52 -0
  102. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/CHANGELOG.md +406 -0
  103. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/Gemfile +15 -0
  104. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/LICENSE.txt +22 -0
  105. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/README.md +207 -0
  106. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/Rakefile +51 -0
  107. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/SECURITY.md +104 -0
  108. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/bin/console +15 -0
  109. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/codecov.yml +12 -0
  110. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/data/list.txt +13380 -0
  111. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix.rb +179 -0
  112. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/domain.rb +235 -0
  113. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/errors.rb +41 -0
  114. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/list.rb +247 -0
  115. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/rule.rb +350 -0
  116. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/lib/public_suffix/version.rb +13 -0
  117. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/public_suffix.gemspec +29 -0
  118. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/acceptance_test.rb +131 -0
  119. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find.rb +66 -0
  120. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_find_all.rb +102 -0
  121. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_names.rb +91 -0
  122. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select.rb +26 -0
  123. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_select_incremental.rb +25 -0
  124. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/benchmarks/bm_valid.rb +101 -0
  125. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/domain_profiler.rb +12 -0
  126. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler.rb +12 -0
  127. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/find_profiler_jp.rb +12 -0
  128. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/initialization_profiler.rb +11 -0
  129. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/list_profsize.rb +11 -0
  130. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/profilers/object_binsize.rb +57 -0
  131. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/psl_test.rb +52 -0
  132. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/test_helper.rb +18 -0
  133. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/tests.txt +98 -0
  134. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/domain_test.rb +106 -0
  135. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/errors_test.rb +25 -0
  136. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/list_test.rb +241 -0
  137. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/public_suffix_test.rb +188 -0
  138. data/vendor/bundle/jruby/2.5.0/gems/public_suffix-4.0.6/test/unit/rule_test.rb +222 -0
  139. data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/LICENSE +191 -0
  140. data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/README.md +55 -0
  141. data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile.rb +17 -0
  142. data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile/estimator.rb +186 -0
  143. data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile/quantile.rb +66 -0
  144. data/vendor/bundle/jruby/2.5.0/gems/quantile-0.2.1/lib/quantile/version.rb +16 -0
  145. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/LICENSE.txt +22 -0
  146. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/NEWS.md +178 -0
  147. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/README.md +48 -0
  148. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/context.rdoc +143 -0
  149. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/child.rdoc +87 -0
  150. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/document.rdoc +276 -0
  151. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/element.rdoc +602 -0
  152. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/node.rdoc +97 -0
  153. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/rdoc/parent.rdoc +267 -0
  154. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/child_toc.rdoc +12 -0
  155. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/document_toc.rdoc +30 -0
  156. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/element_toc.rdoc +55 -0
  157. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/master_toc.rdoc +135 -0
  158. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/node_toc.rdoc +16 -0
  159. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/doc/rexml/tasks/tocs/parent_toc.rdoc +25 -0
  160. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml.rb +3 -0
  161. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attlistdecl.rb +63 -0
  162. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/attribute.rb +205 -0
  163. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/cdata.rb +68 -0
  164. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/child.rb +97 -0
  165. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/comment.rb +80 -0
  166. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/doctype.rb +311 -0
  167. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/document.rb +451 -0
  168. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/attlistdecl.rb +11 -0
  169. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/dtd.rb +47 -0
  170. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/elementdecl.rb +18 -0
  171. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/entitydecl.rb +57 -0
  172. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/dtd/notationdecl.rb +40 -0
  173. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/element.rb +2599 -0
  174. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/encoding.rb +51 -0
  175. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/entity.rb +171 -0
  176. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/default.rb +116 -0
  177. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/pretty.rb +142 -0
  178. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/formatters/transitive.rb +58 -0
  179. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/functions.rb +447 -0
  180. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/instruction.rb +79 -0
  181. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/light/node.rb +188 -0
  182. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/namespace.rb +59 -0
  183. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/node.rb +76 -0
  184. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/output.rb +30 -0
  185. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parent.rb +166 -0
  186. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parseexception.rb +52 -0
  187. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb +694 -0
  188. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/lightparser.rb +59 -0
  189. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb +197 -0
  190. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb +273 -0
  191. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/streamparser.rb +61 -0
  192. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/treeparser.rb +101 -0
  193. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/ultralightparser.rb +57 -0
  194. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/parsers/xpathparser.rb +689 -0
  195. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/quickpath.rb +266 -0
  196. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/rexml.rb +37 -0
  197. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/sax2listener.rb +98 -0
  198. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/security.rb +28 -0
  199. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/source.rb +298 -0
  200. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/streamlistener.rb +93 -0
  201. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/text.rb +424 -0
  202. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/undefinednamespaceexception.rb +9 -0
  203. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/relaxng.rb +539 -0
  204. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validation.rb +144 -0
  205. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/validation/validationexception.rb +10 -0
  206. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmldecl.rb +130 -0
  207. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xmltokens.rb +85 -0
  208. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath.rb +81 -0
  209. data/vendor/bundle/jruby/2.5.0/gems/rexml-3.2.5/lib/rexml/xpath_parser.rb +974 -0
  210. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/CHANGELOG.md +1894 -0
  211. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/Gemfile +9 -0
  212. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/LICENSE +20 -0
  213. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/README.md +1176 -0
  214. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/Rakefile +38 -0
  215. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock.rb +59 -0
  216. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/api.rb +109 -0
  217. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/assertion_failure.rb +11 -0
  218. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/callback_registry.rb +35 -0
  219. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/config.rb +18 -0
  220. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/cucumber.rb +10 -0
  221. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/deprecation.rb +9 -0
  222. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/errors.rb +17 -0
  223. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +216 -0
  224. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/curb_adapter.rb +351 -0
  225. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +231 -0
  226. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/excon_adapter.rb +165 -0
  227. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_lib_adapter.rb +7 -0
  228. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +19 -0
  229. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/client.rb +17 -0
  230. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/request.rb +16 -0
  231. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/response.rb +64 -0
  232. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/streamer.rb +29 -0
  233. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb/webmock.rb +68 -0
  234. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/http_rb_adapter.rb +37 -0
  235. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/httpclient_adapter.rb +259 -0
  236. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/manticore_adapter.rb +145 -0
  237. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/net_http.rb +385 -0
  238. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/net_http_response.rb +34 -0
  239. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/patron_adapter.rb +130 -0
  240. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +174 -0
  241. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/any_arg_matcher.rb +13 -0
  242. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/hash_argument_matcher.rb +21 -0
  243. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/hash_excluding_matcher.rb +15 -0
  244. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/matchers/hash_including_matcher.rb +17 -0
  245. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/minitest.rb +41 -0
  246. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rack_response.rb +69 -0
  247. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_body_diff.rb +64 -0
  248. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_execution_verifier.rb +77 -0
  249. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_pattern.rb +405 -0
  250. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_registry.rb +35 -0
  251. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_signature.rb +54 -0
  252. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_signature_snippet.rb +61 -0
  253. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/request_stub.rb +100 -0
  254. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/response.rb +159 -0
  255. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/responses_sequence.rb +40 -0
  256. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec.rb +42 -0
  257. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec/matchers.rb +27 -0
  258. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec/matchers/request_pattern_matcher.rb +78 -0
  259. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/rspec/matchers/webmock_matcher.rb +67 -0
  260. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/stub_registry.rb +82 -0
  261. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/stub_request_snippet.rb +38 -0
  262. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/test_unit.rb +20 -0
  263. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/hash_counter.rb +39 -0
  264. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/hash_keys_stringifier.rb +25 -0
  265. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/hash_validator.rb +17 -0
  266. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/headers.rb +64 -0
  267. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/json.rb +67 -0
  268. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/query_mapper.rb +281 -0
  269. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/uri.rb +111 -0
  270. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/values_stringifier.rb +20 -0
  271. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/util/version_checker.rb +111 -0
  272. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/version.rb +3 -0
  273. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/lib/webmock/webmock.rb +163 -0
  274. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/minitest/test_helper.rb +34 -0
  275. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/minitest/test_webmock.rb +9 -0
  276. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/minitest/webmock_spec.rb +60 -0
  277. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/async_http_client/async_http_client_spec.rb +375 -0
  278. 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
  279. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/curb/curb_spec.rb +499 -0
  280. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/curb/curb_spec_helper.rb +147 -0
  281. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/em_http_request/em_http_request_spec.rb +462 -0
  282. 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
  283. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/excon/excon_spec.rb +77 -0
  284. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/excon/excon_spec_helper.rb +52 -0
  285. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/http_rb/http_rb_spec.rb +93 -0
  286. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/http_rb/http_rb_spec_helper.rb +54 -0
  287. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/httpclient/httpclient_spec.rb +217 -0
  288. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/httpclient/httpclient_spec_helper.rb +57 -0
  289. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/manticore/manticore_spec.rb +107 -0
  290. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/manticore/manticore_spec_helper.rb +35 -0
  291. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/net_http_shared.rb +153 -0
  292. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/net_http_spec.rb +369 -0
  293. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/net_http_spec_helper.rb +64 -0
  294. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/net_http/real_net_http_spec.rb +20 -0
  295. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/patron/patron_spec.rb +125 -0
  296. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/patron/patron_spec_helper.rb +54 -0
  297. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +313 -0
  298. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/callbacks.rb +148 -0
  299. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/complex_cross_concern_behaviors.rb +36 -0
  300. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/enabling_and_disabling_webmock.rb +95 -0
  301. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/precedence_of_stubs.rb +15 -0
  302. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/request_expectations.rb +930 -0
  303. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/returning_declared_responses.rb +409 -0
  304. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/shared/stubbing_requests.rb +678 -0
  305. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +135 -0
  306. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +60 -0
  307. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/acceptance/webmock_shared.rb +41 -0
  308. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/fixtures/test.txt +1 -0
  309. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/quality_spec.rb +84 -0
  310. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/spec_helper.rb +48 -0
  311. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/example_curl_output.txt +22 -0
  312. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/failures.rb +9 -0
  313. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/my_rack_app.rb +53 -0
  314. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/network_connection.rb +19 -0
  315. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/support/webmock_server.rb +70 -0
  316. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/api_spec.rb +175 -0
  317. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/errors_spec.rb +129 -0
  318. 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
  319. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +12 -0
  320. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/matchers/hash_excluding_matcher_spec.rb +61 -0
  321. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/matchers/hash_including_matcher_spec.rb +87 -0
  322. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/rack_response_spec.rb +112 -0
  323. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_body_diff_spec.rb +90 -0
  324. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_execution_verifier_spec.rb +208 -0
  325. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_pattern_spec.rb +736 -0
  326. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_registry_spec.rb +95 -0
  327. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_signature_snippet_spec.rb +89 -0
  328. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_signature_spec.rb +155 -0
  329. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/request_stub_spec.rb +199 -0
  330. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/response_spec.rb +286 -0
  331. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/stub_registry_spec.rb +103 -0
  332. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/stub_request_snippet_spec.rb +115 -0
  333. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/hash_counter_spec.rb +39 -0
  334. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/hash_keys_stringifier_spec.rb +27 -0
  335. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/headers_spec.rb +28 -0
  336. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/json_spec.rb +33 -0
  337. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/query_mapper_spec.rb +157 -0
  338. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/uri_spec.rb +371 -0
  339. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/util/version_checker_spec.rb +65 -0
  340. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/spec/unit/webmock_spec.rb +60 -0
  341. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/http_request.rb +24 -0
  342. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/shared_test.rb +108 -0
  343. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/test_helper.rb +23 -0
  344. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/test/test_webmock.rb +12 -0
  345. data/vendor/bundle/jruby/2.5.0/gems/webmock-3.13.0/webmock.gemspec +54 -0
  346. data/vendor/bundle/jruby/2.5.0/specifications/addressable-2.7.0.gemspec +39 -0
  347. data/vendor/bundle/jruby/2.5.0/specifications/{connection_pool-2.2.3.gemspec → connection_pool-2.2.5.gemspec} +4 -3
  348. data/vendor/bundle/jruby/2.5.0/specifications/crack-0.4.5.gemspec +32 -0
  349. data/vendor/bundle/jruby/2.5.0/specifications/hashdiff-1.0.1.gemspec +46 -0
  350. data/vendor/bundle/jruby/2.5.0/specifications/{net-http-persistent-4.0.0.gemspec → net-http-persistent-4.0.1.gemspec} +4 -5
  351. data/vendor/bundle/jruby/2.5.0/specifications/public_suffix-4.0.6.gemspec +24 -0
  352. data/vendor/bundle/jruby/2.5.0/specifications/quantile-0.2.1.gemspec +20 -0
  353. data/vendor/bundle/jruby/2.5.0/specifications/rexml-3.2.5.gemspec +42 -0
  354. data/vendor/bundle/jruby/2.5.0/specifications/webmock-3.13.0.gemspec +85 -0
  355. metadata +367 -32
  356. data/vendor/bundle/jruby/2.5.0/cache/connection_pool-2.2.3.gem +0 -0
  357. 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: fab6a3a6d6d6b2f6f2a3fbe2dc2eb3f58cb6e0f3fba4661c483288f1f6f9f9a8
4
- data.tar.gz: 954a437080e6fd03afc46fa08787ee35a02bad271e199e4347ba0728dc4699f1
3
+ metadata.gz: d6df8debd88e7675c00715a8b4fa2888e14cea861436c0049c1cbb99b96f2d0c
4
+ data.tar.gz: f07b38d925f732664390d391da3e84b3930644b77197b871043cabbf28bfd218
5
5
  SHA512:
6
- metadata.gz: c2a23046dd52329648c0581f80065c530eac90a84a19ce3916d52910a9786bead1f15f2fb341f79dd6561fb101e742d1c6af0bc705aaa9698bdb7d4cf7b1a7b8
7
- data.tar.gz: 2de8f9bb2f7b3b98021a163169317fa17219f9e698ff153429dd1540dc57bfe1e6a1bf525fb29a4cca2f29caf8d00a429e74c753b0c8ec70142893078dfb67ba
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.6.gem` or follow the latest official instructions on working with plugins from Logstash.
13
+ 2. Install the gem into a Logstash installation, run `/usr/share/logstash/bin/logstash-plugin install logstash-output-scalyr-0.1.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 your Scalyr backend is located in other geographies (such as Europe which would use `https://agent.eu.scalyr.com/`), you may need to modify this
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
- `client.rb`, twice in the CircleCI `Dockerfile`, and under "Quick Start" in this `README.md`.
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 'net/http'
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
- # For correctness reasons we need to limit this plugin to a single worker, a single worker will be single concurrency
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 your Scalyr backend is located in other geographies (such as Europe which would use `https://agent.eu.scalyr.com/`), you may need to modify this
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
- # The following two settings pertain to preventing Man-in-the-middle (MITM) attacks # echee TODO: eliminate?
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
- config :ssl_verify_depth, :validate => :number, :default => 5
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
- @ssl_verify_peer, @ssl_ca_bundle_path, @ssl_verify_depth,
186
- @append_builtin_cert
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
- multi_event_request_array = build_multi_event_request_array(events)
211
- # Loop over all array of multi-event requests, sending each multi-event to Scalyr
280
+ begin
281
+ start_time = Time.now.to_f
212
282
 
213
- sleep_interval = @retry_initial_interval
214
- batch_num = 1
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
- result = []
218
- while !multi_event_request_array.to_a.empty?
219
- begin
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
- # For some reason a retry on the multi_receive may result in the request array containing `nil` elements, we
222
- # ignore these.
223
- if !multi_event_request.nil?
224
- @client_session.post_add_events(multi_event_request[:body])
225
- sleep_interval = 0
226
- result.push(multi_event_request)
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
- rescue OpenSSL::SSL::SSLError => e
230
- # cannot rely on exception message, so we always log the following warning
231
- @logger.error "SSL certificate verification failed. "
232
- "Please make sure your certificate bundle is configured correctly and points to a valid file. "
233
- "You can configure this with the ssl_ca_bundle_path configuration option. "
234
- "The current value of ssl_ca_bundle_path is '#{@ssl_ca_bundle_path}'"
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
- send_status
277
- return result
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
- record = Scalyr::Common::Util.flatten(record, delimiter=@flatten_nested_values_delimiter) if @flatten_nested_values
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
- { :body => body.to_json, :record_count => scalyr_events.size }
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
- if !@last_status_transmit_time
575
- status_event[:attrs]['message'] = "Started Scalyr LogStash output plugin."
576
- status_event[:attrs]['serverHost'] = @node_hostname
577
- else
578
- cur_time = Time.now()
579
- return if (cur_time.to_i - @last_status_transmit_time.to_i) < 300
580
- # echee TODO: get instance stats from session and create a status log line
581
- msg = 'plugin_status: '
582
- cnt = 0
583
- @client_session.get_stats.each do |k, v|
584
- val = v.instance_of?(Float) ? sprintf("%.1f", v) : v
585
- msg << ', ' if cnt > 0
586
- msg << "#{k.to_s}=#{val}"
587
- cnt += 1
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
- @client_session.post_add_events(multi_event_request[:body])
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 > 300
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