logstash-lib 1.3.2

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 (419) hide show
  1. data/.gitignore +24 -0
  2. data/.tailor +8 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG +1185 -0
  5. data/CONTRIBUTING.md +61 -0
  6. data/CONTRIBUTORS +79 -0
  7. data/LICENSE +14 -0
  8. data/Makefile +460 -0
  9. data/README.md +120 -0
  10. data/STYLE.md +96 -0
  11. data/bin/logstash +37 -0
  12. data/bin/logstash-test +4 -0
  13. data/bin/logstash-web +4 -0
  14. data/bin/logstash.lib.sh +78 -0
  15. data/bot/check_pull_changelog.rb +89 -0
  16. data/docs/configuration.md +260 -0
  17. data/docs/docgen.rb +242 -0
  18. data/docs/extending/example-add-a-new-filter.md +121 -0
  19. data/docs/extending/index.md +91 -0
  20. data/docs/flags.md +43 -0
  21. data/docs/generate_index.rb +28 -0
  22. data/docs/index.html.erb +56 -0
  23. data/docs/learn.md +46 -0
  24. data/docs/life-of-an-event.md +109 -0
  25. data/docs/logging-tool-comparisons.md +60 -0
  26. data/docs/plugin-doc.html.erb +91 -0
  27. data/docs/plugin-milestones.md +41 -0
  28. data/docs/plugin-synopsis.html.erb +24 -0
  29. data/docs/release-engineering.md +46 -0
  30. data/docs/release-test-results.md +14 -0
  31. data/docs/repositories.md +35 -0
  32. data/docs/tutorials/10-minute-walkthrough/apache-elasticsearch.conf +35 -0
  33. data/docs/tutorials/10-minute-walkthrough/apache-parse.conf +33 -0
  34. data/docs/tutorials/10-minute-walkthrough/apache_log.1 +1 -0
  35. data/docs/tutorials/10-minute-walkthrough/apache_log.2.bz2 +0 -0
  36. data/docs/tutorials/10-minute-walkthrough/hello-search.conf +25 -0
  37. data/docs/tutorials/10-minute-walkthrough/hello.conf +16 -0
  38. data/docs/tutorials/10-minute-walkthrough/index.md +124 -0
  39. data/docs/tutorials/10-minute-walkthrough/step-5-output.txt +17 -0
  40. data/docs/tutorials/getting-started-centralized-overview-diagram.png +0 -0
  41. data/docs/tutorials/getting-started-centralized-overview-diagram.xml +1 -0
  42. data/docs/tutorials/getting-started-centralized.md +217 -0
  43. data/docs/tutorials/getting-started-simple.md +200 -0
  44. data/docs/tutorials/just-enough-rabbitmq-for-logstash.md +201 -0
  45. data/docs/tutorials/media/frontend-response-codes.png +0 -0
  46. data/docs/tutorials/metrics-from-logs.md +84 -0
  47. data/docs/tutorials/zeromq.md +118 -0
  48. data/extract_services.rb +29 -0
  49. data/gembag.rb +64 -0
  50. data/lib/logstash-event.rb +2 -0
  51. data/lib/logstash.rb +4 -0
  52. data/lib/logstash/JRUBY-6970-openssl.rb +22 -0
  53. data/lib/logstash/JRUBY-6970.rb +102 -0
  54. data/lib/logstash/agent.rb +305 -0
  55. data/lib/logstash/certs/cacert.pem +3895 -0
  56. data/lib/logstash/codecs/base.rb +49 -0
  57. data/lib/logstash/codecs/compress_spooler.rb +50 -0
  58. data/lib/logstash/codecs/dots.rb +18 -0
  59. data/lib/logstash/codecs/edn.rb +28 -0
  60. data/lib/logstash/codecs/edn_lines.rb +36 -0
  61. data/lib/logstash/codecs/fluent.rb +55 -0
  62. data/lib/logstash/codecs/graphite.rb +114 -0
  63. data/lib/logstash/codecs/json.rb +41 -0
  64. data/lib/logstash/codecs/json_lines.rb +52 -0
  65. data/lib/logstash/codecs/json_spooler.rb +22 -0
  66. data/lib/logstash/codecs/line.rb +58 -0
  67. data/lib/logstash/codecs/msgpack.rb +43 -0
  68. data/lib/logstash/codecs/multiline.rb +189 -0
  69. data/lib/logstash/codecs/netflow.rb +342 -0
  70. data/lib/logstash/codecs/netflow/util.rb +212 -0
  71. data/lib/logstash/codecs/noop.rb +19 -0
  72. data/lib/logstash/codecs/oldlogstashjson.rb +56 -0
  73. data/lib/logstash/codecs/plain.rb +48 -0
  74. data/lib/logstash/codecs/rubydebug.rb +22 -0
  75. data/lib/logstash/codecs/spool.rb +38 -0
  76. data/lib/logstash/config/Makefile +4 -0
  77. data/lib/logstash/config/config_ast.rb +380 -0
  78. data/lib/logstash/config/file.rb +39 -0
  79. data/lib/logstash/config/grammar.rb +3504 -0
  80. data/lib/logstash/config/grammar.treetop +241 -0
  81. data/lib/logstash/config/mixin.rb +464 -0
  82. data/lib/logstash/config/registry.rb +13 -0
  83. data/lib/logstash/config/test.conf +18 -0
  84. data/lib/logstash/errors.rb +10 -0
  85. data/lib/logstash/event.rb +262 -0
  86. data/lib/logstash/filters/advisor.rb +178 -0
  87. data/lib/logstash/filters/alter.rb +173 -0
  88. data/lib/logstash/filters/anonymize.rb +93 -0
  89. data/lib/logstash/filters/base.rb +190 -0
  90. data/lib/logstash/filters/checksum.rb +50 -0
  91. data/lib/logstash/filters/cidr.rb +76 -0
  92. data/lib/logstash/filters/cipher.rb +145 -0
  93. data/lib/logstash/filters/clone.rb +35 -0
  94. data/lib/logstash/filters/collate.rb +114 -0
  95. data/lib/logstash/filters/csv.rb +94 -0
  96. data/lib/logstash/filters/date.rb +244 -0
  97. data/lib/logstash/filters/dns.rb +201 -0
  98. data/lib/logstash/filters/drop.rb +32 -0
  99. data/lib/logstash/filters/elapsed.rb +256 -0
  100. data/lib/logstash/filters/elasticsearch.rb +73 -0
  101. data/lib/logstash/filters/environment.rb +27 -0
  102. data/lib/logstash/filters/extractnumbers.rb +84 -0
  103. data/lib/logstash/filters/gelfify.rb +52 -0
  104. data/lib/logstash/filters/geoip.rb +145 -0
  105. data/lib/logstash/filters/grep.rb +153 -0
  106. data/lib/logstash/filters/grok.rb +425 -0
  107. data/lib/logstash/filters/grokdiscovery.rb +75 -0
  108. data/lib/logstash/filters/i18n.rb +51 -0
  109. data/lib/logstash/filters/json.rb +90 -0
  110. data/lib/logstash/filters/json_encode.rb +52 -0
  111. data/lib/logstash/filters/kv.rb +232 -0
  112. data/lib/logstash/filters/metaevent.rb +68 -0
  113. data/lib/logstash/filters/metrics.rb +237 -0
  114. data/lib/logstash/filters/multiline.rb +241 -0
  115. data/lib/logstash/filters/mutate.rb +399 -0
  116. data/lib/logstash/filters/noop.rb +21 -0
  117. data/lib/logstash/filters/prune.rb +149 -0
  118. data/lib/logstash/filters/punct.rb +32 -0
  119. data/lib/logstash/filters/railsparallelrequest.rb +86 -0
  120. data/lib/logstash/filters/range.rb +142 -0
  121. data/lib/logstash/filters/ruby.rb +42 -0
  122. data/lib/logstash/filters/sleep.rb +111 -0
  123. data/lib/logstash/filters/split.rb +64 -0
  124. data/lib/logstash/filters/sumnumbers.rb +73 -0
  125. data/lib/logstash/filters/syslog_pri.rb +107 -0
  126. data/lib/logstash/filters/translate.rb +121 -0
  127. data/lib/logstash/filters/unique.rb +29 -0
  128. data/lib/logstash/filters/urldecode.rb +57 -0
  129. data/lib/logstash/filters/useragent.rb +112 -0
  130. data/lib/logstash/filters/uuid.rb +58 -0
  131. data/lib/logstash/filters/xml.rb +139 -0
  132. data/lib/logstash/filters/zeromq.rb +123 -0
  133. data/lib/logstash/filterworker.rb +122 -0
  134. data/lib/logstash/inputs/base.rb +125 -0
  135. data/lib/logstash/inputs/collectd.rb +306 -0
  136. data/lib/logstash/inputs/drupal_dblog.rb +323 -0
  137. data/lib/logstash/inputs/drupal_dblog/jdbcconnection.rb +66 -0
  138. data/lib/logstash/inputs/elasticsearch.rb +140 -0
  139. data/lib/logstash/inputs/eventlog.rb +129 -0
  140. data/lib/logstash/inputs/eventlog/racob_fix.rb +44 -0
  141. data/lib/logstash/inputs/exec.rb +69 -0
  142. data/lib/logstash/inputs/file.rb +146 -0
  143. data/lib/logstash/inputs/ganglia.rb +127 -0
  144. data/lib/logstash/inputs/ganglia/gmondpacket.rb +146 -0
  145. data/lib/logstash/inputs/ganglia/xdr.rb +327 -0
  146. data/lib/logstash/inputs/gelf.rb +138 -0
  147. data/lib/logstash/inputs/gemfire.rb +222 -0
  148. data/lib/logstash/inputs/generator.rb +97 -0
  149. data/lib/logstash/inputs/graphite.rb +41 -0
  150. data/lib/logstash/inputs/heroku.rb +51 -0
  151. data/lib/logstash/inputs/imap.rb +136 -0
  152. data/lib/logstash/inputs/irc.rb +84 -0
  153. data/lib/logstash/inputs/log4j.rb +136 -0
  154. data/lib/logstash/inputs/lumberjack.rb +53 -0
  155. data/lib/logstash/inputs/pipe.rb +57 -0
  156. data/lib/logstash/inputs/rabbitmq.rb +126 -0
  157. data/lib/logstash/inputs/rabbitmq/bunny.rb +118 -0
  158. data/lib/logstash/inputs/rabbitmq/hot_bunnies.rb +1 -0
  159. data/lib/logstash/inputs/rabbitmq/march_hare.rb +129 -0
  160. data/lib/logstash/inputs/redis.rb +263 -0
  161. data/lib/logstash/inputs/relp.rb +106 -0
  162. data/lib/logstash/inputs/s3.rb +279 -0
  163. data/lib/logstash/inputs/snmptrap.rb +87 -0
  164. data/lib/logstash/inputs/sqlite.rb +185 -0
  165. data/lib/logstash/inputs/sqs.rb +172 -0
  166. data/lib/logstash/inputs/stdin.rb +46 -0
  167. data/lib/logstash/inputs/stomp.rb +84 -0
  168. data/lib/logstash/inputs/syslog.rb +237 -0
  169. data/lib/logstash/inputs/tcp.rb +231 -0
  170. data/lib/logstash/inputs/threadable.rb +18 -0
  171. data/lib/logstash/inputs/twitter.rb +82 -0
  172. data/lib/logstash/inputs/udp.rb +81 -0
  173. data/lib/logstash/inputs/unix.rb +163 -0
  174. data/lib/logstash/inputs/varnishlog.rb +48 -0
  175. data/lib/logstash/inputs/websocket.rb +50 -0
  176. data/lib/logstash/inputs/wmi.rb +72 -0
  177. data/lib/logstash/inputs/xmpp.rb +81 -0
  178. data/lib/logstash/inputs/zenoss.rb +143 -0
  179. data/lib/logstash/inputs/zeromq.rb +165 -0
  180. data/lib/logstash/kibana.rb +113 -0
  181. data/lib/logstash/loadlibs.rb +9 -0
  182. data/lib/logstash/logging.rb +89 -0
  183. data/lib/logstash/monkeypatches-for-bugs.rb +2 -0
  184. data/lib/logstash/monkeypatches-for-debugging.rb +47 -0
  185. data/lib/logstash/monkeypatches-for-performance.rb +66 -0
  186. data/lib/logstash/multiqueue.rb +53 -0
  187. data/lib/logstash/namespace.rb +16 -0
  188. data/lib/logstash/outputs/base.rb +120 -0
  189. data/lib/logstash/outputs/boundary.rb +116 -0
  190. data/lib/logstash/outputs/circonus.rb +78 -0
  191. data/lib/logstash/outputs/cloudwatch.rb +351 -0
  192. data/lib/logstash/outputs/csv.rb +55 -0
  193. data/lib/logstash/outputs/datadog.rb +93 -0
  194. data/lib/logstash/outputs/datadog_metrics.rb +123 -0
  195. data/lib/logstash/outputs/elasticsearch.rb +332 -0
  196. data/lib/logstash/outputs/elasticsearch/elasticsearch-template.json +44 -0
  197. data/lib/logstash/outputs/elasticsearch_http.rb +256 -0
  198. data/lib/logstash/outputs/elasticsearch_river.rb +214 -0
  199. data/lib/logstash/outputs/email.rb +299 -0
  200. data/lib/logstash/outputs/exec.rb +40 -0
  201. data/lib/logstash/outputs/file.rb +180 -0
  202. data/lib/logstash/outputs/ganglia.rb +75 -0
  203. data/lib/logstash/outputs/gelf.rb +208 -0
  204. data/lib/logstash/outputs/gemfire.rb +103 -0
  205. data/lib/logstash/outputs/google_bigquery.rb +570 -0
  206. data/lib/logstash/outputs/google_cloud_storage.rb +431 -0
  207. data/lib/logstash/outputs/graphite.rb +143 -0
  208. data/lib/logstash/outputs/graphtastic.rb +185 -0
  209. data/lib/logstash/outputs/hipchat.rb +80 -0
  210. data/lib/logstash/outputs/http.rb +142 -0
  211. data/lib/logstash/outputs/irc.rb +80 -0
  212. data/lib/logstash/outputs/jira.rb +109 -0
  213. data/lib/logstash/outputs/juggernaut.rb +105 -0
  214. data/lib/logstash/outputs/librato.rb +146 -0
  215. data/lib/logstash/outputs/loggly.rb +93 -0
  216. data/lib/logstash/outputs/lumberjack.rb +51 -0
  217. data/lib/logstash/outputs/metriccatcher.rb +103 -0
  218. data/lib/logstash/outputs/mongodb.rb +81 -0
  219. data/lib/logstash/outputs/nagios.rb +119 -0
  220. data/lib/logstash/outputs/nagios_nsca.rb +123 -0
  221. data/lib/logstash/outputs/null.rb +18 -0
  222. data/lib/logstash/outputs/opentsdb.rb +101 -0
  223. data/lib/logstash/outputs/pagerduty.rb +79 -0
  224. data/lib/logstash/outputs/pipe.rb +132 -0
  225. data/lib/logstash/outputs/rabbitmq.rb +96 -0
  226. data/lib/logstash/outputs/rabbitmq/bunny.rb +135 -0
  227. data/lib/logstash/outputs/rabbitmq/hot_bunnies.rb +1 -0
  228. data/lib/logstash/outputs/rabbitmq/march_hare.rb +143 -0
  229. data/lib/logstash/outputs/redis.rb +245 -0
  230. data/lib/logstash/outputs/riak.rb +152 -0
  231. data/lib/logstash/outputs/riemann.rb +109 -0
  232. data/lib/logstash/outputs/s3.rb +356 -0
  233. data/lib/logstash/outputs/sns.rb +124 -0
  234. data/lib/logstash/outputs/solr_http.rb +78 -0
  235. data/lib/logstash/outputs/sqs.rb +141 -0
  236. data/lib/logstash/outputs/statsd.rb +116 -0
  237. data/lib/logstash/outputs/stdout.rb +53 -0
  238. data/lib/logstash/outputs/stomp.rb +67 -0
  239. data/lib/logstash/outputs/syslog.rb +145 -0
  240. data/lib/logstash/outputs/tcp.rb +145 -0
  241. data/lib/logstash/outputs/udp.rb +38 -0
  242. data/lib/logstash/outputs/websocket.rb +46 -0
  243. data/lib/logstash/outputs/websocket/app.rb +29 -0
  244. data/lib/logstash/outputs/websocket/pubsub.rb +45 -0
  245. data/lib/logstash/outputs/xmpp.rb +78 -0
  246. data/lib/logstash/outputs/zabbix.rb +108 -0
  247. data/lib/logstash/outputs/zeromq.rb +125 -0
  248. data/lib/logstash/pipeline.rb +286 -0
  249. data/lib/logstash/plugin.rb +150 -0
  250. data/lib/logstash/plugin_mixins/aws_config.rb +93 -0
  251. data/lib/logstash/program.rb +15 -0
  252. data/lib/logstash/runner.rb +238 -0
  253. data/lib/logstash/sized_queue.rb +8 -0
  254. data/lib/logstash/test.rb +183 -0
  255. data/lib/logstash/threadwatchdog.rb +37 -0
  256. data/lib/logstash/time_addon.rb +33 -0
  257. data/lib/logstash/util.rb +106 -0
  258. data/lib/logstash/util/buftok.rb +139 -0
  259. data/lib/logstash/util/charset.rb +39 -0
  260. data/lib/logstash/util/fieldreference.rb +50 -0
  261. data/lib/logstash/util/password.rb +25 -0
  262. data/lib/logstash/util/prctl.rb +11 -0
  263. data/lib/logstash/util/relp.rb +326 -0
  264. data/lib/logstash/util/require-helper.rb +18 -0
  265. data/lib/logstash/util/socket_peer.rb +7 -0
  266. data/lib/logstash/util/zenoss.rb +566 -0
  267. data/lib/logstash/util/zeromq.rb +47 -0
  268. data/lib/logstash/version.rb +6 -0
  269. data/locales/en.yml +170 -0
  270. data/logstash-event.gemspec +29 -0
  271. data/logstash.gemspec +128 -0
  272. data/patterns/firewalls +60 -0
  273. data/patterns/grok-patterns +91 -0
  274. data/patterns/haproxy +37 -0
  275. data/patterns/java +3 -0
  276. data/patterns/linux-syslog +14 -0
  277. data/patterns/mcollective +1 -0
  278. data/patterns/mcollective-patterns +4 -0
  279. data/patterns/nagios +108 -0
  280. data/patterns/postgresql +3 -0
  281. data/patterns/redis +3 -0
  282. data/patterns/ruby +2 -0
  283. data/pkg/build.sh +135 -0
  284. data/pkg/centos/after-install.sh +1 -0
  285. data/pkg/centos/before-install.sh +10 -0
  286. data/pkg/centos/before-remove.sh +11 -0
  287. data/pkg/centos/sysconfig +15 -0
  288. data/pkg/debian/after-install.sh +5 -0
  289. data/pkg/debian/before-install.sh +13 -0
  290. data/pkg/debian/before-remove.sh +13 -0
  291. data/pkg/debian/build.sh +34 -0
  292. data/pkg/debian/debian/README +6 -0
  293. data/pkg/debian/debian/changelog +17 -0
  294. data/pkg/debian/debian/compat +1 -0
  295. data/pkg/debian/debian/control +16 -0
  296. data/pkg/debian/debian/copyright +27 -0
  297. data/pkg/debian/debian/dirs +19 -0
  298. data/pkg/debian/debian/docs +0 -0
  299. data/pkg/debian/debian/logstash.default +39 -0
  300. data/pkg/debian/debian/logstash.init +201 -0
  301. data/pkg/debian/debian/logstash.install +1 -0
  302. data/pkg/debian/debian/logstash.logrotate +9 -0
  303. data/pkg/debian/debian/logstash.postinst +68 -0
  304. data/pkg/debian/debian/logstash.postrm +23 -0
  305. data/pkg/debian/debian/manpage.1.ex +59 -0
  306. data/pkg/debian/debian/preinst.ex +37 -0
  307. data/pkg/debian/debian/prerm.ex +40 -0
  308. data/pkg/debian/debian/release.conf +5 -0
  309. data/pkg/debian/debian/rules +80 -0
  310. data/pkg/debian/debian/watch.ex +22 -0
  311. data/pkg/logrotate.conf +8 -0
  312. data/pkg/logstash-web.default +41 -0
  313. data/pkg/logstash-web.sysv.debian +201 -0
  314. data/pkg/logstash-web.upstart.ubuntu +18 -0
  315. data/pkg/logstash.default +45 -0
  316. data/pkg/logstash.sysv.debian +202 -0
  317. data/pkg/logstash.sysv.redhat +158 -0
  318. data/pkg/logstash.upstart.ubuntu +20 -0
  319. data/pkg/rpm/SOURCES/logstash.conf +26 -0
  320. data/pkg/rpm/SOURCES/logstash.init +80 -0
  321. data/pkg/rpm/SOURCES/logstash.logrotate +8 -0
  322. data/pkg/rpm/SOURCES/logstash.sysconfig +3 -0
  323. data/pkg/rpm/SOURCES/logstash.wrapper +105 -0
  324. data/pkg/rpm/SPECS/logstash.spec +180 -0
  325. data/pkg/rpm/readme.md +4 -0
  326. data/pkg/ubuntu/after-install.sh +7 -0
  327. data/pkg/ubuntu/before-install.sh +12 -0
  328. data/pkg/ubuntu/before-remove.sh +13 -0
  329. data/pull_release_note.rb +25 -0
  330. data/require-analyze.rb +22 -0
  331. data/spec/README.md +14 -0
  332. data/spec/codecs/edn.rb +40 -0
  333. data/spec/codecs/edn_lines.rb +53 -0
  334. data/spec/codecs/graphite.rb +96 -0
  335. data/spec/codecs/json.rb +57 -0
  336. data/spec/codecs/json_lines.rb +51 -0
  337. data/spec/codecs/json_spooler.rb +43 -0
  338. data/spec/codecs/msgpack.rb +39 -0
  339. data/spec/codecs/multiline.rb +60 -0
  340. data/spec/codecs/oldlogstashjson.rb +55 -0
  341. data/spec/codecs/plain.rb +35 -0
  342. data/spec/codecs/spool.rb +35 -0
  343. data/spec/conditionals/test.rb +323 -0
  344. data/spec/config.rb +31 -0
  345. data/spec/event.rb +165 -0
  346. data/spec/examples/fail2ban.rb +28 -0
  347. data/spec/examples/graphite-input.rb +41 -0
  348. data/spec/examples/mysql-slow-query.rb +70 -0
  349. data/spec/examples/parse-apache-logs.rb +66 -0
  350. data/spec/examples/parse-haproxy-logs.rb +115 -0
  351. data/spec/examples/syslog.rb +48 -0
  352. data/spec/filters/alter.rb +96 -0
  353. data/spec/filters/anonymize.rb +189 -0
  354. data/spec/filters/checksum.rb +41 -0
  355. data/spec/filters/clone.rb +67 -0
  356. data/spec/filters/collate.rb +122 -0
  357. data/spec/filters/csv.rb +174 -0
  358. data/spec/filters/date.rb +285 -0
  359. data/spec/filters/date_performance.rb +31 -0
  360. data/spec/filters/dns.rb +159 -0
  361. data/spec/filters/drop.rb +19 -0
  362. data/spec/filters/elapsed.rb +294 -0
  363. data/spec/filters/environment.rb +43 -0
  364. data/spec/filters/geoip.rb +62 -0
  365. data/spec/filters/grep.rb +342 -0
  366. data/spec/filters/grok.rb +473 -0
  367. data/spec/filters/grok/timeout2.rb +56 -0
  368. data/spec/filters/grok/timeouts.rb +39 -0
  369. data/spec/filters/i18n.rb +25 -0
  370. data/spec/filters/json.rb +72 -0
  371. data/spec/filters/json_encode.rb +37 -0
  372. data/spec/filters/kv.rb +403 -0
  373. data/spec/filters/metrics.rb +212 -0
  374. data/spec/filters/multiline.rb +119 -0
  375. data/spec/filters/mutate.rb +180 -0
  376. data/spec/filters/noop.rb +221 -0
  377. data/spec/filters/prune.rb +441 -0
  378. data/spec/filters/punct.rb +18 -0
  379. data/spec/filters/railsparallelrequest.rb +112 -0
  380. data/spec/filters/range.rb +169 -0
  381. data/spec/filters/split.rb +58 -0
  382. data/spec/filters/translate.rb +70 -0
  383. data/spec/filters/unique.rb +25 -0
  384. data/spec/filters/useragent.rb +42 -0
  385. data/spec/filters/xml.rb +157 -0
  386. data/spec/inputs/file.rb +107 -0
  387. data/spec/inputs/gelf.rb +52 -0
  388. data/spec/inputs/generator.rb +30 -0
  389. data/spec/inputs/imap.rb +60 -0
  390. data/spec/inputs/redis.rb +63 -0
  391. data/spec/inputs/relp.rb +70 -0
  392. data/spec/inputs/tcp.rb +101 -0
  393. data/spec/jar.rb +21 -0
  394. data/spec/outputs/csv.rb +266 -0
  395. data/spec/outputs/elasticsearch.rb +161 -0
  396. data/spec/outputs/elasticsearch_http.rb +240 -0
  397. data/spec/outputs/email.rb +173 -0
  398. data/spec/outputs/file.rb +82 -0
  399. data/spec/outputs/graphite.rb +236 -0
  400. data/spec/outputs/redis.rb +127 -0
  401. data/spec/speed.rb +20 -0
  402. data/spec/sqlite-test.rb +81 -0
  403. data/spec/support/LOGSTASH-733.rb +21 -0
  404. data/spec/support/LOGSTASH-820.rb +25 -0
  405. data/spec/support/akamai-grok.rb +26 -0
  406. data/spec/support/date-http.rb +17 -0
  407. data/spec/support/postwait1.rb +26 -0
  408. data/spec/support/pull375.rb +21 -0
  409. data/spec/test_utils.rb +125 -0
  410. data/spec/util/fieldeval_spec.rb +44 -0
  411. data/test/jenkins/config.xml.erb +74 -0
  412. data/test/jenkins/create-jobs.rb +23 -0
  413. data/test/jenkins/generatorjob.config.xml +66 -0
  414. data/tools/Gemfile +14 -0
  415. data/tools/Gemfile.jruby-1.9.lock +322 -0
  416. data/tools/Gemfile.rbx-2.1.lock +516 -0
  417. data/tools/Gemfile.ruby-1.9.1.lock +310 -0
  418. data/tools/Gemfile.ruby-2.0.0.lock +310 -0
  419. metadata +629 -0
@@ -0,0 +1,212 @@
1
+ require "logstash/filters/metrics"
2
+
3
+ describe LogStash::Filters::Metrics do
4
+
5
+ context "with basic meter config" do
6
+ context "when no events were received" do
7
+ it "should not flush" do
8
+ config = {"meter" => ["http.%{response}"]}
9
+ filter = LogStash::Filters::Metrics.new config
10
+ filter.register
11
+
12
+ events = filter.flush
13
+ insist { events }.nil?
14
+ end
15
+ end
16
+
17
+ context "when events are received" do
18
+ context "on the first flush" do
19
+ subject {
20
+ config = {"meter" => ["http.%{response}"]}
21
+ filter = LogStash::Filters::Metrics.new config
22
+ filter.register
23
+ filter.filter LogStash::Event.new({"response" => 200})
24
+ filter.filter LogStash::Event.new({"response" => 200})
25
+ filter.filter LogStash::Event.new({"response" => 404})
26
+ filter.flush
27
+ }
28
+
29
+ it "should flush counts" do
30
+ insist { subject.length } == 1
31
+ insist { subject.first["http.200.count"] } == 2
32
+ insist { subject.first["http.404.count"] } == 1
33
+ end
34
+
35
+ it "should include rates and percentiles" do
36
+ metrics = ["http.200.rate_1m", "http.200.rate_5m", "http.200.rate_15m",
37
+ "http.404.rate_1m", "http.404.rate_5m", "http.404.rate_15m"]
38
+ metrics.each do |metric|
39
+ insist { subject.first }.include? metric
40
+ end
41
+ end
42
+ end
43
+
44
+ context "on the second flush" do
45
+ it "should not reset counts" do
46
+ config = {"meter" => ["http.%{response}"]}
47
+ filter = LogStash::Filters::Metrics.new config
48
+ filter.register
49
+ filter.filter LogStash::Event.new({"response" => 200})
50
+ filter.filter LogStash::Event.new({"response" => 200})
51
+ filter.filter LogStash::Event.new({"response" => 404})
52
+
53
+ events = filter.flush
54
+ events = filter.flush
55
+ insist { events.length } == 1
56
+ insist { events.first["http.200.count"] } == 2
57
+ insist { events.first["http.404.count"] } == 1
58
+ end
59
+ end
60
+ end
61
+
62
+ context "when custom rates and percentiles are selected" do
63
+ context "on the first flush" do
64
+ subject {
65
+ config = {
66
+ "meter" => ["http.%{response}"],
67
+ "rates" => [1]
68
+ }
69
+ filter = LogStash::Filters::Metrics.new config
70
+ filter.register
71
+ filter.filter LogStash::Event.new({"response" => 200})
72
+ filter.filter LogStash::Event.new({"response" => 200})
73
+ filter.filter LogStash::Event.new({"response" => 404})
74
+ filter.flush
75
+ }
76
+
77
+ it "should include only the requested rates" do
78
+ rate_fields = subject.first.to_hash.keys.select {|field| field.start_with?("http.200.rate") }
79
+ insist { rate_fields.length } == 1
80
+ insist { rate_fields }.include? "http.200.rate_1m"
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ context "with multiple instances" do
87
+ it "counts should be independent" do
88
+ config_tag1 = {"meter" => ["http.%{response}"], "tags" => ["tag1"]}
89
+ config_tag2 = {"meter" => ["http.%{response}"], "tags" => ["tag2"]}
90
+ filter_tag1 = LogStash::Filters::Metrics.new config_tag1
91
+ filter_tag2 = LogStash::Filters::Metrics.new config_tag2
92
+ event_tag1 = LogStash::Event.new({"response" => 200, "tags" => [ "tag1" ]})
93
+ event_tag2 = LogStash::Event.new({"response" => 200, "tags" => [ "tag2" ]})
94
+ event2_tag2 = LogStash::Event.new({"response" => 200, "tags" => [ "tag2" ]})
95
+ filter_tag1.register
96
+ filter_tag2.register
97
+
98
+ [event_tag1, event_tag2, event2_tag2].each do |event|
99
+ filter_tag1.filter event
100
+ filter_tag2.filter event
101
+ end
102
+
103
+ events_tag1 = filter_tag1.flush
104
+ events_tag2 = filter_tag2.flush
105
+
106
+ insist { events_tag1.first["http.200.count"] } == 1
107
+ insist { events_tag2.first["http.200.count"] } == 2
108
+ end
109
+ end
110
+
111
+ context "with timer config" do
112
+ context "on the first flush" do
113
+ subject {
114
+ config = {"timer" => ["http.request_time", "request_time"]}
115
+ filter = LogStash::Filters::Metrics.new config
116
+ filter.register
117
+ filter.filter LogStash::Event.new({"request_time" => 1})
118
+ filter.filter LogStash::Event.new({"request_time" => 2})
119
+ filter.filter LogStash::Event.new({"request_time" => 3})
120
+ filter.flush
121
+ }
122
+
123
+ it "should flush counts" do
124
+ insist { subject.length } == 1
125
+ insist { subject.first["http.request_time.count"] } == 3
126
+ end
127
+
128
+ it "should include rates and percentiles" do
129
+ metrics = ["rate_1m", "rate_5m", "rate_15m", "p1", "p5", "p10", "p90", "p95", "p99"]
130
+ metrics.each do |metric|
131
+ insist { subject.first }.include? "http.request_time.#{metric}"
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ context "when custom rates and percentiles are selected" do
138
+ context "on the first flush" do
139
+ subject {
140
+ config = {
141
+ "timer" => ["http.request_time", "request_time"],
142
+ "rates" => [1],
143
+ "percentiles" => [1, 2]
144
+ }
145
+ filter = LogStash::Filters::Metrics.new config
146
+ filter.register
147
+ filter.filter LogStash::Event.new({"request_time" => 1})
148
+ filter.flush
149
+ }
150
+
151
+ it "should flush counts" do
152
+ insist { subject.length } == 1
153
+ insist { subject.first["http.request_time.count"] } == 1
154
+ end
155
+
156
+ it "should include only the requested rates" do
157
+ rate_fields = subject.first.to_hash.keys.select {|field| field.start_with?("http.request_time.rate") }
158
+ insist { rate_fields.length } == 1
159
+ insist { rate_fields }.include? "http.request_time.rate_1m"
160
+ end
161
+
162
+ it "should include only the requested percentiles" do
163
+ percentile_fields = subject.first.to_hash.keys.select {|field| field.start_with?("http.request_time.p") }
164
+ insist { percentile_fields.length } == 2
165
+ insist { percentile_fields }.include? "http.request_time.p1"
166
+ insist { percentile_fields }.include? "http.request_time.p2"
167
+ end
168
+ end
169
+ end
170
+
171
+
172
+ context "when a custom flush_interval is set" do
173
+ it "should flush only when required" do
174
+ config = {"meter" => ["http.%{response}"], "flush_interval" => 15}
175
+ filter = LogStash::Filters::Metrics.new config
176
+ filter.register
177
+ filter.filter LogStash::Event.new({"response" => 200})
178
+
179
+ insist { filter.flush }.nil? # 5s
180
+ insist { filter.flush }.nil? # 10s
181
+ insist { filter.flush.length } == 1 # 15s
182
+ insist { filter.flush }.nil? # 20s
183
+ insist { filter.flush }.nil? # 25s
184
+ insist { filter.flush.length } == 1 # 30s
185
+ end
186
+ end
187
+
188
+ context "when a custom clear_interval is set" do
189
+ it "should clear the metrics after interval has passed" do
190
+ config = {"meter" => ["http.%{response}"], "clear_interval" => 15}
191
+ filter = LogStash::Filters::Metrics.new config
192
+ filter.register
193
+ filter.filter LogStash::Event.new({"response" => 200})
194
+
195
+ insist { filter.flush.first["http.200.count"] } == 1 # 5s
196
+ insist { filter.flush.first["http.200.count"] } == 1 # 10s
197
+ insist { filter.flush.first["http.200.count"] } == 1 # 15s
198
+ insist { filter.flush }.nil? # 20s
199
+ end
200
+ end
201
+
202
+ context "when invalid rates are set" do
203
+ subject {
204
+ config = {"meter" => ["http.%{response}"], "rates" => [90]}
205
+ filter = LogStash::Filters::Metrics.new config
206
+ }
207
+
208
+ it "should raise an error" do
209
+ insist {subject.register }.raises(LogStash::ConfigurationError)
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,119 @@
1
+ require "test_utils"
2
+ require "logstash/filters/multiline"
3
+
4
+ puts "MULTILINE FILTER TEST DISABLED"
5
+ describe LogStash::Filters::Multiline, :if => false do
6
+
7
+ extend LogStash::RSpec
8
+
9
+ describe "simple multiline" do
10
+ config <<-CONFIG
11
+ filter {
12
+ multiline {
13
+ pattern => "^\\s"
14
+ what => previous
15
+ }
16
+ }
17
+ CONFIG
18
+
19
+ sample [ "hello world", " second line", "another first line" ] do
20
+ p subject.to_hash
21
+ insist { subject.length } == 2
22
+ insist { subject[0]["message"] } == "hello world\n second line"
23
+ insist { subject[1]["message"] } == "another first line"
24
+ end
25
+ end
26
+
27
+ describe "multiline using grok patterns" do
28
+ config <<-CONFIG
29
+ filter {
30
+ multiline {
31
+ pattern => "^%{NUMBER} %{TIME}"
32
+ negate => true
33
+ what => previous
34
+ }
35
+ }
36
+ CONFIG
37
+
38
+ sample [ "120913 12:04:33 first line", "second line", "third line" ] do
39
+ insist { subject.length } == 1
40
+ insist { subject[0]["message"] } == "120913 12:04:33 first line\nsecond line\nthird line"
41
+ end
42
+ end
43
+
44
+ describe "multiline safety among multiple concurrent streams" do
45
+ config <<-CONFIG
46
+ filter {
47
+ multiline {
48
+ pattern => "^\\s"
49
+ what => previous
50
+ }
51
+ }
52
+ CONFIG
53
+
54
+ multiline_event = [
55
+ "hello world",
56
+ ]
57
+
58
+ count = 20
59
+ stream_count = 2
60
+ id = 0
61
+ eventstream = count.times.collect do |i|
62
+ stream = "stream#{i % stream_count}"
63
+ (
64
+ [ "hello world #{stream}" ] \
65
+ + rand(5).times.collect { |n| id += 1; " extra line #{n} in #{stream} event #{id}" }
66
+ ) .collect do |line|
67
+ LogStash::Event.new("message" => line,
68
+ "host" => stream, "type" => stream,
69
+ "event" => i)
70
+ end
71
+ end
72
+
73
+ alllines = eventstream.flatten
74
+
75
+ # Take whole events and mix them with other events (maintain order)
76
+ # This simulates a mixing of multiple streams being received
77
+ # and processed. It requires that the multiline filter correctly partition
78
+ # by stream_identity
79
+ concurrent_stream = eventstream.flatten.count.times.collect do
80
+ index = rand(eventstream.count)
81
+ event = eventstream[index].shift
82
+ eventstream.delete_at(index) if eventstream[index].empty?
83
+ event
84
+ end
85
+
86
+ sample concurrent_stream do
87
+ insist { subject.count } == count
88
+ subject.each_with_index do |event, i|
89
+ #puts "#{i}/#{event["event"]}: #{event.to_json}"
90
+ #insist { event.type } == stream
91
+ #insist { event.source } == stream
92
+ insist { event["message"].split("\n").first } =~ /hello world /
93
+ end
94
+ end
95
+ end
96
+
97
+ describe "multiline add/remove tags and fields only when matched" do
98
+ config <<-CONFIG
99
+ filter {
100
+ mutate {
101
+ add_tag => "dummy"
102
+ }
103
+ multiline {
104
+ add_tag => [ "nope" ]
105
+ remove_tag => "dummy"
106
+ add_field => [ "dummy2", "value" ]
107
+ pattern => "an unlikely match"
108
+ what => previous
109
+ }
110
+ }
111
+ CONFIG
112
+
113
+ sample [ "120913 12:04:33 first line", "120913 12:04:33 second line" ] do
114
+ subject.each do |s|
115
+ insist { s.tags.find_index("nope").nil? && s.tags.find_index("dummy") != nil && !s.fields.has_key?("dummy2") } == true
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,180 @@
1
+ require "test_utils"
2
+ require "logstash/filters/mutate"
3
+
4
+ describe LogStash::Filters::Mutate do
5
+ extend LogStash::RSpec
6
+
7
+ describe "basics" do
8
+ config <<-CONFIG
9
+ filter {
10
+ mutate {
11
+ lowercase => "lowerme"
12
+ uppercase => "upperme"
13
+ convert => [ "intme", "integer", "floatme", "float" ]
14
+ rename => [ "rename1", "rename2" ]
15
+ replace => [ "replaceme", "hello world" ]
16
+ replace => [ "newfield", "newnew" ]
17
+ update => [ "nosuchfield", "weee" ]
18
+ update => [ "updateme", "updated" ]
19
+ remove => [ "removeme" ]
20
+ }
21
+ }
22
+ CONFIG
23
+
24
+ event = {
25
+ "lowerme" => [ "ExAmPlE" ],
26
+ "upperme" => [ "ExAmPlE" ],
27
+ "intme" => [ "1234", "7890.4", "7.9" ],
28
+ "floatme" => [ "1234.455" ],
29
+ "rename1" => [ "hello world" ],
30
+ "updateme" => [ "who cares" ],
31
+ "replaceme" => [ "who cares" ],
32
+ "removeme" => [ "something" ]
33
+ }
34
+
35
+ sample event do
36
+ insist { subject["lowerme"] } == ['example']
37
+ insist { subject["upperme"] } == ['EXAMPLE']
38
+ insist { subject["intme"] } == [1234, 7890, 7]
39
+ insist { subject["floatme"] } == [1234.455]
40
+ reject { subject }.include?("rename1")
41
+ insist { subject["rename2"] } == [ "hello world" ]
42
+ reject { subject }.include?("removeme")
43
+
44
+ insist { subject }.include?("newfield")
45
+ insist { subject["newfield"] } == "newnew"
46
+ reject { subject }.include?("nosuchfield")
47
+ insist { subject["updateme"] } == "updated"
48
+ end
49
+ end
50
+
51
+ describe "remove multiple fields" do
52
+ config '
53
+ filter {
54
+ mutate {
55
+ remove => [ "remove-me", "remove-me2", "diedie", "[one][two]" ]
56
+ }
57
+ }'
58
+
59
+ sample(
60
+ "remove-me" => "Goodbye!",
61
+ "remove-me2" => 1234,
62
+ "diedie" => [1, 2, 3, 4],
63
+ "survivor" => "Hello.",
64
+ "one" => { "two" => "wee" }
65
+ ) do
66
+ insist { subject["survivor"] } == "Hello."
67
+ reject { subject }.include?("remove-me")
68
+ reject { subject }.include?("remove-me2")
69
+ reject { subject }.include?("diedie")
70
+ reject { subject["one"] }.include?("two")
71
+ end
72
+ end
73
+
74
+ describe "convert one field to string" do
75
+ config '
76
+ filter {
77
+ mutate {
78
+ convert => [ "unicorns", "string" ]
79
+ }
80
+ }'
81
+
82
+ sample("unicorns" => 1234) do
83
+ insist { subject["unicorns"] } == "1234"
84
+ end
85
+ end
86
+
87
+ describe "gsub on a String" do
88
+ config '
89
+ filter {
90
+ mutate {
91
+ gsub => [ "unicorns", "but extinct", "and common" ]
92
+ }
93
+ }'
94
+
95
+ sample("unicorns" => "Magnificient, but extinct, animals") do
96
+ insist { subject["unicorns"] } == "Magnificient, and common, animals"
97
+ end
98
+ end
99
+
100
+ describe "gsub on an Array of Strings" do
101
+ config '
102
+ filter {
103
+ mutate {
104
+ gsub => [ "unicorns", "extinct", "common" ]
105
+ }
106
+ }'
107
+
108
+ sample("unicorns" => [
109
+ "Magnificient extinct animals", "Other extinct ideas" ]
110
+ ) do
111
+ insist { subject["unicorns"] } == [
112
+ "Magnificient common animals",
113
+ "Other common ideas"
114
+ ]
115
+ end
116
+ end
117
+
118
+ describe "gsub on multiple fields" do
119
+ config '
120
+ filter {
121
+ mutate {
122
+ gsub => [ "colors", "red", "blue",
123
+ "shapes", "square", "circle" ]
124
+ }
125
+ }'
126
+
127
+ sample("colors" => "One red car", "shapes" => "Four red squares") do
128
+ insist { subject["colors"] } == "One blue car"
129
+ insist { subject["shapes"] } == "Four red circles"
130
+ end
131
+ end
132
+
133
+ describe "regression - mutate should lowercase a field created by grok" do
134
+ config <<-CONFIG
135
+ filter {
136
+ grok {
137
+ match => [ "message", "%{WORD:foo}" ]
138
+ }
139
+ mutate {
140
+ lowercase => "foo"
141
+ }
142
+ }
143
+ CONFIG
144
+
145
+ sample "HELLO WORLD" do
146
+ insist { subject["foo"] } == "hello"
147
+ end
148
+ end
149
+
150
+ describe "LOGSTASH-757: rename should do nothing with a missing field" do
151
+ config <<-CONFIG
152
+ filter {
153
+ mutate {
154
+ rename => [ "nosuchfield", "hello" ]
155
+ }
156
+ }
157
+ CONFIG
158
+
159
+ sample "whatever" do
160
+ reject { subject }.include?("nosuchfield")
161
+ reject { subject }.include?("hello")
162
+ end
163
+ end
164
+
165
+ describe "convert should work on nested fields" do
166
+ config <<-CONFIG
167
+ filter {
168
+ mutate {
169
+ convert => [ "[foo][bar]", "integer" ]
170
+ }
171
+ }
172
+ CONFIG
173
+
174
+ sample({ "foo" => { "bar" => "1000" } }) do
175
+ insist { subject["[foo][bar]"] } == 1000
176
+ insist { subject["[foo][bar]"] }.is_a?(Fixnum)
177
+ end
178
+ end
179
+ end
180
+