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,306 @@
1
+ # encoding utf-8
2
+ require "date"
3
+ require "logstash/inputs/base"
4
+ require "logstash/namespace"
5
+ require "socket"
6
+ require "tempfile"
7
+ require "time"
8
+
9
+ # Read events from the connectd binary protocol over the network via udp.
10
+ # See https://collectd.org/wiki/index.php/Binary_protocol
11
+ #
12
+ # Configuration in your Logstash configuration file can be as simple as:
13
+ # input {
14
+ # collectd {}
15
+ # }
16
+ #
17
+ # A sample collectd.conf to send to Logstash might be:
18
+ #
19
+ # Hostname "host.example.com"
20
+ # LoadPlugin interface
21
+ # LoadPlugin load
22
+ # LoadPlugin memory
23
+ # LoadPlugin network
24
+ # <Plugin interface>
25
+ # Interface "eth0"
26
+ # IgnoreSelected false
27
+ # </Plugin>
28
+ # <Plugin network>
29
+ # <Server "10.0.0.1" "25826">
30
+ # </Server>
31
+ # </Plugin>
32
+ #
33
+ # Be sure to replace "10.0.0.1" with the IP of your Logstash instance.
34
+ #
35
+
36
+ #
37
+ class LogStash::Inputs::Collectd < LogStash::Inputs::Base
38
+ config_name "collectd"
39
+ milestone 1
40
+
41
+ # File path(s) to collectd types.db to use.
42
+ # The last matching pattern wins if you have identical pattern names in multiple files.
43
+ # If no types.db is provided the included types.db will be used (currently 5.4.0).
44
+ config :typesdb, :validate => :array
45
+
46
+ # The address to listen on. Defaults to all available addresses.
47
+ config :host, :validate => :string, :default => "0.0.0.0"
48
+
49
+ # The port to listen on. Defaults to the collectd expected port of 25826.
50
+ config :port, :validate => :number, :default => 25826
51
+
52
+ # Prune interval records. Defaults to true.
53
+ config :prune_intervals, :validate => :boolean, :default => true
54
+
55
+ # Buffer size. 1452 is the collectd default for v5+
56
+ config :buffer_size, :validate => :number, :default => 1452
57
+
58
+ public
59
+ def initialize(params)
60
+ super
61
+ BasicSocket.do_not_reverse_lookup = true
62
+ @idbyte = 0
63
+ @length = 0
64
+ @prev_typenum = 0
65
+ @header = []; @body = []
66
+ @timestamp = Time.now().utc
67
+ @collectd = {}
68
+ @types = {}
69
+ end # def initialize
70
+
71
+ public
72
+ def register
73
+ @udp = nil
74
+ if @typesdb.nil?
75
+ if __FILE__ =~ /^file:\/.+!.+/
76
+ begin
77
+ # Running from a jar, assume types.db is at the root.
78
+ jar_path = [__FILE__.split("!").first, "/types.db"].join("!")
79
+ @typesdb = [jar_path]
80
+ rescue => ex
81
+ raise "Failed to cache, due to: #{ex}\n#{ex.backtrace}"
82
+ end
83
+ else
84
+ if File.exists?("types.db")
85
+ @typesdb = ["types.db"]
86
+ elsif File.exists?("vendor/collectd/types.db")
87
+ @typesdb = ["vendor/collectd/types.db"]
88
+ else
89
+ raise "You must specify 'typesdb => ...' in your collectd input"
90
+ end
91
+ end
92
+ end
93
+ @logger.info("Using internal types.db", :typesdb => @typesdb.to_s)
94
+ end # def register
95
+
96
+ public
97
+ def run(output_queue)
98
+ begin
99
+ # get types
100
+ get_types(@typesdb)
101
+ # collectd server
102
+ collectd_listener(output_queue)
103
+ rescue LogStash::ShutdownSignal
104
+ # do nothing, shutdown was requested.
105
+ rescue => e
106
+ @logger.warn("Collectd listener died", :exception => e, :backtrace => e.backtrace)
107
+ sleep(5)
108
+ retry
109
+ end # begin
110
+ end # def run
111
+
112
+ public
113
+ def get_types(paths)
114
+ # Get the typesdb
115
+ paths.each do |path|
116
+ @logger.info("Getting Collectd typesdb info", :typesdb => path.to_s)
117
+ File.open(path, 'r').each_line do |line|
118
+ typename, *line = line.strip.split
119
+ next if typename.nil? || if typename[0,1] != '#' # Don't process commented or blank lines
120
+ v = line.collect { |l| l.strip.split(":")[0] }
121
+ @types[typename] = v
122
+ end
123
+ end
124
+ end
125
+ @logger.debug("Collectd Types", :types => @types.to_s)
126
+ end # def get_types
127
+
128
+ public
129
+ def type_map(id)
130
+ case id
131
+ when 0; return "host"
132
+ when 1,8; return "@timestamp"
133
+ when 2; return "plugin"
134
+ when 3; return "plugin_instance"
135
+ when 4; return "collectd_type"
136
+ when 5; return "type_instance"
137
+ when 6; return "values"
138
+ when 9; return "interval"
139
+ when 100; return "message"
140
+ when 101; return "severity"
141
+ end
142
+ end # def type_map
143
+
144
+ public
145
+ def vt_map(id)
146
+ case id
147
+ when 0; return "COUNTER"
148
+ when 1; return "GAUGE"
149
+ when 2; return "DERIVE"
150
+ when 3; return "ABSOLUTE"
151
+ else; return 'UNKNOWN'
152
+ end
153
+ end
154
+
155
+ public
156
+ def get_values(id, body)
157
+ retval = ''
158
+ case id
159
+ when 0,2,3,4,5,100 #=> String types
160
+ retval = body.pack("C*")
161
+ retval = retval[0..-2]
162
+ when 1 # Time
163
+ # Time here, in bit-shifted format. Parse bytes into UTC.
164
+ byte1, byte2 = body.pack("C*").unpack("NN")
165
+ retval = Time.at(( ((byte1 << 32) + byte2))).utc
166
+ when 7,101 #=> Numeric types
167
+ retval = body.slice!(0..7).pack("C*").unpack("E")[0]
168
+ when 8 # Time, Hi-Res
169
+ # Time here, in bit-shifted format. Parse bytes into UTC.
170
+ byte1, byte2 = body.pack("C*").unpack("NN")
171
+ retval = Time.at(( ((byte1 << 32) + byte2) * (2**-30) )).utc
172
+ when 9 # Interval, Hi-Res
173
+ byte1, byte2 = body.pack("C*").unpack("NN")
174
+ retval = (((byte1 << 32) + byte2) * (2**-30)).to_i
175
+ when 6 # Values
176
+ val_bytes = body.slice!(0..1)
177
+ val_count = val_bytes.pack("C*").unpack("n")
178
+ if body.length % 9 == 0 # Should be 9 fields
179
+ count = 0
180
+ retval = []
181
+ types = body.slice!(0..((body.length/9)-1))
182
+ while body.length > 0
183
+ vtype = vt_map(types[count])
184
+ case types[count]
185
+ when 0, 3; v = body.slice!(0..7).pack("C*").unpack("Q>")[0]
186
+ when 1; v = body.slice!(0..7).pack("C*").unpack("E")[0]
187
+ when 2; v = body.slice!(0..7).pack("C*").unpack("q>")[0]
188
+ else; v = 0
189
+ end
190
+ retval << v
191
+ count += 1
192
+ end
193
+ else
194
+ @logger.error("Incorrect number of data fields for collectd record", :body => body.to_s)
195
+ end
196
+ end
197
+ # Populate some state variables based on their type...
198
+ case id
199
+ when 2
200
+ if @plugin != retval # Zero-out @plugin_instance when @plugin changes
201
+ @plugin_instance = ''
202
+ @collectd.delete('plugin_instance')
203
+ end
204
+ @plugin = retval
205
+ when 0; @cdhost = retval
206
+ when 3; @plugin_instance = retval
207
+ when 4; @cdtype = retval
208
+ when 5; @type_instance = retval
209
+ when 1,8; @timestamp = retval
210
+ end
211
+ return retval
212
+ end # def get_values
213
+
214
+ private
215
+ def generate_event(data, output_queue)
216
+ # Prune these *specific* keys if they exist and are empty.
217
+ # This is better than looping over all keys every time.
218
+ data.delete('type_instance') if data['type_instance'] == ""
219
+ data.delete('plugin_instance') if data['plugin_instance'] == ""
220
+ # As crazy as it sounds, this is where we actually send our events to the queue!
221
+ event = LogStash::Event.new
222
+ data.each {|k, v| event[k] = data[k]}
223
+ decorate(event)
224
+ output_queue << event
225
+ end # def generate_event
226
+
227
+ private
228
+ def collectd_listener(output_queue)
229
+
230
+ @logger.info("Starting Collectd listener", :address => "#{@host}:#{@port}")
231
+
232
+ if @udp && ! @udp.closed?
233
+ @udp.close
234
+ end
235
+
236
+ @udp = UDPSocket.new(Socket::AF_INET)
237
+ @udp.bind(@host, @port)
238
+
239
+ loop do
240
+ payload, client = @udp.recvfrom(@buffer_size)
241
+ payload.each_byte do |byte|
242
+ # According to the documentation for the binary protocol
243
+ # it takes 4 bytes to define the header:
244
+ # The first 2 bytes are the type number,
245
+ # the second 2 bytes are the length of the message.
246
+ # So, until we have looped 4 times (@idbyte is our counter)
247
+ # append the byte to the @header
248
+ if @idbyte < 4
249
+ @header << byte
250
+ # Now that we have looped exactly 4 times...
251
+ elsif @idbyte == 4
252
+ @typenum = (@header[0] << 1) + @header[1] # @typenum gets the first 2 bytes
253
+ @length = (@header[2] << 1) + @header[3] # @length gets the second 2 bytes
254
+ @body << byte # @body begins with the current byte
255
+ # And if we've looped more than 4, up until the length of the message (now defined)
256
+ elsif @idbyte > 4 && @idbyte < @length
257
+ @body << byte # append the current byte to @body
258
+ end
259
+ # So long as we have @length and we've reached it, it's time to parse
260
+ if @length > 0 && @idbyte == @length-1
261
+ field = type_map(@typenum) # Get the field name based on type
262
+ if @typenum < @prev_typenum # We've started over, generate an event
263
+ if @prune_intervals
264
+ generate_event(@collectd, output_queue) unless @prev_typenum == 7 or @prev_typenum == 9
265
+ else
266
+ generate_event(@collectd, output_queue)
267
+ end
268
+ @collectd.clear # Empty @collectd
269
+ @collectd['host'] = @cdhost # Reset these from state
270
+ @collectd['collectd_type'] = @cdtype
271
+ @collectd['plugin'] = @plugin
272
+ @collectd['plugin_instance'] = @plugin_instance
273
+ @collectd['@timestamp'] = @timestamp
274
+ end
275
+ # Here is where we actually fill @collectd
276
+ values = get_values(@typenum, @body)
277
+ if values.kind_of?(Array)
278
+ if values.length > 1 # Only do this iteration on multi-value arrays
279
+ values.each_with_index {|value, x| @collectd[@types[@collectd['collectd_type']][x]] = values[x]}
280
+ else # Otherwise it's a single value
281
+ @collectd['value'] = values[0] # So name it 'value' accordingly
282
+ end
283
+ elsif field != nil # Not an array, make sure it's non-empty
284
+ @collectd[field] = values # Append values to @collectd under key field
285
+ end
286
+ @prev_typenum = @typenum
287
+ # All bytes in the collectd event have now been processed. Reset counters, header & body.
288
+ @idbyte = 0; @length = 0; @header.clear; @body.clear;
289
+ else # Increment the byte positional counter
290
+ @idbyte += 1
291
+ end # End of if @length > 0 && @idbyte == @length-1
292
+ end # End of payload.each_byte do |byte| loop
293
+ end # End of loop do, payload, client = @udp.recvfrom(@buffer_size)
294
+ ensure
295
+ if @udp
296
+ @udp.close_read rescue nil
297
+ @udp.close_write rescue nil
298
+ end
299
+ end # def collectd_listener
300
+
301
+ public
302
+ def teardown
303
+ @udp.close if @udp && !@udp.closed?
304
+ end
305
+
306
+ end # class LogStash::Inputs::Collectd
@@ -0,0 +1,323 @@
1
+ # encoding: utf-8
2
+ require "date"
3
+ require "logstash/inputs/base"
4
+ require "logstash/namespace"
5
+
6
+ # Retrieve watchdog log events from a Drupal installation with DBLog enabled.
7
+ # The events are pulled out directly from the database.
8
+ # The original events are not deleted, and on every consecutive run only new
9
+ # events are pulled.
10
+ #
11
+ # The last watchdog event id that was processed is stored in the Drupal
12
+ # variable table with the name "logstash_last_wid". Delete this variable or
13
+ # set it to 0 if you want to re-import all events.
14
+ #
15
+ # More info on DBLog: http://drupal.org/documentation/modules/dblog
16
+ #
17
+ class LogStash::Inputs::DrupalDblog < LogStash::Inputs::Base
18
+ config_name "drupal_dblog"
19
+ milestone 1
20
+
21
+ default :codec, "plain"
22
+
23
+ # Specify all drupal databases that you whish to import from.
24
+ # This can be as many as you whish.
25
+ # The format is a hash, with a unique site name as the key, and a databse
26
+ # url as the value.
27
+ #
28
+ # Example:
29
+ # [
30
+ # "site1", "mysql://user1:password@host1.com/databasename",
31
+ # "other_site", "mysql://user2:password@otherhost.com/databasename",
32
+ # ...
33
+ # ]
34
+ config :databases, :validate => :hash
35
+
36
+ # By default, the event only contains the current user id as a field.
37
+ # If you whish to add the username as an additional field, set this to true.
38
+ config :add_usernames, :validate => :boolean, :default => false
39
+
40
+ # Time between checks in minutes.
41
+ config :interval, :validate => :number, :default => 10
42
+
43
+ # The amount of log messages that should be fetched with each query.
44
+ # Bulk fetching is done to prevent querying huge data sets when lots of
45
+ # messages are in the database.
46
+ config :bulksize, :validate => :number, :default => 5000
47
+
48
+ # Label this input with a type.
49
+ # Types are used mainly for filter activation.
50
+ #
51
+ #
52
+ # If you create an input with type "foobar", then only filters
53
+ # which also have type "foobar" will act on them.
54
+ #
55
+ # The type is also stored as part of the event itself, so you
56
+ # can also use the type to search for in the web interface.
57
+ config :type, :validate => :string, :default => 'watchdog'
58
+
59
+ public
60
+ def register
61
+ require "php_serialize"
62
+
63
+ if RUBY_PLATFORM == 'java'
64
+ require "logstash/inputs/drupal_dblog/jdbcconnection"
65
+ else
66
+ require "mysql2"
67
+ end
68
+ end # def register
69
+
70
+ public
71
+ def config_init(params)
72
+ super
73
+
74
+ dbs = {}
75
+ valid = true
76
+
77
+ @databases.each do |name, rawUri|
78
+ uri = URI(rawUri)
79
+
80
+ dbs[name] = {
81
+ "site" => name,
82
+ "scheme" => uri.scheme,
83
+ "host" => uri.host,
84
+ "user" => uri.user,
85
+ "password" => uri.password,
86
+ "database" => uri.path.sub('/', ''),
87
+ "port" => uri.port.to_i
88
+ }
89
+
90
+ if not (
91
+ uri.scheme and not uri.scheme.empty?\
92
+ and uri.host and not uri.host.empty?\
93
+ and uri.user and not uri.user.empty?\
94
+ and uri.password\
95
+ and uri.path and not uri.path.sub('/', '').empty?
96
+ )
97
+ @logger.error("Drupal DBLog: Invalid database URI for #{name} : #{rawUri}")
98
+ valid = false
99
+ end
100
+ if not uri.scheme == 'mysql'
101
+ @logger.error("Drupal DBLog: Only mysql databases are supported.")
102
+ valid = false
103
+ end
104
+ end
105
+
106
+ if not valid
107
+ @logger.error("Config validation failed.")
108
+ exit 1
109
+ end
110
+
111
+ @databases = dbs
112
+ end #def config_init
113
+
114
+ public
115
+ def run(output_queue)
116
+ @logger.info("Initializing drupal_dblog")
117
+
118
+ loop do
119
+ @logger.debug("Drupal DBLog: Starting to fetch new watchdog entries")
120
+ start = Time.now.to_i
121
+
122
+ @databases.each do |name, db|
123
+ @logger.debug("Drupal DBLog: Checking database #{name}")
124
+ check_database(output_queue, db)
125
+ @logger.info("Drupal DBLog: Retrieved all new watchdog messages from #{name}")
126
+ end
127
+
128
+ timeTaken = Time.now.to_i - start
129
+ @logger.info("Drupal DBLog: Fetched all new watchdog entries in #{timeTaken} seconds")
130
+
131
+ # If fetching of all databases took less time than the interval,
132
+ # sleep a bit.
133
+ sleepTime = @interval * 60 - timeTaken
134
+ if sleepTime > 0
135
+ @logger.debug("Drupal DBLog: Sleeping for #{sleepTime} seconds")
136
+ sleep(sleepTime)
137
+ end
138
+ end # loop
139
+ end # def run
140
+
141
+ private
142
+ def initialize_client(db)
143
+ if db["scheme"] == 'mysql'
144
+
145
+ if not db["port"] > 0
146
+ db["port"] = 3306
147
+ end
148
+
149
+ if RUBY_PLATFORM == 'java'
150
+ @client = LogStash::DrupalDblogJavaMysqlConnection.new(
151
+ db["host"],
152
+ db["user"],
153
+ db["password"],
154
+ db["database"],
155
+ db["port"]
156
+ )
157
+ else
158
+ @client = Mysql2::Client.new(
159
+ :host => db["host"],
160
+ :port => db["port"],
161
+ :username => db["user"],
162
+ :password => db["password"],
163
+ :database => db["database"]
164
+ )
165
+ end
166
+ end
167
+ end #def get_client
168
+
169
+ private
170
+ def check_database(output_queue, db)
171
+
172
+ begin
173
+ # connect to the MySQL server
174
+ initialize_client(db)
175
+ rescue Exception => e
176
+ @logger.error("Could not connect to database: " + e.message)
177
+ return
178
+ end #begin
179
+
180
+ begin
181
+ @sitename = db["site"]
182
+
183
+ @usermap = @add_usernames ? get_usermap : nil
184
+
185
+ # Retrieve last pulled watchdog entry id
186
+ initialLastWid = get_last_wid
187
+ lastWid = nil
188
+
189
+
190
+ if initialLastWid == false
191
+ lastWid = 0
192
+ set_last_wid(0, true)
193
+ else
194
+ lastWid = initialLastWid
195
+ end
196
+
197
+ # Fetch new entries, and create the event
198
+ while true
199
+ results = get_db_rows(lastWid)
200
+ if results.length() < 1
201
+ break
202
+ end
203
+
204
+ @logger.debug("Fetched " + results.length().to_s + " database rows")
205
+
206
+ results.each do |row|
207
+ event = build_event(row)
208
+ if event
209
+ decorate(event)
210
+ output_queue << event
211
+ lastWid = row['wid'].to_s
212
+ end
213
+ end
214
+
215
+ set_last_wid(lastWid, false)
216
+ end
217
+ rescue Exception => e
218
+ @logger.error("Error while fetching messages: ", :error => e.message)
219
+ end # begin
220
+
221
+ # Close connection
222
+ @client.close
223
+ end # def check_database
224
+
225
+ def get_db_rows(lastWid)
226
+ query = 'SELECT * from watchdog WHERE wid > ' + lastWid.to_s + " ORDER BY wid asc LIMIT " + @bulksize.to_s
227
+ return @client.query(query)
228
+ end # def get_db_rows
229
+
230
+ private
231
+ def update_sitename
232
+ if @sitename == ""
233
+ result = @client.query('SELECT value FROM variable WHERE name="site_name"')
234
+ if result.first()
235
+ @sitename = PHP.unserialize(result.first()['value'])
236
+ end
237
+ end
238
+ end # def update_sitename
239
+
240
+ private
241
+ def get_last_wid
242
+ result = @client.query('SELECT value FROM variable WHERE name="logstash_last_wid"')
243
+ lastWid = false
244
+
245
+ if result.count() > 0
246
+ tmp = result.first()["value"].gsub("i:", "").gsub(";", "")
247
+ lastWid = tmp.to_i.to_s == tmp ? tmp : "0"
248
+ end
249
+
250
+ return lastWid
251
+ end # def get_last_wid
252
+
253
+ private
254
+ def set_last_wid(wid, insert)
255
+ wid = PHP.serialize(wid.to_i)
256
+
257
+ # Update last import wid variable
258
+ if insert
259
+ # Does not exist yet, so insert
260
+ @client.query('INSERT INTO variable (name, value) VALUES("logstash_last_wid", "' + wid + '")')
261
+ else
262
+ @client.query('UPDATE variable SET value="' + wid + '" WHERE name="logstash_last_wid"')
263
+ end
264
+ end # def set_last_wid
265
+
266
+ private
267
+ def get_usermap
268
+ map = {}
269
+
270
+ @client.query("SELECT uid, name FROM users").each do |row|
271
+ map[row["uid"]] = row["name"]
272
+ end
273
+
274
+ map[0] = "guest"
275
+ return map
276
+ end # def get_usermap
277
+
278
+ private
279
+ def build_event(row)
280
+ # Convert unix timestamp
281
+ timestamp = Time.at(row["timestamp"]).to_datetime.iso8601
282
+
283
+ msg = row["message"]
284
+ vars = {}
285
+
286
+ # Unserialize the variables, and construct the message
287
+ if row['variables'] != 'N;'
288
+ vars = PHP.unserialize(row["variables"])
289
+
290
+ if vars.is_a?(Hash)
291
+ vars.each_pair do |k, v|
292
+ if msg.scan(k).length() > 0
293
+ msg = msg.gsub(k.to_s, v.to_s)
294
+ else
295
+ # If not inside the message, add var as an additional field
296
+ row["variable_" + k] = v
297
+ end
298
+ end
299
+ end
300
+ end
301
+
302
+ row.delete("message")
303
+ row.delete("variables")
304
+ row.delete("timestamp")
305
+
306
+ row["severity"] = row["severity"].to_i
307
+
308
+ if @add_usernames and @usermap.has_key?(row["uid"])
309
+ row["user"] = @usermap[row["uid"]]
310
+ end
311
+
312
+ entry = {
313
+ "@timestamp" => timestamp,
314
+ "tags" => [],
315
+ "type" => "watchdog",
316
+ "site" => @sitename,
317
+ "message" => msg
318
+ }.merge(row)
319
+
320
+ return LogStash::Event.new(entry)
321
+ end # def build_event
322
+
323
+ end # class LogStash::Inputs::DrupalDblog