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,244 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # The date filter is used for parsing dates from fields and using that
6
+ # date or timestamp as the timestamp for the event.
7
+ #
8
+ # For example, syslog events usually have timestamps like this:
9
+ #
10
+ # "Apr 17 09:32:01"
11
+ #
12
+ # You would use the date format "MMM dd HH:mm:ss" to parse this.
13
+ #
14
+ # The date filter is especially important for sorting events and for
15
+ # backfilling old data. If you don't get the date correct in your
16
+ # event, then searching for them later will likely sort out of order.
17
+ #
18
+ # In the absence of this filter, logstash will choose a timestamp based on the
19
+ # first time it sees the event (at input time), if the timestamp is not already
20
+ # set in the event. For example, with file input, the timestamp is set to the
21
+ # time of each read.
22
+ class LogStash::Filters::Date < LogStash::Filters::Base
23
+ if RUBY_ENGINE == "jruby"
24
+ JavaException = java.lang.Exception
25
+ UTC = org.joda.time.DateTimeZone.forID("UTC")
26
+ end
27
+
28
+ config_name "date"
29
+ milestone 3
30
+
31
+ # Specify a timezone canonical ID to be used for date parsing.
32
+ # The valid ID are listed on http://joda-time.sourceforge.net/timezones.html
33
+ # Useful in case the timezone cannot be extracted from the value,
34
+ # and is not the platform default.
35
+ # If this is not specified the platform default will be used.
36
+ # Canonical ID is good as it takes care of daylight saving time for you
37
+ # For example, America/Los_Angeles or Europe/France are valid IDs.
38
+ config :timezone, :validate => :string
39
+
40
+ # specify a locale to be used for date parsing. If this is not specified the
41
+ # platform default will be used
42
+ #
43
+ # The locale is mostly necessary to be set for parsing month names and
44
+ # weekday names
45
+ #
46
+ config :locale, :validate => :string
47
+
48
+ # The date formats allowed are anything allowed by Joda-Time (java time
49
+ # library): You can see the docs for this format here:
50
+ #
51
+ # [joda.time.format.DateTimeFormat](http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html)
52
+ #
53
+ # An array with field name first, and format patterns following, `[ field,
54
+ # formats... ]`
55
+ #
56
+ # If your time field has multiple possible formats, you can do this:
57
+ #
58
+ # match => [ "logdate", "MMM dd YYY HH:mm:ss",
59
+ # "MMM d YYY HH:mm:ss", "ISO8601" ]
60
+ #
61
+ # The above will match a syslog (rfc3164) or iso8601 timestamp.
62
+ #
63
+ # There are a few special exceptions, the following format literals exist
64
+ # to help you save time and ensure correctness of date parsing.
65
+ #
66
+ # * "ISO8601" - should parse any valid ISO8601 timestamp, such as
67
+ # 2011-04-19T03:44:01.103Z
68
+ # * "UNIX" - will parse unix time in seconds since epoch
69
+ # * "UNIX_MS" - will parse unix time in milliseconds since epoch
70
+ # * "TAI64N" - will parse tai64n time values
71
+ #
72
+ # For example, if you have a field 'logdate' and with a value that looks like
73
+ # 'Aug 13 2010 00:03:44', you would use this configuration:
74
+ #
75
+ # filter {
76
+ # date {
77
+ # match => [ "logdate", "MMM dd YYYY HH:mm:ss" ]
78
+ # }
79
+ # }
80
+ #
81
+ # If your field is nested in your structure, you can use the nested
82
+ # syntax [foo][bar] to match its value. For more information, please refer to
83
+ # http://logstash.net/docs/latest/configuration#fieldreferences
84
+ config :match, :validate => :array, :default => []
85
+
86
+ # Store the matching timestamp into the given target field. If not provided,
87
+ # default to updating the @timestamp field of the event.
88
+ config :target, :validate => :string, :default => "@timestamp"
89
+
90
+ # LOGSTASH-34
91
+ DATEPATTERNS = %w{ y d H m s S }
92
+
93
+ # The 'date' filter will take a value from your event and use it as the
94
+ # event timestamp. This is useful for parsing logs generated on remote
95
+ # servers or for importing old logs.
96
+ #
97
+ # The config looks like this:
98
+ #
99
+ # filter {
100
+ # date {
101
+ # type => "typename"
102
+ # filename => fieldformat
103
+ # # Example:
104
+ # timestamp => "mmm DD HH:mm:ss"
105
+ # }
106
+ # }
107
+ #
108
+ # The format is whatever is supported by Joda; generally:
109
+ # http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html
110
+ #
111
+ # TODO(sissel): Support 'seconds since epoch' parsing (nagios uses this)
112
+ public
113
+ def initialize(config = {})
114
+ super
115
+
116
+ @parsers = Hash.new { |h,k| h[k] = [] }
117
+ end # def initialize
118
+
119
+ private
120
+ def parseLocale(localeString)
121
+ return nil if localeString == nil
122
+ matches = localeString.match(/(?<lang>.+?)(?:_(?<country>.+?))?(?:_(?<variant>.+))?/)
123
+ lang = matches['lang'] == nil ? "" : matches['lang'].strip()
124
+ country = matches['country'] == nil ? "" : matches['country'].strip()
125
+ variant = matches['variant'] == nil ? "" : matches['variant'].strip()
126
+ return lang.length > 0 ? java.util.Locale.new(lang, country, variant) : nil
127
+ end
128
+
129
+ public
130
+ def register
131
+ require "java"
132
+ if @match.length < 2
133
+ raise LogStash::ConfigurationError, I18n.t("logstash.agent.configuration.invalid_plugin_register",
134
+ :plugin => "filter", :type => "date",
135
+ :error => "The match setting should contains first a field name and at least one date format, current value is #{@match}")
136
+ end
137
+ # TODO(sissel): Need a way of capturing regexp configs better.
138
+ locale = parseLocale(@config["locale"][0]) if @config["locale"] != nil and @config["locale"][0] != nil
139
+ setupMatcher(@config["match"].shift, locale, @config["match"] )
140
+ end
141
+
142
+ def setupMatcher(field, locale, value)
143
+ value.each do |format|
144
+ case format
145
+ when "ISO8601"
146
+ joda_parser = org.joda.time.format.ISODateTimeFormat.dateTimeParser
147
+ if @timezone
148
+ joda_parser = joda_parser.withZone(org.joda.time.DateTimeZone.forID(@timezone))
149
+ else
150
+ joda_parser = joda_parser.withOffsetParsed
151
+ end
152
+ parser = lambda { |date| joda_parser.parseMillis(date) }
153
+ when "UNIX" # unix epoch
154
+ joda_instant = org.joda.time.Instant.java_class.constructor(Java::long).method(:new_instance)
155
+ #parser = lambda { |date| joda_instant.call((date.to_f * 1000).to_i).to_java.toDateTime }
156
+ parser = lambda { |date| (date.to_f * 1000).to_i }
157
+ when "UNIX_MS" # unix epoch in ms
158
+ joda_instant = org.joda.time.Instant.java_class.constructor(Java::long).method(:new_instance)
159
+ parser = lambda do |date|
160
+ #return joda_instant.call(date.to_i).to_java.toDateTime
161
+ return date.to_i
162
+ end
163
+ when "TAI64N" # TAI64 with nanoseconds, -10000 accounts for leap seconds
164
+ joda_instant = org.joda.time.Instant.java_class.constructor(Java::long).method(:new_instance)
165
+ parser = lambda do |date|
166
+ # Skip leading "@" if it is present (common in tai64n times)
167
+ date = date[1..-1] if date[0, 1] == "@"
168
+ #return joda_instant.call((date[1..15].hex * 1000 - 10000)+(date[16..23].hex/1000000)).to_java.toDateTime
169
+ return (date[1..15].hex * 1000 - 10000)+(date[16..23].hex/1000000)
170
+ end
171
+ else
172
+ joda_parser = org.joda.time.format.DateTimeFormat.forPattern(format).withDefaultYear(Time.new.year)
173
+ if @timezone
174
+ joda_parser = joda_parser.withZone(org.joda.time.DateTimeZone.forID(@timezone))
175
+ else
176
+ joda_parser = joda_parser.withOffsetParsed
177
+ end
178
+ if (locale != nil)
179
+ joda_parser = joda_parser.withLocale(locale)
180
+ end
181
+ parser = lambda { |date| joda_parser.parseMillis(date) }
182
+ end
183
+
184
+ @logger.debug("Adding type with date config", :type => @type,
185
+ :field => field, :format => format)
186
+ @parsers[field] << {
187
+ :parser => parser,
188
+ :format => format
189
+ }
190
+ end
191
+ end
192
+
193
+ # def register
194
+
195
+ public
196
+ def filter(event)
197
+ @logger.debug? && @logger.debug("Date filter: received event", :type => event["type"])
198
+ return unless filter?(event)
199
+ @parsers.each do |field, fieldparsers|
200
+ @logger.debug? && @logger.debug("Date filter looking for field",
201
+ :type => event["type"], :field => field)
202
+ next unless event.include?(field)
203
+
204
+ fieldvalues = event[field]
205
+ fieldvalues = [fieldvalues] if !fieldvalues.is_a?(Array)
206
+ fieldvalues.each do |value|
207
+ next if value.nil?
208
+ begin
209
+ epochmillis = nil
210
+ success = false
211
+ last_exception = RuntimeError.new "Unknown"
212
+ fieldparsers.each do |parserconfig|
213
+ parser = parserconfig[:parser]
214
+ begin
215
+ epochmillis = parser.call(value)
216
+ success = true
217
+ break # success
218
+ rescue StandardError, JavaException => e
219
+ last_exception = e
220
+ end
221
+ end # fieldparsers.each
222
+
223
+ raise last_exception unless success
224
+
225
+ # Convert joda DateTime to a ruby Time
226
+ event[@target] = Time.at(epochmillis / 1000, (epochmillis % 1000) * 1000)
227
+ #event[@target] = Time.at(epochmillis / 1000.0).utc
228
+
229
+ @logger.debug? && @logger.debug("Date parsing done", :value => value, :timestamp => event[@target])
230
+ rescue StandardError, JavaException => e
231
+ @logger.warn("Failed parsing date from field", :field => field,
232
+ :value => value, :exception => e)
233
+ # Raising here will bubble all the way up and cause an exit.
234
+ # TODO(sissel): Maybe we shouldn't raise?
235
+ # TODO(sissel): What do we do on a failure? Tag it like grok does?
236
+ #raise e
237
+ end # begin
238
+ end # fieldvalue.each
239
+ end # @parsers.each
240
+
241
+ filter_matched(event) if !event.cancelled?
242
+ return event
243
+ end # def filter
244
+ end # class LogStash::Filters::Date
@@ -0,0 +1,201 @@
1
+ # encoding: utf-8
2
+ # DNS Filter
3
+ #
4
+ # This filter will resolve any IP addresses from a field of your choosing.
5
+ #
6
+
7
+ require "logstash/filters/base"
8
+ require "logstash/namespace"
9
+
10
+ # The DNS filter performs a lookup (either an A record/CNAME record lookup
11
+ # or a reverse lookup at the PTR record) on records specified under the
12
+ # "reverse" and "resolve" arrays.
13
+ #
14
+ # The config should look like this:
15
+ #
16
+ # filter {
17
+ # dns {
18
+ # type => 'type'
19
+ # reverse => [ "source_host", "field_with_address" ]
20
+ # resolve => [ "field_with_fqdn" ]
21
+ # action => "replace"
22
+ # }
23
+ # }
24
+ #
25
+ # Caveats: at the moment, there's no way to tune the timeout with the 'resolv'
26
+ # core library. It does seem to be fixed in here:
27
+ #
28
+ # http://redmine.ruby-lang.org/issues/5100
29
+ #
30
+ # but isn't currently in JRuby.
31
+ class LogStash::Filters::DNS < LogStash::Filters::Base
32
+
33
+ config_name "dns"
34
+ milestone 2
35
+
36
+ # Reverse resolve one or more fields.
37
+ config :reverse, :validate => :array
38
+
39
+ # Forward resolve one or more fields.
40
+ config :resolve, :validate => :array
41
+
42
+ # Determine what action to do: append or replace the values in the fields
43
+ # specified under "reverse" and "resolve."
44
+ config :action, :validate => [ "append", "replace" ], :default => "append"
45
+
46
+ # Use custom nameserver.
47
+ config :nameserver, :validate => :string
48
+
49
+ # TODO(sissel): make 'action' required? This was always the intent, but it
50
+ # due to a typo it was never enforced. Thus the default behavior in past
51
+ # versions was 'append' by accident.
52
+
53
+ # resolv calls will be wrapped in a timeout instance
54
+ config :timeout, :validate => :number, :default => 2
55
+
56
+ public
57
+ def register
58
+ require "resolv"
59
+ require "timeout"
60
+ if @nameserver.nil?
61
+ @resolv = Resolv.new
62
+ else
63
+ @resolv = Resolv.new(resolvers=[::Resolv::Hosts.new, ::Resolv::DNS.new(:nameserver => [@nameserver], :search => [], :ndots => 1)])
64
+ end
65
+
66
+ @ip_validator = Resolv::AddressRegex
67
+ end # def register
68
+
69
+ public
70
+ def filter(event)
71
+ return unless filter?(event)
72
+
73
+ if @resolve
74
+ begin
75
+ status = Timeout::timeout(@timeout) {
76
+ resolve(event)
77
+ }
78
+ rescue Timeout::Error
79
+ @logger.debug("DNS: resolve action timed out")
80
+ return
81
+ end
82
+ end
83
+
84
+ if @reverse
85
+ begin
86
+ status = Timeout::timeout(@timeout) {
87
+ reverse(event)
88
+ }
89
+ rescue Timeout::Error
90
+ @logger.debug("DNS: reverse action timed out")
91
+ return
92
+ end
93
+ end
94
+
95
+ filter_matched(event)
96
+ end
97
+
98
+ private
99
+ def resolve(event)
100
+ @resolve.each do |field|
101
+ is_array = false
102
+ raw = event[field]
103
+ if raw.is_a?(Array)
104
+ is_array = true
105
+ if raw.length > 1
106
+ @logger.warn("DNS: skipping resolve, can't deal with multiple values", :field => field, :value => raw)
107
+ return
108
+ end
109
+ raw = raw.first
110
+ end
111
+
112
+ begin
113
+ address = @resolv.getaddress(raw)
114
+ rescue Resolv::ResolvError
115
+ @logger.debug("DNS: couldn't resolve the hostname.",
116
+ :field => field, :value => raw)
117
+ return
118
+ rescue Resolv::ResolvTimeout
119
+ @logger.debug("DNS: timeout on resolving the hostname.",
120
+ :field => field, :value => raw)
121
+ return
122
+ rescue SocketError => e
123
+ @logger.debug("DNS: Encountered SocketError.",
124
+ :field => field, :value => raw)
125
+ return
126
+ rescue NoMethodError => e
127
+ # see JRUBY-5647
128
+ @logger.debug("DNS: couldn't resolve the hostname.",
129
+ :field => field, :value => raw,
130
+ :extra => "NameError instead of ResolvError")
131
+ return
132
+ end
133
+
134
+ if @action == "replace"
135
+ if is_array
136
+ event[field] = [address]
137
+ else
138
+ event[field] = address
139
+ end
140
+ else
141
+ if !is_array
142
+ event[field] = [event[field], address]
143
+ else
144
+ event[field] << address
145
+ end
146
+ end
147
+
148
+ end
149
+ end
150
+
151
+ private
152
+ def reverse(event)
153
+ @reverse.each do |field|
154
+ raw = event[field]
155
+ is_array = false
156
+ if raw.is_a?(Array)
157
+ is_array = true
158
+ if raw.length > 1
159
+ @logger.warn("DNS: skipping reverse, can't deal with multiple values", :field => field, :value => raw)
160
+ return
161
+ end
162
+ raw = raw.first
163
+ end
164
+
165
+ if ! @ip_validator.match(raw)
166
+ @logger.debug("DNS: not an address",
167
+ :field => field, :value => event[field])
168
+ return
169
+ end
170
+ begin
171
+ hostname = @resolv.getname(raw)
172
+ rescue Resolv::ResolvError
173
+ @logger.debug("DNS: couldn't resolve the address.",
174
+ :field => field, :value => raw)
175
+ return
176
+ rescue Resolv::ResolvTimeout
177
+ @logger.debug("DNS: timeout on resolving address.",
178
+ :field => field, :value => raw)
179
+ return
180
+ rescue SocketError => e
181
+ @logger.debug("DNS: Encountered SocketError.",
182
+ :field => field, :value => raw)
183
+ return
184
+ end
185
+
186
+ if @action == "replace"
187
+ if is_array
188
+ event[field] = [hostname]
189
+ else
190
+ event[field] = hostname
191
+ end
192
+ else
193
+ if !is_array
194
+ event[field] = [event[field], hostname]
195
+ else
196
+ event[field] << hostname
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end # class LogStash::Filters::DNS
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ require "logstash/filters/base"
3
+ require "logstash/namespace"
4
+
5
+ # Drop filter.
6
+ #
7
+ # Drops everything that gets to this filter.
8
+ #
9
+ # This is best used in combination with conditionals, for example:
10
+ #
11
+ # filter {
12
+ # if [loglevel] == "debug" {
13
+ # drop { }
14
+ # }
15
+ # }
16
+ #
17
+ # The above will only pass events to the drop filter if the loglevel field is
18
+ # "debug". This will cause all events matching to be dropped.
19
+ class LogStash::Filters::Drop < LogStash::Filters::Base
20
+ config_name "drop"
21
+ milestone 3
22
+
23
+ public
24
+ def register
25
+ # nothing to do.
26
+ end
27
+
28
+ public
29
+ def filter(event)
30
+ event.cancel
31
+ end # def filter
32
+ end # class LogStash::Filters::Drop