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,18 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+
5
+ # A null output. This is useful for testing logstash inputs and filters for
6
+ # performance.
7
+ class LogStash::Outputs::Null < LogStash::Outputs::Base
8
+ config_name "null"
9
+ milestone 3
10
+
11
+ public
12
+ def register
13
+ end # def register
14
+
15
+ public
16
+ def receive(event)
17
+ end # def event
18
+ end # class LogStash::Outputs::Null
@@ -0,0 +1,101 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+ require "socket"
5
+
6
+ # This output allows you to pull metrics from your logs and ship them to
7
+ # opentsdb. Opentsdb is an open source tool for storing and graphing metrics.
8
+ #
9
+ class LogStash::Outputs::Opentsdb < LogStash::Outputs::Base
10
+ config_name "opentsdb"
11
+ milestone 1
12
+
13
+ # Enable debugging. Tries to pretty-print the entire event object.
14
+ config :debug, :validate => :boolean
15
+
16
+ # The address of the opentsdb server.
17
+ config :host, :validate => :string, :default => "localhost"
18
+
19
+ # The port to connect on your graphite server.
20
+ config :port, :validate => :number, :default => 4242
21
+
22
+ # The metric(s) to use. This supports dynamic strings like %{source_host}
23
+ # for metric names and also for values. This is an array field with key
24
+ # of the metric name, value of the metric value, and multiple tag,values . Example:
25
+ #
26
+ # [
27
+ # "%{host}/uptime",
28
+ # %{uptime_1m} " ,
29
+ # "hostname" ,
30
+ # "%{host}
31
+ # "anotherhostname" ,
32
+ # "%{host}
33
+ # ]
34
+ #
35
+ # The value will be coerced to a floating point value. Values which cannot be
36
+ # coerced will zero (0)
37
+ config :metrics, :validate => :array, :required => true
38
+
39
+ def register
40
+ connect
41
+ end # def register
42
+
43
+ def connect
44
+ # TODO(sissel): Test error cases. Catch exceptions. Find fortune and glory.
45
+ begin
46
+ @socket = TCPSocket.new(@host, @port)
47
+ rescue Errno::ECONNREFUSED => e
48
+ @logger.warn("Connection refused to opentsdb server, sleeping...",
49
+ :host => @host, :port => @port)
50
+ sleep(2)
51
+ retry
52
+ end
53
+ end # def connect
54
+
55
+ public
56
+ def receive(event)
57
+ return unless output?(event)
58
+
59
+ # Opentsdb message format: put metric timestamp value tagname=tagvalue tag2=value2\n
60
+
61
+ # Catch exceptions like ECONNRESET and friends, reconnect on failure.
62
+ begin
63
+ name = metrics[0]
64
+ value = metrics[1]
65
+ tags = metrics[2..-1]
66
+
67
+ # The first part of the message
68
+ message = ['put',
69
+ event.sprintf(name),
70
+ event.sprintf("%{+%s}"),
71
+ event.sprintf(value),
72
+ ].join(" ")
73
+
74
+ # If we have have tags we need to add it to the message
75
+ event_tags = []
76
+ unless tags.nil?
77
+ Hash[*tags.flatten].each do |tag_name,tag_value|
78
+ # Interprete variables if neccesary
79
+ real_tag_name = event.sprintf(tag_name)
80
+ real_tag_value = event.sprintf(tag_value)
81
+ event_tags << [real_tag_name , real_tag_value ].join('=')
82
+ end
83
+ message+=' '+event_tags.join(' ')
84
+ end
85
+
86
+ # TODO(sissel): Test error cases. Catch exceptions. Find fortune and glory.
87
+ begin
88
+ @socket.puts(message)
89
+ rescue Errno::EPIPE, Errno::ECONNRESET => e
90
+ @logger.warn("Connection to opentsdb server died",
91
+ :exception => e, :host => @host, :port => @port)
92
+ sleep(2)
93
+ connect
94
+ end
95
+
96
+ # TODO(sissel): resend on failure
97
+ # TODO(sissel): Make 'resend on failure' tunable; sometimes it's OK to
98
+ # drop metrics.
99
+ end # @metrics.each
100
+ end # def receive
101
+ end # class LogStash::Outputs::Opentsdb
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+
5
+ # PagerDuty output
6
+ # Send specific events to PagerDuty for alerting
7
+
8
+ class LogStash::Outputs::PagerDuty < LogStash::Outputs::Base
9
+ config_name "pagerduty"
10
+ milestone 1
11
+
12
+ # Service API Key
13
+ config :service_key, :validate => :string, :required => true
14
+
15
+ # The service key to use
16
+ # You'll need to set this up in PD beforehand
17
+ config :incident_key, :validate => :string, :default => "logstash/%{host}/%{type}"
18
+
19
+ # Event type
20
+ config :event_type, :validate => ["trigger", "acknowledge", "resolve"], :default => "trigger"
21
+
22
+ # Custom description
23
+ config :description, :validate => :string, :default => "Logstash event for %{host}"
24
+
25
+ # Event details
26
+ # These might be keys from the logstash event you wish to include
27
+ # tags are automatically included if detected so no need to add them here
28
+ config :details, :validate => :hash, :default => {"timestamp" => "%{@timestamp}", "message" => "%{message}"}
29
+
30
+ # PagerDuty API url
31
+ # You shouldn't need to change this
32
+ # This allows for flexibility
33
+ # should PD iterate the API
34
+ # and Logstash hasn't updated yet
35
+ config :pdurl, :validate => :string, :default => "https://events.pagerduty.com/generic/2010-04-15/create_event.json"
36
+
37
+ public
38
+ def register
39
+ require 'net/https'
40
+ require 'uri'
41
+ @pd_uri = URI.parse(@pdurl)
42
+ @client = Net::HTTP.new(@pd_uri.host, @pd_uri.port)
43
+ if @pd_uri.scheme == "https"
44
+ @client.use_ssl = true
45
+ #@client.verify_mode = OpenSSL::SSL::VERIFY_PEER
46
+ # PagerDuty cert doesn't verify oob
47
+ @client.verify_mode = OpenSSL::SSL::VERIFY_NONE
48
+ end
49
+ end # def register
50
+
51
+ public
52
+ def receive(event)
53
+ return unless output?(event)
54
+
55
+ pd_event = Hash.new
56
+ pd_event[:service_key] = "#{@service_key}"
57
+ pd_event[:incident_key] = event.sprintf(@incident_key)
58
+ pd_event[:event_type] = "#{@event_type}"
59
+ pd_event[:description] = event.sprintf(@description)
60
+ pd_event[:details] = Hash.new
61
+ @details.each do |key, value|
62
+ @logger.debug("PD Details added:" , key => event.sprintf(value))
63
+ pd_event[:details]["#{key}"] = event.sprintf(value)
64
+ end
65
+ pd_event[:details][:tags] = @tags if @tags
66
+
67
+ @logger.info("PD Event", :event => pd_event)
68
+ begin
69
+ request = Net::HTTP::Post.new(@pd_uri.path)
70
+ request.body = pd_event.to_json
71
+ @logger.debug("PD Request", :request => request.inspect)
72
+ response = @client.request(request)
73
+ @logger.debug("PD Response", :response => response.body)
74
+
75
+ rescue Exception => e
76
+ @logger.debug("PD Unhandled exception", :pd_error => e.backtrace)
77
+ end
78
+ end # def receive
79
+ end # class LogStash::Outputs::PagerDuty
@@ -0,0 +1,132 @@
1
+ # encoding: utf-8
2
+ require "logstash/namespace"
3
+ require "logstash/outputs/base"
4
+
5
+ # Pipe output.
6
+ #
7
+ # Pipe events to stdin of another program. You can use fields from the
8
+ # event as parts of the command.
9
+ # WARNING: This feature can cause logstash to fork off multiple children if you are not carefull with per-event commandline.
10
+ class LogStash::Outputs::Pipe < LogStash::Outputs::Base
11
+
12
+ config_name "pipe"
13
+ milestone 1
14
+
15
+ # The format to use when writing events to the pipe. This value
16
+ # supports any string and can include %{name} and other dynamic
17
+ # strings.
18
+ #
19
+ # If this setting is omitted, the full json representation of the
20
+ # event will be written as a single line.
21
+ config :message_format, :validate => :string
22
+
23
+ # Command line to launch and pipe to
24
+ config :command, :validate => :string, :required => true
25
+
26
+ # Close pipe that hasn't been used for TTL seconds. -1 or 0 means never close.
27
+ config :ttl, :validate => :number, :default => 10
28
+ public
29
+ def register
30
+ @pipes = {}
31
+ @last_stale_cleanup_cycle = Time.now
32
+ end # def register
33
+
34
+ public
35
+ def receive(event)
36
+ return unless output?(event)
37
+
38
+ command = event.sprintf(@command)
39
+ pipe = get_pipe(command)
40
+
41
+ if @message_format
42
+ output = event.sprintf(@message_format) + "\n"
43
+ else
44
+ output = event.to_json
45
+ end
46
+
47
+ begin
48
+ pipe.puts(output)
49
+ rescue IOError, Errno::EPIPE => e
50
+ @logger.error("Error writing to pipe, closing pipe.", :command => command, :pipe => pipe)
51
+ drop_pipe(command)
52
+ end
53
+
54
+ close_stale_pipes
55
+ end # def receive
56
+
57
+ def teardown
58
+ @logger.info("Teardown: closing pipes")
59
+ @pipes.each do |command, pipe|
60
+ begin
61
+ drop_pipe(command)
62
+ @logger.debug("Closed pipe #{command}", :pipe => pipe)
63
+ rescue Exception => e
64
+ @logger.error("Excpetion while closing pipes.", :exception => e)
65
+ end
66
+ end
67
+ finished
68
+ end
69
+
70
+ private
71
+ # every 10 seconds or so (triggered by events, but if there are no events there's no point closing files anyway)
72
+ def close_stale_pipes
73
+ return if @ttl <= 0
74
+ now = Time.now
75
+ return unless now - @last_stale_cleanup_cycle >= @ttl
76
+ @logger.info("Starting stale pipes cleanup cycle", :pipes => @pipes)
77
+ inactive_pipes = @pipes.select { |command, pipe| not pipe.active }
78
+ @logger.debug("%d stale pipes found" % inactive_pipes.count, :inactive_pipes => inactive_pipes)
79
+ inactive_pipes.each do |command, pipe|
80
+ drop_pipe(command)
81
+ end
82
+ # mark all pipes as inactive, a call to write will mark them as active again
83
+ @pipes.each { |command, pipe| pipe.active = false }
84
+ @last_stale_cleanup_cycle = now
85
+ end
86
+
87
+ def drop_pipe(command)
88
+ return unless @pipes.include? command
89
+ @logger.info("Closing pipe \"%s\"" % command)
90
+ begin
91
+ @pipes[command].close
92
+ rescue Exception => e
93
+ @logger.warn("Failed to close pipe.", :error => e, :command => command)
94
+ end
95
+ @pipes.delete(command)
96
+ end
97
+
98
+ def get_pipe(command)
99
+ return @pipes[command] if @pipes.include?(command)
100
+
101
+ @logger.info("Opening pipe", :command => command)
102
+
103
+ @pipes[command] = PipeWrapper.new(command, mode="a+")
104
+ end
105
+ end # class LogStash::Outputs::Pipe
106
+
107
+ class PipeWrapper
108
+ attr_accessor :active
109
+ def initialize(command, mode="a+")
110
+ @pipe = IO.popen(command, mode)
111
+ @active = false
112
+ end
113
+
114
+ def method_missing?(m, *args)
115
+ if @pipe.respond_to? m
116
+ @pipe.send(m, *args)
117
+ else
118
+ raise NoMethodError
119
+ end
120
+ end
121
+
122
+ def puts(txt)
123
+ @pipe.puts(txt)
124
+ @pipe.flush
125
+ @active = true
126
+ end
127
+
128
+ def write(txt)
129
+ @pipe.write(txt)
130
+ @active = true
131
+ end
132
+ end
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+
5
+ # Push events to a RabbitMQ exchange. Requires RabbitMQ 2.x
6
+ # or later version (3.x is recommended).
7
+ #
8
+ # Relevant links:
9
+ #
10
+ # * RabbitMQ: <http://www.rabbitmq.com/>
11
+ # * March Hare: <http://rubymarchhare.info>
12
+ # * Bunny: <http://rubybunny.info>
13
+ class LogStash::Outputs::RabbitMQ < LogStash::Outputs::Base
14
+ EXCHANGE_TYPES = ["fanout", "direct", "topic"]
15
+
16
+ config_name "rabbitmq"
17
+ milestone 1
18
+
19
+
20
+ #
21
+ # Connection
22
+ #
23
+
24
+ # RabbitMQ server address
25
+ config :host, :validate => :string, :required => true
26
+
27
+ # RabbitMQ port to connect on
28
+ config :port, :validate => :number, :default => 5672
29
+
30
+ # RabbitMQ username
31
+ config :user, :validate => :string, :default => "guest"
32
+
33
+ # RabbitMQ password
34
+ config :password, :validate => :password, :default => "guest"
35
+
36
+ # The vhost to use. If you don't know what this is, leave the default.
37
+ config :vhost, :validate => :string, :default => "/"
38
+
39
+ # Enable or disable SSL
40
+ config :ssl, :validate => :boolean, :default => false
41
+
42
+ # Validate SSL certificate
43
+ config :verify_ssl, :validate => :boolean, :default => false
44
+
45
+ # Enable or disable logging
46
+ config :debug, :validate => :boolean, :default => false
47
+
48
+
49
+
50
+ #
51
+ # Exchange
52
+ #
53
+
54
+
55
+ # The exchange type (fanout, topic, direct)
56
+ config :exchange_type, :validate => EXCHANGE_TYPES, :required => true
57
+
58
+ # The name of the exchange
59
+ config :exchange, :validate => :string, :required => true
60
+
61
+ # Key to route to by default. Defaults to 'logstash'
62
+ #
63
+ # * Routing keys are ignored on fanout exchanges.
64
+ config :key, :validate => :string, :default => "logstash"
65
+
66
+ # Is this exchange durable? (aka; Should it survive a broker restart?)
67
+ config :durable, :validate => :boolean, :default => true
68
+
69
+ # Should RabbitMQ persist messages to disk?
70
+ config :persistent, :validate => :boolean, :default => true
71
+
72
+
73
+
74
+ def initialize(params)
75
+ params["codec"] = "json" if !params["codec"]
76
+
77
+ super
78
+ end
79
+
80
+ # Use MarchHare on JRuby to avoid IO#select CPU spikes
81
+ # (see github.com/ruby-amqp/bunny/issues/95).
82
+ #
83
+ # On MRI, use Bunny.
84
+ #
85
+ # See http://rubybunny.info and http://rubymarchhare.info
86
+ # for the docs.
87
+ if RUBY_ENGINE == "jruby"
88
+ require "logstash/outputs/rabbitmq/march_hare"
89
+
90
+ include MarchHareImpl
91
+ else
92
+ require "logstash/outputs/rabbitmq/bunny"
93
+
94
+ include BunnyImpl
95
+ end
96
+ end # class LogStash::Outputs::RabbitMQ
@@ -0,0 +1,135 @@
1
+ # encoding: utf-8
2
+ class LogStash::Outputs::RabbitMQ
3
+ module BunnyImpl
4
+
5
+ #
6
+ # API
7
+ #
8
+
9
+ def register
10
+ require "bunny"
11
+
12
+ @logger.info("Registering output", :plugin => self)
13
+
14
+ connect
15
+ declare_exchange
16
+ end # def register
17
+
18
+
19
+ def receive(event)
20
+ return unless output?(event)
21
+
22
+ @logger.debug("Sending event", :destination => to_s, :event => event, :key => key)
23
+ key = event.sprintf(@key) if @key
24
+
25
+ begin
26
+ publish_serialized(event.to_json, key)
27
+ rescue JSON::GeneratorError => e
28
+ @logger.warn("Trouble converting event to JSON", :exception => e,
29
+ :event => event)
30
+ end
31
+ end
32
+
33
+ def publish_serialized(message, key = @key)
34
+ begin
35
+ if @x
36
+ @x.publish(message, :persistent => @persistent, :routing_key => key)
37
+ else
38
+ @logger.warn("Tried to send a message, but not connected to RabbitMQ yet.")
39
+ end
40
+ rescue Bunny::NetworkFailure, Bunny::ConnectionClosedError, Bunny::ConnectionLevelException, Bunny::TCPConnectionFailed => e
41
+ n = Bunny::Session::DEFAULT_NETWORK_RECOVERY_INTERVAL * 2
42
+
43
+ @logger.error("RabbitMQ connection error: #{e.message}. Will attempt to reconnect in #{n} seconds...",
44
+ :exception => e,
45
+ :backtrace => e.backtrace)
46
+ return if terminating?
47
+
48
+ sleep n
49
+ connect
50
+ declare_exchange
51
+ retry
52
+ end
53
+ end
54
+
55
+ def to_s
56
+ return "amqp://#{@user}@#{@host}:#{@port}#{@vhost}/#{@exchange_type}/#{@exchange}\##{@key}"
57
+ end
58
+
59
+ def teardown
60
+ @conn.close if @conn && @conn.open?
61
+ @conn = nil
62
+
63
+ finished
64
+ end
65
+
66
+
67
+
68
+ #
69
+ # Implementation
70
+ #
71
+
72
+ def connect
73
+ @vhost ||= Bunny::DEFAULT_HOST
74
+ # 5672. Will be switched to 5671 by Bunny if TLS is enabled.
75
+ @port ||= AMQ::Protocol::DEFAULT_PORT
76
+ @routing_key ||= "#"
77
+
78
+ @settings = {
79
+ :vhost => @vhost,
80
+ :host => @host,
81
+ :port => @port,
82
+ :automatically_recover => false
83
+ }
84
+ @settings[:user] = @user || Bunny::DEFAULT_USER
85
+ @settings[:pass] = if @password
86
+ @password.value
87
+ else
88
+ Bunny::DEFAULT_PASSWORD
89
+ end
90
+
91
+ @settings[:log_level] = if @debug
92
+ :debug
93
+ else
94
+ :error
95
+ end
96
+
97
+ @settings[:tls] = @ssl if @ssl
98
+ @settings[:verify_ssl] = @verify_ssl if @verify_ssl
99
+
100
+ proto = if @ssl
101
+ "amqp"
102
+ else
103
+ "amqps"
104
+ end
105
+ @connection_url = "#{proto}://#{@user}@#{@host}:#{@port}#{vhost}/#{@queue}"
106
+
107
+ begin
108
+ @conn = Bunny.new(@settings)
109
+
110
+ @logger.debug("Connecting to RabbitMQ. Settings: #{@settings.inspect}, queue: #{@queue.inspect}")
111
+ return if terminating?
112
+ @conn.start
113
+
114
+ @ch = @conn.create_channel
115
+ @logger.info("Connected to RabbitMQ at #{@settings[:host]}")
116
+ rescue Bunny::NetworkFailure, Bunny::ConnectionClosedError, Bunny::ConnectionLevelException, Bunny::TCPConnectionFailed => e
117
+ n = Bunny::Session::DEFAULT_NETWORK_RECOVERY_INTERVAL * 2
118
+
119
+ @logger.error("RabbitMQ connection error: #{e.message}. Will attempt to reconnect in #{n} seconds...",
120
+ :exception => e,
121
+ :backtrace => e.backtrace)
122
+ return if terminating?
123
+
124
+ sleep n
125
+ retry
126
+ end
127
+ end
128
+
129
+ def declare_exchange
130
+ @logger.debug("Declaring an exchange", :name => @exchange, :type => @exchange_type,
131
+ :durable => @durable)
132
+ @x = @ch.exchange(@exchange, :type => @exchange_type.to_sym, :durable => @durable)
133
+ end
134
+ end # BunnyImpl
135
+ end # LogStash::Outputs::RabbitMQ