logstash-lib 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
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,431 @@
1
+ # encoding: utf-8
2
+ # Author: Rodrigo De Castro <rdc@google.com>
3
+ # Date: 2013-09-20
4
+ #
5
+ # Copyright 2013 Google Inc.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ require "logstash/outputs/base"
19
+ require "logstash/namespace"
20
+ require "zlib"
21
+
22
+ # Summary: plugin to upload log events to Google Cloud Storage (GCS), rolling
23
+ # files based on the date pattern provided as a configuration setting. Events
24
+ # are written to files locally and, once file is closed, this plugin uploads
25
+ # it to the configured bucket.
26
+ #
27
+ # For more info on Google Cloud Storage, please go to:
28
+ # https://cloud.google.com/products/cloud-storage
29
+ #
30
+ # In order to use this plugin, a Google service account must be used. For
31
+ # more information, please refer to:
32
+ # https://developers.google.com/storage/docs/authentication#service_accounts
33
+ #
34
+ # Recommendation: experiment with the settings depending on how much log
35
+ # data you generate, so the uploader can keep up with the generated logs.
36
+ # Using gzip output can be a good option to reduce network traffic when
37
+ # uploading the log files and in terms of storage costs as well.
38
+ #
39
+ # USAGE:
40
+ # This is an example of logstash config:
41
+ #
42
+ # output {
43
+ # google_cloud_storage {
44
+ # bucket => "my_bucket" (required)
45
+ # key_path => "/path/to/privatekey.p12" (required)
46
+ # key_password => "notasecret" (optional)
47
+ # service_account => "1234@developer.gserviceaccount.com" (required)
48
+ # temp_directory => "/tmp/logstash-gcs" (optional)
49
+ # log_file_prefix => "logstash_gcs" (optional)
50
+ # max_file_size_kbytes => 1024 (optional)
51
+ # output_format => "plain" (optional)
52
+ # date_pattern => "%Y-%m-%dT%H:00" (optional)
53
+ # flush_interval_secs => 2 (optional)
54
+ # gzip => false (optional)
55
+ # uploader_interval_secs => 60 (optional)
56
+ # }
57
+ # }
58
+ #
59
+ # Improvements TODO list:
60
+ # - Support logstash event variables to determine filename.
61
+ # - Turn Google API code into a Plugin Mixin (like AwsConfig).
62
+ # - There's no recover method, so if logstash/plugin crashes, files may not
63
+ # be uploaded to GCS.
64
+ # - Allow user to configure file name.
65
+ # - Allow parallel uploads for heavier loads (+ connection configuration if
66
+ # exposed by Ruby API client)
67
+ class LogStash::Outputs::GoogleCloudStorage < LogStash::Outputs::Base
68
+ config_name "google_cloud_storage"
69
+ milestone 1
70
+
71
+ # GCS bucket name, without "gs://" or any other prefix.
72
+ config :bucket, :validate => :string, :required => true
73
+
74
+ # GCS path to private key file.
75
+ config :key_path, :validate => :string, :required => true
76
+
77
+ # GCS private key password.
78
+ config :key_password, :validate => :string, :default => "notasecret"
79
+
80
+ # GCS service account.
81
+ config :service_account, :validate => :string, :required => true
82
+
83
+ # Directory where temporary files are stored.
84
+ # Defaults to /tmp/logstash-gcs-<random-suffix>
85
+ config :temp_directory, :validate => :string, :default => ""
86
+
87
+ # Log file prefix. Log file will follow the format:
88
+ # <prefix>_hostname_date<.part?>.log
89
+ config :log_file_prefix, :validate => :string, :default => "logstash_gcs"
90
+
91
+ # Sets max file size in kbytes. 0 disable max file check.
92
+ config :max_file_size_kbytes, :validate => :number, :default => 10000
93
+
94
+ # The event format you want to store in files. Defaults to plain text.
95
+ config :output_format, :validate => [ "json", "plain" ], :default => "plain"
96
+
97
+ # Time pattern for log file, defaults to hourly files.
98
+ # Must Time.strftime patterns: www.ruby-doc.org/core-2.0/Time.html#method-i-strftime
99
+ config :date_pattern, :validate => :string, :default => "%Y-%m-%dT%H:00"
100
+
101
+ # Flush interval in seconds for flushing writes to log files. 0 will flush
102
+ # on every message.
103
+ config :flush_interval_secs, :validate => :number, :default => 2
104
+
105
+ # Gzip output stream when writing events to log files.
106
+ config :gzip, :validate => :boolean, :default => false
107
+
108
+ # Uploader interval when uploading new files to GCS. Adjust time based
109
+ # on your time pattern (for example, for hourly files, this interval can be
110
+ # around one hour).
111
+ config :uploader_interval_secs, :validate => :number, :default => 60
112
+
113
+ public
114
+ def register
115
+ require "fileutils"
116
+ require "thread"
117
+
118
+ @logger.debug("GCS: register plugin")
119
+
120
+ @upload_queue = Queue.new
121
+ @last_flush_cycle = Time.now
122
+ initialize_temp_directory()
123
+ initialize_current_log()
124
+ initialize_google_client()
125
+ initialize_uploader()
126
+
127
+ if @gzip
128
+ @content_type = 'application/gzip'
129
+ else
130
+ @content_type = 'text/plain'
131
+ end
132
+ end
133
+
134
+ # Method called for each log event. It writes the event to the current output
135
+ # file, flushing depending on flush interval configuration.
136
+ public
137
+ def receive(event)
138
+ return unless output?(event)
139
+
140
+ @logger.debug("GCS: receive method called", :event => event)
141
+
142
+ if (@output_format == "json")
143
+ message = event.to_json
144
+ else
145
+ message = event.to_s
146
+ end
147
+
148
+ new_base_path = get_base_path()
149
+
150
+ # Time to roll file based on the date pattern? Or is it over the size limit?
151
+ if (@current_base_path != new_base_path || (@max_file_size_kbytes > 0 && @temp_file.size >= @max_file_size_kbytes * 1024))
152
+ @logger.debug("GCS: log file will be closed and uploaded",
153
+ :filename => File.basename(@temp_file.to_path),
154
+ :size => @temp_file.size.to_s,
155
+ :max_size => @max_file_size_kbytes.to_s)
156
+ # Close does not guarantee that data is physically written to disk.
157
+ @temp_file.fsync()
158
+ @temp_file.close()
159
+ initialize_next_log()
160
+ end
161
+
162
+ @temp_file.write(message)
163
+ @temp_file.write("\n")
164
+
165
+ sync_log_file()
166
+
167
+ @logger.debug("GCS: event appended to log file",
168
+ :filename => File.basename(@temp_file.to_path))
169
+ end
170
+
171
+ public
172
+ def teardown
173
+ @logger.debug("GCS: teardown method called")
174
+
175
+ @temp_file.fsync()
176
+ @temp_file.close()
177
+ end
178
+
179
+ private
180
+ ##
181
+ # Flushes temporary log file every flush_interval_secs seconds or so.
182
+ # This is triggered by events, but if there are no events there's no point
183
+ # flushing files anyway.
184
+ #
185
+ # Inspired by lib/logstash/outputs/file.rb (flush(fd), flush_pending_files)
186
+ def sync_log_file
187
+ if flush_interval_secs <= 0
188
+ @temp_file.fsync()
189
+ return
190
+ end
191
+
192
+ return unless Time.now - @last_flush_cycle >= flush_interval_secs
193
+ @temp_file.fsync()
194
+ @logger.debug("GCS: flushing file",
195
+ :path => @temp_file.to_path,
196
+ :fd => @temp_file)
197
+ @last_flush_cycle = Time.now
198
+ end
199
+
200
+ ##
201
+ # Creates temporary directory, if it does not exist.
202
+ #
203
+ # A random suffix is appended to the temporary directory
204
+ def initialize_temp_directory
205
+ require "stud/temporary"
206
+ if @temp_directory.empty?
207
+ @temp_directory = Stud::Temporary.directory("logstash-gcs")
208
+ @logger.info("GCS: temporary directory generated",
209
+ :directory => @temp_directory)
210
+ end
211
+
212
+ if !(File.directory? @temp_directory)
213
+ @logger.debug("GCS: directory doesn't exist. Creating it.",
214
+ :directory => @temp_directory)
215
+ FileUtils.mkdir_p(@temp_directory)
216
+ end
217
+ end
218
+
219
+ ##
220
+ # Starts thread to upload log files.
221
+ #
222
+ # Uploader is done in a separate thread, not holding the receive method above.
223
+ def initialize_uploader
224
+ @uploader = Thread.new do
225
+ @logger.debug("GCS: starting uploader")
226
+ while true
227
+ filename = @upload_queue.pop
228
+
229
+ # Reenqueue if it is still the current file.
230
+ if filename == @temp_file.to_path
231
+ if @current_base_path == get_base_path()
232
+ @logger.debug("GCS: reenqueue as log file is being currently appended to.",
233
+ :filename => filename)
234
+ @upload_queue << filename
235
+ # If we got here, it means that older files were uploaded, so let's
236
+ # wait another minute before checking on this file again.
237
+ sleep @uploader_interval_secs
238
+ next
239
+ else
240
+ @logger.debug("GCS: flush and close file to be uploaded.",
241
+ :filename => filename)
242
+ @temp_file.fsync()
243
+ @temp_file.close()
244
+ initialize_next_log()
245
+ end
246
+ end
247
+
248
+ upload_object(filename)
249
+ @logger.debug("GCS: delete local temporary file ",
250
+ :filename => filename)
251
+ File.delete(filename)
252
+ sleep @uploader_interval_secs
253
+ end
254
+ end
255
+ end
256
+
257
+ ##
258
+ # Returns base path to log file that is invariant regardless of whether
259
+ # max file or gzip options.
260
+ def get_base_path
261
+ return @temp_directory + File::SEPARATOR + @log_file_prefix + "_" +
262
+ Socket.gethostname() + "_" + Time.now.strftime(@date_pattern)
263
+ end
264
+
265
+ ##
266
+ # Returns log file suffix, which will vary depending on whether gzip is
267
+ # enabled.
268
+ def get_suffix
269
+ return @gzip ? ".log.gz" : ".log"
270
+ end
271
+
272
+ ##
273
+ # Returns full path to the log file based on global variables (like
274
+ # current_base_path) and configuration options (max file size and gzip
275
+ # enabled).
276
+ def get_full_path
277
+ if @max_file_size_kbytes > 0
278
+ return @current_base_path + ".part" + ("%03d" % @size_counter) + get_suffix()
279
+ else
280
+ return @current_base_path + get_suffix()
281
+ end
282
+ end
283
+
284
+ ##
285
+ # Returns latest part number for a base path. This method checks all existing
286
+ # log files in order to find the highest part number, so this file can be used
287
+ # for appending log events.
288
+ #
289
+ # Only applicable if max file size is enabled.
290
+ def get_latest_part_number(base_path)
291
+ part_numbers = Dir.glob(base_path + ".part*" + get_suffix()).map do |item|
292
+ match = /^.*\.part(?<part_num>\d+)#{get_suffix()}$/.match(item)
293
+ next if match.nil?
294
+ match[:part_num].to_i
295
+ end
296
+
297
+ return part_numbers.max if part_numbers.any?
298
+ 0
299
+ end
300
+
301
+ ##
302
+ # Opens current log file and updates @temp_file with an instance of IOWriter.
303
+ # This method also adds file to the upload queue.
304
+ def open_current_file()
305
+ path = get_full_path()
306
+ stat = File.stat(path) rescue nil
307
+ if stat and stat.ftype == "fifo" and RUBY_PLATFORM == "java"
308
+ fd = java.io.FileWriter.new(java.io.File.new(path))
309
+ else
310
+ fd = File.new(path, "a")
311
+ end
312
+ if @gzip
313
+ fd = Zlib::GzipWriter.new(fd)
314
+ end
315
+ @temp_file = GCSIOWriter.new(fd)
316
+ @upload_queue << @temp_file.to_path
317
+ end
318
+
319
+ ##
320
+ # Opens log file on plugin initialization, trying to resume from an existing
321
+ # file. If max file size is enabled, find the highest part number and resume
322
+ # from it.
323
+ def initialize_current_log
324
+ @current_base_path = get_base_path
325
+ if @max_file_size_kbytes > 0
326
+ @size_counter = get_latest_part_number(@current_base_path)
327
+ @logger.debug("GCS: resuming from latest part.",
328
+ :part => @size_counter)
329
+ end
330
+ open_current_file()
331
+ end
332
+
333
+ ##
334
+ # Generates new log file name based on configuration options and opens log
335
+ # file. If max file size is enabled, part number if incremented in case the
336
+ # the base log file name is the same (e.g. log file was not rolled given the
337
+ # date pattern).
338
+ def initialize_next_log
339
+ new_base_path = get_base_path
340
+ if @max_file_size_kbytes > 0
341
+ @size_counter = @current_base_path == new_base_path ? @size_counter + 1 : 0
342
+ @logger.debug("GCS: opening next log file.",
343
+ :filename => @current_base_path,
344
+ :part => @size_counter)
345
+ else
346
+ @logger.debug("GCS: opening next log file.",
347
+ :filename => @current_base_path)
348
+ end
349
+ @current_base_path = new_base_path
350
+ open_current_file()
351
+ end
352
+
353
+ ##
354
+ # Initializes Google Client instantiating client and authorizing access.
355
+ def initialize_google_client
356
+ require "google/api_client"
357
+ require "openssl"
358
+
359
+ @client = Google::APIClient.new(:application_name =>
360
+ 'Logstash Google Cloud Storage output plugin',
361
+ :application_version => '0.1')
362
+ @storage = @client.discovered_api('storage', 'v1beta1')
363
+
364
+ key = Google::APIClient::PKCS12.load_key(@key_path, @key_password)
365
+ service_account = Google::APIClient::JWTAsserter.new(@service_account,
366
+ 'https://www.googleapis.com/auth/devstorage.read_write',
367
+ key)
368
+ @client.authorization = service_account.authorize
369
+ end
370
+
371
+ ##
372
+ # Uploads a local file to the configured bucket.
373
+ def upload_object(filename)
374
+ begin
375
+ @logger.debug("GCS: upload object.", :filename => filename)
376
+
377
+ media = Google::APIClient::UploadIO.new(filename, @content_type)
378
+ metadata_insert_result = @client.execute(:api_method => @storage.objects.insert,
379
+ :parameters => {
380
+ 'uploadType' => 'multipart',
381
+ 'bucket' => @bucket,
382
+ 'name' => File.basename(filename)
383
+ },
384
+ :body_object => {contentType: @content_type},
385
+ :media => media)
386
+ contents = metadata_insert_result.data
387
+ @logger.debug("GCS: multipart insert",
388
+ :object => contents.name,
389
+ :self_link => contents.self_link)
390
+ rescue => e
391
+ @logger.error("GCS: failed to upload file", :exception => e)
392
+ # TODO(rdc): limit retries?
393
+ sleep 1
394
+ retry
395
+ end
396
+ end
397
+ end
398
+
399
+ ##
400
+ # Wrapper class that abstracts which IO being used (for instance, regular
401
+ # files or GzipWriter.
402
+ #
403
+ # Inspired by lib/logstash/outputs/file.rb.
404
+ class GCSIOWriter
405
+ def initialize(io)
406
+ @io = io
407
+ end
408
+ def write(*args)
409
+ @io.write(*args)
410
+ end
411
+ def fsync
412
+ if @io.class == Zlib::GzipWriter
413
+ @io.flush
414
+ @io.to_io.fsync
415
+ else
416
+ @io.fsync
417
+ end
418
+ end
419
+ def method_missing(method_name, *args, &block)
420
+ if @io.respond_to?(method_name)
421
+ @io.send(method_name, *args, &block)
422
+ else
423
+ if @io.class == Zlib::GzipWriter && @io.to_io.respond_to?(method_name)
424
+ @io.to_io.send(method_name, *args, &block)
425
+ else
426
+ super
427
+ end
428
+ end
429
+ end
430
+ attr_accessor :active
431
+ end
@@ -0,0 +1,143 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+ require "socket"
5
+
6
+ # This output allows you to pull metrics from your logs and ship them to
7
+ # graphite. Graphite is an open source tool for storing and graphing metrics.
8
+ #
9
+ # An example use case: At loggly, some of our applications emit aggregated
10
+ # stats in the logs every 10 seconds. Using the grok filter and this output,
11
+ # I can capture the metric values from the logs and emit them to graphite.
12
+ class LogStash::Outputs::Graphite < LogStash::Outputs::Base
13
+ config_name "graphite"
14
+ milestone 2
15
+
16
+ EXCLUDE_ALWAYS = [ "@timestamp", "@version" ]
17
+
18
+ DEFAULT_METRICS_FORMAT = "*"
19
+ METRIC_PLACEHOLDER = "*"
20
+
21
+ # The address of the graphite server.
22
+ config :host, :validate => :string, :default => "localhost"
23
+
24
+ # The port to connect on your graphite server.
25
+ config :port, :validate => :number, :default => 2003
26
+
27
+ # Interval between reconnect attempts to Carbon
28
+ config :reconnect_interval, :validate => :number, :default => 2
29
+
30
+ # Should metrics be resend on failure?
31
+ config :resend_on_failure, :validate => :boolean, :default => false
32
+
33
+ # The metric(s) to use. This supports dynamic strings like %{host}
34
+ # for metric names and also for values. This is a hash field with key
35
+ # of the metric name, value of the metric value. Example:
36
+ #
37
+ # [ "%{host}/uptime", "%{uptime_1m}" ]
38
+ #
39
+ # The value will be coerced to a floating point value. Values which cannot be
40
+ # coerced will zero (0)
41
+ config :metrics, :validate => :hash, :default => {}
42
+
43
+ # Indicate that the event @fields should be treated as metrics and will be sent as is to graphite
44
+ config :fields_are_metrics, :validate => :boolean, :default => false
45
+
46
+ # Include only regex matched metric names
47
+ config :include_metrics, :validate => :array, :default => [ ".*" ]
48
+
49
+ # Exclude regex matched metric names, by default exclude unresolved %{field} strings
50
+ config :exclude_metrics, :validate => :array, :default => [ "%\{[^}]+\}" ]
51
+
52
+ # Enable debug output
53
+ config :debug, :validate => :boolean, :default => false
54
+
55
+ # Defines format of the metric string. The placeholder '*' will be
56
+ # replaced with the name of the actual metric.
57
+ #
58
+ # metrics_format => "foo.bar.*.sum"
59
+ #
60
+ # NOTE: If no metrics_format is defined the name of the metric will be used as fallback.
61
+ config :metrics_format, :validate => :string, :default => DEFAULT_METRICS_FORMAT
62
+
63
+ def register
64
+ @include_metrics.collect!{|regexp| Regexp.new(regexp)}
65
+ @exclude_metrics.collect!{|regexp| Regexp.new(regexp)}
66
+
67
+ if @metrics_format && !@metrics_format.include?(METRIC_PLACEHOLDER)
68
+ @logger.warn("metrics_format does not include placeholder #{METRIC_PLACEHOLDER} .. falling back to default format: #{DEFAULT_METRICS_FORMAT.inspect}")
69
+
70
+ @metrics_format = DEFAULT_METRICS_FORMAT
71
+ end
72
+
73
+ connect
74
+ end # def register
75
+
76
+ def connect
77
+ # TODO(sissel): Test error cases. Catch exceptions. Find fortune and glory.
78
+ begin
79
+ @socket = TCPSocket.new(@host, @port)
80
+ rescue Errno::ECONNREFUSED => e
81
+ @logger.warn("Connection refused to graphite server, sleeping...",
82
+ :host => @host, :port => @port)
83
+ sleep(@reconnect_interval)
84
+ retry
85
+ end
86
+ end # def connect
87
+
88
+ def construct_metric_name(metric)
89
+ if @metrics_format
90
+ return @metrics_format.gsub(METRIC_PLACEHOLDER, metric)
91
+ end
92
+
93
+ metric
94
+ end
95
+
96
+ public
97
+ def receive(event)
98
+ return unless output?(event)
99
+
100
+ # Graphite message format: metric value timestamp\n
101
+
102
+ messages = []
103
+ timestamp = event.sprintf("%{+%s}")
104
+
105
+ if @fields_are_metrics
106
+ @logger.debug("got metrics event", :metrics => event.to_hash)
107
+ event.to_hash.each do |metric,value|
108
+ next if EXCLUDE_ALWAYS.include?(metric)
109
+ next unless @include_metrics.empty? || @include_metrics.any? { |regexp| metric.match(regexp) }
110
+ next if @exclude_metrics.any? {|regexp| metric.match(regexp)}
111
+ messages << "#{construct_metric_name(metric)} #{event.sprintf(value.to_s).to_f} #{timestamp}"
112
+ end
113
+ else
114
+ @metrics.each do |metric, value|
115
+ @logger.debug("processing", :metric => metric, :value => value)
116
+ metric = event.sprintf(metric)
117
+ next unless @include_metrics.any? {|regexp| metric.match(regexp)}
118
+ next if @exclude_metrics.any? {|regexp| metric.match(regexp)}
119
+ messages << "#{construct_metric_name(event.sprintf(metric))} #{event.sprintf(value).to_f} #{timestamp}"
120
+ end
121
+ end
122
+
123
+ if messages.empty?
124
+ @logger.debug("Message is empty, not sending anything to graphite", :messages => messages, :host => @host, :port => @port)
125
+ else
126
+ message = messages.join("\n")
127
+ @logger.debug("Sending carbon messages", :messages => messages, :host => @host, :port => @port)
128
+
129
+ # Catch exceptions like ECONNRESET and friends, reconnect on failure.
130
+ # TODO(sissel): Test error cases. Catch exceptions. Find fortune and glory.
131
+ begin
132
+ @socket.puts(message)
133
+ rescue Errno::EPIPE, Errno::ECONNRESET => e
134
+ @logger.warn("Connection to graphite server died",
135
+ :exception => e, :host => @host, :port => @port)
136
+ sleep(@reconnect_interval)
137
+ connect
138
+ retry if @resend_on_failure
139
+ end
140
+ end
141
+
142
+ end # def receive
143
+ end # class LogStash::Outputs::Graphite