logstash-lib 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
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,43 @@
1
+ require "test_utils"
2
+ require "logstash/filters/environment"
3
+
4
+ describe LogStash::Filters::Environment do
5
+ extend LogStash::RSpec
6
+
7
+ describe "add a field from the environment" do
8
+ # The logstash config goes here.
9
+ # At this time, only filters are supported.
10
+ config <<-CONFIG
11
+ filter {
12
+ environment {
13
+ add_field_from_env => [ "newfield", "MY_ENV_VAR" ]
14
+ }
15
+ }
16
+ CONFIG
17
+
18
+ ENV["MY_ENV_VAR"] = "hello world"
19
+
20
+ sample "example" do
21
+ insist { subject["newfield"] } == "hello world"
22
+ end
23
+ end
24
+
25
+ describe "does nothing on non-matching events" do
26
+ # The logstash config goes here.
27
+ # At this time, only filters are supported.
28
+ config <<-CONFIG
29
+ filter {
30
+ environment {
31
+ type => "foo"
32
+ add_field_from_env => [ "newfield", "MY_ENV_VAR" ]
33
+ }
34
+ }
35
+ CONFIG
36
+
37
+ ENV["MY_ENV_VAR"] = "hello world"
38
+
39
+ sample("type" => "bar", "message" => "fizz") do
40
+ insist { subject["newfield"] }.nil?
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,62 @@
1
+ require "test_utils"
2
+ require "logstash/filters/geoip"
3
+
4
+ describe LogStash::Filters::GeoIP do
5
+ extend LogStash::RSpec
6
+ describe "defaults" do
7
+ config <<-CONFIG
8
+ filter {
9
+ geoip {
10
+ source => "ip"
11
+ #database => "vendor/geoip/GeoLiteCity.dat"
12
+ }
13
+ }
14
+ CONFIG
15
+
16
+ sample("ip" => "8.8.8.8") do
17
+ insist { subject }.include?("geoip")
18
+
19
+ expected_fields = %w(ip country_code2 country_code3 country_name
20
+ continent_code region_name city_name postal_code
21
+ latitude longitude dma_code area_code timezone
22
+ location )
23
+ expected_fields.each do |f|
24
+ insist { subject["geoip"] }.include?(f)
25
+ end
26
+ end
27
+
28
+ sample("ip" => "127.0.0.1") do
29
+ # assume geoip fails on localhost lookups
30
+ reject { subject }.include?("geoip")
31
+ end
32
+ end
33
+
34
+ describe "Specify the target" do
35
+ config <<-CONFIG
36
+ filter {
37
+ geoip {
38
+ source => "ip"
39
+ #database => "vendor/geoip/GeoLiteCity.dat"
40
+ target => src_ip
41
+ }
42
+ }
43
+ CONFIG
44
+
45
+ sample("ip" => "8.8.8.8") do
46
+ insist { subject }.include?("src_ip")
47
+
48
+ expected_fields = %w(ip country_code2 country_code3 country_name
49
+ continent_code region_name city_name postal_code
50
+ latitude longitude dma_code area_code timezone
51
+ location )
52
+ expected_fields.each do |f|
53
+ insist { subject["src_ip"] }.include?(f)
54
+ end
55
+ end
56
+
57
+ sample("ip" => "127.0.0.1") do
58
+ # assume geoip fails on localhost lookups
59
+ reject { subject }.include?("src_ip")
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,342 @@
1
+ require "test_utils"
2
+ require "logstash/filters/grep"
3
+
4
+ describe LogStash::Filters::Grep do
5
+ extend LogStash::RSpec
6
+
7
+ describe "single grep match" do
8
+ config <<-CONFIG
9
+ filter {
10
+ grep {
11
+ match => [ "str", "test" ]
12
+ }
13
+ }
14
+ CONFIG
15
+
16
+ sample("str" => "test: this should not be dropped") do
17
+ reject { subject }.nil?
18
+ end
19
+
20
+ sample("str" => "foo: this should be dropped") do
21
+ insist { subject }.nil?
22
+ end
23
+ end
24
+
25
+ describe "single match failure cancels the event" do
26
+ config <<-CONFIG
27
+ filter {
28
+ grep {
29
+ match => [ "str", "test" ]
30
+ }
31
+ }
32
+ CONFIG
33
+
34
+ sample("str" => "foo: this should be dropped") do
35
+ insist { subject }.nil?
36
+ end
37
+ end
38
+
39
+ describe "single match failure does not cancel the event with drop set to false" do
40
+ config <<-CONFIG
41
+ filter {
42
+ grep {
43
+ match => [ "str", "test" ]
44
+ drop => false
45
+ }
46
+ }
47
+ CONFIG
48
+
49
+ sample("str" => "foo: this should not be dropped") do
50
+ reject { subject }.nil?
51
+ end
52
+ end
53
+
54
+ describe "multiple match conditions" do
55
+ config <<-CONFIG
56
+ filter {
57
+ grep {
58
+ match => [
59
+ "str", "test",
60
+ "bar", "baz"
61
+ ]
62
+ }
63
+ }
64
+ CONFIG
65
+
66
+ sample("str" => "test: this should not be dropped", "bar" => "foo baz foo") do
67
+ reject { subject }.nil?
68
+ end
69
+ end
70
+
71
+ describe "multiple match conditions should cancel on failure" do
72
+ config <<-CONFIG
73
+ filter {
74
+ grep {
75
+ match => [
76
+ "str", "test",
77
+ "bar", "baz"
78
+ ]
79
+ }
80
+ }
81
+ CONFIG
82
+
83
+ sample("str" => "test: this should be dropped", "bar" => "foo bAz foo") do
84
+ insist { subject }.nil?
85
+ end
86
+ end
87
+
88
+ describe "single condition with regexp syntax" do
89
+ config <<-CONFIG
90
+ filter {
91
+ grep {
92
+ match => [ "str", "(?i)test.*foo"]
93
+ }
94
+ }
95
+ CONFIG
96
+
97
+ sample("str" => "TeST regexp match FoO") do
98
+ reject { subject }.nil?
99
+ end
100
+ end
101
+
102
+ describe "single condition with regexp syntax cancels on failure" do
103
+ config <<-CONFIG
104
+ filter {
105
+ grep {
106
+ match => [ "str", "test.*foo" ]
107
+ }
108
+ }
109
+ CONFIG
110
+
111
+ sample("str" => "TeST regexp match FoO") do
112
+ insist { subject }.nil?
113
+ end
114
+ end
115
+
116
+ describe "adding one field on success" do
117
+ config <<-CONFIG
118
+ filter {
119
+ grep {
120
+ match => [ "str", "test" ]
121
+ add_field => ["new_field", "new_value"]
122
+ }
123
+ }
124
+ CONFIG
125
+
126
+ sample("str" => "test") do
127
+ reject { subject }.nil?
128
+ insist { subject["new_field"]} == "new_value"
129
+ end
130
+ end
131
+
132
+ describe "adding one field with a sprintf value" do
133
+ config <<-CONFIG
134
+ filter {
135
+ grep {
136
+ match => [ "str", "test" ]
137
+ add_field => ["new_field", "%{type}"]
138
+ }
139
+ }
140
+ CONFIG
141
+
142
+ sample("type" => "grepper", "str" => "test") do
143
+ reject { subject }.nil?
144
+ insist { subject["new_field"]} == subject["type"]
145
+ end
146
+ end
147
+
148
+ # following test was __DISABLED_FOR_NOW_, remember why ?
149
+ # Seems to be multi-match several time on the same field not allowed
150
+ # maybe a clearer test on multi-match on same field could be created
151
+ # Also add_field behaviour tested separately in new NOOP test for add_field
152
+
153
+ # describe "adding fields on successful multiple match" do
154
+ # config <<-CONFIG
155
+ # filter {
156
+ # grep {
157
+ # match => [ "str", "test" ]
158
+ # add_field => ["new_field", "new_value"]
159
+ # match => [ "str", ".*" ]
160
+ # add_field => ["new_field", "new_value_2"]
161
+ # }
162
+ # }
163
+ # CONFIG
164
+ #
165
+ # sample("type" => "grepper", "str" => "test") do
166
+ # reject { subject }.nil?
167
+ # insist { subject["new_field"]} == ["new_value", "new_value_2"]
168
+ # end
169
+ # end
170
+
171
+ describe "add tags" do
172
+ config <<-CONFIG
173
+ filter {
174
+ grep {
175
+ match => [ "str", "test" ]
176
+ add_tag => ["new_tag"]
177
+ }
178
+ }
179
+ CONFIG
180
+
181
+ sample("tags" => ["tag"], "str" => "test") do
182
+ reject { subject }.nil?
183
+ insist { subject["tags"]} == ["tag", "new_tag"]
184
+ end
185
+ end
186
+
187
+ describe "add tags with drop set to false tags matching events" do
188
+ config <<-CONFIG
189
+ filter {
190
+ grep {
191
+ match => [ "str", "test" ]
192
+ drop => false
193
+ add_tag => ["new_tag"]
194
+ }
195
+ }
196
+ CONFIG
197
+
198
+ sample("tags" => ["tag"], "str" => "test") do
199
+ reject { subject }.nil?
200
+ insist { subject["tags"]} == ["tag", "new_tag"]
201
+ end
202
+ end
203
+
204
+ describe "add tags with drop set to false allows non-matching events through" do
205
+ config <<-CONFIG
206
+ filter {
207
+ grep {
208
+ match => [ "str", "test" ]
209
+ drop => false
210
+ add_tag => ["new_tag"]
211
+ }
212
+ }
213
+ CONFIG
214
+
215
+ sample("tags" => ["tag"], "str" => "non-matching") do
216
+ reject { subject }.nil?
217
+ insist { subject["tags"]} == ["tag"]
218
+ end
219
+ end
220
+
221
+ describe "add tags with sprintf value" do
222
+ config <<-CONFIG
223
+ filter {
224
+ grep {
225
+ match => [ "str", "test" ]
226
+ add_tag => ["%{str}"]
227
+ }
228
+ }
229
+ CONFIG
230
+
231
+ sample("tags" => ["tag"], "str" => "test") do
232
+ reject { subject }.nil?
233
+ insist { subject["tags"]} == ["tag", subject["str"]]
234
+ end
235
+ end
236
+
237
+ describe "negate=true should not cause drops when field is nil" do
238
+ # Set negate to true; the pattern being searched doesn't actually matter
239
+ # here. We're testing to make sure "grep -v" behavior doesn't drop events
240
+ # that don't even have the field being filtered for.
241
+ config <<-CONFIG
242
+ filter {
243
+ grep {
244
+ match => [ "str", "doesn't matter lol" ]
245
+ negate => true
246
+ }
247
+ }
248
+ CONFIG
249
+
250
+ sample("tags" => ["tag"], "str" => nil) do
251
+ reject { subject }.nil?
252
+ end
253
+ end
254
+
255
+ #LOGSTASH-599
256
+ describe "drop line based on type and tags 'matching' only but otherwise pattern matching" do
257
+ config <<-CONFIG
258
+ filter {
259
+ grep {
260
+ type => "testing"
261
+ tags => ["_grokparsefailure"]
262
+ negate => true
263
+ }
264
+ }
265
+ CONFIG
266
+
267
+ sample("type" => "testing", "tags" => ["_grokparsefailure"], "str" => "test") do
268
+ insist { subject }.nil?
269
+ end
270
+ end
271
+
272
+ #LOGSTASH-894 and LOGSTASH-919
273
+ describe "repeat a field in match config, similar to piped grep command line" do
274
+ config <<-CONFIG
275
+ filter {
276
+ grep {
277
+ match => ["message", "hello", "message", "world"]
278
+ }
279
+ }
280
+ CONFIG
281
+
282
+ #both match
283
+ sample "hello world" do
284
+ reject { subject }.nil?
285
+ end
286
+ #one match
287
+ sample "bye world" do
288
+ insist { subject }.nil?
289
+ end
290
+ #one match
291
+ sample "hello Jordan" do
292
+ insist { subject }.nil?
293
+ end
294
+ #no match
295
+ sample "WTF" do
296
+ insist { subject }.nil?
297
+ end
298
+ end
299
+
300
+ describe "repeat a field in match config, similar to several -e in grep command line" do
301
+ config <<-CONFIG
302
+ filter {
303
+ grep {
304
+ match => ["message", "hello", "message", "world"]
305
+ negate => true
306
+ }
307
+ }
308
+ CONFIG
309
+
310
+ #both match
311
+ sample "hello world" do
312
+ insist { subject }.nil?
313
+ end
314
+ #one match
315
+ sample "bye world" do
316
+ insist { subject }.nil?
317
+ end
318
+ #one match
319
+ sample "hello Jordan" do
320
+ insist { subject }.nil?
321
+ end
322
+ #no match
323
+ sample "WTF" do
324
+ reject { subject }.nil?
325
+ end
326
+ end
327
+
328
+ describe "case-insensitive matching" do
329
+ config <<-CONFIG
330
+ filter {
331
+ grep {
332
+ ignore_case => true
333
+ match => [ "str", "test" ]
334
+ }
335
+ }
336
+ CONFIG
337
+
338
+ sample("str" => "tEsT: this should still be matched") do
339
+ reject { subject }.nil?
340
+ end
341
+ end
342
+ end
@@ -0,0 +1,473 @@
1
+ require "test_utils"
2
+ require "logstash/filters/grok"
3
+
4
+ describe LogStash::Filters::Grok do
5
+ extend LogStash::RSpec
6
+
7
+ describe "simple syslog line" do
8
+ # The logstash config goes here.
9
+ # At this time, only filters are supported.
10
+ config <<-CONFIG
11
+ filter {
12
+ grok {
13
+ match => [ "message", "%{SYSLOGLINE}" ]
14
+ singles => true
15
+ overwrite => [ "message" ]
16
+ }
17
+ }
18
+ CONFIG
19
+
20
+ sample "Mar 16 00:01:25 evita postfix/smtpd[1713]: connect from camomile.cloud9.net[168.100.1.3]" do
21
+ insist { subject["tags"] }.nil?
22
+ insist { subject["logsource"] } == "evita"
23
+ insist { subject["timestamp"] } == "Mar 16 00:01:25"
24
+ insist { subject["message"] } == "connect from camomile.cloud9.net[168.100.1.3]"
25
+ insist { subject["program"] } == "postfix/smtpd"
26
+ insist { subject["pid"] } == "1713"
27
+ end
28
+ end
29
+
30
+ describe "ietf 5424 syslog line" do
31
+ # The logstash config goes here.
32
+ # At this time, only filters are supported.
33
+ config <<-CONFIG
34
+ filter {
35
+ grok {
36
+ match => [ "message", "%{SYSLOG5424LINE}" ]
37
+ singles => true
38
+ }
39
+ }
40
+ CONFIG
41
+
42
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug 4123 - [id1 foo=\"bar\"][id2 baz=\"something\"] Hello, syslog." do
43
+ insist { subject["tags"] }.nil?
44
+ insist { subject["syslog5424_pri"] } == "191"
45
+ insist { subject["syslog5424_ver"] } == "1"
46
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
47
+ insist { subject["syslog5424_host"] } == "paxton.local"
48
+ insist { subject["syslog5424_app"] } == "grokdebug"
49
+ insist { subject["syslog5424_proc"] } == "4123"
50
+ insist { subject["syslog5424_msgid"] } == nil
51
+ insist { subject["syslog5424_sd"] } == "[id1 foo=\"bar\"][id2 baz=\"something\"]"
52
+ insist { subject["syslog5424_msg"] } == "Hello, syslog."
53
+ end
54
+
55
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug - - [id1 foo=\"bar\"] No process ID." do
56
+ insist { subject["tags"] }.nil?
57
+ insist { subject["syslog5424_pri"] } == "191"
58
+ insist { subject["syslog5424_ver"] } == "1"
59
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
60
+ insist { subject["syslog5424_host"] } == "paxton.local"
61
+ insist { subject["syslog5424_app"] } == "grokdebug"
62
+ insist { subject["syslog5424_proc"] } == nil
63
+ insist { subject["syslog5424_msgid"] } == nil
64
+ insist { subject["syslog5424_sd"] } == "[id1 foo=\"bar\"]"
65
+ insist { subject["syslog5424_msg"] } == "No process ID."
66
+ end
67
+
68
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug 4123 - - No structured data." do
69
+ insist { subject["tags"] }.nil?
70
+ insist { subject["syslog5424_pri"] } == "191"
71
+ insist { subject["syslog5424_ver"] } == "1"
72
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
73
+ insist { subject["syslog5424_host"] } == "paxton.local"
74
+ insist { subject["syslog5424_app"] } == "grokdebug"
75
+ insist { subject["syslog5424_proc"] } == "4123"
76
+ insist { subject["syslog5424_msgid"] } == nil
77
+ insist { subject["syslog5424_sd"] } == nil
78
+ insist { subject["syslog5424_msg"] } == "No structured data."
79
+ end
80
+
81
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug - - - No PID or SD." do
82
+ insist { subject["tags"] }.nil?
83
+ insist { subject["syslog5424_pri"] } == "191"
84
+ insist { subject["syslog5424_ver"] } == "1"
85
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
86
+ insist { subject["syslog5424_host"] } == "paxton.local"
87
+ insist { subject["syslog5424_app"] } == "grokdebug"
88
+ insist { subject["syslog5424_proc"] } == nil
89
+ insist { subject["syslog5424_msgid"] } == nil
90
+ insist { subject["syslog5424_sd"] } == nil
91
+ insist { subject["syslog5424_msg"] } == "No PID or SD."
92
+ end
93
+
94
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug 4123 - Missing structured data." do
95
+ insist { subject["tags"] }.nil?
96
+ insist { subject["syslog5424_pri"] } == "191"
97
+ insist { subject["syslog5424_ver"] } == "1"
98
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
99
+ insist { subject["syslog5424_host"] } == "paxton.local"
100
+ insist { subject["syslog5424_app"] } == "grokdebug"
101
+ insist { subject["syslog5424_proc"] } == "4123"
102
+ insist { subject["syslog5424_msgid"] } == nil
103
+ insist { subject["syslog5424_sd"] } == nil
104
+ insist { subject["syslog5424_msg"] } == "Missing structured data."
105
+ end
106
+
107
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug 4123 - - Additional spaces." do
108
+ insist { subject["tags"] }.nil?
109
+ insist { subject["syslog5424_pri"] } == "191"
110
+ insist { subject["syslog5424_ver"] } == "1"
111
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
112
+ insist { subject["syslog5424_host"] } == "paxton.local"
113
+ insist { subject["syslog5424_app"] } == "grokdebug"
114
+ insist { subject["syslog5424_proc"] } == "4123"
115
+ insist { subject["syslog5424_msgid"] } == nil
116
+ insist { subject["syslog5424_sd"] } == nil
117
+ insist { subject["syslog5424_msg"] } == "Additional spaces."
118
+ end
119
+
120
+ sample "<191>1 2009-06-30T18:30:00+02:00 paxton.local grokdebug 4123 - Additional spaces and missing SD." do
121
+ insist { subject["tags"] }.nil?
122
+ insist { subject["syslog5424_pri"] } == "191"
123
+ insist { subject["syslog5424_ver"] } == "1"
124
+ insist { subject["syslog5424_ts"] } == "2009-06-30T18:30:00+02:00"
125
+ insist { subject["syslog5424_host"] } == "paxton.local"
126
+ insist { subject["syslog5424_app"] } == "grokdebug"
127
+ insist { subject["syslog5424_proc"] } == "4123"
128
+ insist { subject["syslog5424_msgid"] } == nil
129
+ insist { subject["syslog5424_sd"] } == nil
130
+ insist { subject["syslog5424_msg"] } == "Additional spaces and missing SD."
131
+ end
132
+ end
133
+
134
+ describe "parsing an event with multiple messages (array of strings)", :if => false do
135
+ config <<-CONFIG
136
+ filter {
137
+ grok {
138
+ match => [ "message", "(?:hello|world) %{NUMBER}" ]
139
+ named_captures_only => false
140
+ }
141
+ }
142
+ CONFIG
143
+
144
+ sample("message" => [ "hello 12345", "world 23456" ]) do
145
+ insist { subject["NUMBER"] } == [ "12345", "23456" ]
146
+ end
147
+ end
148
+
149
+ describe "coercing matched values" do
150
+ config <<-CONFIG
151
+ filter {
152
+ grok {
153
+ match => [ "message", "%{NUMBER:foo:int} %{NUMBER:bar:float}" ]
154
+ singles => true
155
+ }
156
+ }
157
+ CONFIG
158
+
159
+ sample "400 454.33" do
160
+ insist { subject["foo"] } == 400
161
+ insist { subject["foo"] }.is_a?(Fixnum)
162
+ insist { subject["bar"] } == 454.33
163
+ insist { subject["bar"] }.is_a?(Float)
164
+ end
165
+ end
166
+
167
+ describe "in-line pattern definitions" do
168
+ config <<-CONFIG
169
+ filter {
170
+ grok {
171
+ match => [ "message", "%{FIZZLE=\\d+}" ]
172
+ named_captures_only => false
173
+ singles => true
174
+ }
175
+ }
176
+ CONFIG
177
+
178
+ sample "hello 1234" do
179
+ insist { subject["FIZZLE"] } == "1234"
180
+ end
181
+ end
182
+
183
+ describe "processing selected fields" do
184
+ config <<-CONFIG
185
+ filter {
186
+ grok {
187
+ match => [ "message", "%{WORD:word}" ]
188
+ match => [ "examplefield", "%{NUMBER:num}" ]
189
+ break_on_match => false
190
+ singles => true
191
+ }
192
+ }
193
+ CONFIG
194
+
195
+ sample("message" => "hello world", "examplefield" => "12345") do
196
+ insist { subject["examplefield"] } == "12345"
197
+ insist { subject["word"] } == "hello"
198
+ end
199
+ end
200
+
201
+ describe "adding fields on match" do
202
+ config <<-CONFIG
203
+ filter {
204
+ grok {
205
+ match => [ "message", "matchme %{NUMBER:fancy}" ]
206
+ singles => true
207
+ add_field => [ "new_field", "%{fancy}" ]
208
+ }
209
+ }
210
+ CONFIG
211
+
212
+ sample "matchme 1234" do
213
+ insist { subject["tags"] }.nil?
214
+ insist { subject["new_field"] } == "1234"
215
+ end
216
+
217
+ sample "this will not be matched" do
218
+ insist { subject["tags"] }.include?("_grokparsefailure")
219
+ reject { subject }.include?("new_field")
220
+ end
221
+ end
222
+
223
+ context "empty fields" do
224
+ describe "drop by default" do
225
+ config <<-CONFIG
226
+ filter {
227
+ grok {
228
+ match => [ "message", "1=%{WORD:foo1} *(2=%{WORD:foo2})?" ]
229
+ }
230
+ }
231
+ CONFIG
232
+
233
+ sample "1=test" do
234
+ insist { subject["tags"] }.nil?
235
+ insist { subject }.include?("foo1")
236
+
237
+ # Since 'foo2' was not captured, it must not be present in the event.
238
+ reject { subject }.include?("foo2")
239
+ end
240
+ end
241
+
242
+ describe "keep if keep_empty_captures is true" do
243
+ config <<-CONFIG
244
+ filter {
245
+ grok {
246
+ match => [ "message", "1=%{WORD:foo1} *(2=%{WORD:foo2})?" ]
247
+ keep_empty_captures => true
248
+ }
249
+ }
250
+ CONFIG
251
+
252
+ sample "1=test" do
253
+ insist { subject["tags"] }.nil?
254
+ # use .to_hash for this test, for now, because right now
255
+ # the Event.include? returns false for missing fields as well
256
+ # as for fields with nil values.
257
+ insist { subject.to_hash }.include?("foo2")
258
+ insist { subject.to_hash }.include?("foo2")
259
+ end
260
+ end
261
+ end
262
+
263
+ describe "when named_captures_only == false" do
264
+ config <<-CONFIG
265
+ filter {
266
+ grok {
267
+ match => [ "message", "Hello %{WORD}. %{WORD:foo}" ]
268
+ named_captures_only => false
269
+ singles => true
270
+ }
271
+ }
272
+ CONFIG
273
+
274
+ sample "Hello World, yo!" do
275
+ insist { subject }.include?("WORD")
276
+ insist { subject["WORD"] } == "World"
277
+ insist { subject }.include?("foo")
278
+ insist { subject["foo"] } == "yo"
279
+ end
280
+ end
281
+
282
+ describe "using oniguruma named captures (?<name>regex)" do
283
+ context "plain regexp" do
284
+ config <<-'CONFIG'
285
+ filter {
286
+ grok {
287
+ singles => true
288
+ match => [ "message", "(?<foo>\w+)" ]
289
+ }
290
+ }
291
+ CONFIG
292
+ sample "hello world" do
293
+ insist { subject["tags"] }.nil?
294
+ insist { subject["foo"] } == "hello"
295
+ end
296
+ end
297
+
298
+ context "grok patterns" do
299
+ config <<-'CONFIG'
300
+ filter {
301
+ grok {
302
+ singles => true
303
+ match => [ "message", "(?<timestamp>%{DATE_EU} %{TIME})" ]
304
+ }
305
+ }
306
+ CONFIG
307
+
308
+ sample "fancy 12-12-12 12:12:12" do
309
+ insist { subject["tags"] }.nil?
310
+ insist { subject["timestamp"] } == "12-12-12 12:12:12"
311
+ end
312
+ end
313
+ end
314
+
315
+ describe "grok on integer types" do
316
+ config <<-'CONFIG'
317
+ filter {
318
+ grok {
319
+ match => [ "status", "^403$" ]
320
+ add_tag => "four_oh_three"
321
+ }
322
+ }
323
+ CONFIG
324
+
325
+ sample("status" => 403) do
326
+ reject { subject["tags"] }.include?("_grokparsefailure")
327
+ insist { subject["tags"] }.include?("four_oh_three")
328
+ end
329
+ end
330
+
331
+ describe "grok on float types" do
332
+ config <<-'CONFIG'
333
+ filter {
334
+ grok {
335
+ match => [ "version", "^1.0$" ]
336
+ add_tag => "one_point_oh"
337
+ }
338
+ }
339
+ CONFIG
340
+
341
+ sample("version" => 1.0) do
342
+ insist { subject["tags"] }.include?("one_point_oh")
343
+ insist { subject["tags"] }.include?("one_point_oh")
344
+ end
345
+ end
346
+
347
+ describe "grok on %{LOGLEVEL}" do
348
+ config <<-'CONFIG'
349
+ filter {
350
+ grok {
351
+ pattern => "%{LOGLEVEL:level}: error!"
352
+ }
353
+ }
354
+ CONFIG
355
+
356
+ log_level_names = %w(
357
+ trace Trace TRACE
358
+ debug Debug DEBUG
359
+ notice Notice Notice
360
+ info Info INFO
361
+ warn warning Warn Warning WARN WARNING
362
+ err error Err Error ERR ERROR
363
+ crit critical Crit Critical CRIT CRITICAL
364
+ fatal Fatal FATAL
365
+ severe Severe SEVERE
366
+ emerg emergency Emerg Emergency EMERG EMERGENCY
367
+ )
368
+ log_level_names.each do |level_name|
369
+ sample "#{level_name}: error!" do
370
+ insist { subject['level'] } == level_name
371
+ end
372
+ end
373
+ end
374
+
375
+ describe "tagging on failure" do
376
+ config <<-CONFIG
377
+ filter {
378
+ grok {
379
+ match => [ "message", "matchme %{NUMBER:fancy}" ]
380
+ tag_on_failure => false
381
+ }
382
+ }
383
+ CONFIG
384
+
385
+ sample "matchme 1234" do
386
+ insist { subject["tags"] }.nil?
387
+ end
388
+
389
+ sample "this will not be matched" do
390
+ insist { subject["tags"] }.include?("false")
391
+ end
392
+ end
393
+
394
+ describe "captures named fields even if the whole text matches" do
395
+ config <<-CONFIG
396
+ filter {
397
+ grok {
398
+ match => [ "message", "%{DATE_EU:stimestamp}" ]
399
+ singles => true
400
+ }
401
+ }
402
+ CONFIG
403
+
404
+ sample "11/01/01" do
405
+ insist { subject["stimestamp"] } == "11/01/01"
406
+ end
407
+ end
408
+
409
+ describe "allow dashes in capture names" do
410
+ config <<-CONFIG
411
+ filter {
412
+ grok {
413
+ match => [ "message", "%{WORD:foo-bar}" ]
414
+ singles => true
415
+ }
416
+ }
417
+ CONFIG
418
+
419
+ sample "hello world" do
420
+ insist { subject["foo-bar"] } == "hello"
421
+ end
422
+ end
423
+
424
+ describe "performance test", :if => ENV["SPEEDTEST"] do
425
+ event_count = 100000
426
+ min_rate = 4000
427
+
428
+ max_duration = event_count / min_rate
429
+ input = "Nov 24 01:29:01 -0800"
430
+ config <<-CONFIG
431
+ input {
432
+ generator {
433
+ count => #{event_count}
434
+ message => "Mar 16 00:01:25 evita postfix/smtpd[1713]: connect from camomile.cloud9.net[168.100.1.3]"
435
+ }
436
+ }
437
+ filter {
438
+ grok {
439
+ match => [ "message", "%{SYSLOGLINE}" ]
440
+ singles => true
441
+ overwrite => [ "message" ]
442
+ }
443
+ }
444
+ output { null { } }
445
+ CONFIG
446
+
447
+ 2.times do
448
+ agent do
449
+ puts "grok parse rate: #{event_count / @duration}"
450
+ insist { @duration } < max_duration
451
+ end
452
+ end
453
+ end
454
+
455
+ describe "singles with duplicate-named fields" do
456
+ config <<-CONFIG
457
+ filter {
458
+ grok {
459
+ match => [ "message", "%{INT:foo}|%{WORD:foo}" ]
460
+ singles => true
461
+ }
462
+ }
463
+ CONFIG
464
+
465
+ sample "hello world" do
466
+ insist { subject["foo"] }.is_a?(String)
467
+ end
468
+
469
+ sample "123 world" do
470
+ insist { subject["foo"] }.is_a?(String)
471
+ end
472
+ end
473
+ end