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,68 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ class LogStash::Filters::Metaevent < LogStash::Filters::Base
6
+ config_name "metaevent"
7
+ milestone 1
8
+
9
+ # syntax: `followed_by_tags => [ "tag", "tag" ]`
10
+ config :followed_by_tags, :validate => :array, :required => true
11
+
12
+ # syntax: `period => 60`
13
+ config :period, :validate => :number, :default => 5
14
+
15
+ def register
16
+ @logger.debug("registering")
17
+ @metaevents = []
18
+ end
19
+
20
+ def filter(event)
21
+ if filter?(event)
22
+ start_period(event)
23
+ elsif within_period(event)
24
+ if followed_by_tags_match(event)
25
+ trigger(event)
26
+ else
27
+ @logger.debug(["metaevent", @add_tag, "ignoring (tags don't match)", event])
28
+ end
29
+ else
30
+ @logger.debug(["metaevent", @add_tag, "ignoring (not in period)", event])
31
+ end
32
+ end
33
+
34
+ def flush
35
+ return if @metaevents.empty?
36
+
37
+ new_events = @metaevents
38
+ @metaevents = []
39
+ new_events
40
+ end
41
+
42
+ private
43
+
44
+ def start_period(event)
45
+ @logger.debug(["metaevent", @add_tag, "start_period", event])
46
+ @start_event = event
47
+ end
48
+
49
+ def trigger(event)
50
+ @logger.debug(["metaevent", @add_tag, "trigger", event])
51
+
52
+ event = LogStash::Event.new
53
+ event["source"] = Socket.gethostname
54
+ event["tags"] = [@add_tag]
55
+
56
+ @metaevents << event
57
+ @start_event = nil
58
+ end
59
+
60
+ def followed_by_tags_match(event)
61
+ (event["tags"] & @followed_by_tags).size == @followed_by_tags.size
62
+ end
63
+
64
+ def within_period(event)
65
+ time_delta = event["@timestamp"] - @start_event["@timestamp"]
66
+ time_delta >= 0 && time_delta <= @period
67
+ end
68
+ end
@@ -0,0 +1,237 @@
1
+ # encoding: utf-8
2
+ require "securerandom"
3
+ require "logstash/filters/base"
4
+ require "logstash/namespace"
5
+
6
+ # The metrics filter is useful for aggregating metrics.
7
+ #
8
+ # For example, if you have a field 'response' that is
9
+ # a http response code, and you want to count each
10
+ # kind of response, you can do this:
11
+ #
12
+ # filter {
13
+ # metrics {
14
+ # meter => [ "http.%{response}" ]
15
+ # add_tag => "metric"
16
+ # }
17
+ # }
18
+ #
19
+ # Metrics are flushed every 5 seconds by default or according to
20
+ # 'flush_interval'. Metrics appear as
21
+ # new events in the event stream and go through any filters
22
+ # that occur after as well as outputs.
23
+ #
24
+ # In general, you will want to add a tag to your metrics and have an output
25
+ # explicitly look for that tag.
26
+ #
27
+ # The event that is flushed will include every 'meter' and 'timer'
28
+ # metric in the following way:
29
+ #
30
+ # #### 'meter' values
31
+ #
32
+ # For a `meter => "something"` you will receive the following fields:
33
+ #
34
+ # * "thing.count" - the total count of events
35
+ # * "thing.rate_1m" - the 1-minute rate (sliding)
36
+ # * "thing.rate_5m" - the 5-minute rate (sliding)
37
+ # * "thing.rate_15m" - the 15-minute rate (sliding)
38
+ #
39
+ # #### 'timer' values
40
+ #
41
+ # For a `timer => [ "thing", "%{duration}" ]` you will receive the following fields:
42
+ #
43
+ # * "thing.count" - the total count of events
44
+ # * "thing.rate_1m" - the 1-minute rate of events (sliding)
45
+ # * "thing.rate_5m" - the 5-minute rate of events (sliding)
46
+ # * "thing.rate_15m" - the 15-minute rate of events (sliding)
47
+ # * "thing.min" - the minimum value seen for this metric
48
+ # * "thing.max" - the maximum value seen for this metric
49
+ # * "thing.stddev" - the standard deviation for this metric
50
+ # * "thing.mean" - the mean for this metric
51
+ #
52
+ # #### Example: computing event rate
53
+ #
54
+ # For a simple example, let's track how many events per second are running
55
+ # through logstash:
56
+ #
57
+ # input {
58
+ # generator {
59
+ # type => "generated"
60
+ # }
61
+ # }
62
+ #
63
+ # filter {
64
+ # metrics {
65
+ # type => "generated"
66
+ # meter => "events"
67
+ # add_tag => "metric"
68
+ # }
69
+ # }
70
+ #
71
+ # output {
72
+ # stdout {
73
+ # # only emit events with the 'metric' tag
74
+ # tags => "metric"
75
+ # message => "rate: %{events.rate_1m}"
76
+ # }
77
+ # }
78
+ #
79
+ # Running the above:
80
+ #
81
+ # % java -jar logstash.jar agent -f example.conf
82
+ # rate: 23721.983566819246
83
+ # rate: 24811.395722536377
84
+ # rate: 25875.892745934525
85
+ # rate: 26836.42375967113
86
+ #
87
+ # We see the output includes our 'events' 1-minute rate.
88
+ #
89
+ # In the real world, you would emit this to graphite or another metrics store,
90
+ # like so:
91
+ #
92
+ # output {
93
+ # graphite {
94
+ # metrics => [ "events.rate_1m", "%{events.rate_1m}" ]
95
+ # }
96
+ # }
97
+ class LogStash::Filters::Metrics < LogStash::Filters::Base
98
+ config_name "metrics"
99
+ milestone 1
100
+
101
+ # syntax: `meter => [ "name of metric", "name of metric" ]`
102
+ config :meter, :validate => :array, :default => []
103
+
104
+ # syntax: `timer => [ "name of metric", "%{time_value}" ]`
105
+ config :timer, :validate => :hash, :default => {}
106
+
107
+ # Don't track events that have @timestamp older than some number of seconds.
108
+ #
109
+ # This is useful if you want to only include events that are near real-time
110
+ # in your metrics.
111
+ #
112
+ # Example, to only count events that are within 10 seconds of real-time, you
113
+ # would do this:
114
+ #
115
+ # filter {
116
+ # metrics {
117
+ # meter => [ "hits" ]
118
+ # ignore_older_than => 10
119
+ # }
120
+ # }
121
+ config :ignore_older_than, :validate => :number, :default => 0
122
+
123
+ # The flush interval, when the metrics event is created. Must be a multiple of 5s.
124
+ config :flush_interval, :validate => :number, :default => 5
125
+
126
+ # The clear interval, when all counter are reset.
127
+ #
128
+ # If set to -1, the default value, the metrics will never be cleared.
129
+ # Otherwise, should be a multiple of 5s.
130
+ config :clear_interval, :validate => :number, :default => -1
131
+
132
+ # The rates that should be measured, in minutes.
133
+ # Possible values are 1, 5, and 15.
134
+ config :rates, :validate => :array, :default => [1, 5, 15]
135
+
136
+ # The percentiles that should be measured
137
+ config :percentiles, :validate => :array, :default => [1, 5, 10, 90, 95, 99, 100]
138
+
139
+ def register
140
+ require "metriks"
141
+ require "socket"
142
+ @last_flush = 0 # how many seconds ago the metrics where flushed.
143
+ @last_clear = 0 # how many seconds ago the metrics where cleared.
144
+ @random_key_preffix = SecureRandom.hex
145
+ unless (@rates - [1, 5, 15]).empty?
146
+ raise LogStash::ConfigurationError, "Invalid rates configuration. possible rates are 1, 5, 15. Rates: #{rates}."
147
+ end
148
+ initialize_metrics
149
+ end # def register
150
+
151
+ def filter(event)
152
+ return unless filter?(event)
153
+
154
+ # TODO(piavlo): This should probably be moved to base filter class.
155
+ if @ignore_older_than > 0 && Time.now - event["@timestamp"] > @ignore_older_than
156
+ @logger.debug("Skipping metriks for old event", :event => event)
157
+ return
158
+ end
159
+
160
+ @meter.each do |m|
161
+ @metric_meters[event.sprintf(m)].mark
162
+ end
163
+
164
+ @timer.each do |name, value|
165
+ @metric_timers[event.sprintf(name)].update(event.sprintf(value).to_f)
166
+ end
167
+ end # def filter
168
+
169
+ def flush
170
+ # Add 5 seconds to @last_flush and @last_clear counters
171
+ # since this method is called every 5 seconds.
172
+ @last_flush += 5
173
+ @last_clear += 5
174
+
175
+ # Do nothing if there's nothing to do ;)
176
+ return unless should_flush?
177
+
178
+ event = LogStash::Event.new
179
+ event["message"] = Socket.gethostname
180
+ @metric_meters.each do |name, metric|
181
+ flush_rates event, name, metric
182
+ metric.clear if should_clear?
183
+ end
184
+
185
+ @metric_timers.each do |name, metric|
186
+ flush_rates event, name, metric
187
+ # These 4 values are not sliding, so they probably are not useful.
188
+ event["#{name}.min"] = metric.min
189
+ event["#{name}.max"] = metric.max
190
+ # timer's stddev currently returns variance, fix it.
191
+ event["#{name}.stddev"] = metric.stddev ** 0.5
192
+ event["#{name}.mean"] = metric.mean
193
+
194
+ @percentiles.each do |percentile|
195
+ event["#{name}.p#{percentile}"] = metric.snapshot.value(percentile / 100)
196
+ end
197
+ metric.clear if should_clear?
198
+ end
199
+
200
+ # Reset counter since metrics were flushed
201
+ @last_flush = 0
202
+
203
+ if should_clear?
204
+ #Reset counter since metrics were cleared
205
+ @last_clear = 0
206
+ initialize_metrics
207
+ end
208
+
209
+ filter_matched(event)
210
+ return [event]
211
+ end
212
+
213
+ private
214
+ def flush_rates(event, name, metric)
215
+ event["#{name}.count"] = metric.count
216
+ event["#{name}.rate_1m"] = metric.one_minute_rate if @rates.include? 1
217
+ event["#{name}.rate_5m"] = metric.five_minute_rate if @rates.include? 5
218
+ event["#{name}.rate_15m"] = metric.fifteen_minute_rate if @rates.include? 15
219
+ end
220
+
221
+ def initialize_metrics
222
+ @metric_meters = Hash.new { |h,k| h[k] = Metriks.meter metric_key(k) }
223
+ @metric_timers = Hash.new { |h,k| h[k] = Metriks.timer metric_key(k) }
224
+ end
225
+
226
+ def metric_key(key)
227
+ "#{@random_key_preffix}_#{key}"
228
+ end
229
+
230
+ def should_flush?
231
+ @last_flush >= @flush_interval && (@metric_meters.any? || @metric_timers.any?)
232
+ end
233
+
234
+ def should_clear?
235
+ @clear_interval > 0 && @last_clear >= @clear_interval
236
+ end
237
+ end # class LogStash::Filters::Metrics
@@ -0,0 +1,241 @@
1
+ # encoding: utf-8
2
+ # multiline filter
3
+ #
4
+ # This filter will collapse multiline messages into a single event.
5
+ #
6
+
7
+ require "logstash/filters/base"
8
+ require "logstash/namespace"
9
+ require "set"
10
+
11
+ # The multiline filter is for combining multiple events from a single source
12
+ # into the same event.
13
+ #
14
+ # The original goal of this filter was to allow joining of multi-line messages
15
+ # from files into a single event. For example - joining java exception and
16
+ # stacktrace messages into a single event.
17
+ #
18
+ # TODO(sissel): Document any issues?
19
+ # The config looks like this:
20
+ #
21
+ # filter {
22
+ # multiline {
23
+ # type => "type"
24
+ # pattern => "pattern, a regexp"
25
+ # negate => boolean
26
+ # what => "previous" or "next"
27
+ # }
28
+ # }
29
+ #
30
+ # The 'regexp' should match what you believe to be an indicator that
31
+ # the field is part of a multi-line event
32
+ #
33
+ # The 'what' must be "previous" or "next" and indicates the relation
34
+ # to the multi-line event.
35
+ #
36
+ # The 'negate' can be "true" or "false" (defaults false). If true, a
37
+ # message not matching the pattern will constitute a match of the multiline
38
+ # filter and the what will be applied. (vice-versa is also true)
39
+ #
40
+ # For example, java stack traces are multiline and usually have the message
41
+ # starting at the far-left, then each subsequent line indented. Do this:
42
+ #
43
+ # filter {
44
+ # multiline {
45
+ # type => "somefiletype"
46
+ # pattern => "^\s"
47
+ # what => "previous"
48
+ # }
49
+ # }
50
+ #
51
+ # This says that any line starting with whitespace belongs to the previous line.
52
+ #
53
+ # Another example is C line continuations (backslash). Here's how to do that:
54
+ #
55
+ # filter {
56
+ # multiline {
57
+ # type => "somefiletype "
58
+ # pattern => "\\$"
59
+ # what => "next"
60
+ # }
61
+ # }
62
+ #
63
+ class LogStash::Filters::Multiline < LogStash::Filters::Base
64
+
65
+ config_name "multiline"
66
+ milestone 3
67
+
68
+ # The regular expression to match
69
+ config :pattern, :validate => :string, :required => true
70
+
71
+ # If the pattern matched, does event belong to the next or previous event?
72
+ config :what, :validate => ["previous", "next"], :required => true
73
+
74
+ # Negate the regexp pattern ('if not matched')
75
+ config :negate, :validate => :boolean, :default => false
76
+
77
+ # The stream identity is how the multiline filter determines which stream an
78
+ # event belongs. This is generally used for differentiating, say, events
79
+ # coming from multiple files in the same file input, or multiple connections
80
+ # coming from a tcp input.
81
+ #
82
+ # The default value here is usually what you want, but there are some cases
83
+ # where you want to change it. One such example is if you are using a tcp
84
+ # input with only one client connecting at any time. If that client
85
+ # reconnects (due to error or client restart), then logstash will identify
86
+ # the new connection as a new stream and break any multiline goodness that
87
+ # may have occurred between the old and new connection. To solve this use
88
+ # case, you can use "%{@source_host}.%{@type}" instead.
89
+ config :stream_identity , :validate => :string, :default => "%{host}.%{path}.%{type}"
90
+
91
+ # logstash ships by default with a bunch of patterns, so you don't
92
+ # necessarily need to define this yourself unless you are adding additional
93
+ # patterns.
94
+ #
95
+ # Pattern files are plain text with format:
96
+ #
97
+ # NAME PATTERN
98
+ #
99
+ # For example:
100
+ #
101
+ # NUMBER \d+
102
+ config :patterns_dir, :validate => :array, :default => []
103
+
104
+ # Detect if we are running from a jarfile, pick the right path.
105
+ @@patterns_path = Set.new
106
+ if __FILE__ =~ /file:\/.*\.jar!.*/
107
+ @@patterns_path += ["#{File.dirname(__FILE__)}/../../patterns/*"]
108
+ else
109
+ @@patterns_path += ["#{File.dirname(__FILE__)}/../../../patterns/*"]
110
+ end
111
+
112
+ public
113
+ def initialize(config = {})
114
+ super
115
+
116
+ @threadsafe = false
117
+
118
+ # This filter needs to keep state.
119
+ @types = Hash.new { |h,k| h[k] = [] }
120
+ @pending = Hash.new
121
+ end # def initialize
122
+
123
+ public
124
+ def register
125
+ require "grok-pure" # rubygem 'jls-grok'
126
+
127
+ @grok = Grok.new
128
+
129
+ @patterns_dir = @@patterns_path.to_a + @patterns_dir
130
+ @patterns_dir.each do |path|
131
+ # Can't read relative paths from jars, try to normalize away '../'
132
+ while path =~ /file:\/.*\.jar!.*\/\.\.\//
133
+ # replace /foo/bar/../baz => /foo/baz
134
+ path = path.gsub(/[^\/]+\/\.\.\//, "")
135
+ end
136
+
137
+ if File.directory?(path)
138
+ path = File.join(path, "*")
139
+ end
140
+
141
+ Dir.glob(path).each do |file|
142
+ @logger.info("Grok loading patterns from file", :path => file)
143
+ @grok.add_patterns_from_file(file)
144
+ end
145
+ end
146
+
147
+ @grok.compile(@pattern)
148
+
149
+ @logger.debug("Registered multiline plugin", :type => @type, :config => @config)
150
+ end # def register
151
+
152
+ public
153
+ def filter(event)
154
+ return unless filter?(event)
155
+
156
+ if event["message"].is_a?(Array)
157
+ match = @grok.match(event["message"].first)
158
+ else
159
+ match = @grok.match(event["message"])
160
+ end
161
+ key = event.sprintf(@stream_identity)
162
+ pending = @pending[key]
163
+
164
+ @logger.debug("Multiline", :pattern => @pattern, :message => event["message"],
165
+ :match => match, :negate => @negate)
166
+
167
+ # Add negate option
168
+ match = (match and !@negate) || (!match and @negate)
169
+
170
+ case @what
171
+ when "previous"
172
+ if match
173
+ event.tag "multiline"
174
+ # previous previous line is part of this event.
175
+ # append it to the event and cancel it
176
+ if pending
177
+ pending.append(event)
178
+ else
179
+ @pending[key] = event
180
+ end
181
+ event.cancel
182
+ else
183
+ # this line is not part of the previous event
184
+ # if we have a pending event, it's done, send it.
185
+ # put the current event into pending
186
+ if pending
187
+ tmp = event.to_hash
188
+ event.overwrite(pending)
189
+ @pending[key] = LogStash::Event.new(tmp)
190
+ else
191
+ @pending[key] = event
192
+ event.cancel
193
+ end # if/else pending
194
+ end # if/else match
195
+ when "next"
196
+ if match
197
+ event.tag "multiline"
198
+ # this line is part of a multiline event, the next
199
+ # line will be part, too, put it into pending.
200
+ if pending
201
+ pending.append(event)
202
+ else
203
+ @pending[key] = event
204
+ end
205
+ event.cancel
206
+ else
207
+ # if we have something in pending, join it with this message
208
+ # and send it. otherwise, this is a new message and not part of
209
+ # multiline, send it.
210
+ if pending
211
+ pending.append(event)
212
+ event.overwrite(pending.to_hash)
213
+ @pending.delete(key)
214
+ end
215
+ end # if/else match
216
+ else
217
+ # TODO(sissel): Make this part of the 'register' method.
218
+ @logger.warn("Unknown multiline 'what' value.", :what => @what)
219
+ end # case @what
220
+
221
+ if !event.cancelled?
222
+ event["message"] = event["message"].join("\n") if event["message"].is_a?(Array)
223
+ event["@timestamp"] = event["@timestamp"].first if event["@timestamp"].is_a?(Array)
224
+ filter_matched(event) if match
225
+ end
226
+ end # def filter
227
+
228
+ # Flush any pending messages. This is generally used for unit testing only.
229
+ #
230
+ # Note: flush is disabled now; it is preferable to use the multiline codec.
231
+ public
232
+ def __flush
233
+ events = []
234
+ @pending.each do |key, value|
235
+ value.uncancel
236
+ events << value
237
+ end
238
+ @pending.clear
239
+ return events
240
+ end # def flush
241
+ end # class LogStash::Filters::Multiline