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,56 @@
1
+ require "test_utils"
2
+ require "grok-pure"
3
+ require "timeout"
4
+
5
+ describe "grok known timeout failures" do
6
+ extend LogStash::RSpec
7
+
8
+ describe "user reported timeout" do
9
+ config <<-'CONFIG'
10
+ filter {
11
+ grok {
12
+ match => [ "message", "%{SYSLOGBASE:ts1} \[\#\|%{TIMESTAMP_ISO8601:ts2}\|%{DATA} for %{PATH:url} = %{POSINT:delay} ms.%{GREEDYDATA}" ]
13
+ }
14
+ }
15
+ CONFIG
16
+
17
+ start = Time.now
18
+ line = 'Nov 13 19:23:34 qa-api1 glassfish: [#|2012-11-13T19:23:25.604+0000|INFO|glassfish3.1.2|com.locusenergy.platform.messages.LocusMessage|_ThreadID=59;_ThreadName=Thread-2;|API TIMER - Cache HIT user: null for /kiosks/194/energyreadings/data?tz=America/New_York&fields=kwh&type=gen&end=2012-11-13T23:59:59&start=2010-12-16T00:00:00-05:00&gran=yearly = 5 ms.|#]'
19
+
20
+ sample line do
21
+ duration = Time.now - start
22
+ insist { duration } < 0.03
23
+ end
24
+ end
25
+
26
+ describe "user reported timeout" do
27
+ config <<-'CONFIG'
28
+ filter {
29
+ grok {
30
+ pattern => [
31
+ "%{DATA:http_host} %{IPORHOST:clientip} %{USER:ident} %{USER:http_auth} \[%{HTTPDATE:http_timestamp}\] \"%{WORD:http_method} %{DATA:http_request} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_response_code} (?:%{NUMBER:bytes}|-) \"(?:%{URI:http_referrer}|-)\" %{QS:http_user_agent} %{QS:http_x_forwarded_for} %{USER:ssl_chiper} %{NUMBER:request_time} (?:%{DATA:gzip_ratio}|-) (?:%{DATA:upstream}|-) (?:%{NUMBER:upstream_time}|-) (?:%{WORD:geoip_country}|-)",
32
+ "%{DATA:http_host} %{IPORHOST:clientip} %{USER:ident} %{USER:http_auth} \[%{HTTPDATE:http_timestamp}\] \"%{WORD:http_method} %{DATA:http_request} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_response_code} (?:%{NUMBER:bytes}|-) \"(?:%{URI:http_referrer}|-)\" %{QS:http_user_agent} %{QS:http_x_forwarded_for} %{USER:ssl_chiper} %{NUMBER:request_time} (?:%{DATA:gzip_ratio}|-) (?:%{DATA:upstream}|-) (?:%{NUMBER:upstream_time}|-)"
33
+ ]
34
+ }
35
+ }
36
+ CONFIG
37
+
38
+ start = Time.now
39
+ sample 'www.example.com 10.6.10.13 - - [09/Aug/2012:16:19:39 +0200] "GET /index.php HTTP/1.1" 403 211 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" "-" - 0.019 - 10.6.10.12:81 0.002 US' do
40
+ duration = Time.now - start
41
+ insist { duration } < 1
42
+ reject { subject.tags }.include?("_grokparsefailure")
43
+ insist { subject["geoip_country"] } == ["US"]
44
+ end
45
+
46
+
47
+ sample 'www.example.com 10.6.10.13 - - [09/Aug/2012:16:19:39 +0200] "GET /index.php HTTP/1.1" 403 211 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" "-" - 0.019 - 10.6.10.12:81 0.002 -' do
48
+ duration = Time.now - start
49
+ insist { duration } < 1
50
+ reject { subject.tags }.include?("_grokparsefailure")
51
+ insist { subject["geoip_country"].nil? } == true
52
+ end
53
+ end
54
+ end
55
+
56
+ __END__
@@ -0,0 +1,39 @@
1
+ require "test_utils"
2
+ require "grok-pure"
3
+ require "timeout"
4
+
5
+ describe "grok known timeout failures" do
6
+ describe "more apache log timeouts" do
7
+ subject { Grok.new }
8
+ before :each do
9
+ patterns = Dir.glob(File.join(File.dirname(__FILE__), "../../../patterns/*"))
10
+ patterns.each { |path| subject.add_patterns_from_file(path) }
11
+ subject.add_pattern("RESPONSE_BYTES", '[0-9_-]+')
12
+ subject.add_pattern("POST_CONN_STATUS", '[+-X]')
13
+ subject.add_pattern("CUSTOMAPACHELOG", '%{HOSTNAME:servername} %{IP:remote_host} %{NONNEGINT:servetime_secs} \[%{HTTPDATE:apache_timestamp}\] \"%{WORD:method} %{URIPATH:url}\" %{QS:query} %{POSINT:status} %{RESPONSE_BYTES:bytes} %{POST_CONN_STATUS:post_conn_status} \"(?:%{URI:referrer}|-)\" %{QS:agent} %{QS:cookie}')
14
+ subject.compile("%{CUSTOMAPACHELOG}")
15
+ end
16
+
17
+ it "should not timeout" do
18
+ data = File.open(__FILE__); data.each { |line| break if line == "__END__\n" }
19
+ puts subject.expanded_pattern
20
+ data.each do |line|
21
+ # This timeout will toss an exception if it takes too long.
22
+ Timeout.timeout(1) do
23
+ puts :matched => subject.match(line.chomp)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ __END__
31
+ example.com 11.22.33.44 1 [24/Oct/2012:08:47:14 +0200] "GET /need-russia-foo.php" "?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" 200 145492 + "http://www.google.de/#hl=de&sclient=psy-ab&q=foo+russland+kosten&oq=foo+rus&gs_l=hp.1.1.0l4.0.0.1.297.0.0.0.0.0.0.0.0..0.0...0.0...1c.uULgSTd5tzc&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.&fp=c4affe4f526437d4&bpcl=35466521&biw=1600&bih=799" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: -" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
32
+ example.com 11.22.33.44 0 [24/Oct/2012:08:47:18 +0200] "GET /ajax/ajax.fillPurposes2.php" "?destination=RUS&nationality=DEU&state=&localCode=DE" 200 271 + "http://example.com/need-russia-foo.php?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536" "Accept: application/json, text/javascript, */*; q=0.01" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
33
+ example.com 11.22.33.44 0 [24/Oct/2012:08:49:30 +0200] "GET /ajax/ajax.fillPurposes2.php" "?destination=RUS&nationality=DEU&state=Baden-W%C3%BCrttemberg&localCode=DE" 200 271 + "http://example.com/need-russia-foo.php?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536" "Accept: application/json, text/javascript, */*; q=0.01" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
34
+ example.com 11.22.33.44 0 [24/Oct/2012:08:49:41 +0200] "GET /ajax/ajax.fooPopup.php" "?passport_from=DEU&state_of_residence=Baden-W%C3%BCrttemberg&traveling_to[0]=RUS&traveling_for%5B0%5D=P&traveling_to%5B1%5D=&traveling_for%5B1%5D=&traveling_to%5B2%5D=&traveling_for%5B2%5D=&traveling_to%5B3%5D=&traveling_for%5B3%5D=&account_number=100536&account_exists=N" 200 2459 + "http://example.com/need-russia-foo.php?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536" "Accept: text/html, */*; q=0.01" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
35
+ example.com 11.22.33.44 0 [24/Oct/2012:08:49:45 +0200] "GET /ajax/ajax.fooPopupValid.php" "?codeId=1588744&countryCode=RUS&travelingFor=P&entry=S&passportFrom=DEU&_=1351061386611" 200 490 + "http://example.com/need-russia-foo.php?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536" "Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
36
+ example.com 11.22.33.44 0 [24/Oct/2012:08:49:50 +0200] "POST /ajax/ajax.fooPopup.php" "" 302 - + "http://example.com/need-russia-foo.php?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
37
+ example.com 11.22.33.44 1 [24/Oct/2012:08:49:50 +0200] "GET /requirements.php" "" 200 23780 + "http://example.com/need-russia-foo.php?login=100536&gclid=CJHRrKeHmbMCFWbKtAodn24ArA" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536" "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
38
+ example.com 11.22.33.44 1 [24/Oct/2012:08:49:52 +0200] "GET /ajax/ajax.requirementsFeesTable.php" "?text=RUS_0" 200 1406 + "http://example.com/requirements.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" "Cookie: PHPSESSID=b9bctuvsf2bdjcorbpogdkbll6p4p8uj; code=100536; __utma=256812172.1575809976.1351061239.1351061239.1351061239.1; __utmb=256812172.2.10.1351061239; __utmc=256812172; __utmz=256812172.1351061239.1.1.utmgclid=CJHRrKeHmbMCFWbKtAodn24ArA|utmccn=(not%20set)|utmcmd=(not%20set)|utmctr=foo%20russland%20kosten; __utmv=256812172.100536; 100536-AB-/eta-requirements=%2Feta-requirements; 100536-AB-/esta-requirements=%2Festa-requirements" "Accept: */*" "Lang: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4" "Encoding: gzip,deflate,sdch" "Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3"
39
+ example.com 194.127.209.156 0 [24/Oct/2012:10:54:06 +0200] "GET /ajax/ajax.fillPurposes2.php" "?destination=SAU&nationality=AUT&state=&localCode=DE" 200 236 + "http://example.com/foo.php?traveling_to=SAU&traveling_for=B&nationality=AUT&login=524412&state_of_residence=Baden-W\xc3\xbcrttemberg&use_lang=de&utm_source=trans&utm_medium=email&utm_campaign=cir-foo" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" "Cookie: PHPSESSID=h9gbvo04nomip8ca5ljko3cprrkttq9 ; code=524412" "Accept: application/json, text/javascript, */*; q=0.01" "Lang: de" "Encoding: gzip, deflate" "Charset: -"
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ require "test_utils"
3
+ require "logstash/filters/i18n"
4
+
5
+ describe LogStash::Filters::I18n do
6
+ extend LogStash::RSpec
7
+
8
+ describe "transliterate" do
9
+ config <<-CONFIG
10
+ filter {
11
+ i18n {
12
+ transliterate => [ "transliterateme" ]
13
+ }
14
+ }
15
+ CONFIG
16
+
17
+ event = {
18
+ "transliterateme" => [ "Ærøskøbing" ]
19
+ }
20
+
21
+ sample event do
22
+ insist { subject["transliterateme"] } == [ "AEroskobing" ]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,72 @@
1
+ require "test_utils"
2
+ require "logstash/filters/json"
3
+
4
+ describe LogStash::Filters::Json do
5
+ extend LogStash::RSpec
6
+
7
+ describe "parse message into the event" do
8
+ config <<-CONFIG
9
+ filter {
10
+ json {
11
+ # Parse message as JSON, store the results in the 'data' field'
12
+ source => "message"
13
+ }
14
+ }
15
+ CONFIG
16
+
17
+ sample '{ "hello": "world", "list": [ 1, 2, 3 ], "hash": { "k": "v" } }' do
18
+ insist { subject["hello"] } == "world"
19
+ insist { subject["list" ] } == [1,2,3]
20
+ insist { subject["hash"] } == { "k" => "v" }
21
+ end
22
+ end
23
+
24
+ describe "parse message into a target field" do
25
+ config <<-CONFIG
26
+ filter {
27
+ json {
28
+ # Parse message as JSON, store the results in the 'data' field'
29
+ source => "message"
30
+ target => "data"
31
+ }
32
+ }
33
+ CONFIG
34
+
35
+ sample '{ "hello": "world", "list": [ 1, 2, 3 ], "hash": { "k": "v" } }' do
36
+ insist { subject["data"]["hello"] } == "world"
37
+ insist { subject["data"]["list" ] } == [1,2,3]
38
+ insist { subject["data"]["hash"] } == { "k" => "v" }
39
+ end
40
+ end
41
+
42
+ describe "tag invalid json" do
43
+ config <<-CONFIG
44
+ filter {
45
+ json {
46
+ # Parse message as JSON, store the results in the 'data' field'
47
+ source => "message"
48
+ target => "data"
49
+ }
50
+ }
51
+ CONFIG
52
+
53
+ sample "invalid json" do
54
+ insist { subject["tags"] }.include?("_jsonparsefailure")
55
+ end
56
+ end
57
+
58
+ describe "fixing @timestamp (#pull 733)" do
59
+ config <<-CONFIG
60
+ filter {
61
+ json {
62
+ source => "message"
63
+ }
64
+ }
65
+ CONFIG
66
+
67
+ sample "{ \"@timestamp\": \"2013-10-19T00:14:32.996Z\" }" do
68
+ insist { subject["@timestamp"] }.is_a?(Time)
69
+ insist { subject["@timestamp"].to_json } == "\"2013-10-19T00:14:32.996Z\""
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,37 @@
1
+ require "test_utils"
2
+ require "logstash/filters/json_encode"
3
+
4
+ describe LogStash::Filters::JSONEncode do
5
+ extend LogStash::RSpec
6
+
7
+ describe "encode a field as json" do
8
+ config <<-CONFIG
9
+ filter {
10
+ json_encode {
11
+ source => "hello"
12
+ target => "fancy"
13
+ }
14
+ }
15
+ CONFIG
16
+
17
+ hash = { "hello" => { "whoa" => [ 1,2,3 ] } }
18
+ sample(hash) do
19
+ insist { JSON.parse(subject["fancy"]).to_json } == hash["hello"].to_json
20
+ end
21
+ end
22
+
23
+ describe "encode a field as json and overwrite the original" do
24
+ config <<-CONFIG
25
+ filter {
26
+ json_encode {
27
+ source => "hello"
28
+ }
29
+ }
30
+ CONFIG
31
+
32
+ hash = { "hello" => { "whoa" => [ 1,2,3 ] } }
33
+ sample(hash) do
34
+ insist { JSON.parse(subject["hello"]).to_json } == hash["hello"].to_json
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,403 @@
1
+ require "test_utils"
2
+ require "logstash/filters/kv"
3
+
4
+ describe LogStash::Filters::KV do
5
+ extend LogStash::RSpec
6
+
7
+ describe "defaults" do
8
+ # The logstash config goes here.
9
+ # At this time, only filters are supported.
10
+ config <<-CONFIG
11
+ filter {
12
+ kv { }
13
+ }
14
+ CONFIG
15
+
16
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
17
+ insist { subject["hello"] } == "world"
18
+ insist { subject["foo"] } == "bar"
19
+ insist { subject["baz"] } == "fizz"
20
+ insist { subject["doublequoted"] } == "hello world"
21
+ insist { subject["singlequoted"] } == "hello world"
22
+ end
23
+
24
+ end
25
+
26
+ describe "LOGSTASH-624: allow escaped space in key or value " do
27
+ config <<-CONFIG
28
+ filter {
29
+ kv { value_split => ':' }
30
+ }
31
+ CONFIG
32
+
33
+ sample 'IKE:=Quick\ Mode\ completion IKE\ IDs:=subnet:\ x.x.x.x\ (mask=\ 255.255.255.254)\ and\ host:\ y.y.y.y' do
34
+ insist { subject["IKE"] } == '=Quick\ Mode\ completion'
35
+ insist { subject['IKE\ IDs'] } == '=subnet:\ x.x.x.x\ (mask=\ 255.255.255.254)\ and\ host:\ y.y.y.y'
36
+ end
37
+ end
38
+
39
+ describe "test value_split" do
40
+ config <<-CONFIG
41
+ filter {
42
+ kv { value_split => ':' }
43
+ }
44
+ CONFIG
45
+
46
+ sample "hello:=world foo:bar baz=:fizz doublequoted:\"hello world\" singlequoted:'hello world'" do
47
+ insist { subject["hello"] } == "=world"
48
+ insist { subject["foo"] } == "bar"
49
+ insist { subject["baz="] } == "fizz"
50
+ insist { subject["doublequoted"] } == "hello world"
51
+ insist { subject["singlequoted"] } == "hello world"
52
+ end
53
+
54
+ end
55
+
56
+ describe "test field_split" do
57
+ config <<-CONFIG
58
+ filter {
59
+ kv { field_split => '?&' }
60
+ }
61
+ CONFIG
62
+
63
+ sample "?hello=world&foo=bar&baz=fizz&doublequoted=\"hello world\"&singlequoted='hello world'&ignoreme&foo12=bar12" do
64
+ insist { subject["hello"] } == "world"
65
+ insist { subject["foo"] } == "bar"
66
+ insist { subject["baz"] } == "fizz"
67
+ insist { subject["doublequoted"] } == "hello world"
68
+ insist { subject["singlequoted"] } == "hello world"
69
+ insist { subject["foo12"] } == "bar12"
70
+ end
71
+
72
+ end
73
+
74
+ describe "delimited fields should override space default (reported by LOGSTASH-733)" do
75
+ config <<-CONFIG
76
+ filter {
77
+ kv { field_split => "|" }
78
+ }
79
+ CONFIG
80
+
81
+ sample "field1=test|field2=another test|field3=test3" do
82
+ insist { subject["field1"] } == "test"
83
+ insist { subject["field2"] } == "another test"
84
+ insist { subject["field3"] } == "test3"
85
+ end
86
+ end
87
+
88
+ describe "test prefix" do
89
+ config <<-CONFIG
90
+ filter {
91
+ kv { prefix => '__' }
92
+ }
93
+ CONFIG
94
+
95
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
96
+ insist { subject["__hello"] } == "world"
97
+ insist { subject["__foo"] } == "bar"
98
+ insist { subject["__baz"] } == "fizz"
99
+ insist { subject["__doublequoted"] } == "hello world"
100
+ insist { subject["__singlequoted"] } == "hello world"
101
+ end
102
+
103
+ end
104
+
105
+ describe "speed test", :if => ENV["SPEEDTEST"] do
106
+ count = 10000 + rand(3000)
107
+ config <<-CONFIG
108
+ input {
109
+ generator {
110
+ count => #{count}
111
+ type => foo
112
+ message => "hello=world bar='baz fizzle'"
113
+ }
114
+ }
115
+
116
+ filter {
117
+ kv { }
118
+ }
119
+
120
+ output {
121
+ null { }
122
+ }
123
+ CONFIG
124
+
125
+ agent do
126
+ p :duration => @duration, :rate => count/@duration
127
+ end
128
+ end
129
+
130
+ describe "add_tag" do
131
+ context "should activate when successful" do
132
+ config <<-CONFIG
133
+ filter {
134
+ kv { add_tag => "hello" }
135
+ }
136
+ CONFIG
137
+
138
+ sample "hello=world" do
139
+ insist { subject["hello"] } == "world"
140
+ insist { subject["tags"] }.include?("hello")
141
+ end
142
+ end
143
+ context "should not activate when failing" do
144
+ config <<-CONFIG
145
+ filter {
146
+ kv { add_tag => "hello" }
147
+ }
148
+ CONFIG
149
+
150
+ sample "this is not key value" do
151
+ insist { subject["tags"] }.nil?
152
+ end
153
+ end
154
+ end
155
+
156
+ describe "add_field" do
157
+ context "should activate when successful" do
158
+ config <<-CONFIG
159
+ filter {
160
+ kv { add_field => [ "whoa", "fancypants" ] }
161
+ }
162
+ CONFIG
163
+
164
+ sample "hello=world" do
165
+ insist { subject["hello"] } == "world"
166
+ insist { subject["whoa"] } == "fancypants"
167
+ end
168
+ end
169
+
170
+ context "should not activate when failing" do
171
+ config <<-CONFIG
172
+ filter {
173
+ kv { add_tag => "hello" }
174
+ }
175
+ CONFIG
176
+
177
+ sample "this is not key value" do
178
+ reject { subject["whoa"] } == "fancypants"
179
+ end
180
+ end
181
+ end
182
+
183
+ #New tests
184
+ describe "test target" do
185
+ config <<-CONFIG
186
+ filter {
187
+ kv { target => 'kv' }
188
+ }
189
+ CONFIG
190
+
191
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
192
+ insist { subject["kv"]["hello"] } == "world"
193
+ insist { subject["kv"]["foo"] } == "bar"
194
+ insist { subject["kv"]["baz"] } == "fizz"
195
+ insist { subject["kv"]["doublequoted"] } == "hello world"
196
+ insist { subject["kv"]["singlequoted"] } == "hello world"
197
+ insist {subject["kv"].count } == 5
198
+ end
199
+
200
+ end
201
+
202
+ describe "test empty target" do
203
+ config <<-CONFIG
204
+ filter {
205
+ kv { target => 'kv' }
206
+ }
207
+ CONFIG
208
+
209
+ sample "hello:world:foo:bar:baz:fizz" do
210
+ insist { subject["kv"] } == nil
211
+ end
212
+ end
213
+
214
+
215
+ describe "test data from specific sub source" do
216
+ config <<-CONFIG
217
+ filter {
218
+ kv {
219
+ source => "data"
220
+ }
221
+ }
222
+ CONFIG
223
+ sample("data" => "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'") do
224
+ insist { subject["hello"] } == "world"
225
+ insist { subject["foo"] } == "bar"
226
+ insist { subject["baz"] } == "fizz"
227
+ insist { subject["doublequoted"] } == "hello world"
228
+ insist { subject["singlequoted"] } == "hello world"
229
+ end
230
+ end
231
+
232
+ describe "test data from specific top source" do
233
+ config <<-CONFIG
234
+ filter {
235
+ kv {
236
+ source => "@data"
237
+ }
238
+ }
239
+ CONFIG
240
+ sample({"@data" => "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'"}) do
241
+ insist { subject["hello"] } == "world"
242
+ insist { subject["foo"] } == "bar"
243
+ insist { subject["baz"] } == "fizz"
244
+ insist { subject["doublequoted"] } == "hello world"
245
+ insist { subject["singlequoted"] } == "hello world"
246
+ end
247
+ end
248
+
249
+
250
+ describe "test data from specific sub source and target" do
251
+ config <<-CONFIG
252
+ filter {
253
+ kv {
254
+ source => "data"
255
+ target => "kv"
256
+ }
257
+ }
258
+ CONFIG
259
+ sample("data" => "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'") do
260
+ insist { subject["kv"]["hello"] } == "world"
261
+ insist { subject["kv"]["foo"] } == "bar"
262
+ insist { subject["kv"]["baz"] } == "fizz"
263
+ insist { subject["kv"]["doublequoted"] } == "hello world"
264
+ insist { subject["kv"]["singlequoted"] } == "hello world"
265
+ insist { subject["kv"].count } == 5
266
+ end
267
+ end
268
+
269
+ describe "test data from nil sub source, should not issue a warning" do
270
+ config <<-CONFIG
271
+ filter {
272
+ kv {
273
+ source => "non-exisiting-field"
274
+ target => "kv"
275
+ }
276
+ }
277
+ CONFIG
278
+ sample "" do
279
+ insist { subject["non-exisiting-field"] } == nil
280
+ insist { subject["kv"] } == nil
281
+ end
282
+ end
283
+
284
+ describe "test include_keys" do
285
+ config <<-CONFIG
286
+ filter {
287
+ kv {
288
+ include_keys => [ "foo", "singlequoted" ]
289
+ }
290
+ }
291
+ CONFIG
292
+
293
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
294
+ insist { subject["foo"] } == "bar"
295
+ insist { subject["singlequoted"] } == "hello world"
296
+ end
297
+ end
298
+
299
+ describe "test exclude_keys" do
300
+ config <<-CONFIG
301
+ filter {
302
+ kv {
303
+ exclude_keys => [ "foo", "singlequoted" ]
304
+ }
305
+ }
306
+ CONFIG
307
+
308
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
309
+ insist { subject["hello"] } == "world"
310
+ insist { subject["baz"] } == "fizz"
311
+ insist { subject["doublequoted"] } == "hello world"
312
+ end
313
+ end
314
+
315
+ describe "test include_keys with prefix" do
316
+ config <<-CONFIG
317
+ filter {
318
+ kv {
319
+ include_keys => [ "foo", "singlequoted" ]
320
+ prefix => "__"
321
+ }
322
+ }
323
+ CONFIG
324
+
325
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
326
+ insist { subject["__foo"] } == "bar"
327
+ insist { subject["__singlequoted"] } == "hello world"
328
+ end
329
+ end
330
+
331
+ describe "test exclude_keys with prefix" do
332
+ config <<-CONFIG
333
+ filter {
334
+ kv {
335
+ exclude_keys => [ "foo", "singlequoted" ]
336
+ prefix => "__"
337
+ }
338
+ }
339
+ CONFIG
340
+
341
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
342
+ insist { subject["__hello"] } == "world"
343
+ insist { subject["__baz"] } == "fizz"
344
+ insist { subject["__doublequoted"] } == "hello world"
345
+ end
346
+ end
347
+
348
+ describe "test include_keys and exclude_keys" do
349
+ config <<-CONFIG
350
+ filter {
351
+ kv {
352
+ # This should exclude everything as a result of both settings.
353
+ include_keys => [ "foo", "singlequoted" ]
354
+ exclude_keys => [ "foo", "singlequoted" ]
355
+ }
356
+ }
357
+ CONFIG
358
+
359
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
360
+ %w(hello foo baz doublequoted singlequoted).each do |field|
361
+ reject { subject }.include?(field)
362
+ end
363
+ end
364
+ end
365
+
366
+ describe "test default_keys" do
367
+ config <<-CONFIG
368
+ filter {
369
+ kv {
370
+ default_keys => [ "foo", "xxx",
371
+ "goo", "yyy" ]
372
+ }
373
+ }
374
+ CONFIG
375
+
376
+ sample "hello=world foo=bar baz=fizz doublequoted=\"hello world\" singlequoted='hello world'" do
377
+ insist { subject["hello"] } == "world"
378
+ insist { subject["foo"] } == "bar"
379
+ insist { subject["goo"] } == "yyy"
380
+ insist { subject["baz"] } == "fizz"
381
+ insist { subject["doublequoted"] } == "hello world"
382
+ insist { subject["singlequoted"] } == "hello world"
383
+ end
384
+ end
385
+
386
+ describe "overwriting a string field (often the source)" do
387
+ config <<-CONFIG
388
+ filter {
389
+ kv {
390
+ source => "happy"
391
+ target => "happy"
392
+ }
393
+ }
394
+ CONFIG
395
+
396
+ sample("happy" => "foo=bar baz=fizz") do
397
+ insist { subject["[happy][foo]"] } == "bar"
398
+ insist { subject["[happy][baz]"] } == "fizz"
399
+ end
400
+
401
+ end
402
+
403
+ end