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,8 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/logging"
4
+
5
+ require "thread" # for SizedQueue
6
+ class LogStash::SizedQueue < SizedQueue
7
+ # TODO(sissel): Soon will implement push/pop stats, etc
8
+ end
@@ -0,0 +1,183 @@
1
+ # encoding: utf-8
2
+ require "rubygems"
3
+ require "optparse"
4
+
5
+ # TODO(sissel): Are these necessary anymore?
6
+ #$:.unshift "#{File.dirname(__FILE__)}/../lib"
7
+ #$:.unshift "#{File.dirname(__FILE__)}/../test"
8
+
9
+ require "logstash/namespace"
10
+ require "logstash/loadlibs"
11
+ require "logstash/logging"
12
+
13
+ class LogStash::Test
14
+ public
15
+ def initialize
16
+ log_to(STDERR)
17
+
18
+ # This is lib/logstash/test.rb, so go up 2 directories for the plugin path
19
+ if jarred?(__FILE__)
20
+ @plugin_paths = [ File.dirname(File.dirname(__FILE__)) ]
21
+ else
22
+ @plugin_paths = [ File.dirname(File.dirname(File.dirname(__FILE__))) ]
23
+ end
24
+ @verbose = 0
25
+ end # def initialize
26
+
27
+ private
28
+ def jarred?(path)
29
+ return path =~ /^file:/
30
+ end # def jarred?
31
+
32
+ public
33
+ def log_to(target)
34
+ @logger = LogStash::Logger.new(target)
35
+ end # def log_to
36
+
37
+ def check_lib(lib, provider, is=:optional, message=nil)
38
+ optional = (is == :optional)
39
+ begin
40
+ require lib
41
+ puts "+ Found #{optional ? "optional" : "required"} library '#{lib}'"
42
+ return { :optional => optional, :found => true }
43
+ rescue LoadError => e
44
+ puts "- Missing #{optional ? "optional" : "required"} library '#{lib}'" \
45
+ "- try 'gem install #{provider}'" \
46
+ "#{optional ? " if you want this library" : ""}. #{message}"
47
+ return { :optional => optional, :found => false }
48
+ end
49
+ end # def check_lib
50
+
51
+ def report_ruby_version
52
+ puts "Running #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} on #{RUBY_PLATFORM}"
53
+ end # def report_ruby_version
54
+
55
+ def check_libraries
56
+ results = [
57
+ # main agent
58
+ check_lib("grok-pure", "jls-grok", :optional, "needed for the grok filter."),
59
+ check_lib("bunny", "bunny", :optional, "needed for AMQP input and output"),
60
+ check_lib("uuidtools", "uuidtools", :required,
61
+ "needed for AMQP input and output"),
62
+ check_lib("ap", "awesome_print", :optional, "improve debug logging output"),
63
+ check_lib("json", "json", :required, "required for logstash to function"),
64
+ check_lib("filewatch/tail", "filewatch", :optional,
65
+ "required for file input"),
66
+ check_lib("jruby-elasticsearch", "jruby-elasticsearch", :optional,
67
+ "required for elasticsearch output and for logstash web"),
68
+ check_lib("stomp", "stomp", :optional,
69
+ "required for stomp input and output"),
70
+ check_lib("mongo", "mongo", :optional, "required for mongo output"),
71
+ check_lib("redis", "redis", :optional,
72
+ "required for stomp input and output"),
73
+ check_lib("gelf", "gelf", :optional, "required for gelf (graylog2) output"),
74
+ check_lib("statsd", "statsd-ruby", :optional, "required for statsd output"),
75
+
76
+ # logstash web
77
+ check_lib("ftw", "ftw", :required, "needed for logstash web"),
78
+ check_lib("rack", "rack", :required, "needed for logstash web"),
79
+ check_lib("sinatra", "sinatra", :required, "needed for logstash web"),
80
+ check_lib("sass", "sass", :required, "needed for logstash web"),
81
+ check_lib("haml", "haml", :required, "needed for logstash web"),
82
+ ]
83
+
84
+ missing_required = results.count { |r| !r[:optional] and !r[:found] }
85
+ if missing_required == 0
86
+ puts "All required libraries found :)"
87
+ else
88
+ suffix = (missing_required > 1) ? "ies" : "y"
89
+ puts "FATAL: Missing #{missing_required} required librar#{suffix}"
90
+ return false
91
+ end
92
+
93
+ return true
94
+ end # def check_libraries
95
+
96
+ # Parse options.
97
+ private
98
+ def options(args)
99
+ # strip out the pluginpath argument if it exists and
100
+ # extend the LOAD_PATH for the ruby runtime
101
+ opts = OptionParser.new
102
+
103
+ opts.on("-v", "Increase verbosity") do
104
+ @verbose += 1
105
+ end
106
+
107
+ # Step one is to add test flags.
108
+ opts.on("--pluginpath PLUGINPATH",
109
+ "Load plugins and test from a pluginpath") do |path|
110
+ @plugin_paths << path
111
+ end # --pluginpath PLUGINPATH
112
+
113
+ begin
114
+ remainder = opts.parse(args)
115
+ rescue OptionParser::InvalidOption => e
116
+ @logger.info("Invalid option", :exception => e)
117
+ raise e
118
+ end
119
+ return remainder
120
+ end # def options
121
+
122
+ public
123
+ def run(args)
124
+ remainder = options(args)
125
+
126
+ if @verbose >= 3 # Uber debugging.
127
+ @logger.level = :debug
128
+ $DEBUG = true
129
+ elsif @verbose == 2 # logstash debug logs
130
+ @logger.level = :debug
131
+ elsif @verbose == 1 # logstash info logs
132
+ @logger.level = :info
133
+ else # Default log level
134
+ @logger.level = :warn
135
+ end
136
+
137
+ @success = true
138
+ @thread = Thread.new do
139
+ report_ruby_version
140
+
141
+ # TODO(sissel): Rewrite this into a proper test?
142
+ #if !check_libraries
143
+ #puts "Library check failed."
144
+ #@success = false
145
+ #end
146
+
147
+ @plugin_paths.each do |path|
148
+ load_tests(path)
149
+ end
150
+
151
+ require "minitest/spec"
152
+ @status = MiniTest::Unit.new.run(ARGV)
153
+ end # the runner thread
154
+ return remainder
155
+ end # def run
156
+
157
+ def wait
158
+ @thread.join
159
+ return @status
160
+ end # def wait
161
+
162
+ # Find tests in a given path. Tests must be in the plugin path +
163
+ # "/test/.../test_*.rb"
164
+ def each_test(basepath, &block)
165
+ if jarred?(basepath)
166
+ # No test/logstash/... hierarchy in the jar, not right now anyway.
167
+ glob_path = File.join(basepath, "logstash", "**", "test_*.rb")
168
+ else
169
+ glob_path = File.join(basepath, "test", "**", "test_*.rb")
170
+ end
171
+ @logger.info("Searching for tests", :path => glob_path)
172
+ Dir.glob(glob_path).each do |path|
173
+ block.call(path)
174
+ end
175
+ end # def each_test
176
+
177
+ def load_tests(path)
178
+ each_test(path) do |test|
179
+ @logger.info("Loading test", :test => test)
180
+ require test
181
+ end
182
+ end # def load_tests
183
+ end # class LogStash::Test
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/logging"
4
+
5
+ class LogStash::ThreadWatchdog
6
+ attr_accessor :logger
7
+ attr_accessor :threads
8
+
9
+ class TimeoutError < StandardError; end
10
+
11
+ public
12
+ def initialize(threads, watchdog_timeout=10)
13
+ @threads = threads
14
+ @watchdog_timeout = watchdog_timeout
15
+ end # def initialize
16
+
17
+ public
18
+ def watch
19
+ while sleep(1)
20
+ cutoff = Time.now - @watchdog_timeout
21
+ @threads.each do |t|
22
+ watchdog = t[:watchdog]
23
+ if watchdog and watchdog <= cutoff
24
+ age = Time.now - watchdog
25
+ @logger.fatal("thread watchdog timeout",
26
+ :thread => t,
27
+ :backtrace => t.backtrace,
28
+ :thread_watchdog => watchdog,
29
+ :age => age,
30
+ :cutoff => @watchdog_timeout,
31
+ :state => t[:watchdog_state])
32
+ raise TimeoutError, "watchdog timeout"
33
+ end
34
+ end
35
+ end
36
+ end # def watch
37
+ end # class LogStash::ThreadWatchdog
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+
4
+ # Provide our own Time wrapper for ISO8601 support
5
+ # Example:
6
+ # >> LogStash::Time.now.to_iso8601
7
+ # => "2010-10-17 00:25:24.619014-0700"
8
+ #
9
+ # >> LogStash::Time.now.utc.to_iso8601
10
+ # => "2010-10-17 07:25:26.788704Z"
11
+ module LogStash::Time
12
+ ISO8601_STRFTIME = "%04d-%02d-%02dT%02d:%02d:%02d.%06d%+03d:00".freeze
13
+ def self.now
14
+ return Time.new.utc
15
+ end
16
+
17
+ if RUBY_PLATFORM == "java"
18
+ #JODA_ISO8601_PARSER = org.joda.time.format.ISODateTimeFormat.dateTimeParser
19
+ #JODA_ISO8601_PARSER = org.joda.time.format.ISODateTimeFormat.dateTimeParser
20
+ JODA_ISO8601_PARSER = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
21
+ UTC = org.joda.time.DateTimeZone.forID("UTC")
22
+ def self.parse_iso8601(t)
23
+ millis = JODA_ISO8601_PARSER.parseMillis(t)
24
+ return Time.at(millis / 1000, (millis % 1000) * 1000)
25
+ end
26
+ else
27
+ def self.parse_iso8601(t)
28
+ # Warning, ruby's Time.parse is *really* terrible and slow.
29
+ return unless t.is_a?(String)
30
+ return Time.parse(t).gmtime
31
+ end
32
+ end
33
+ end # module LogStash::Time
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+
4
+ module LogStash::Util
5
+ UNAME = case RbConfig::CONFIG["host_os"]
6
+ when /^linux/; "linux"
7
+ else; RbConfig::CONFIG["host_os"]
8
+ end
9
+
10
+ PR_SET_NAME = 15
11
+ def self.set_thread_name(name)
12
+ if RUBY_ENGINE == "jruby"
13
+ # Keep java and ruby thread names in sync.
14
+ Java::java.lang.Thread.currentThread.setName(name)
15
+ end
16
+ Thread.current[:name] = name
17
+
18
+ if UNAME == "linux"
19
+ require "logstash/util/prctl"
20
+ # prctl PR_SET_NAME allows up to 16 bytes for a process name
21
+ # since MRI 1.9, JRuby, and Rubinius use system threads for this.
22
+ LibC.prctl(PR_SET_NAME, name[0..16], 0, 0, 0)
23
+ end
24
+ end # def set_thread_name
25
+
26
+ # Merge hash 'src' into 'dst' nondestructively
27
+ #
28
+ # Duplicate keys will become array values
29
+ #
30
+ # [ src["foo"], dst["foo"] ]
31
+ def self.hash_merge(dst, src)
32
+ src.each do |name, svalue|
33
+ if dst.include?(name)
34
+ dvalue = dst[name]
35
+ if dvalue.is_a?(Hash) && svalue.is_a?(Hash)
36
+ dvalue = hash_merge(dvalue, svalue)
37
+ elsif svalue.is_a?(Array)
38
+ if dvalue.is_a?(Array)
39
+ # merge arrays without duplicates.
40
+ dvalue |= svalue
41
+ else
42
+ dvalue = [dvalue] | svalue
43
+ end
44
+ else
45
+ if dvalue.is_a?(Array)
46
+ dvalue << svalue unless dvalue.include?(svalue)
47
+ else
48
+ dvalue = [dvalue, svalue] unless dvalue == svalue
49
+ end
50
+ end
51
+
52
+ dst[name] = dvalue
53
+ else
54
+ # dst doesn't have this key, just set it.
55
+ dst[name] = svalue
56
+ end
57
+ end
58
+
59
+ return dst
60
+ end # def self.hash_merge
61
+
62
+ # Merge hash 'src' into 'dst' nondestructively
63
+ #
64
+ # Duplicate keys will become array values
65
+ # Arrays merged will simply be appended.
66
+ #
67
+ # [ src["foo"], dst["foo"] ]
68
+ def self.hash_merge_with_dups(dst, src)
69
+ src.each do |name, svalue|
70
+ if dst.include?(name)
71
+ dvalue = dst[name]
72
+ if dvalue.is_a?(Hash) && svalue.is_a?(Hash)
73
+ dvalue = hash_merge(dvalue, svalue)
74
+ elsif svalue.is_a?(Array)
75
+ if dvalue.is_a?(Array)
76
+ # merge arrays without duplicates.
77
+ dvalue += svalue
78
+ else
79
+ dvalue = [dvalue] + svalue
80
+ end
81
+ else
82
+ if dvalue.is_a?(Array)
83
+ dvalue << svalue unless dvalue.include?(svalue)
84
+ else
85
+ dvalue = [dvalue, svalue] unless dvalue == svalue
86
+ end
87
+ end
88
+
89
+ dst[name] = dvalue
90
+ else
91
+ # dst doesn't have this key, just set it.
92
+ dst[name] = svalue
93
+ end
94
+ end
95
+
96
+ return dst
97
+ end # def self.hash_merge
98
+
99
+ def self.hash_merge_many(*hashes)
100
+ dst = {}
101
+ hashes.each do |hash|
102
+ hash_merge_with_dups(dst, hash)
103
+ end
104
+ return dst
105
+ end # def hash_merge_many
106
+ end # module LogStash::Util
@@ -0,0 +1,139 @@
1
+ # encoding: utf-8
2
+ # BufferedTokenizer - Statefully split input data by a specifiable token
3
+ #
4
+ # Authors:: Tony Arcieri, Martin Emde
5
+ #
6
+ #----------------------------------------------------------------------------
7
+ #
8
+ # Copyright (C) 2006-07 by Tony Arcieri and Martin Emde
9
+ #
10
+ # Distributed under the Ruby license (http://www.ruby-lang.org/en/LICENSE.txt)
11
+ #
12
+ #---------------------------------------------------------------------------
13
+ #
14
+
15
+ # (C)2006 Tony Arcieri, Martin Emde
16
+ # Distributed under the Ruby license (http://www.ruby-lang.org/en/LICENSE.txt)
17
+
18
+ # BufferedTokenizer takes a delimiter upon instantiation, or acts line-based
19
+ # by default. It allows input to be spoon-fed from some outside source which
20
+ # receives arbitrary length datagrams which may-or-may-not contain the token
21
+ # by which entities are delimited.
22
+ #
23
+ # Commonly used to parse lines out of incoming data:
24
+ #
25
+ # module LineBufferedConnection
26
+ # def receive_data(data)
27
+ # (@buffer ||= BufferedTokenizer.new).extract(data).each do |line|
28
+ # receive_line(line)
29
+ # end
30
+ # end
31
+ # end
32
+
33
+ module FileWatch; class BufferedTokenizer
34
+ # New BufferedTokenizers will operate on lines delimited by "\n" by default
35
+ # or allow you to specify any delimiter token you so choose, which will then
36
+ # be used by String#split to tokenize the input data
37
+ def initialize(delimiter = "\n", size_limit = nil)
38
+ # Store the specified delimiter
39
+ @delimiter = delimiter
40
+
41
+ # Store the specified size limitation
42
+ @size_limit = size_limit
43
+
44
+ # The input buffer is stored as an array. This is by far the most efficient
45
+ # approach given language constraints (in C a linked list would be a more
46
+ # appropriate data structure). Segments of input data are stored in a list
47
+ # which is only joined when a token is reached, substantially reducing the
48
+ # number of objects required for the operation.
49
+ @input = []
50
+
51
+ # Size of the input buffer
52
+ @input_size = 0
53
+ end
54
+
55
+ # Extract takes an arbitrary string of input data and returns an array of
56
+ # tokenized entities, provided there were any available to extract. This
57
+ # makes for easy processing of datagrams using a pattern like:
58
+ #
59
+ # tokenizer.extract(data).map { |entity| Decode(entity) }.each do ...
60
+ def extract(data)
61
+ # Extract token-delimited entities from the input string with the split command.
62
+ # There's a bit of craftiness here with the -1 parameter. Normally split would
63
+ # behave no differently regardless of if the token lies at the very end of the
64
+ # input buffer or not (i.e. a literal edge case) Specifying -1 forces split to
65
+ # return "" in this case, meaning that the last entry in the list represents a
66
+ # new segment of data where the token has not been encountered
67
+ entities = data.split @delimiter, -1
68
+
69
+ # Check to see if the buffer has exceeded capacity, if we're imposing a limit
70
+ if @size_limit
71
+ raise 'input buffer full' if @input_size + entities.first.size > @size_limit
72
+ @input_size += entities.first.size
73
+ end
74
+
75
+ # Move the first entry in the resulting array into the input buffer. It represents
76
+ # the last segment of a token-delimited entity unless it's the only entry in the list.
77
+ @input << entities.shift
78
+
79
+ # If the resulting array from the split is empty, the token was not encountered
80
+ # (not even at the end of the buffer). Since we've encountered no token-delimited
81
+ # entities this go-around, return an empty array.
82
+ return [] if entities.empty?
83
+
84
+ # At this point, we've hit a token, or potentially multiple tokens. Now we can bring
85
+ # together all the data we've buffered from earlier calls without hitting a token,
86
+ # and add it to our list of discovered entities.
87
+ entities.unshift @input.join
88
+
89
+ =begin
90
+ # Note added by FC, 10Jul07. This paragraph contains a regression. It breaks
91
+ # empty tokens. Think of the empty line that delimits an HTTP header. It will have
92
+ # two "\n" delimiters in a row, and this code mishandles the resulting empty token.
93
+ # It someone figures out how to fix the problem, we can re-enable this code branch.
94
+ # Multi-character token support.
95
+ # Split any tokens that were incomplete on the last iteration buf complete now.
96
+ entities.map! do |e|
97
+ e.split @delimiter, -1
98
+ end
99
+ # Flatten the resulting array. This has the side effect of removing the empty
100
+ # entry at the end that was produced by passing -1 to split. Add it again if
101
+ # necessary.
102
+ if (entities[-1] == [])
103
+ entities.flatten! << []
104
+ else
105
+ entities.flatten!
106
+ end
107
+ =end
108
+
109
+ # Now that we've hit a token, joined the input buffer and added it to the entities
110
+ # list, we can go ahead and clear the input buffer. All of the segments that were
111
+ # stored before the join can now be garbage collected.
112
+ @input.clear
113
+
114
+ # The last entity in the list is not token delimited, however, thanks to the -1
115
+ # passed to split. It represents the beginning of a new list of as-yet-untokenized
116
+ # data, so we add it to the start of the list.
117
+ @input << entities.pop
118
+
119
+ # Set the new input buffer size, provided we're keeping track
120
+ @input_size = @input.first.size if @size_limit
121
+
122
+ # Now we're left with the list of extracted token-delimited entities we wanted
123
+ # in the first place. Hooray!
124
+ entities
125
+ end
126
+
127
+ # Flush the contents of the input buffer, i.e. return the input buffer even though
128
+ # a token has not yet been encountered
129
+ def flush
130
+ buffer = @input.join
131
+ @input.clear
132
+ buffer
133
+ end
134
+
135
+ # Is the buffer empty?
136
+ def empty?
137
+ @input.empty?
138
+ end
139
+ end; end