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,58 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+ require "securerandom"
5
+
6
+ # The uuid filter allows you to add a UUID field to messages.
7
+ # This is useful to be able to control the _id messages are indexed into Elasticsearch
8
+ # with, so that you can insert duplicate messages (i.e. the same message multiple times
9
+ # without creating duplicates) - for log pipeline reliability
10
+ #
11
+ class LogStash::Filters::Uuid < LogStash::Filters::Base
12
+ config_name "uuid"
13
+ milestone 2
14
+
15
+ # Add a UUID to a field.
16
+ #
17
+ # Example:
18
+ #
19
+ # filter {
20
+ # uuid {
21
+ # target => "@uuid"
22
+ # }
23
+ # }
24
+ config :target, :validate => :string, :required => true
25
+
26
+ # If the value in the field currently (if any) should be overridden
27
+ # by the generated UUID. Defaults to false (i.e. if the field is
28
+ # present, with ANY value, it won't be overridden)
29
+ #
30
+ # Example:
31
+ #
32
+ # filter {
33
+ # uuid {
34
+ # target => "@uuid"
35
+ # overwrite => true
36
+ # }
37
+ # }
38
+ config :overwrite, :validate => :boolean, :default => false
39
+
40
+ public
41
+ def register
42
+ end # def register
43
+
44
+ public
45
+ def filter(event)
46
+ return unless filter?(event)
47
+
48
+ if overwrite
49
+ event[target] = SecureRandom.uuid
50
+ else
51
+ event[target] ||= SecureRandom.uuid
52
+ end
53
+
54
+ filter_matched(event)
55
+ end # def filter
56
+
57
+ end # class LogStash::Filters::Uuid
58
+
@@ -0,0 +1,139 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # XML filter. Takes a field that contains XML and expands it into
6
+ # an actual datastructure.
7
+ class LogStash::Filters::Xml < LogStash::Filters::Base
8
+
9
+ config_name "xml"
10
+ milestone 1
11
+
12
+ # Config for xml to hash is:
13
+ #
14
+ # source => source_field
15
+ #
16
+ # For example, if you have the whole xml document in your @message field:
17
+ #
18
+ # filter {
19
+ # xml {
20
+ # source => "message"
21
+ # }
22
+ # }
23
+ #
24
+ # The above would parse the xml from the @message field
25
+ config :source, :validate => :string
26
+
27
+ # Define target for placing the data
28
+ #
29
+ # for example if you want the data to be put in the 'doc' field:
30
+ #
31
+ # filter {
32
+ # xml {
33
+ # target => "doc"
34
+ # }
35
+ # }
36
+ #
37
+ # XML in the value of the source field will be expanded into a
38
+ # datastructure in the "target" field.
39
+ # Note: if the "target" field already exists, it will be overridden
40
+ # Required
41
+ config :target, :validate => :string
42
+
43
+ # xpath will additionally select string values (.to_s on whatever is selected)
44
+ # from parsed XML (using each source field defined using the method above)
45
+ # and place those values in the destination fields. Configuration:
46
+ #
47
+ # xpath => [ "xpath-syntax", "destination-field" ]
48
+ #
49
+ # Values returned by XPath parsring from xpath-synatx will be put in the
50
+ # destination field. Multiple values returned will be pushed onto the
51
+ # destination field as an array. As such, multiple matches across
52
+ # multiple source fields will produce duplicate entries in the field
53
+ #
54
+ # More on xpath: http://www.w3schools.com/xpath/
55
+ #
56
+ # The xpath functions are particularly powerful:
57
+ # http://www.w3schools.com/xpath/xpath_functions.asp
58
+ #
59
+ config :xpath, :validate => :hash, :default => {}
60
+
61
+ # By default the filter will store the whole parsed xml in the destination
62
+ # field as described above. Setting this to false will prevent that.
63
+ config :store_xml, :validate => :boolean, :default => true
64
+
65
+ public
66
+ def register
67
+ require "nokogiri"
68
+ require "xmlsimple"
69
+
70
+ end # def register
71
+
72
+ public
73
+ def filter(event)
74
+ return unless filter?(event)
75
+ matched = false
76
+
77
+ @logger.debug("Running xml filter", :event => event)
78
+
79
+ return unless event.include?(@source)
80
+
81
+ value = event[@source]
82
+
83
+ if value.is_a?(Array) && value.length > 1
84
+ @logger.warn("XML filter only works on fields of length 1",
85
+ :source => @source, :value => value)
86
+ return
87
+ end
88
+
89
+ # Do nothing with an empty string.
90
+ return if value.strip.length == 0
91
+
92
+ if @xpath
93
+ begin
94
+ doc = Nokogiri::XML(value)
95
+ rescue => e
96
+ event.tag("_xmlparsefailure")
97
+ @logger.warn("Trouble parsing xml", :source => @source, :value => value,
98
+ :exception => e, :backtrace => e.backtrace)
99
+ return
100
+ end
101
+
102
+ @xpath.each do |xpath_src, xpath_dest|
103
+ nodeset = doc.xpath(xpath_src)
104
+
105
+ # If asking xpath for a String, like "name(/*)", we get back a
106
+ # String instead of a NodeSet. We normalize that here.
107
+ normalized_nodeset = nodeset.kind_of?(Nokogiri::XML::NodeSet) ? nodeset : [nodeset]
108
+
109
+ normalized_nodeset.each do |value|
110
+ # some XPath functions return empty arrays as string
111
+ if value.is_a?(Array)
112
+ return if value.length == 0
113
+ end
114
+
115
+ unless value.nil?
116
+ matched = true
117
+ event[xpath_dest] ||= []
118
+ event[xpath_dest] << value.to_s
119
+ end
120
+ end # XPath.each
121
+ end # @xpath.each
122
+ end # if @xpath
123
+
124
+ if @store_xml
125
+ begin
126
+ event[@target] = XmlSimple.xml_in(value)
127
+ matched = true
128
+ rescue => e
129
+ event.tag("_xmlparsefailure")
130
+ @logger.warn("Trouble parsing xml with XmlSimple", :source => @source,
131
+ :value => value, :exception => e, :backtrace => e.backtrace)
132
+ return
133
+ end
134
+ end # if @store_xml
135
+
136
+ filter_matched(event) if matched
137
+ @logger.debug("Event after xml filter", :event => event)
138
+ end # def filter
139
+ end # class LogStash::Filters::Xml
@@ -0,0 +1,123 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # ZeroMQ filter. This is the best way to send an event externally for filtering
6
+ # It works much like an exec filter would by sending the event "offsite"
7
+ # for processing and waiting for a response
8
+ #
9
+ # The protocol here is:
10
+ # * REQ sent with JSON-serialized logstash event
11
+ # * REP read expected to be the full JSON 'filtered' event
12
+ # * - if reply read is an empty string, it will cancel the event.
13
+ #
14
+ # Note that this is a limited subset of the zeromq functionality in
15
+ # inputs and outputs. The only topology that makes sense here is:
16
+ # REQ/REP.
17
+ class LogStash::Filters::ZeroMQ < LogStash::Filters::Base
18
+
19
+ config_name "zeromq"
20
+ milestone 1
21
+
22
+ # 0mq socket address to connect or bind
23
+ # Please note that inproc:// will not work with logstash
24
+ # as we use a context per thread
25
+ # By default, filters connect
26
+ config :address, :validate => :string, :default => "tcp://127.0.0.1:2121"
27
+
28
+ # The field to send off-site for processing
29
+ # If this is unset, the whole event will be sent
30
+ # TODO (lusis)
31
+ # Allow filtering multiple fields
32
+ config :field, :validate => :string
33
+
34
+ # 0mq mode
35
+ # server mode binds/listens
36
+ # client mode connects
37
+ config :mode, :validate => ["server", "client"], :default => "client"
38
+
39
+
40
+ # 0mq socket options
41
+ # This exposes zmq_setsockopt
42
+ # for advanced tuning
43
+ # see http://api.zeromq.org/2-1:zmq-setsockopt for details
44
+ #
45
+ # This is where you would set values like:
46
+ # ZMQ::HWM - high water mark
47
+ # ZMQ::IDENTITY - named queues
48
+ # ZMQ::SWAP_SIZE - space for disk overflow
49
+ # ZMQ::SUBSCRIBE - topic filters for pubsub
50
+ #
51
+ # example: sockopt => ["ZMQ::HWM", 50, "ZMQ::IDENTITY", "my_named_queue"]
52
+ config :sockopt, :validate => :hash
53
+
54
+ public
55
+ def initialize(params)
56
+ super(params)
57
+
58
+ @threadsafe = false
59
+ end
60
+
61
+ public
62
+ def register
63
+ require "ffi-rzmq"
64
+ require "logstash/util/zeromq"
65
+ self.class.send(:include, LogStash::Util::ZeroMQ)
66
+
67
+ @zsocket = context.socket(ZMQ::REQ)
68
+
69
+ error_check(@zsocket.setsockopt(ZMQ::LINGER, 1),
70
+ "while setting ZMQ::LINGER == 1)")
71
+
72
+ if @sockopt
73
+ setopts(@zsocket, @sockopt)
74
+ end
75
+
76
+ setup(@zsocket, @address)
77
+ end # def register
78
+
79
+ public
80
+ def filter(event)
81
+ return unless filter?(event)
82
+
83
+ # TODO (lusis)
84
+ # Need to set a timeout on the socket
85
+ # If it never gets a reply, filtering stops cold
86
+ begin
87
+ if @field
88
+ @logger.debug("0mq: sending", :request => event[@field])
89
+ error_check(@zsocket.send_string(event[@field]), "in send_string")
90
+ else
91
+ @logger.debug("0mq: sending", :request => event.to_json)
92
+ error_check(@zsocket.send_string(event.to_json), "in send_string")
93
+ end
94
+ reply = ''
95
+ rc = @zsocket.recv_string(reply)
96
+ error_check(rc, "in recv_string")
97
+
98
+ # If we receive an empty reply, this is an indication that the filter
99
+ # wishes to cancel this event.
100
+ if reply.empty?
101
+ event.cancel
102
+ return
103
+ end
104
+ @logger.debug("0mq: receiving", :reply => reply)
105
+ if @field
106
+ event[@field] = event.sprintf(reply)
107
+ filter_matched(event)
108
+ else
109
+ reply = JSON.parse(reply)
110
+ event.overwrite(reply)
111
+ end
112
+ filter_matched(event)
113
+ rescue => e
114
+ @logger.warn("0mq filter exception", :address => @address, :exception => e, :backtrace => e.backtrace)
115
+ end
116
+ end # def filter
117
+
118
+ private
119
+ def server?
120
+ @mode == "server"
121
+ end # def server?
122
+
123
+ end # class LogStash::Filters::ZeroMQ
@@ -0,0 +1,122 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/logging"
4
+ require "logstash/plugin"
5
+ require "logstash/config/mixin"
6
+ require "stud/interval"
7
+
8
+ # TODO(sissel): Should this really be a 'plugin' ?
9
+ class LogStash::FilterWorker < LogStash::Plugin
10
+ include Stud
11
+ attr_accessor :logger
12
+ attr_accessor :filters
13
+ attr_reader :after_filter
14
+
15
+ Exceptions = [Exception]
16
+ Exceptions << java.lang.Exception if RUBY_ENGINE == "jruby"
17
+
18
+ def initialize(filters, input_queue, output_queue)
19
+ @filters = filters
20
+ @input_queue = input_queue
21
+ @output_queue = output_queue
22
+ @shutdown_requested = false
23
+ end # def initialize
24
+
25
+ #This block is called after each filter is done on an event.
26
+ #The filtered event and filter class name is passed to the block.
27
+ #This could be used to add metrics in the future?
28
+ def after_filter(&block)
29
+ @after_filter = block
30
+ end
31
+
32
+ def run
33
+ # TODO(sissel): Run a flusher thread for each plugin requesting flushes
34
+ # > It seems reasonable that you could want a multiline filter to flush
35
+ # after 5 seconds, but want a metrics filter to flush every 10 or 60.
36
+
37
+ # Set up the periodic flusher thread.
38
+ @flusher = Thread.new { interval(5) { flusher } }
39
+
40
+ while !@shutdown_requested && event = @input_queue.pop
41
+ if event == LogStash::SHUTDOWN
42
+ finished
43
+ @input_queue << LogStash::SHUTDOWN # for the next filter thread
44
+ return
45
+ end
46
+
47
+ filter(event)
48
+ end # while @input_queue.pop
49
+ finished
50
+ end # def run
51
+
52
+ def flusher
53
+ events = []
54
+ @filters.each do |filter|
55
+
56
+ # Filter any events generated so far in this flush.
57
+ events.each do |event|
58
+ # TODO(sissel): watchdog on flush filtration?
59
+ unless event.cancelled?
60
+ filter.filter(event)
61
+ @after_filter.call(event,filter) unless @after_filter.nil?
62
+ end
63
+ end
64
+
65
+ # TODO(sissel): watchdog on flushes?
66
+ if filter.respond_to?(:flush)
67
+ flushed = filter.flush
68
+ events += flushed if !flushed.nil? && flushed.any?
69
+ end
70
+ end
71
+
72
+ events.each do |event|
73
+ @logger.debug? and @logger.debug("Pushing flushed events", :event => event)
74
+ @output_queue.push(event) unless event.cancelled?
75
+ end
76
+ end # def flusher
77
+
78
+ def teardown
79
+ @shutdown_requested = true
80
+ end
81
+
82
+ def filter(original_event)
83
+ # Make an 'events' array that filters can push onto if they
84
+ # need to generate additional events based on the current event.
85
+ # The 'split' filter does this, for example.
86
+ events = [original_event]
87
+
88
+ events.each do |event|
89
+ @filters.each do |filter|
90
+ # Filter can emit multiple events, like the 'split' event, so
91
+ # give the input queue to dump generated events into.
92
+
93
+ # TODO(sissel): This may require some refactoring later, I am not sure
94
+ # this is the best approach. The goal is to allow filters to modify
95
+ # the current event, but if necessary, create new events based on
96
+ # this event.
97
+ begin
98
+ update_watchdog(:event => event, :filter => filter)
99
+ filter.execute(event) do |newevent|
100
+ events << newevent
101
+ end
102
+ rescue *Exceptions => e
103
+ @logger.warn("Exception during filter", :event => event,
104
+ :exception => $!, :backtrace => e.backtrace,
105
+ :filter => filter)
106
+ ensure
107
+ clear_watchdog
108
+ end
109
+ if event.cancelled?
110
+ @logger.debug? and @logger.debug("Event cancelled", :event => event,
111
+ :filter => filter.class)
112
+ break
113
+ end
114
+ @after_filter.call(event,filter) unless @after_filter.nil?
115
+ end # @filters.each
116
+
117
+ @logger.debug? and @logger.debug("Event finished filtering", :event => event,
118
+ :thread => Thread.current[:name])
119
+ @output_queue.push(event) unless event.cancelled?
120
+ end # events.each
121
+ end # def filter
122
+ end # class LogStash::FilterWorker
@@ -0,0 +1,125 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/event"
4
+ require "logstash/plugin"
5
+ require "logstash/logging"
6
+ require "logstash/config/mixin"
7
+ require "logstash/codecs/base"
8
+
9
+ # This is the base class for logstash inputs.
10
+ class LogStash::Inputs::Base < LogStash::Plugin
11
+ include LogStash::Config::Mixin
12
+ config_name "input"
13
+
14
+ # Add a 'type' field to all events handled by this input.
15
+ #
16
+ # Types are used mainly for filter activation.
17
+ #
18
+ # If you create an input with type "foobar", then only filters
19
+ # which also have type "foobar" will act on them.
20
+ #
21
+ # The type is also stored as part of the event itself, so you
22
+ # can also use the type to search for in the web interface.
23
+ #
24
+ # If you try to set a type on an event that already has one (for
25
+ # example when you send an event from a shipper to an indexer) then
26
+ # a new input will not override the existing type. A type set at
27
+ # the shipper stays with that event for its life even
28
+ # when sent to another LogStash server.
29
+ config :type, :validate => :string
30
+
31
+ # Set this to true to enable debugging on an input.
32
+ config :debug, :validate => :boolean, :default => false
33
+
34
+ # The format of input data (plain, json, json_event)
35
+ config :format, :validate => ["plain", "json", "json_event", "msgpack_event"], :deprecated => "You should use the newer 'codec' setting instead."
36
+
37
+ # The codec used for input data
38
+ config :codec, :validate => :codec, :default => "plain"
39
+
40
+ # The character encoding used in this input. Examples include "UTF-8"
41
+ # and "cp1252"
42
+ #
43
+ # This setting is useful if your log files are in Latin-1 (aka cp1252)
44
+ # or in another character set other than UTF-8.
45
+ #
46
+ # This only affects "plain" format logs since json is UTF-8 already.
47
+ config :charset, :validate => ::Encoding.name_list, :deprecated => true
48
+
49
+ # If format is "json", an event sprintf string to build what
50
+ # the display @message should be given (defaults to the raw JSON).
51
+ # sprintf format strings look like %{fieldname}
52
+ #
53
+ # If format is "json_event", ALL fields except for @type
54
+ # are expected to be present. Not receiving all fields
55
+ # will cause unexpected results.
56
+ config :message_format, :validate => :string, :deprecated => true
57
+
58
+ # Add any number of arbitrary tags to your event.
59
+ #
60
+ # This can help with processing later.
61
+ config :tags, :validate => :array
62
+
63
+ # Add a field to an event
64
+ config :add_field, :validate => :hash, :default => {}
65
+
66
+ attr_accessor :params
67
+ attr_accessor :threadable
68
+
69
+ public
70
+ def initialize(params={})
71
+ super
72
+ @threadable = false
73
+ config_init(params)
74
+ @tags ||= []
75
+
76
+ if @charset && @codec.class.get_config.include?("charset")
77
+ # charset is deprecated on inputs, but provide backwards compatibility
78
+ # by copying the charset setting into the codec.
79
+
80
+ @logger.info("Copying input's charset setting into codec", :input => self, :codec => @codec)
81
+ charset = @charset
82
+ @codec.instance_eval { @charset = charset }
83
+ end
84
+
85
+ # Backwards compat for the 'format' setting
86
+ case @format
87
+ when "plain"; # do nothing
88
+ when "json"
89
+ @codec = LogStash::Plugin.lookup("codec", "json").new
90
+ when "json_event"
91
+ @codec = LogStash::Plugin.lookup("codec", "oldlogstashjson").new
92
+ end
93
+
94
+ end # def initialize
95
+
96
+ public
97
+ def register
98
+ raise "#{self.class}#register must be overidden"
99
+ end # def register
100
+
101
+ public
102
+ def tag(newtag)
103
+ @tags << newtag
104
+ end # def tag
105
+
106
+ protected
107
+ def to_event(raw, source)
108
+ raise LogStash::ThisMethodWasRemoved("LogStash::Inputs::Base#to_event - you should use codecs now instead of to_event. Not sure what this means? Get help on logstash-users@googlegroups.com!")
109
+ end # def to_event
110
+
111
+ protected
112
+ def decorate(event)
113
+ # Only set 'type' if not already set. This is backwards-compatible behavior
114
+ event["type"] = @type if @type && !event.include?("type")
115
+
116
+ if @tags.any?
117
+ event["tags"] ||= []
118
+ event["tags"] += @tags
119
+ end
120
+
121
+ @add_field.each do |field, value|
122
+ event[field] = value
123
+ end
124
+ end
125
+ end # class LogStash::Inputs::Base