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,399 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # The mutate filter allows you to do general mutations to fields. You
6
+ # can rename, remove, replace, and modify fields in your events.
7
+ #
8
+ # TODO(sissel): Support regexp replacements like String#gsub ?
9
+ class LogStash::Filters::Mutate < LogStash::Filters::Base
10
+ config_name "mutate"
11
+ milestone 3
12
+
13
+ # Rename one or more fields.
14
+ #
15
+ # Example:
16
+ #
17
+ # filter {
18
+ # mutate {
19
+ # # Renames the 'HOSTORIP' field to 'client_ip'
20
+ # rename => [ "HOSTORIP", "client_ip" ]
21
+ # }
22
+ # }
23
+ config :rename, :validate => :hash
24
+
25
+ # Remove one or more fields.
26
+ #
27
+ # Example:
28
+ #
29
+ # filter {
30
+ # mutate {
31
+ # remove => [ "client" ] # Removes the 'client' field
32
+ # }
33
+ # }
34
+ #
35
+ # This option is deprecated, instead use remove_field option available in all
36
+ # filters.
37
+ config :remove, :validate => :array, :deprecated => true
38
+
39
+ # Replace a field with a new value. The new value can include %{foo} strings
40
+ # to help you build a new value from other parts of the event.
41
+ #
42
+ # Example:
43
+ #
44
+ # filter {
45
+ # mutate {
46
+ # replace => [ "message", "%{source_host}: My new message" ]
47
+ # }
48
+ # }
49
+ config :replace, :validate => :hash
50
+
51
+ # Update an existing field with a new value. If the field does not exist,
52
+ # then no action will be taken.
53
+ #
54
+ # Example:
55
+ #
56
+ # filter {
57
+ # mutate {
58
+ # update => [ "sample", "My new message" ]
59
+ # }
60
+ # }
61
+ config :update, :validate => :hash
62
+
63
+ # Convert a field's value to a different type, like turning a string to an
64
+ # integer. If the field value is an array, all members will be converted.
65
+ # If the field is a hash, no action will be taken.
66
+ #
67
+ # Valid conversion targets are: integer, float, string
68
+ #
69
+ # Example:
70
+ #
71
+ # filter {
72
+ # mutate {
73
+ # convert => [ "fieldname", "integer" ]
74
+ # }
75
+ # }
76
+ config :convert, :validate => :hash
77
+
78
+ # Convert a string field by applying a regular expression and a replacement
79
+ # if the field is not a string, no action will be taken.
80
+ #
81
+ # This configuration takes an array consisting of 3 elements per
82
+ # field/substitution.
83
+ #
84
+ # Be aware of escaping any backslash in the config file.
85
+ #
86
+ # Example:
87
+ #
88
+ # filter {
89
+ # mutate {
90
+ # gsub => [
91
+ # # replace all forward slashes with underscore
92
+ # "fieldname", "/", "_",
93
+ #
94
+ # # replace backslashes, question marks, hashes, and minuses with
95
+ # # dot
96
+ # "fieldname2", "[\\?#-]", "."
97
+ # ]
98
+ # }
99
+ # }
100
+ #
101
+ config :gsub, :validate => :array
102
+
103
+ # Convert a string to its uppercase equivalent
104
+ #
105
+ # Example:
106
+ #
107
+ # filter {
108
+ # mutate {
109
+ # uppercase => [ "fieldname" ]
110
+ # }
111
+ # }
112
+ config :uppercase, :validate => :array
113
+
114
+ # Convert a string to its lowercase equivalent
115
+ #
116
+ # Example:
117
+ #
118
+ # filter {
119
+ # mutate {
120
+ # lowercase => [ "fieldname" ]
121
+ # }
122
+ # }
123
+ config :lowercase, :validate => :array
124
+
125
+ # Split a field to an array using a separator character. Only works on string
126
+ # fields.
127
+ #
128
+ # Example:
129
+ #
130
+ # filter {
131
+ # mutate {
132
+ # split => ["fieldname", ","]
133
+ # }
134
+ # }
135
+ config :split, :validate => :hash
136
+
137
+ # Join an array with a separator character, does nothing on non-array fields
138
+ #
139
+ # Example:
140
+ #
141
+ # filter {
142
+ # mutate {
143
+ # join => ["fieldname", ","]
144
+ # }
145
+ # }
146
+ config :join, :validate => :hash
147
+
148
+ # Strip whitespaces
149
+ #
150
+ # Example:
151
+ #
152
+ # filter {
153
+ # mutate {
154
+ # strip => ["field1", "field2"]
155
+ # }
156
+ # }
157
+ config :strip, :validate => :array
158
+
159
+ # merge two fields or arrays or hashes
160
+ # String fields will be converted in array, so
161
+ # array + string will work
162
+ # string + string will result in an 2 entry array in dest_field
163
+ # array and hash will not work
164
+ #
165
+ # Example:
166
+ #
167
+ # filter {
168
+ # mutate {
169
+ # merge => ["dest_field", "added_field"]
170
+ # }
171
+ # }
172
+ config :merge, :validate => :hash
173
+
174
+ public
175
+ def register
176
+ valid_conversions = %w(string integer float)
177
+ # TODO(sissel): Validate conversion requests if provided.
178
+ @convert.nil? or @convert.each do |field, type|
179
+ if !valid_conversions.include?(type)
180
+ @logger.error("Invalid conversion type",
181
+ "type" => type, "expected one of" => valid_types)
182
+ # TODO(sissel): It's 2011, man, let's actually make like.. a proper
183
+ # 'configuration broken' exception
184
+ raise "Bad configuration, aborting."
185
+ end
186
+ end # @convert.each
187
+
188
+ @gsub_parsed = []
189
+ @gsub.nil? or @gsub.each_slice(3) do |field, needle, replacement|
190
+ if [field, needle, replacement].any? {|n| n.nil?}
191
+ @logger.error("Invalid gsub configuration. gsub has to define 3 elements per config entry", :field => field, :needle => needle, :replacement => replacement)
192
+ raise "Bad configuration, aborting."
193
+ end
194
+ @gsub_parsed << {
195
+ :field => field,
196
+ :needle => Regexp.new(needle),
197
+ :replacement => replacement
198
+ }
199
+ end
200
+ end # def register
201
+
202
+ public
203
+ def filter(event)
204
+ return unless filter?(event)
205
+
206
+ rename(event) if @rename
207
+ update(event) if @update
208
+ replace(event) if @replace
209
+ convert(event) if @convert
210
+ gsub(event) if @gsub
211
+ uppercase(event) if @uppercase
212
+ lowercase(event) if @lowercase
213
+ strip(event) if @strip
214
+ remove(event) if @remove
215
+ split(event) if @split
216
+ join(event) if @join
217
+ merge(event) if @merge
218
+
219
+ filter_matched(event)
220
+ end # def filter
221
+
222
+ private
223
+ def remove(event)
224
+ # TODO(sissel): use event.sprintf on the field names?
225
+ @remove.each do |field|
226
+ event.remove(field)
227
+ end
228
+ end # def remove
229
+
230
+ private
231
+ def rename(event)
232
+ # TODO(sissel): use event.sprintf on the field names?
233
+ @rename.each do |old, new|
234
+ next unless event.include?(old)
235
+ event[new] = event.remove(old)
236
+ end
237
+ end # def rename
238
+
239
+ private
240
+ def update(event)
241
+ @update.each do |field, newvalue|
242
+ next unless event.include?(field)
243
+ event[field] = event.sprintf(newvalue)
244
+ end
245
+ end # def update
246
+
247
+ private
248
+ def replace(event)
249
+ @replace.each do |field, newvalue|
250
+ event[field] = event.sprintf(newvalue)
251
+ end
252
+ end # def replace
253
+
254
+ def convert(event)
255
+ @convert.each do |field, type|
256
+ next unless event.include?(field)
257
+ original = event[field]
258
+
259
+ # calls convert_{string,integer,float} depending on type requested.
260
+ converter = method("convert_" + type)
261
+ if original.nil?
262
+ next
263
+ elsif original.is_a?(Hash)
264
+ @logger.debug("I don't know how to type convert a hash, skipping",
265
+ :field => field, :value => original)
266
+ next
267
+ elsif original.is_a?(Array)
268
+ value = original.map { |v| converter.call(v) }
269
+ else
270
+ value = converter.call(original)
271
+ end
272
+ event[field] = value
273
+ end
274
+ end # def convert
275
+
276
+ def convert_string(value)
277
+ return value.to_s
278
+ end # def convert_string
279
+
280
+ def convert_integer(value)
281
+ return value.to_i
282
+ end # def convert_integer
283
+
284
+ def convert_float(value)
285
+ return value.to_f
286
+ end # def convert_float
287
+
288
+ private
289
+ def gsub(event)
290
+ @gsub_parsed.each do |config|
291
+ field = config[:field]
292
+ needle = config[:needle]
293
+ replacement = config[:replacement]
294
+
295
+ if event[field].is_a?(Array)
296
+ event[field] = event[field].map do |v|
297
+ if not v.is_a?(String)
298
+ @logger.warn("gsub mutation is only applicable for Strings, " +
299
+ "skipping", :field => field, :value => v)
300
+ v
301
+ else
302
+ v.gsub(needle, replacement)
303
+ end
304
+ end
305
+ else
306
+ if not event[field].is_a?(String)
307
+ @logger.debug("gsub mutation is only applicable for Strings, " +
308
+ "skipping", :field => field, :value => event[field])
309
+ next
310
+ end
311
+ event[field] = event[field].gsub(needle, replacement)
312
+ end
313
+ end # @gsub_parsed.each
314
+ end # def gsub
315
+
316
+ private
317
+ def uppercase(event)
318
+ @uppercase.each do |field|
319
+ if event[field].is_a?(Array)
320
+ event[field].each { |v| v.upcase! }
321
+ elsif event[field].is_a?(String)
322
+ event[field].upcase!
323
+ else
324
+ @logger.debug("Can't uppercase something that isn't a string",
325
+ :field => field, :value => event[field])
326
+ end
327
+ end
328
+ end # def uppercase
329
+
330
+ private
331
+ def lowercase(event)
332
+ @lowercase.each do |field|
333
+ if event[field].is_a?(Array)
334
+ event[field].each { |v| v.downcase! }
335
+ elsif event[field].is_a?(String)
336
+ event[field].downcase!
337
+ else
338
+ @logger.debug("Can't lowercase something that isn't a string",
339
+ :field => field, :value => event[field])
340
+ end
341
+ end
342
+ end # def lowercase
343
+
344
+ private
345
+ def split(event)
346
+ @split.each do |field, separator|
347
+ if event[field].is_a?(String)
348
+ event[field] = event[field].split(separator)
349
+ else
350
+ @logger.debug("Can't split something that isn't a string",
351
+ :field => field, :value => event[field])
352
+ end
353
+ end
354
+ end
355
+
356
+ private
357
+ def join(event)
358
+ @join.each do |field, separator|
359
+ if event[field].is_a?(Array)
360
+ event[field] = event[field].join(separator)
361
+ end
362
+ end
363
+ end
364
+
365
+ private
366
+ def strip(event)
367
+ @strip.each do |field|
368
+ if event[field].is_a?(Array)
369
+ event[field] = event[field].map{|s| s.strip }
370
+ elsif event[field].is_a?(String)
371
+ event[field] = event[field].strip
372
+ end
373
+ end
374
+ end
375
+
376
+ private
377
+ def merge(event)
378
+ @merge.each do |dest_field, added_fields|
379
+ #When multiple calls, added_field is an array
380
+ added_fields = [ added_fields ] if ! added_fields.is_a?(Array)
381
+ added_fields.each do |added_field|
382
+ if event[dest_field].is_a?(Hash) ^ event[added_field].is_a?(Hash)
383
+ @logger.error("Not possible to merge an array and a hash: ",
384
+ :dest_field => dest_field,
385
+ :added_field => added_field )
386
+ next
387
+ end
388
+ if event[dest_field].is_a?(Hash) #No need to test the other
389
+ event[dest_field].update(event[added_field])
390
+ else
391
+ event[dest_field] = [event[dest_field]] if ! event[dest_field].is_a?(Array)
392
+ event[added_field] = [event[added_field]] if ! event[added_field].is_a?(Array)
393
+ event[dest_field].concat(event[added_field])
394
+ end
395
+ end
396
+ end
397
+ end
398
+
399
+ end # class LogStash::Filters::Mutate
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # No-op filter. This is used generally for internal/dev testing.
6
+ class LogStash::Filters::NOOP < LogStash::Filters::Base
7
+ config_name "noop"
8
+ milestone 2
9
+
10
+ public
11
+ def register
12
+ # Nothing
13
+ end # def register
14
+
15
+ public
16
+ def filter(event)
17
+ return unless filter?(event)
18
+ # Nothing to do
19
+ filter_matched(event)
20
+ end # def filter
21
+ end # class LogStash::Filters::NOOP
@@ -0,0 +1,149 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # The prune filter is for pruning event data from @fileds based on whitelist/blacklist
6
+ # of field names or their values (names and values can also be regular expressions).
7
+
8
+ class LogStash::Filters::Prune < LogStash::Filters::Base
9
+ config_name "prune"
10
+ milestone 1
11
+
12
+ # Trigger whether configation fields and values should be interpolated for
13
+ # dynamic values.
14
+ # Probably adds some performance overhead. Defaults to false.
15
+ config :interpolate, :validate => :boolean, :default => false
16
+
17
+ # Include only fields only if their names match specified regexps, default to empty list which means include everything.
18
+ #
19
+ # filter {
20
+ # %PLUGIN% {
21
+ # tags => [ "apache-accesslog" ]
22
+ # whitelist_names => [ "method", "(referrer|status)", "${some}_field" ]
23
+ # }
24
+ # }
25
+ config :whitelist_names, :validate => :array, :default => []
26
+
27
+ # Exclude fields which names match specified regexps, by default exclude unresolved %{field} strings.
28
+ #
29
+ # filter {
30
+ # %PLUGIN% {
31
+ # tags => [ "apache-accesslog" ]
32
+ # blacklist_names => [ "method", "(referrer|status)", "${some}_field" ]
33
+ # }
34
+ # }
35
+ config :blacklist_names, :validate => :array, :default => [ "%\{[^}]+\}" ]
36
+
37
+ # Include specified fields only if their values match regexps.
38
+ # In case field values are arrays, the fields are pruned on per array item
39
+ # thus only matching array items will be included.
40
+ #
41
+ # filter {
42
+ # %PLUGIN% {
43
+ # tags => [ "apache-accesslog" ]
44
+ # whitelist_values => [ "uripath", "/index.php",
45
+ # "method", "(GET|POST)",
46
+ # "status", "^[^2]" ]
47
+ # }
48
+ # }
49
+ config :whitelist_values, :validate => :hash, :default => {}
50
+
51
+ # Exclude specified fields if their values match regexps.
52
+ # In case field values are arrays, the fields are pruned on per array item
53
+ # in case all array items are matched whole field will be deleted.
54
+ #
55
+ # filter {
56
+ # %PLUGIN% {
57
+ # tags => [ "apache-accesslog" ]
58
+ # blacklist_values => [ "uripath", "/index.php",
59
+ # "method", "(HEAD|OPTIONS)",
60
+ # "status", "^[^2]" ]
61
+ # }
62
+ # }
63
+ config :blacklist_values, :validate => :hash, :default => {}
64
+
65
+ public
66
+ def register
67
+ unless @interpolate
68
+ @whitelist_names_regexp = Regexp.union(@whitelist_names.map {|x| Regexp.new(x)})
69
+ @blacklist_names_regexp = Regexp.union(@blacklist_names.map {|x| Regexp.new(x)})
70
+ @whitelist_values.each do |key, value|
71
+ @whitelist_values[key] = Regexp.new(value)
72
+ end
73
+ @blacklist_values.each do |key, value|
74
+ @blacklist_values[key] = Regexp.new(value)
75
+ end
76
+ end
77
+ end # def register
78
+
79
+ public
80
+ def filter(event)
81
+ return unless filter?(event)
82
+
83
+ hash = event.to_hash
84
+
85
+ # We need to collect fields which needs to be remove ,and only in the end
86
+ # actually remove it since then interpolation mode you can get unexpected
87
+ # results as fields with dynamic values will not match since the fields to
88
+ # which they refer have already been removed.
89
+ fields_to_remove = []
90
+
91
+ unless @whitelist_names.empty?
92
+ @whitelist_names_regexp = Regexp.union(@whitelist_names.map {|x| Regexp.new(event.sprintf(x))}) if @interpolate
93
+ hash.each_key do |field|
94
+ fields_to_remove << field unless field.match(@whitelist_names_regexp)
95
+ end
96
+ end
97
+
98
+ unless @blacklist_names.empty?
99
+ @blacklist_names_regexp = Regexp.union(@blacklist_names.map {|x| Regexp.new(event.sprintf(x))}) if @interpolate
100
+ hash.each_key do |field|
101
+ fields_to_remove << field if field.match(@blacklist_names_regexp)
102
+ end
103
+ end
104
+
105
+ @whitelist_values.each do |key, value|
106
+ if @interpolate
107
+ key = event.sprintf(key)
108
+ value = Regexp.new(event.sprintf(value))
109
+ end
110
+ if hash[key]
111
+ if hash[key].is_a?(Array)
112
+ subvalues_to_remove = hash[key].find_all{|x| not x.match(value)}
113
+ unless subvalues_to_remove.empty?
114
+ fields_to_remove << (subvalues_to_remove.length == hash[key].length ? key : { :key => key, :values => subvalues_to_remove })
115
+ end
116
+ else
117
+ fields_to_remove << key if not hash[key].match(value)
118
+ end
119
+ end
120
+ end
121
+
122
+ @blacklist_values.each do |key, value|
123
+ if @interpolate
124
+ key = event.sprintf(key)
125
+ value = Regexp.new(event.sprintf(value))
126
+ end
127
+ if hash[key]
128
+ if hash[key].is_a?(Array)
129
+ subvalues_to_remove = hash[key].find_all{|x| x.match(value)}
130
+ unless subvalues_to_remove.empty?
131
+ fields_to_remove << (subvalues_to_remove.length == hash[key].length ? key : { :key => key, :values => subvalues_to_remove })
132
+ end
133
+ else
134
+ fields_to_remove << key if hash[key].match(value)
135
+ end
136
+ end
137
+ end
138
+
139
+ fields_to_remove.each do |field|
140
+ if field.is_a?(Hash)
141
+ hash[field[:key]] = hash[field[:key]] - field[:values]
142
+ else
143
+ hash.delete(field)
144
+ end
145
+ end
146
+
147
+ filter_matched(event)
148
+ end # def filter
149
+ end # class LogStash::Filters::Prune