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,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