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,256 @@
1
+ # elapsed filter
2
+ #
3
+ # This filter tracks a pair of start/end events and calculates the elapsed
4
+ # time between them.
5
+
6
+ require "logstash/filters/base"
7
+ require "logstash/namespace"
8
+ require 'thread'
9
+
10
+ # The elapsed filter tracks a pair of start/end events and uses their
11
+ # timestamps to calculate the elapsed time between them.
12
+ #
13
+ # The filter has been developed to track the execution time of processes and
14
+ # other long tasks.
15
+ #
16
+ # The configuration looks like this:
17
+ #
18
+ # filter {
19
+ # elapsed {
20
+ # start_tag => "start event tag"
21
+ # end_tag => "end event tag"
22
+ # unique_id_field => "id field name"
23
+ # timeout => seconds
24
+ # new_event_on_match => true/false
25
+ # }
26
+ # }
27
+ #
28
+ # The events managed by this filter must have some particular properties.
29
+ # The event describing the start of the task (the "start event") must contain
30
+ # a tag equal to 'start_tag'. On the other side, the event describing the end
31
+ # of the task (the "end event") must contain a tag equal to 'end_tag'. Both
32
+ # these two kinds of event need to own an ID field which identify uniquely that
33
+ # particular task. The name of this field is stored in 'unique_id_field'.
34
+ #
35
+ # You can use a Grok filter to prepare the events for the elapsed filter.
36
+ # An example of configuration can be:
37
+ #
38
+ # filter {
39
+ # grok {
40
+ # match => ["message", "%{TIMESTAMP_ISO8601} START id: (?<task_id>.*)"]
41
+ # add_tag => [ "taskStarted" ]
42
+ # }
43
+ #
44
+ # grok {
45
+ # match => ["message", "%{TIMESTAMP_ISO8601} END id: (?<task_id>.*)"]
46
+ # add_tag => [ "taskTerminated"]
47
+ # }
48
+ #
49
+ # elapsed {
50
+ # start_tag => "taskStarted"
51
+ # end_tag => "taskTerminated"
52
+ # unique_id_field => "task_id"
53
+ # }
54
+ # }
55
+ #
56
+ # The elapsed filter collects all the "start events". If two, or more, "start
57
+ # events" have the same ID, only the first one is recorded, the others are
58
+ # discarded.
59
+ #
60
+ # When an "end event" matching a previously collected "start event" is
61
+ # received, there is a match. The configuration property 'new_event_on_match'
62
+ # tells where to insert the elapsed information: they can be added to the
63
+ # "end event" or a new "match event" can be created. Both events store the
64
+ # following information:
65
+ # - the tags "elapsed" and "elapsed.match"
66
+ # - the field "elapsed.time" with the difference, in seconds, between
67
+ # the two events timestamps
68
+ # - an ID filed with the task ID
69
+ # - the field "elapsed.timestamp_start" with the timestamp of the "start event"
70
+ #
71
+ # If the "end event" does not arrive before "timeout" seconds, the
72
+ # "start event" is discarded and an "expired event" is generated. This event
73
+ # contains:
74
+ # - the tags "elapsed" and "elapsed.expired_error"
75
+ # - a field called "elapsed.time" with the age, in seconds, of the
76
+ # "start event"
77
+ # - an ID filed with the task ID
78
+ # - the field "elapsed.timestamp_start" with the timestamp of the "start event"
79
+ #
80
+ class LogStash::Filters::Elapsed < LogStash::Filters::Base
81
+ PREFIX = "elapsed."
82
+ ELAPSED_FIELD = PREFIX + "time"
83
+ TIMESTAMP_START_EVENT_FIELD = PREFIX + "timestamp_start"
84
+ HOST_FIELD = "host"
85
+
86
+ ELAPSED_TAG = "elapsed"
87
+ EXPIRED_ERROR_TAG = PREFIX + "expired_error"
88
+ END_WITHOUT_START_TAG = PREFIX + "end_wtihout_start"
89
+ MATCH_TAG = PREFIX + "match"
90
+
91
+ config_name "elapsed"
92
+ milestone 1
93
+
94
+ # The name of the tag identifying the "start event"
95
+ config :start_tag, :validate => :string, :required => true
96
+
97
+ # The name of the tag identifying the "end event"
98
+ config :end_tag, :validate => :string, :required => true
99
+
100
+ # The name of the field containing the task ID.
101
+ # This value must uniquely identify the task in the system, otherwise
102
+ # it's impossible to match the couple of events.
103
+ config :unique_id_field, :validate => :string, :required => true
104
+
105
+ # The amount of seconds after an "end event" can be considered lost.
106
+ # The corresponding "start event" is discarded and an "expired event"
107
+ # is generated. The default value is 30 minutes (1800 seconds).
108
+ config :timeout, :validate => :number, :required => false, :default => 1800
109
+
110
+ # This property manage what to do when an "end event" matches a "start event".
111
+ # If it's set to 'false' (default value), the elapsed information are added
112
+ # to the "end event"; if it's set to 'true' a new "match event" is created.
113
+ config :new_event_on_match, :validate => :boolean, :required => false, :default => false
114
+
115
+ public
116
+ def register
117
+ @mutex = Mutex.new
118
+ # This is the state of the filter. The keys are the "unique_id_field",
119
+ # the values are couples of values: <start event, age>
120
+ @start_events = {}
121
+
122
+ @logger.info("Elapsed, timeout: #{@timeout} seconds")
123
+ end
124
+
125
+ # Getter method used for the tests
126
+ def start_events
127
+ @start_events
128
+ end
129
+
130
+ def filter(event)
131
+ return unless filter?(event)
132
+
133
+ unique_id = event[@unique_id_field]
134
+ return if unique_id.nil?
135
+
136
+ if(start_event?(event))
137
+ filter_matched(event)
138
+ @logger.info("Elapsed, 'start event' received", start_tag: @start_tag, unique_id_field: @unique_id_field)
139
+
140
+ @mutex.synchronize do
141
+ unless(@start_events.has_key?(unique_id))
142
+ @start_events[unique_id] = LogStash::Filters::Elapsed::Element.new(event)
143
+ end
144
+ end
145
+
146
+ elsif(end_event?(event))
147
+ filter_matched(event)
148
+ @logger.info("Elapsed, 'end event' received", end_tag: @end_tag, unique_id_field: @unique_id_field)
149
+
150
+ @mutex.lock
151
+ if(@start_events.has_key?(unique_id))
152
+ start_event = @start_events.delete(unique_id).event
153
+ @mutex.unlock
154
+ elapsed = event["@timestamp"] - start_event["@timestamp"]
155
+ if(@new_event_on_match)
156
+ elapsed_event = new_elapsed_event(elapsed, unique_id, start_event["@timestamp"])
157
+ filter_matched(elapsed_event)
158
+ yield elapsed_event if block_given?
159
+ else
160
+ return add_elapsed_info(event, elapsed, unique_id, start_event["@timestamp"])
161
+ end
162
+ else
163
+ @mutex.unlock
164
+ # The "start event" did not arrive.
165
+ event.tag(END_WITHOUT_START_TAG)
166
+ end
167
+ end
168
+ end # def filter
169
+
170
+ # The method is invoked by LogStash every 5 seconds.
171
+ def flush()
172
+ expired_elements = []
173
+
174
+ @mutex.synchronize do
175
+ increment_age_by(5)
176
+ expired_elements = remove_expired_elements()
177
+ end
178
+
179
+ return create_expired_events_from(expired_elements)
180
+ end
181
+
182
+ private
183
+ def increment_age_by(seconds)
184
+ @start_events.each_pair do |key, element|
185
+ element.age += seconds
186
+ end
187
+ end
188
+
189
+ # Remove the expired "start events" from the internal
190
+ # buffer and return them.
191
+ def remove_expired_elements()
192
+ expired = []
193
+ @start_events.delete_if do |key, element|
194
+ if(element.age >= @timeout)
195
+ expired << element
196
+ next true
197
+ end
198
+ next false
199
+ end
200
+
201
+ return expired
202
+ end
203
+
204
+ def create_expired_events_from(expired_elements)
205
+ events = []
206
+ expired_elements.each do |element|
207
+ error_event = LogStash::Event.new
208
+ error_event.tag(ELAPSED_TAG)
209
+ error_event.tag(EXPIRED_ERROR_TAG)
210
+
211
+ error_event[HOST_FIELD] = Socket.gethostname
212
+ error_event[@unique_id_field] = element.event[@unique_id_field]
213
+ error_event[ELAPSED_FIELD] = element.age
214
+ error_event[TIMESTAMP_START_EVENT_FIELD] = element.event["@timestamp"]
215
+
216
+ events << error_event
217
+ filter_matched(error_event)
218
+ end
219
+
220
+ return events
221
+ end
222
+
223
+ def start_event?(event)
224
+ return (event["tags"] != nil && event["tags"].include?(@start_tag))
225
+ end
226
+
227
+ def end_event?(event)
228
+ return (event["tags"] != nil && event["tags"].include?(@end_tag))
229
+ end
230
+
231
+ def new_elapsed_event(elapsed_time, unique_id, timestamp_start_event)
232
+ new_event = LogStash::Event.new
233
+ new_event[HOST_FIELD] = Socket.gethostname
234
+ return add_elapsed_info(new_event, elapsed_time, unique_id, timestamp_start_event)
235
+ end
236
+
237
+ def add_elapsed_info(event, elapsed_time, unique_id, timestamp_start_event)
238
+ event.tag(ELAPSED_TAG)
239
+ event.tag(MATCH_TAG)
240
+
241
+ event[ELAPSED_FIELD] = elapsed_time
242
+ event[@unique_id_field] = unique_id
243
+ event[TIMESTAMP_START_EVENT_FIELD] = timestamp_start_event
244
+
245
+ return event
246
+ end
247
+ end # class LogStash::Filters::Elapsed
248
+
249
+ class LogStash::Filters::Elapsed::Element
250
+ attr_accessor :event, :age
251
+
252
+ def initialize(event)
253
+ @event = event
254
+ @age = 0
255
+ end
256
+ end
@@ -0,0 +1,73 @@
1
+ require "logstash/filters/base"
2
+ require "logstash/namespace"
3
+ require "logstash/util/fieldreference"
4
+
5
+ # Search elasticsearch for a previous log event and copy some fields from it
6
+ # into the current event. Below is a complete example of how this filter might
7
+ # be used. Whenever logstash receives an "end" event, it uses this elasticsearch
8
+ # filter to find the matching "start" event based on some operation identifier.
9
+ # Then it copies the @timestamp field from the "start" event into a new field on
10
+ # the "end" event. Finally, using a combination of the "date" filter and the
11
+ # "ruby" filter, we calculate the time duration in hours between the two events.
12
+ #
13
+ # if [type] == "end" {
14
+ # elasticsearch {
15
+ # hosts => ["es-server"]
16
+ # query => "type:start AND operation:%{[opid]}"
17
+ # fields => ["@timestamp", "started"]
18
+ # }
19
+ #
20
+ # date {
21
+ # match => ["[started]", "ISO8601"]
22
+ # target => "[started]"
23
+ # }
24
+ #
25
+ # ruby {
26
+ # code => "event['duration_hrs'] = (event['@timestamp'] - event['started']) / 3600 rescue nil"
27
+ # }
28
+ # }
29
+ #
30
+ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
31
+ config_name "elasticsearch"
32
+ milestone 1
33
+
34
+ # List of elasticsearch hosts to use for querying.
35
+ config :hosts, :validate => :array
36
+
37
+ # Elasticsearch query string
38
+ config :query, :validate => :string
39
+
40
+ # Comma-delimited list of <field>:<direction> pairs that define the sort order
41
+ config :sort, :validate => :string, :default => "@timestamp:desc"
42
+
43
+ # Hash of fields to copy from old event (found via elasticsearch) into new event
44
+ config :fields, :validate => :hash, :default => {}
45
+
46
+ public
47
+ def register
48
+ require "elasticsearch"
49
+
50
+ @logger.info("New ElasticSearch filter", :hosts => @hosts)
51
+ @client = Elasticsearch::Client.new hosts: @hosts
52
+ end # def register
53
+
54
+ public
55
+ def filter(event)
56
+ return unless filter?(event)
57
+
58
+ begin
59
+ query_str = event.sprintf(@query)
60
+
61
+ results = @client.search q: query_str, sort: @sort, size: 1
62
+
63
+ @fields.each do |old, new|
64
+ event[new] = results['hits']['hits'][0]['_source'][old]
65
+ end
66
+
67
+ filter_matched(event)
68
+ rescue => e
69
+ @logger.warn("Failed to query elasticsearch for previous event",
70
+ :query => query_str, :event => event, :error => e)
71
+ end
72
+ end # def filter
73
+ end # class LogStash::Filters::Elasticsearch
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # Set fields from environment variables
6
+ class LogStash::Filters::Environment < LogStash::Filters::Base
7
+ config_name "environment"
8
+ milestone 1
9
+
10
+ # Specify a hash of fields to the environment variable
11
+ # A hash of matches of field => environment variable
12
+ config :add_field_from_env, :validate => :hash, :default => {}
13
+
14
+ public
15
+ def register
16
+ # Nothing
17
+ end # def register
18
+
19
+ public
20
+ def filter(event)
21
+ return unless filter?(event)
22
+ @add_field_from_env.each do |field, env|
23
+ event[field] = ENV[env]
24
+ end
25
+ filter_matched(event)
26
+ end # def filter
27
+ end # class LogStash::Filters::Environment
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+ require 'logstash/namespace'
3
+ require 'logstash/filters/base'
4
+
5
+
6
+ # This filter automatically extracts all numbers found inside a string
7
+ #
8
+ # This is useful when you have lines that don't match a grok pattern
9
+ # or use json but you still need to extract numbers.
10
+ #
11
+ # Each numbers is returned in a @fields.intX or @fields.floatX field
12
+ # where X indicates the position in the string.
13
+ #
14
+ # The fields produced by this filter are extra useful used in combination
15
+ # with kibana number plotting features.
16
+ class LogStash::Filters::ExtractNumbers < LogStash::Filters::Base
17
+ config_name 'extractnumbers'
18
+ milestone 1
19
+
20
+ # The source field for the data. By default is message.
21
+ config :source, :validate => :string, :default => 'message'
22
+
23
+ public
24
+ def register
25
+ end
26
+
27
+ public
28
+ def filter(event)
29
+ integers = nil
30
+ floats = nil
31
+
32
+ msg = event[@source]
33
+
34
+ if not msg
35
+ return
36
+ end
37
+
38
+ # If for some reason the field is an array of values, take the first only.
39
+ msg = msg.first if msg.is_a?(Array)
40
+
41
+
42
+ fields = msg.split
43
+ for elem in fields
44
+ int = str_as_integer(elem)
45
+ if int != nil
46
+ if not integers
47
+ integers = Array.new
48
+ end
49
+ integers.push(int)
50
+ next
51
+ end
52
+ f = str_as_float(elem)
53
+ if f != nil
54
+ if not floats
55
+ floats = Array.new
56
+ end
57
+ floats.push(f)
58
+ end
59
+ end
60
+
61
+ if integers
62
+ index = 0
63
+ for i in integers
64
+ index += 1
65
+ event["int" + index.to_s] = i
66
+ end
67
+ end
68
+ if floats
69
+ index = 0
70
+ for f in floats
71
+ index += 1
72
+ event["float" + index.to_s] = f
73
+ end
74
+ end
75
+ end
76
+
77
+ def str_as_integer(str)
78
+ Integer(str) rescue nil
79
+ end
80
+
81
+ def str_as_float(str)
82
+ Float(str) rescue nil
83
+ end
84
+ end # class LogStash::Filters::ExtractNumbers
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # The GELFify filter parses RFC3164 severity levels to
6
+ # corresponding GELF levels.
7
+ class LogStash::Filters::Gelfify < LogStash::Filters::Base
8
+ config_name "gelfify"
9
+ milestone 2
10
+
11
+ SYSLOG_LEVEL_MAP = {
12
+ 0 => 3, # Emergency => FATAL
13
+ 1 => 5, # Alert => WARN
14
+ 2 => 3, # Critical => FATAL
15
+ 3 => 4, # Error => ERROR
16
+ 4 => 5, # Warning => WARN
17
+ 5 => 6, # Notice => INFO
18
+ 6 => 6, # Informat. => INFO
19
+ 7 => 7 # Debug => DEBUG
20
+ }
21
+
22
+ public
23
+ def register
24
+ # nothing
25
+ end # def register
26
+
27
+ public
28
+ def filter(event)
29
+ return unless event["type"] == @type
30
+ @logger.debug("GELFIFY FILTER: received event of type #{event["type"]}")
31
+
32
+ if event.include?("severity")
33
+ sev = event["severity"].to_i rescue nil
34
+ if sev.to_s != event["severity"].to_s
35
+ # severity isn't convertable to an integer.
36
+ # "foo".to_i => 0, which would default to EMERG.
37
+ @logger.debug("GELFIFY FILTER: existing severity field is not an int")
38
+ elsif SYSLOG_LEVEL_MAP[sev]
39
+ @logger.debug("GELFIFY FILTER: Severity level successfully mapped")
40
+ event["GELF_severity"] = SYSLOG_LEVEL_MAP[sev]
41
+ else
42
+ @logger.debug("GELFIFY FILTER: unknown severity #{sev}")
43
+ end
44
+ else
45
+ @logger.debug("GELFIFY FILTER: No 'severity' field found")
46
+ end
47
+
48
+ if !event.cancelled?
49
+ filter_matched(event)
50
+ end
51
+ end # def filter
52
+ end # class LogStash::Filters::Gelfify