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,44 @@
1
+ {
2
+ "template" : "logstash-*",
3
+ "settings" : {
4
+ "index.refresh_interval" : "5s",
5
+ "analysis" : {
6
+ "analyzer" : {
7
+ "default" : {
8
+ "type" : "standard",
9
+ "stopwords" : "_none_"
10
+ }
11
+ }
12
+ }
13
+ },
14
+ "mappings" : {
15
+ "_default_" : {
16
+ "_all" : {"enabled" : true},
17
+ "dynamic_templates" : [ {
18
+ "string_fields" : {
19
+ "match" : "*",
20
+ "match_mapping_type" : "string",
21
+ "mapping" : {
22
+ "type" : "multi_field",
23
+ "fields" : {
24
+ "{name}" : {"type": "string", "index" : "analyzed", "omit_norms" : true },
25
+ "raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
26
+ }
27
+ }
28
+ }
29
+ } ],
30
+ "properties" : {
31
+ "@version": { "type": "string", "index": "not_analyzed" },
32
+ "geoip" : {
33
+ "type" : "object",
34
+ "dynamic": true,
35
+ "path": "full",
36
+ "properties" : {
37
+ "location" : { "type" : "geo_point" }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+
@@ -0,0 +1,256 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/outputs/base"
4
+ require "stud/buffer"
5
+
6
+ # This output lets you store logs in elasticsearch.
7
+ #
8
+ # This plugin uses the HTTP/REST interface to ElasticSearch, which usually
9
+ # lets you use any version of elasticsearch server. It is known to work
10
+ # with elasticsearch %ELASTICSEARCH_VERSION%
11
+ #
12
+ # You can learn more about elasticsearch at <http://elasticsearch.org>
13
+ class LogStash::Outputs::ElasticSearchHTTP < LogStash::Outputs::Base
14
+ include Stud::Buffer
15
+
16
+ config_name "elasticsearch_http"
17
+ milestone 2
18
+
19
+ # The index to write events to. This can be dynamic using the %{foo} syntax.
20
+ # The default value will partition your indices by day so you can more easily
21
+ # delete old data or only search specific date ranges.
22
+ config :index, :validate => :string, :default => "logstash-%{+YYYY.MM.dd}"
23
+
24
+ # The index type to write events to. Generally you should try to write only
25
+ # similar events to the same 'type'. String expansion '%{foo}' works here.
26
+ config :index_type, :validate => :string
27
+
28
+ # Starting in Logstash 1.3 (unless you set option "manage_template" to false)
29
+ # a default mapping template for Elasticsearch will be applied, if you do not
30
+ # already have one set to match the index pattern defined (default of
31
+ # "logstash-%{+YYYY.MM.dd}"), minus any variables. For example, in this case
32
+ # the template will be applied to all indices starting with logstash-*
33
+ #
34
+ # If you have dynamic templating (e.g. creating indices based on field names)
35
+ # then you should set "manage_template" to false and use the REST API to upload
36
+ # your templates manually.
37
+ config :manage_template, :validate => :boolean, :default => true
38
+
39
+ # This configuration option defines how the template is named inside Elasticsearch
40
+ # Note that if you have used the template management features and subsequently
41
+ # change this you will need to prune the old template manually, e.g.
42
+ # curl -XDELETE <http://localhost:9200/_template/OLD_template_name?pretty>
43
+ # where OLD_template_name is whatever the former setting was.
44
+ config :template_name, :validate => :string, :default => "logstash"
45
+
46
+ # You can set the path to your own template here, if you so desire.
47
+ # If not the included template will be used.
48
+ config :template, :validate => :path
49
+
50
+ # Overwrite the current template with whatever is configured
51
+ # in the template and template_name directives.
52
+ config :template_overwrite, :validate => :boolean, :default => false
53
+
54
+ # The hostname or ip address to reach your elasticsearch server.
55
+ config :host, :validate => :string, :required => true
56
+
57
+ # The port for ElasticSearch HTTP interface to use.
58
+ config :port, :validate => :number, :default => 9200
59
+
60
+ # The HTTP Basic Auth username used to access your elasticsearch server.
61
+ config :user, :validate => :string, :default => nil
62
+
63
+ # The HTTP Basic Auth password used to access your elasticsearch server.
64
+ config :password, :validate => :password, :default => nil
65
+
66
+ # This plugin uses the bulk index api for improved indexing performance.
67
+ # To make efficient bulk api calls, we will buffer a certain number of
68
+ # events before flushing that out to elasticsearch. This setting
69
+ # controls how many events will be buffered before sending a batch
70
+ # of events.
71
+ config :flush_size, :validate => :number, :default => 100
72
+
73
+ # The amount of time since last flush before a flush is forced.
74
+ #
75
+ # This setting helps ensure slow event rates don't get stuck in logstash.
76
+ # For example, if your `flush_size` is 100, and you have received 10 events,
77
+ # and it has been more than `idle_flush_time` seconds since the last flush,
78
+ # logstash will flush those 10 events automatically.
79
+ #
80
+ # This helps keep both fast and slow log streams moving along in
81
+ # near-real-time.
82
+ config :idle_flush_time, :validate => :number, :default => 1
83
+
84
+ # The document ID for the index. Useful for overwriting existing entries in
85
+ # elasticsearch with the same ID.
86
+ config :document_id, :validate => :string, :default => nil
87
+
88
+ # Set the type of elasticsearch replication to use. If async
89
+ # the index request to elasticsearch to return after the primary
90
+ # shards have been written. If sync (default), index requests
91
+ # will wait until the primary and the replica shards have been
92
+ # written.
93
+ config :replication, :validate => ['async', 'sync'], :default => 'sync'
94
+
95
+ public
96
+ def register
97
+ require "ftw" # gem ftw
98
+ @agent = FTW::Agent.new
99
+ @queue = []
100
+
101
+ auth = @user && @password ? "#{@user}:#{@password.value}@" : ""
102
+ @bulk_url = "http://#{auth}#{@host}:#{@port}/_bulk?replication=#{@replication}"
103
+ if @manage_template
104
+ @logger.info("Automatic template management enabled", :manage_template => @manage_template.to_s)
105
+ template_search_url = "http://#{auth}#{@host}:#{@port}/_template/*"
106
+ @template_url = "http://#{auth}#{@host}:#{@port}/_template/#{@template_name}"
107
+ if @template_overwrite
108
+ @logger.info("Template overwrite enabled. Deleting existing template.", :template_overwrite => @template_overwrite.to_s)
109
+ response = @agent.get!(@template_url)
110
+ template_action('delete') if response.status == 200 #=> Purge the old template if it exists
111
+ end
112
+ @logger.debug("Template Search URL:", :template_search_url => template_search_url)
113
+ has_template = false
114
+ template_idx_name = @index.sub(/%{[^}]+}/,'*')
115
+ alt_template_idx_name = @index.sub(/-%{[^}]+}/,'*')
116
+ # Get the template data
117
+ response = @agent.get!(template_search_url)
118
+ json = ""
119
+ if response.status == 404 #=> This condition can occcur when no template has ever been appended
120
+ @logger.info("No template found in Elasticsearch...")
121
+ get_template_json
122
+ template_action('put')
123
+ elsif response.status == 200
124
+ begin
125
+ response.read_body { |c| json << c }
126
+ results = JSON.parse(json)
127
+ rescue Exception => e
128
+ @logger.error("Error parsing JSON", :json => json, :results => results.to_s, :error => e.to_s)
129
+ raise "Exception in parsing JSON", e
130
+ end
131
+ if !results.any? { |k,v| v["template"] == template_idx_name || v["template"] == alt_template_idx_name }
132
+ @logger.debug("No template found in Elasticsearch", :has_template => has_template, :name => template_idx_name, :alt => alt_template_idx_name)
133
+ get_template_json
134
+ template_action('put')
135
+ end
136
+ else #=> Some other status code?
137
+ @logger.error("Could not check for existing template. Check status code.", :status => response.status.to_s)
138
+ end # end if response.status == 200
139
+ end # end if @manage_template
140
+ buffer_initialize(
141
+ :max_items => @flush_size,
142
+ :max_interval => @idle_flush_time,
143
+ :logger => @logger
144
+ )
145
+ end # def register
146
+
147
+ public
148
+ def template_action(command)
149
+ begin
150
+ if command == 'delete'
151
+ response = @agent.delete!(@template_url)
152
+ response.discard_body
153
+ elsif command == 'put'
154
+ response = @agent.put!(@template_url, :body => @template_json)
155
+ response.discard_body
156
+ end
157
+ rescue EOFError
158
+ @logger.warn("EOF while attempting request or reading response header from elasticsearch",
159
+ :host => @host, :port => @port)
160
+ return # abort this action
161
+ end
162
+ if response.status != 200
163
+ @logger.error("Error acting on elasticsearch mapping template",
164
+ :response => response, :action => command,
165
+ :request_url => @template_url)
166
+ return
167
+ end
168
+ @logger.info("Successfully deleted template", :template_url => @template_url) if command == 'delete'
169
+ @logger.info("Successfully applied template", :template_url => @template_url) if command == 'put'
170
+ end # def template_action
171
+
172
+
173
+ public
174
+ def get_template_json
175
+ if @template.nil?
176
+ if __FILE__ =~ /^(jar:)?file:\/.+!.+/
177
+ begin
178
+ # Running from a jar, assume types.db is at the root.
179
+ jar_path = [__FILE__.split("!").first, "/elasticsearch-template.json"].join("!")
180
+ @template = jar_path
181
+ rescue => ex
182
+ raise "Failed to cache, due to: #{ex}\n#{ex.backtrace}"
183
+ end
184
+ else
185
+ if File.exists?("elasticsearch-template.json")
186
+ @template = "elasticsearch-template.json"
187
+ elsif File.exists?("lib/logstash/outputs/elasticsearch/elasticsearch-template.json")
188
+ @template = "lib/logstash/outputs/elasticsearch/elasticsearch-template.json"
189
+ else
190
+ raise "You must specify 'template => ...' in your elasticsearch_http output"
191
+ end
192
+ end
193
+ end
194
+ @template_json = IO.read(@template).gsub(/\n/,'')
195
+ @logger.info("Using mapping template", :template => @template_json)
196
+ end # def get_template
197
+
198
+ public
199
+ def receive(event)
200
+ return unless output?(event)
201
+ buffer_receive([event, index, type])
202
+ end # def receive
203
+
204
+ def flush(events, teardown=false)
205
+ # Avoid creating a new string for newline every time
206
+ newline = "\n".freeze
207
+
208
+ body = events.collect do |event, index, type|
209
+ index = event.sprintf(@index)
210
+
211
+ # Set the 'type' value for the index.
212
+ if @index_type.nil?
213
+ type = event["type"] || "logs"
214
+ else
215
+ type = event.sprintf(@index_type)
216
+ end
217
+ header = { "index" => { "_index" => index, "_type" => type } }
218
+ header["index"]["_id"] = event.sprintf(@document_id) if !@document_id.nil?
219
+
220
+ [ header.to_json, newline, event.to_json, newline ]
221
+ end.flatten
222
+ post(body.join(""))
223
+ end # def receive_bulk
224
+
225
+ def post(body)
226
+ begin
227
+ response = @agent.post!(@bulk_url, :body => body)
228
+ rescue EOFError
229
+ @logger.warn("EOF while writing request or reading response header from elasticsearch",
230
+ :host => @host, :port => @port)
231
+ return # abort this flush
232
+ end
233
+
234
+ # Consume the body for error checking
235
+ # This will also free up the connection for reuse.
236
+ body = ""
237
+ begin
238
+ response.read_body { |chunk| body += chunk }
239
+ rescue EOFError
240
+ @logger.warn("EOF while reading response body from elasticsearch",
241
+ :host => @host, :port => @port)
242
+ return # abort this flush
243
+ end
244
+
245
+ if response.status != 200
246
+ @logger.error("Error writing (bulk) to elasticsearch",
247
+ :response => response, :response_body => body,
248
+ :request_body => @queue.join("\n"))
249
+ return
250
+ end
251
+ end # def post
252
+
253
+ def teardown
254
+ buffer_flush(:final => true)
255
+ end # def teardown
256
+ end # class LogStash::Outputs::ElasticSearchHTTP
@@ -0,0 +1,214 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/outputs/base"
4
+ require "json"
5
+ require "uri"
6
+ require "net/http"
7
+
8
+ # This output lets you store logs in elasticsearch. It's similar to the
9
+ # 'elasticsearch' output but improves performance by using a queue server,
10
+ # rabbitmq, to send data to elasticsearch.
11
+ #
12
+ # Upon startup, this output will automatically contact an elasticsearch cluster
13
+ # and configure it to read from the queue to which we write.
14
+ #
15
+ # You can learn more about elasticseasrch at <http://elasticsearch.org>
16
+ # More about the elasticsearch rabbitmq river plugin: <https://github.com/elasticsearch/elasticsearch-river-rabbitmq/blob/master/README.md>
17
+
18
+ class LogStash::Outputs::ElasticSearchRiver < LogStash::Outputs::Base
19
+
20
+ config_name "elasticsearch_river"
21
+ milestone 2
22
+
23
+ config :debug, :validate => :boolean, :default => false
24
+
25
+ # The index to write events to. This can be dynamic using the %{foo} syntax.
26
+ # The default value will partition your indeces by day so you can more easily
27
+ # delete old data or only search specific date ranges.
28
+ config :index, :validate => :string, :default => "logstash-%{+YYYY.MM.dd}"
29
+
30
+ # The index type to write events to. Generally you should try to write only
31
+ # similar events to the same 'type'. String expansion '%{foo}' works here.
32
+ config :index_type, :validate => :string, :default => "%{type}"
33
+
34
+ # The name/address of an ElasticSearch host to use for river creation
35
+ config :es_host, :validate => :string, :required => true
36
+
37
+ # ElasticSearch API port
38
+ config :es_port, :validate => :number, :default => 9200
39
+
40
+ # ElasticSearch river configuration: bulk fetch size
41
+ config :es_bulk_size, :validate => :number, :default => 1000
42
+
43
+ # ElasticSearch river configuration: bulk timeout in milliseconds
44
+ config :es_bulk_timeout_ms, :validate => :number, :default => 100
45
+
46
+ # ElasticSearch river configuration: is ordered?
47
+ config :es_ordered, :validate => :boolean, :default => false
48
+
49
+ # Hostname of RabbitMQ server
50
+ config :rabbitmq_host, :validate => :string, :required => true
51
+
52
+ # Port of RabbitMQ server
53
+ config :rabbitmq_port, :validate => :number, :default => 5672
54
+
55
+ # RabbitMQ user
56
+ config :user, :validate => :string, :default => "guest"
57
+
58
+ # RabbitMQ password
59
+ config :password, :validate => :string, :default => "guest"
60
+
61
+ # RabbitMQ vhost
62
+ config :vhost, :validate => :string, :default => "/"
63
+
64
+ # RabbitMQ queue name
65
+ config :queue, :validate => :string, :default => "elasticsearch"
66
+
67
+ # RabbitMQ exchange name
68
+ config :exchange, :validate => :string, :default => "elasticsearch"
69
+
70
+ # The exchange type (fanout, topic, direct)
71
+ config :exchange_type, :validate => [ "fanout", "direct", "topic"],
72
+ :default => "direct"
73
+
74
+ # RabbitMQ routing key
75
+ config :key, :validate => :string, :default => "elasticsearch"
76
+
77
+ # RabbitMQ durability setting. Also used for ElasticSearch setting
78
+ config :durable, :validate => :boolean, :default => true
79
+
80
+ # RabbitMQ persistence setting
81
+ config :persistent, :validate => :boolean, :default => true
82
+
83
+ # The document ID for the index. Useful for overwriting existing entries in
84
+ # elasticsearch with the same ID.
85
+ config :document_id, :validate => :string, :default => nil
86
+
87
+ public
88
+ def register
89
+
90
+ # TODO(sissel): find a better way of declaring where the elasticsearch
91
+ # libraries are
92
+ # TODO(sissel): can skip this step if we're running from a jar.
93
+ jarpath = File.join(File.dirname(__FILE__), "../../../vendor/**/*.jar")
94
+ Dir[jarpath].each do |jar|
95
+ require jar
96
+ end
97
+ prepare_river
98
+ end
99
+
100
+ protected
101
+ def prepare_river
102
+ require "logstash/outputs/rabbitmq"
103
+
104
+ # Configure the message plugin
105
+ params = {
106
+ "host" => [@rabbitmq_host],
107
+ "port" => [@rabbitmq_port],
108
+ "user" => [@user],
109
+ "password" => [@password],
110
+ "exchange_type" => [@exchange_type],
111
+ "exchange" => [@exchange],
112
+ "key" => [@key],
113
+ "vhost" => [@vhost],
114
+ "durable" => [@durable.to_s],
115
+ "persistent" => [@persistent.to_s],
116
+ "debug" => [@debug.to_s],
117
+ }.reject {|k,v| v.first.nil?}
118
+ @mq = LogStash::Outputs::RabbitMQ.new(params)
119
+ @mq.register
120
+
121
+ # Set up the river
122
+ begin
123
+ auth = "#{@user}:#{@password}"
124
+
125
+ # Name the river by our hostname
126
+ require "socket"
127
+ hostname = Socket.gethostname
128
+
129
+ # Replace spaces with hyphens and remove all non-alpha non-dash non-underscore characters
130
+ river_name = "#{hostname} #{@queue}".gsub(' ', '-').gsub(/[^\w-]/, '')
131
+
132
+ api_path = "/_river/logstash-#{river_name}/_meta"
133
+ @status_path = "/_river/logstash-#{river_name}/_status"
134
+
135
+ river_config = {"type" => "rabbitmq",
136
+ "rabbitmq" => {
137
+ "host" => @rabbitmq_host=="localhost" ? hostname : @rabbitmq_host,
138
+ "port" => @rabbitmq_port,
139
+ "user" => @user,
140
+ "pass" => @password,
141
+ "vhost" => @vhost,
142
+ "queue" => @queue,
143
+ "exchange" => @exchange,
144
+ "routing_key" => @key,
145
+ "exchange_type" => @exchange_type,
146
+ "exchange_durable" => @durable.to_s,
147
+ "queue_durable" => @durable.to_s
148
+ },
149
+ "index" => {"bulk_size" => @es_bulk_size,
150
+ "bulk_timeout" => "#{@es_bulk_timeout_ms}ms",
151
+ "ordered" => @es_ordered
152
+ },
153
+ }
154
+ @logger.info("ElasticSearch using river", :config => river_config)
155
+ Net::HTTP.start(@es_host, @es_port) do |http|
156
+ req = Net::HTTP::Put.new(api_path)
157
+ req.body = river_config.to_json
158
+ response = http.request(req)
159
+ response.value() # raise an exception if error
160
+ @logger.info("River created: #{response.body}")
161
+ end
162
+ rescue Exception => e
163
+ # TODO(petef): should we just throw an exception here, so the
164
+ # agent tries to restart us and we in turn retry the river
165
+ # registration?
166
+ @logger.warn("Couldn't set up river. You'll have to set it up manually (or restart)", :exception => e)
167
+ end
168
+
169
+ check_river_status
170
+ end # def prepare_river
171
+
172
+ private
173
+ def check_river_status
174
+ tries = 0
175
+ success = false
176
+ reason = nil
177
+ begin
178
+ while !success && tries <= 3 do
179
+ tries += 1
180
+ Net::HTTP.start(@es_host, @es_port) do |http|
181
+ req = Net::HTTP::Get.new(@status_path)
182
+ response = http.request(req)
183
+ response.value
184
+ status = JSON.parse(response.body)
185
+ @logger.debug("Checking ES river status", :status => status)
186
+ if status["_source"]["error"]
187
+ reason = "ES river status: #{status["_source"]["error"]}"
188
+ else
189
+ success = true
190
+ end
191
+ end
192
+ sleep(2)
193
+ end
194
+ rescue Exception => e
195
+ raise "river is not running, checking status failed: #{$!}"
196
+ end
197
+
198
+ raise "river is not running: #{reason}" unless success
199
+ end # def check_river_status
200
+
201
+ public
202
+ def receive(event)
203
+ return unless output?(event)
204
+ # River events have a format of
205
+ # "action\ndata\n"
206
+ # where 'action' is index or delete, data is the data to index.
207
+ header = { "index" => { "_index" => event.sprintf(@index), "_type" => event.sprintf(@index_type) } }
208
+ if !@document_id.nil?
209
+ header["index"]["_id"] = event.sprintf(@document_id)
210
+ end
211
+
212
+ @mq.publish_serialized(header.to_json + "\n" + event.to_json + "\n")
213
+ end # def receive
214
+ end # LogStash::Outputs::ElasticSearchRiver