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.
- data/.gitignore +24 -0
- data/.tailor +8 -0
- data/.travis.yml +12 -0
- data/CHANGELOG +1185 -0
- data/CONTRIBUTING.md +61 -0
- data/CONTRIBUTORS +79 -0
- data/LICENSE +14 -0
- data/Makefile +460 -0
- data/README.md +120 -0
- data/STYLE.md +96 -0
- data/bin/logstash +37 -0
- data/bin/logstash-test +4 -0
- data/bin/logstash-web +4 -0
- data/bin/logstash.lib.sh +78 -0
- data/bot/check_pull_changelog.rb +89 -0
- data/docs/configuration.md +260 -0
- data/docs/docgen.rb +242 -0
- data/docs/extending/example-add-a-new-filter.md +121 -0
- data/docs/extending/index.md +91 -0
- data/docs/flags.md +43 -0
- data/docs/generate_index.rb +28 -0
- data/docs/index.html.erb +56 -0
- data/docs/learn.md +46 -0
- data/docs/life-of-an-event.md +109 -0
- data/docs/logging-tool-comparisons.md +60 -0
- data/docs/plugin-doc.html.erb +91 -0
- data/docs/plugin-milestones.md +41 -0
- data/docs/plugin-synopsis.html.erb +24 -0
- data/docs/release-engineering.md +46 -0
- data/docs/release-test-results.md +14 -0
- data/docs/repositories.md +35 -0
- data/docs/tutorials/10-minute-walkthrough/apache-elasticsearch.conf +35 -0
- data/docs/tutorials/10-minute-walkthrough/apache-parse.conf +33 -0
- data/docs/tutorials/10-minute-walkthrough/apache_log.1 +1 -0
- data/docs/tutorials/10-minute-walkthrough/apache_log.2.bz2 +0 -0
- data/docs/tutorials/10-minute-walkthrough/hello-search.conf +25 -0
- data/docs/tutorials/10-minute-walkthrough/hello.conf +16 -0
- data/docs/tutorials/10-minute-walkthrough/index.md +124 -0
- data/docs/tutorials/10-minute-walkthrough/step-5-output.txt +17 -0
- data/docs/tutorials/getting-started-centralized-overview-diagram.png +0 -0
- data/docs/tutorials/getting-started-centralized-overview-diagram.xml +1 -0
- data/docs/tutorials/getting-started-centralized.md +217 -0
- data/docs/tutorials/getting-started-simple.md +200 -0
- data/docs/tutorials/just-enough-rabbitmq-for-logstash.md +201 -0
- data/docs/tutorials/media/frontend-response-codes.png +0 -0
- data/docs/tutorials/metrics-from-logs.md +84 -0
- data/docs/tutorials/zeromq.md +118 -0
- data/extract_services.rb +29 -0
- data/gembag.rb +64 -0
- data/lib/logstash-event.rb +2 -0
- data/lib/logstash.rb +4 -0
- data/lib/logstash/JRUBY-6970-openssl.rb +22 -0
- data/lib/logstash/JRUBY-6970.rb +102 -0
- data/lib/logstash/agent.rb +305 -0
- data/lib/logstash/certs/cacert.pem +3895 -0
- data/lib/logstash/codecs/base.rb +49 -0
- data/lib/logstash/codecs/compress_spooler.rb +50 -0
- data/lib/logstash/codecs/dots.rb +18 -0
- data/lib/logstash/codecs/edn.rb +28 -0
- data/lib/logstash/codecs/edn_lines.rb +36 -0
- data/lib/logstash/codecs/fluent.rb +55 -0
- data/lib/logstash/codecs/graphite.rb +114 -0
- data/lib/logstash/codecs/json.rb +41 -0
- data/lib/logstash/codecs/json_lines.rb +52 -0
- data/lib/logstash/codecs/json_spooler.rb +22 -0
- data/lib/logstash/codecs/line.rb +58 -0
- data/lib/logstash/codecs/msgpack.rb +43 -0
- data/lib/logstash/codecs/multiline.rb +189 -0
- data/lib/logstash/codecs/netflow.rb +342 -0
- data/lib/logstash/codecs/netflow/util.rb +212 -0
- data/lib/logstash/codecs/noop.rb +19 -0
- data/lib/logstash/codecs/oldlogstashjson.rb +56 -0
- data/lib/logstash/codecs/plain.rb +48 -0
- data/lib/logstash/codecs/rubydebug.rb +22 -0
- data/lib/logstash/codecs/spool.rb +38 -0
- data/lib/logstash/config/Makefile +4 -0
- data/lib/logstash/config/config_ast.rb +380 -0
- data/lib/logstash/config/file.rb +39 -0
- data/lib/logstash/config/grammar.rb +3504 -0
- data/lib/logstash/config/grammar.treetop +241 -0
- data/lib/logstash/config/mixin.rb +464 -0
- data/lib/logstash/config/registry.rb +13 -0
- data/lib/logstash/config/test.conf +18 -0
- data/lib/logstash/errors.rb +10 -0
- data/lib/logstash/event.rb +262 -0
- data/lib/logstash/filters/advisor.rb +178 -0
- data/lib/logstash/filters/alter.rb +173 -0
- data/lib/logstash/filters/anonymize.rb +93 -0
- data/lib/logstash/filters/base.rb +190 -0
- data/lib/logstash/filters/checksum.rb +50 -0
- data/lib/logstash/filters/cidr.rb +76 -0
- data/lib/logstash/filters/cipher.rb +145 -0
- data/lib/logstash/filters/clone.rb +35 -0
- data/lib/logstash/filters/collate.rb +114 -0
- data/lib/logstash/filters/csv.rb +94 -0
- data/lib/logstash/filters/date.rb +244 -0
- data/lib/logstash/filters/dns.rb +201 -0
- data/lib/logstash/filters/drop.rb +32 -0
- data/lib/logstash/filters/elapsed.rb +256 -0
- data/lib/logstash/filters/elasticsearch.rb +73 -0
- data/lib/logstash/filters/environment.rb +27 -0
- data/lib/logstash/filters/extractnumbers.rb +84 -0
- data/lib/logstash/filters/gelfify.rb +52 -0
- data/lib/logstash/filters/geoip.rb +145 -0
- data/lib/logstash/filters/grep.rb +153 -0
- data/lib/logstash/filters/grok.rb +425 -0
- data/lib/logstash/filters/grokdiscovery.rb +75 -0
- data/lib/logstash/filters/i18n.rb +51 -0
- data/lib/logstash/filters/json.rb +90 -0
- data/lib/logstash/filters/json_encode.rb +52 -0
- data/lib/logstash/filters/kv.rb +232 -0
- data/lib/logstash/filters/metaevent.rb +68 -0
- data/lib/logstash/filters/metrics.rb +237 -0
- data/lib/logstash/filters/multiline.rb +241 -0
- data/lib/logstash/filters/mutate.rb +399 -0
- data/lib/logstash/filters/noop.rb +21 -0
- data/lib/logstash/filters/prune.rb +149 -0
- data/lib/logstash/filters/punct.rb +32 -0
- data/lib/logstash/filters/railsparallelrequest.rb +86 -0
- data/lib/logstash/filters/range.rb +142 -0
- data/lib/logstash/filters/ruby.rb +42 -0
- data/lib/logstash/filters/sleep.rb +111 -0
- data/lib/logstash/filters/split.rb +64 -0
- data/lib/logstash/filters/sumnumbers.rb +73 -0
- data/lib/logstash/filters/syslog_pri.rb +107 -0
- data/lib/logstash/filters/translate.rb +121 -0
- data/lib/logstash/filters/unique.rb +29 -0
- data/lib/logstash/filters/urldecode.rb +57 -0
- data/lib/logstash/filters/useragent.rb +112 -0
- data/lib/logstash/filters/uuid.rb +58 -0
- data/lib/logstash/filters/xml.rb +139 -0
- data/lib/logstash/filters/zeromq.rb +123 -0
- data/lib/logstash/filterworker.rb +122 -0
- data/lib/logstash/inputs/base.rb +125 -0
- data/lib/logstash/inputs/collectd.rb +306 -0
- data/lib/logstash/inputs/drupal_dblog.rb +323 -0
- data/lib/logstash/inputs/drupal_dblog/jdbcconnection.rb +66 -0
- data/lib/logstash/inputs/elasticsearch.rb +140 -0
- data/lib/logstash/inputs/eventlog.rb +129 -0
- data/lib/logstash/inputs/eventlog/racob_fix.rb +44 -0
- data/lib/logstash/inputs/exec.rb +69 -0
- data/lib/logstash/inputs/file.rb +146 -0
- data/lib/logstash/inputs/ganglia.rb +127 -0
- data/lib/logstash/inputs/ganglia/gmondpacket.rb +146 -0
- data/lib/logstash/inputs/ganglia/xdr.rb +327 -0
- data/lib/logstash/inputs/gelf.rb +138 -0
- data/lib/logstash/inputs/gemfire.rb +222 -0
- data/lib/logstash/inputs/generator.rb +97 -0
- data/lib/logstash/inputs/graphite.rb +41 -0
- data/lib/logstash/inputs/heroku.rb +51 -0
- data/lib/logstash/inputs/imap.rb +136 -0
- data/lib/logstash/inputs/irc.rb +84 -0
- data/lib/logstash/inputs/log4j.rb +136 -0
- data/lib/logstash/inputs/lumberjack.rb +53 -0
- data/lib/logstash/inputs/pipe.rb +57 -0
- data/lib/logstash/inputs/rabbitmq.rb +126 -0
- data/lib/logstash/inputs/rabbitmq/bunny.rb +118 -0
- data/lib/logstash/inputs/rabbitmq/hot_bunnies.rb +1 -0
- data/lib/logstash/inputs/rabbitmq/march_hare.rb +129 -0
- data/lib/logstash/inputs/redis.rb +263 -0
- data/lib/logstash/inputs/relp.rb +106 -0
- data/lib/logstash/inputs/s3.rb +279 -0
- data/lib/logstash/inputs/snmptrap.rb +87 -0
- data/lib/logstash/inputs/sqlite.rb +185 -0
- data/lib/logstash/inputs/sqs.rb +172 -0
- data/lib/logstash/inputs/stdin.rb +46 -0
- data/lib/logstash/inputs/stomp.rb +84 -0
- data/lib/logstash/inputs/syslog.rb +237 -0
- data/lib/logstash/inputs/tcp.rb +231 -0
- data/lib/logstash/inputs/threadable.rb +18 -0
- data/lib/logstash/inputs/twitter.rb +82 -0
- data/lib/logstash/inputs/udp.rb +81 -0
- data/lib/logstash/inputs/unix.rb +163 -0
- data/lib/logstash/inputs/varnishlog.rb +48 -0
- data/lib/logstash/inputs/websocket.rb +50 -0
- data/lib/logstash/inputs/wmi.rb +72 -0
- data/lib/logstash/inputs/xmpp.rb +81 -0
- data/lib/logstash/inputs/zenoss.rb +143 -0
- data/lib/logstash/inputs/zeromq.rb +165 -0
- data/lib/logstash/kibana.rb +113 -0
- data/lib/logstash/loadlibs.rb +9 -0
- data/lib/logstash/logging.rb +89 -0
- data/lib/logstash/monkeypatches-for-bugs.rb +2 -0
- data/lib/logstash/monkeypatches-for-debugging.rb +47 -0
- data/lib/logstash/monkeypatches-for-performance.rb +66 -0
- data/lib/logstash/multiqueue.rb +53 -0
- data/lib/logstash/namespace.rb +16 -0
- data/lib/logstash/outputs/base.rb +120 -0
- data/lib/logstash/outputs/boundary.rb +116 -0
- data/lib/logstash/outputs/circonus.rb +78 -0
- data/lib/logstash/outputs/cloudwatch.rb +351 -0
- data/lib/logstash/outputs/csv.rb +55 -0
- data/lib/logstash/outputs/datadog.rb +93 -0
- data/lib/logstash/outputs/datadog_metrics.rb +123 -0
- data/lib/logstash/outputs/elasticsearch.rb +332 -0
- data/lib/logstash/outputs/elasticsearch/elasticsearch-template.json +44 -0
- data/lib/logstash/outputs/elasticsearch_http.rb +256 -0
- data/lib/logstash/outputs/elasticsearch_river.rb +214 -0
- data/lib/logstash/outputs/email.rb +299 -0
- data/lib/logstash/outputs/exec.rb +40 -0
- data/lib/logstash/outputs/file.rb +180 -0
- data/lib/logstash/outputs/ganglia.rb +75 -0
- data/lib/logstash/outputs/gelf.rb +208 -0
- data/lib/logstash/outputs/gemfire.rb +103 -0
- data/lib/logstash/outputs/google_bigquery.rb +570 -0
- data/lib/logstash/outputs/google_cloud_storage.rb +431 -0
- data/lib/logstash/outputs/graphite.rb +143 -0
- data/lib/logstash/outputs/graphtastic.rb +185 -0
- data/lib/logstash/outputs/hipchat.rb +80 -0
- data/lib/logstash/outputs/http.rb +142 -0
- data/lib/logstash/outputs/irc.rb +80 -0
- data/lib/logstash/outputs/jira.rb +109 -0
- data/lib/logstash/outputs/juggernaut.rb +105 -0
- data/lib/logstash/outputs/librato.rb +146 -0
- data/lib/logstash/outputs/loggly.rb +93 -0
- data/lib/logstash/outputs/lumberjack.rb +51 -0
- data/lib/logstash/outputs/metriccatcher.rb +103 -0
- data/lib/logstash/outputs/mongodb.rb +81 -0
- data/lib/logstash/outputs/nagios.rb +119 -0
- data/lib/logstash/outputs/nagios_nsca.rb +123 -0
- data/lib/logstash/outputs/null.rb +18 -0
- data/lib/logstash/outputs/opentsdb.rb +101 -0
- data/lib/logstash/outputs/pagerduty.rb +79 -0
- data/lib/logstash/outputs/pipe.rb +132 -0
- data/lib/logstash/outputs/rabbitmq.rb +96 -0
- data/lib/logstash/outputs/rabbitmq/bunny.rb +135 -0
- data/lib/logstash/outputs/rabbitmq/hot_bunnies.rb +1 -0
- data/lib/logstash/outputs/rabbitmq/march_hare.rb +143 -0
- data/lib/logstash/outputs/redis.rb +245 -0
- data/lib/logstash/outputs/riak.rb +152 -0
- data/lib/logstash/outputs/riemann.rb +109 -0
- data/lib/logstash/outputs/s3.rb +356 -0
- data/lib/logstash/outputs/sns.rb +124 -0
- data/lib/logstash/outputs/solr_http.rb +78 -0
- data/lib/logstash/outputs/sqs.rb +141 -0
- data/lib/logstash/outputs/statsd.rb +116 -0
- data/lib/logstash/outputs/stdout.rb +53 -0
- data/lib/logstash/outputs/stomp.rb +67 -0
- data/lib/logstash/outputs/syslog.rb +145 -0
- data/lib/logstash/outputs/tcp.rb +145 -0
- data/lib/logstash/outputs/udp.rb +38 -0
- data/lib/logstash/outputs/websocket.rb +46 -0
- data/lib/logstash/outputs/websocket/app.rb +29 -0
- data/lib/logstash/outputs/websocket/pubsub.rb +45 -0
- data/lib/logstash/outputs/xmpp.rb +78 -0
- data/lib/logstash/outputs/zabbix.rb +108 -0
- data/lib/logstash/outputs/zeromq.rb +125 -0
- data/lib/logstash/pipeline.rb +286 -0
- data/lib/logstash/plugin.rb +150 -0
- data/lib/logstash/plugin_mixins/aws_config.rb +93 -0
- data/lib/logstash/program.rb +15 -0
- data/lib/logstash/runner.rb +238 -0
- data/lib/logstash/sized_queue.rb +8 -0
- data/lib/logstash/test.rb +183 -0
- data/lib/logstash/threadwatchdog.rb +37 -0
- data/lib/logstash/time_addon.rb +33 -0
- data/lib/logstash/util.rb +106 -0
- data/lib/logstash/util/buftok.rb +139 -0
- data/lib/logstash/util/charset.rb +39 -0
- data/lib/logstash/util/fieldreference.rb +50 -0
- data/lib/logstash/util/password.rb +25 -0
- data/lib/logstash/util/prctl.rb +11 -0
- data/lib/logstash/util/relp.rb +326 -0
- data/lib/logstash/util/require-helper.rb +18 -0
- data/lib/logstash/util/socket_peer.rb +7 -0
- data/lib/logstash/util/zenoss.rb +566 -0
- data/lib/logstash/util/zeromq.rb +47 -0
- data/lib/logstash/version.rb +6 -0
- data/locales/en.yml +170 -0
- data/logstash-event.gemspec +29 -0
- data/logstash.gemspec +128 -0
- data/patterns/firewalls +60 -0
- data/patterns/grok-patterns +91 -0
- data/patterns/haproxy +37 -0
- data/patterns/java +3 -0
- data/patterns/linux-syslog +14 -0
- data/patterns/mcollective +1 -0
- data/patterns/mcollective-patterns +4 -0
- data/patterns/nagios +108 -0
- data/patterns/postgresql +3 -0
- data/patterns/redis +3 -0
- data/patterns/ruby +2 -0
- data/pkg/build.sh +135 -0
- data/pkg/centos/after-install.sh +1 -0
- data/pkg/centos/before-install.sh +10 -0
- data/pkg/centos/before-remove.sh +11 -0
- data/pkg/centos/sysconfig +15 -0
- data/pkg/debian/after-install.sh +5 -0
- data/pkg/debian/before-install.sh +13 -0
- data/pkg/debian/before-remove.sh +13 -0
- data/pkg/debian/build.sh +34 -0
- data/pkg/debian/debian/README +6 -0
- data/pkg/debian/debian/changelog +17 -0
- data/pkg/debian/debian/compat +1 -0
- data/pkg/debian/debian/control +16 -0
- data/pkg/debian/debian/copyright +27 -0
- data/pkg/debian/debian/dirs +19 -0
- data/pkg/debian/debian/docs +0 -0
- data/pkg/debian/debian/logstash.default +39 -0
- data/pkg/debian/debian/logstash.init +201 -0
- data/pkg/debian/debian/logstash.install +1 -0
- data/pkg/debian/debian/logstash.logrotate +9 -0
- data/pkg/debian/debian/logstash.postinst +68 -0
- data/pkg/debian/debian/logstash.postrm +23 -0
- data/pkg/debian/debian/manpage.1.ex +59 -0
- data/pkg/debian/debian/preinst.ex +37 -0
- data/pkg/debian/debian/prerm.ex +40 -0
- data/pkg/debian/debian/release.conf +5 -0
- data/pkg/debian/debian/rules +80 -0
- data/pkg/debian/debian/watch.ex +22 -0
- data/pkg/logrotate.conf +8 -0
- data/pkg/logstash-web.default +41 -0
- data/pkg/logstash-web.sysv.debian +201 -0
- data/pkg/logstash-web.upstart.ubuntu +18 -0
- data/pkg/logstash.default +45 -0
- data/pkg/logstash.sysv.debian +202 -0
- data/pkg/logstash.sysv.redhat +158 -0
- data/pkg/logstash.upstart.ubuntu +20 -0
- data/pkg/rpm/SOURCES/logstash.conf +26 -0
- data/pkg/rpm/SOURCES/logstash.init +80 -0
- data/pkg/rpm/SOURCES/logstash.logrotate +8 -0
- data/pkg/rpm/SOURCES/logstash.sysconfig +3 -0
- data/pkg/rpm/SOURCES/logstash.wrapper +105 -0
- data/pkg/rpm/SPECS/logstash.spec +180 -0
- data/pkg/rpm/readme.md +4 -0
- data/pkg/ubuntu/after-install.sh +7 -0
- data/pkg/ubuntu/before-install.sh +12 -0
- data/pkg/ubuntu/before-remove.sh +13 -0
- data/pull_release_note.rb +25 -0
- data/require-analyze.rb +22 -0
- data/spec/README.md +14 -0
- data/spec/codecs/edn.rb +40 -0
- data/spec/codecs/edn_lines.rb +53 -0
- data/spec/codecs/graphite.rb +96 -0
- data/spec/codecs/json.rb +57 -0
- data/spec/codecs/json_lines.rb +51 -0
- data/spec/codecs/json_spooler.rb +43 -0
- data/spec/codecs/msgpack.rb +39 -0
- data/spec/codecs/multiline.rb +60 -0
- data/spec/codecs/oldlogstashjson.rb +55 -0
- data/spec/codecs/plain.rb +35 -0
- data/spec/codecs/spool.rb +35 -0
- data/spec/conditionals/test.rb +323 -0
- data/spec/config.rb +31 -0
- data/spec/event.rb +165 -0
- data/spec/examples/fail2ban.rb +28 -0
- data/spec/examples/graphite-input.rb +41 -0
- data/spec/examples/mysql-slow-query.rb +70 -0
- data/spec/examples/parse-apache-logs.rb +66 -0
- data/spec/examples/parse-haproxy-logs.rb +115 -0
- data/spec/examples/syslog.rb +48 -0
- data/spec/filters/alter.rb +96 -0
- data/spec/filters/anonymize.rb +189 -0
- data/spec/filters/checksum.rb +41 -0
- data/spec/filters/clone.rb +67 -0
- data/spec/filters/collate.rb +122 -0
- data/spec/filters/csv.rb +174 -0
- data/spec/filters/date.rb +285 -0
- data/spec/filters/date_performance.rb +31 -0
- data/spec/filters/dns.rb +159 -0
- data/spec/filters/drop.rb +19 -0
- data/spec/filters/elapsed.rb +294 -0
- data/spec/filters/environment.rb +43 -0
- data/spec/filters/geoip.rb +62 -0
- data/spec/filters/grep.rb +342 -0
- data/spec/filters/grok.rb +473 -0
- data/spec/filters/grok/timeout2.rb +56 -0
- data/spec/filters/grok/timeouts.rb +39 -0
- data/spec/filters/i18n.rb +25 -0
- data/spec/filters/json.rb +72 -0
- data/spec/filters/json_encode.rb +37 -0
- data/spec/filters/kv.rb +403 -0
- data/spec/filters/metrics.rb +212 -0
- data/spec/filters/multiline.rb +119 -0
- data/spec/filters/mutate.rb +180 -0
- data/spec/filters/noop.rb +221 -0
- data/spec/filters/prune.rb +441 -0
- data/spec/filters/punct.rb +18 -0
- data/spec/filters/railsparallelrequest.rb +112 -0
- data/spec/filters/range.rb +169 -0
- data/spec/filters/split.rb +58 -0
- data/spec/filters/translate.rb +70 -0
- data/spec/filters/unique.rb +25 -0
- data/spec/filters/useragent.rb +42 -0
- data/spec/filters/xml.rb +157 -0
- data/spec/inputs/file.rb +107 -0
- data/spec/inputs/gelf.rb +52 -0
- data/spec/inputs/generator.rb +30 -0
- data/spec/inputs/imap.rb +60 -0
- data/spec/inputs/redis.rb +63 -0
- data/spec/inputs/relp.rb +70 -0
- data/spec/inputs/tcp.rb +101 -0
- data/spec/jar.rb +21 -0
- data/spec/outputs/csv.rb +266 -0
- data/spec/outputs/elasticsearch.rb +161 -0
- data/spec/outputs/elasticsearch_http.rb +240 -0
- data/spec/outputs/email.rb +173 -0
- data/spec/outputs/file.rb +82 -0
- data/spec/outputs/graphite.rb +236 -0
- data/spec/outputs/redis.rb +127 -0
- data/spec/speed.rb +20 -0
- data/spec/sqlite-test.rb +81 -0
- data/spec/support/LOGSTASH-733.rb +21 -0
- data/spec/support/LOGSTASH-820.rb +25 -0
- data/spec/support/akamai-grok.rb +26 -0
- data/spec/support/date-http.rb +17 -0
- data/spec/support/postwait1.rb +26 -0
- data/spec/support/pull375.rb +21 -0
- data/spec/test_utils.rb +125 -0
- data/spec/util/fieldeval_spec.rb +44 -0
- data/test/jenkins/config.xml.erb +74 -0
- data/test/jenkins/create-jobs.rb +23 -0
- data/test/jenkins/generatorjob.config.xml +66 -0
- data/tools/Gemfile +14 -0
- data/tools/Gemfile.jruby-1.9.lock +322 -0
- data/tools/Gemfile.rbx-2.1.lock +516 -0
- data/tools/Gemfile.ruby-1.9.1.lock +310 -0
- data/tools/Gemfile.ruby-2.0.0.lock +310 -0
- metadata +629 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/outputs/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# A null output. This is useful for testing logstash inputs and filters for
|
|
6
|
+
# performance.
|
|
7
|
+
class LogStash::Outputs::Null < LogStash::Outputs::Base
|
|
8
|
+
config_name "null"
|
|
9
|
+
milestone 3
|
|
10
|
+
|
|
11
|
+
public
|
|
12
|
+
def register
|
|
13
|
+
end # def register
|
|
14
|
+
|
|
15
|
+
public
|
|
16
|
+
def receive(event)
|
|
17
|
+
end # def event
|
|
18
|
+
end # class LogStash::Outputs::Null
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
# opentsdb. Opentsdb is an open source tool for storing and graphing metrics.
|
|
8
|
+
#
|
|
9
|
+
class LogStash::Outputs::Opentsdb < LogStash::Outputs::Base
|
|
10
|
+
config_name "opentsdb"
|
|
11
|
+
milestone 1
|
|
12
|
+
|
|
13
|
+
# Enable debugging. Tries to pretty-print the entire event object.
|
|
14
|
+
config :debug, :validate => :boolean
|
|
15
|
+
|
|
16
|
+
# The address of the opentsdb server.
|
|
17
|
+
config :host, :validate => :string, :default => "localhost"
|
|
18
|
+
|
|
19
|
+
# The port to connect on your graphite server.
|
|
20
|
+
config :port, :validate => :number, :default => 4242
|
|
21
|
+
|
|
22
|
+
# The metric(s) to use. This supports dynamic strings like %{source_host}
|
|
23
|
+
# for metric names and also for values. This is an array field with key
|
|
24
|
+
# of the metric name, value of the metric value, and multiple tag,values . Example:
|
|
25
|
+
#
|
|
26
|
+
# [
|
|
27
|
+
# "%{host}/uptime",
|
|
28
|
+
# %{uptime_1m} " ,
|
|
29
|
+
# "hostname" ,
|
|
30
|
+
# "%{host}
|
|
31
|
+
# "anotherhostname" ,
|
|
32
|
+
# "%{host}
|
|
33
|
+
# ]
|
|
34
|
+
#
|
|
35
|
+
# The value will be coerced to a floating point value. Values which cannot be
|
|
36
|
+
# coerced will zero (0)
|
|
37
|
+
config :metrics, :validate => :array, :required => true
|
|
38
|
+
|
|
39
|
+
def register
|
|
40
|
+
connect
|
|
41
|
+
end # def register
|
|
42
|
+
|
|
43
|
+
def connect
|
|
44
|
+
# TODO(sissel): Test error cases. Catch exceptions. Find fortune and glory.
|
|
45
|
+
begin
|
|
46
|
+
@socket = TCPSocket.new(@host, @port)
|
|
47
|
+
rescue Errno::ECONNREFUSED => e
|
|
48
|
+
@logger.warn("Connection refused to opentsdb server, sleeping...",
|
|
49
|
+
:host => @host, :port => @port)
|
|
50
|
+
sleep(2)
|
|
51
|
+
retry
|
|
52
|
+
end
|
|
53
|
+
end # def connect
|
|
54
|
+
|
|
55
|
+
public
|
|
56
|
+
def receive(event)
|
|
57
|
+
return unless output?(event)
|
|
58
|
+
|
|
59
|
+
# Opentsdb message format: put metric timestamp value tagname=tagvalue tag2=value2\n
|
|
60
|
+
|
|
61
|
+
# Catch exceptions like ECONNRESET and friends, reconnect on failure.
|
|
62
|
+
begin
|
|
63
|
+
name = metrics[0]
|
|
64
|
+
value = metrics[1]
|
|
65
|
+
tags = metrics[2..-1]
|
|
66
|
+
|
|
67
|
+
# The first part of the message
|
|
68
|
+
message = ['put',
|
|
69
|
+
event.sprintf(name),
|
|
70
|
+
event.sprintf("%{+%s}"),
|
|
71
|
+
event.sprintf(value),
|
|
72
|
+
].join(" ")
|
|
73
|
+
|
|
74
|
+
# If we have have tags we need to add it to the message
|
|
75
|
+
event_tags = []
|
|
76
|
+
unless tags.nil?
|
|
77
|
+
Hash[*tags.flatten].each do |tag_name,tag_value|
|
|
78
|
+
# Interprete variables if neccesary
|
|
79
|
+
real_tag_name = event.sprintf(tag_name)
|
|
80
|
+
real_tag_value = event.sprintf(tag_value)
|
|
81
|
+
event_tags << [real_tag_name , real_tag_value ].join('=')
|
|
82
|
+
end
|
|
83
|
+
message+=' '+event_tags.join(' ')
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# TODO(sissel): Test error cases. Catch exceptions. Find fortune and glory.
|
|
87
|
+
begin
|
|
88
|
+
@socket.puts(message)
|
|
89
|
+
rescue Errno::EPIPE, Errno::ECONNRESET => e
|
|
90
|
+
@logger.warn("Connection to opentsdb server died",
|
|
91
|
+
:exception => e, :host => @host, :port => @port)
|
|
92
|
+
sleep(2)
|
|
93
|
+
connect
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# TODO(sissel): resend on failure
|
|
97
|
+
# TODO(sissel): Make 'resend on failure' tunable; sometimes it's OK to
|
|
98
|
+
# drop metrics.
|
|
99
|
+
end # @metrics.each
|
|
100
|
+
end # def receive
|
|
101
|
+
end # class LogStash::Outputs::Opentsdb
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/outputs/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# PagerDuty output
|
|
6
|
+
# Send specific events to PagerDuty for alerting
|
|
7
|
+
|
|
8
|
+
class LogStash::Outputs::PagerDuty < LogStash::Outputs::Base
|
|
9
|
+
config_name "pagerduty"
|
|
10
|
+
milestone 1
|
|
11
|
+
|
|
12
|
+
# Service API Key
|
|
13
|
+
config :service_key, :validate => :string, :required => true
|
|
14
|
+
|
|
15
|
+
# The service key to use
|
|
16
|
+
# You'll need to set this up in PD beforehand
|
|
17
|
+
config :incident_key, :validate => :string, :default => "logstash/%{host}/%{type}"
|
|
18
|
+
|
|
19
|
+
# Event type
|
|
20
|
+
config :event_type, :validate => ["trigger", "acknowledge", "resolve"], :default => "trigger"
|
|
21
|
+
|
|
22
|
+
# Custom description
|
|
23
|
+
config :description, :validate => :string, :default => "Logstash event for %{host}"
|
|
24
|
+
|
|
25
|
+
# Event details
|
|
26
|
+
# These might be keys from the logstash event you wish to include
|
|
27
|
+
# tags are automatically included if detected so no need to add them here
|
|
28
|
+
config :details, :validate => :hash, :default => {"timestamp" => "%{@timestamp}", "message" => "%{message}"}
|
|
29
|
+
|
|
30
|
+
# PagerDuty API url
|
|
31
|
+
# You shouldn't need to change this
|
|
32
|
+
# This allows for flexibility
|
|
33
|
+
# should PD iterate the API
|
|
34
|
+
# and Logstash hasn't updated yet
|
|
35
|
+
config :pdurl, :validate => :string, :default => "https://events.pagerduty.com/generic/2010-04-15/create_event.json"
|
|
36
|
+
|
|
37
|
+
public
|
|
38
|
+
def register
|
|
39
|
+
require 'net/https'
|
|
40
|
+
require 'uri'
|
|
41
|
+
@pd_uri = URI.parse(@pdurl)
|
|
42
|
+
@client = Net::HTTP.new(@pd_uri.host, @pd_uri.port)
|
|
43
|
+
if @pd_uri.scheme == "https"
|
|
44
|
+
@client.use_ssl = true
|
|
45
|
+
#@client.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
46
|
+
# PagerDuty cert doesn't verify oob
|
|
47
|
+
@client.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
48
|
+
end
|
|
49
|
+
end # def register
|
|
50
|
+
|
|
51
|
+
public
|
|
52
|
+
def receive(event)
|
|
53
|
+
return unless output?(event)
|
|
54
|
+
|
|
55
|
+
pd_event = Hash.new
|
|
56
|
+
pd_event[:service_key] = "#{@service_key}"
|
|
57
|
+
pd_event[:incident_key] = event.sprintf(@incident_key)
|
|
58
|
+
pd_event[:event_type] = "#{@event_type}"
|
|
59
|
+
pd_event[:description] = event.sprintf(@description)
|
|
60
|
+
pd_event[:details] = Hash.new
|
|
61
|
+
@details.each do |key, value|
|
|
62
|
+
@logger.debug("PD Details added:" , key => event.sprintf(value))
|
|
63
|
+
pd_event[:details]["#{key}"] = event.sprintf(value)
|
|
64
|
+
end
|
|
65
|
+
pd_event[:details][:tags] = @tags if @tags
|
|
66
|
+
|
|
67
|
+
@logger.info("PD Event", :event => pd_event)
|
|
68
|
+
begin
|
|
69
|
+
request = Net::HTTP::Post.new(@pd_uri.path)
|
|
70
|
+
request.body = pd_event.to_json
|
|
71
|
+
@logger.debug("PD Request", :request => request.inspect)
|
|
72
|
+
response = @client.request(request)
|
|
73
|
+
@logger.debug("PD Response", :response => response.body)
|
|
74
|
+
|
|
75
|
+
rescue Exception => e
|
|
76
|
+
@logger.debug("PD Unhandled exception", :pd_error => e.backtrace)
|
|
77
|
+
end
|
|
78
|
+
end # def receive
|
|
79
|
+
end # class LogStash::Outputs::PagerDuty
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/namespace"
|
|
3
|
+
require "logstash/outputs/base"
|
|
4
|
+
|
|
5
|
+
# Pipe output.
|
|
6
|
+
#
|
|
7
|
+
# Pipe events to stdin of another program. You can use fields from the
|
|
8
|
+
# event as parts of the command.
|
|
9
|
+
# WARNING: This feature can cause logstash to fork off multiple children if you are not carefull with per-event commandline.
|
|
10
|
+
class LogStash::Outputs::Pipe < LogStash::Outputs::Base
|
|
11
|
+
|
|
12
|
+
config_name "pipe"
|
|
13
|
+
milestone 1
|
|
14
|
+
|
|
15
|
+
# The format to use when writing events to the pipe. This value
|
|
16
|
+
# supports any string and can include %{name} and other dynamic
|
|
17
|
+
# strings.
|
|
18
|
+
#
|
|
19
|
+
# If this setting is omitted, the full json representation of the
|
|
20
|
+
# event will be written as a single line.
|
|
21
|
+
config :message_format, :validate => :string
|
|
22
|
+
|
|
23
|
+
# Command line to launch and pipe to
|
|
24
|
+
config :command, :validate => :string, :required => true
|
|
25
|
+
|
|
26
|
+
# Close pipe that hasn't been used for TTL seconds. -1 or 0 means never close.
|
|
27
|
+
config :ttl, :validate => :number, :default => 10
|
|
28
|
+
public
|
|
29
|
+
def register
|
|
30
|
+
@pipes = {}
|
|
31
|
+
@last_stale_cleanup_cycle = Time.now
|
|
32
|
+
end # def register
|
|
33
|
+
|
|
34
|
+
public
|
|
35
|
+
def receive(event)
|
|
36
|
+
return unless output?(event)
|
|
37
|
+
|
|
38
|
+
command = event.sprintf(@command)
|
|
39
|
+
pipe = get_pipe(command)
|
|
40
|
+
|
|
41
|
+
if @message_format
|
|
42
|
+
output = event.sprintf(@message_format) + "\n"
|
|
43
|
+
else
|
|
44
|
+
output = event.to_json
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
begin
|
|
48
|
+
pipe.puts(output)
|
|
49
|
+
rescue IOError, Errno::EPIPE => e
|
|
50
|
+
@logger.error("Error writing to pipe, closing pipe.", :command => command, :pipe => pipe)
|
|
51
|
+
drop_pipe(command)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
close_stale_pipes
|
|
55
|
+
end # def receive
|
|
56
|
+
|
|
57
|
+
def teardown
|
|
58
|
+
@logger.info("Teardown: closing pipes")
|
|
59
|
+
@pipes.each do |command, pipe|
|
|
60
|
+
begin
|
|
61
|
+
drop_pipe(command)
|
|
62
|
+
@logger.debug("Closed pipe #{command}", :pipe => pipe)
|
|
63
|
+
rescue Exception => e
|
|
64
|
+
@logger.error("Excpetion while closing pipes.", :exception => e)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
finished
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
# every 10 seconds or so (triggered by events, but if there are no events there's no point closing files anyway)
|
|
72
|
+
def close_stale_pipes
|
|
73
|
+
return if @ttl <= 0
|
|
74
|
+
now = Time.now
|
|
75
|
+
return unless now - @last_stale_cleanup_cycle >= @ttl
|
|
76
|
+
@logger.info("Starting stale pipes cleanup cycle", :pipes => @pipes)
|
|
77
|
+
inactive_pipes = @pipes.select { |command, pipe| not pipe.active }
|
|
78
|
+
@logger.debug("%d stale pipes found" % inactive_pipes.count, :inactive_pipes => inactive_pipes)
|
|
79
|
+
inactive_pipes.each do |command, pipe|
|
|
80
|
+
drop_pipe(command)
|
|
81
|
+
end
|
|
82
|
+
# mark all pipes as inactive, a call to write will mark them as active again
|
|
83
|
+
@pipes.each { |command, pipe| pipe.active = false }
|
|
84
|
+
@last_stale_cleanup_cycle = now
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def drop_pipe(command)
|
|
88
|
+
return unless @pipes.include? command
|
|
89
|
+
@logger.info("Closing pipe \"%s\"" % command)
|
|
90
|
+
begin
|
|
91
|
+
@pipes[command].close
|
|
92
|
+
rescue Exception => e
|
|
93
|
+
@logger.warn("Failed to close pipe.", :error => e, :command => command)
|
|
94
|
+
end
|
|
95
|
+
@pipes.delete(command)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def get_pipe(command)
|
|
99
|
+
return @pipes[command] if @pipes.include?(command)
|
|
100
|
+
|
|
101
|
+
@logger.info("Opening pipe", :command => command)
|
|
102
|
+
|
|
103
|
+
@pipes[command] = PipeWrapper.new(command, mode="a+")
|
|
104
|
+
end
|
|
105
|
+
end # class LogStash::Outputs::Pipe
|
|
106
|
+
|
|
107
|
+
class PipeWrapper
|
|
108
|
+
attr_accessor :active
|
|
109
|
+
def initialize(command, mode="a+")
|
|
110
|
+
@pipe = IO.popen(command, mode)
|
|
111
|
+
@active = false
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def method_missing?(m, *args)
|
|
115
|
+
if @pipe.respond_to? m
|
|
116
|
+
@pipe.send(m, *args)
|
|
117
|
+
else
|
|
118
|
+
raise NoMethodError
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def puts(txt)
|
|
123
|
+
@pipe.puts(txt)
|
|
124
|
+
@pipe.flush
|
|
125
|
+
@active = true
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def write(txt)
|
|
129
|
+
@pipe.write(txt)
|
|
130
|
+
@active = true
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/outputs/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# Push events to a RabbitMQ exchange. Requires RabbitMQ 2.x
|
|
6
|
+
# or later version (3.x is recommended).
|
|
7
|
+
#
|
|
8
|
+
# Relevant links:
|
|
9
|
+
#
|
|
10
|
+
# * RabbitMQ: <http://www.rabbitmq.com/>
|
|
11
|
+
# * March Hare: <http://rubymarchhare.info>
|
|
12
|
+
# * Bunny: <http://rubybunny.info>
|
|
13
|
+
class LogStash::Outputs::RabbitMQ < LogStash::Outputs::Base
|
|
14
|
+
EXCHANGE_TYPES = ["fanout", "direct", "topic"]
|
|
15
|
+
|
|
16
|
+
config_name "rabbitmq"
|
|
17
|
+
milestone 1
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Connection
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
# RabbitMQ server address
|
|
25
|
+
config :host, :validate => :string, :required => true
|
|
26
|
+
|
|
27
|
+
# RabbitMQ port to connect on
|
|
28
|
+
config :port, :validate => :number, :default => 5672
|
|
29
|
+
|
|
30
|
+
# RabbitMQ username
|
|
31
|
+
config :user, :validate => :string, :default => "guest"
|
|
32
|
+
|
|
33
|
+
# RabbitMQ password
|
|
34
|
+
config :password, :validate => :password, :default => "guest"
|
|
35
|
+
|
|
36
|
+
# The vhost to use. If you don't know what this is, leave the default.
|
|
37
|
+
config :vhost, :validate => :string, :default => "/"
|
|
38
|
+
|
|
39
|
+
# Enable or disable SSL
|
|
40
|
+
config :ssl, :validate => :boolean, :default => false
|
|
41
|
+
|
|
42
|
+
# Validate SSL certificate
|
|
43
|
+
config :verify_ssl, :validate => :boolean, :default => false
|
|
44
|
+
|
|
45
|
+
# Enable or disable logging
|
|
46
|
+
config :debug, :validate => :boolean, :default => false
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Exchange
|
|
52
|
+
#
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# The exchange type (fanout, topic, direct)
|
|
56
|
+
config :exchange_type, :validate => EXCHANGE_TYPES, :required => true
|
|
57
|
+
|
|
58
|
+
# The name of the exchange
|
|
59
|
+
config :exchange, :validate => :string, :required => true
|
|
60
|
+
|
|
61
|
+
# Key to route to by default. Defaults to 'logstash'
|
|
62
|
+
#
|
|
63
|
+
# * Routing keys are ignored on fanout exchanges.
|
|
64
|
+
config :key, :validate => :string, :default => "logstash"
|
|
65
|
+
|
|
66
|
+
# Is this exchange durable? (aka; Should it survive a broker restart?)
|
|
67
|
+
config :durable, :validate => :boolean, :default => true
|
|
68
|
+
|
|
69
|
+
# Should RabbitMQ persist messages to disk?
|
|
70
|
+
config :persistent, :validate => :boolean, :default => true
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def initialize(params)
|
|
75
|
+
params["codec"] = "json" if !params["codec"]
|
|
76
|
+
|
|
77
|
+
super
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Use MarchHare on JRuby to avoid IO#select CPU spikes
|
|
81
|
+
# (see github.com/ruby-amqp/bunny/issues/95).
|
|
82
|
+
#
|
|
83
|
+
# On MRI, use Bunny.
|
|
84
|
+
#
|
|
85
|
+
# See http://rubybunny.info and http://rubymarchhare.info
|
|
86
|
+
# for the docs.
|
|
87
|
+
if RUBY_ENGINE == "jruby"
|
|
88
|
+
require "logstash/outputs/rabbitmq/march_hare"
|
|
89
|
+
|
|
90
|
+
include MarchHareImpl
|
|
91
|
+
else
|
|
92
|
+
require "logstash/outputs/rabbitmq/bunny"
|
|
93
|
+
|
|
94
|
+
include BunnyImpl
|
|
95
|
+
end
|
|
96
|
+
end # class LogStash::Outputs::RabbitMQ
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
class LogStash::Outputs::RabbitMQ
|
|
3
|
+
module BunnyImpl
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# API
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
def register
|
|
10
|
+
require "bunny"
|
|
11
|
+
|
|
12
|
+
@logger.info("Registering output", :plugin => self)
|
|
13
|
+
|
|
14
|
+
connect
|
|
15
|
+
declare_exchange
|
|
16
|
+
end # def register
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def receive(event)
|
|
20
|
+
return unless output?(event)
|
|
21
|
+
|
|
22
|
+
@logger.debug("Sending event", :destination => to_s, :event => event, :key => key)
|
|
23
|
+
key = event.sprintf(@key) if @key
|
|
24
|
+
|
|
25
|
+
begin
|
|
26
|
+
publish_serialized(event.to_json, key)
|
|
27
|
+
rescue JSON::GeneratorError => e
|
|
28
|
+
@logger.warn("Trouble converting event to JSON", :exception => e,
|
|
29
|
+
:event => event)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def publish_serialized(message, key = @key)
|
|
34
|
+
begin
|
|
35
|
+
if @x
|
|
36
|
+
@x.publish(message, :persistent => @persistent, :routing_key => key)
|
|
37
|
+
else
|
|
38
|
+
@logger.warn("Tried to send a message, but not connected to RabbitMQ yet.")
|
|
39
|
+
end
|
|
40
|
+
rescue Bunny::NetworkFailure, Bunny::ConnectionClosedError, Bunny::ConnectionLevelException, Bunny::TCPConnectionFailed => e
|
|
41
|
+
n = Bunny::Session::DEFAULT_NETWORK_RECOVERY_INTERVAL * 2
|
|
42
|
+
|
|
43
|
+
@logger.error("RabbitMQ connection error: #{e.message}. Will attempt to reconnect in #{n} seconds...",
|
|
44
|
+
:exception => e,
|
|
45
|
+
:backtrace => e.backtrace)
|
|
46
|
+
return if terminating?
|
|
47
|
+
|
|
48
|
+
sleep n
|
|
49
|
+
connect
|
|
50
|
+
declare_exchange
|
|
51
|
+
retry
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def to_s
|
|
56
|
+
return "amqp://#{@user}@#{@host}:#{@port}#{@vhost}/#{@exchange_type}/#{@exchange}\##{@key}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def teardown
|
|
60
|
+
@conn.close if @conn && @conn.open?
|
|
61
|
+
@conn = nil
|
|
62
|
+
|
|
63
|
+
finished
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
#
|
|
69
|
+
# Implementation
|
|
70
|
+
#
|
|
71
|
+
|
|
72
|
+
def connect
|
|
73
|
+
@vhost ||= Bunny::DEFAULT_HOST
|
|
74
|
+
# 5672. Will be switched to 5671 by Bunny if TLS is enabled.
|
|
75
|
+
@port ||= AMQ::Protocol::DEFAULT_PORT
|
|
76
|
+
@routing_key ||= "#"
|
|
77
|
+
|
|
78
|
+
@settings = {
|
|
79
|
+
:vhost => @vhost,
|
|
80
|
+
:host => @host,
|
|
81
|
+
:port => @port,
|
|
82
|
+
:automatically_recover => false
|
|
83
|
+
}
|
|
84
|
+
@settings[:user] = @user || Bunny::DEFAULT_USER
|
|
85
|
+
@settings[:pass] = if @password
|
|
86
|
+
@password.value
|
|
87
|
+
else
|
|
88
|
+
Bunny::DEFAULT_PASSWORD
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
@settings[:log_level] = if @debug
|
|
92
|
+
:debug
|
|
93
|
+
else
|
|
94
|
+
:error
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
@settings[:tls] = @ssl if @ssl
|
|
98
|
+
@settings[:verify_ssl] = @verify_ssl if @verify_ssl
|
|
99
|
+
|
|
100
|
+
proto = if @ssl
|
|
101
|
+
"amqp"
|
|
102
|
+
else
|
|
103
|
+
"amqps"
|
|
104
|
+
end
|
|
105
|
+
@connection_url = "#{proto}://#{@user}@#{@host}:#{@port}#{vhost}/#{@queue}"
|
|
106
|
+
|
|
107
|
+
begin
|
|
108
|
+
@conn = Bunny.new(@settings)
|
|
109
|
+
|
|
110
|
+
@logger.debug("Connecting to RabbitMQ. Settings: #{@settings.inspect}, queue: #{@queue.inspect}")
|
|
111
|
+
return if terminating?
|
|
112
|
+
@conn.start
|
|
113
|
+
|
|
114
|
+
@ch = @conn.create_channel
|
|
115
|
+
@logger.info("Connected to RabbitMQ at #{@settings[:host]}")
|
|
116
|
+
rescue Bunny::NetworkFailure, Bunny::ConnectionClosedError, Bunny::ConnectionLevelException, Bunny::TCPConnectionFailed => e
|
|
117
|
+
n = Bunny::Session::DEFAULT_NETWORK_RECOVERY_INTERVAL * 2
|
|
118
|
+
|
|
119
|
+
@logger.error("RabbitMQ connection error: #{e.message}. Will attempt to reconnect in #{n} seconds...",
|
|
120
|
+
:exception => e,
|
|
121
|
+
:backtrace => e.backtrace)
|
|
122
|
+
return if terminating?
|
|
123
|
+
|
|
124
|
+
sleep n
|
|
125
|
+
retry
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def declare_exchange
|
|
130
|
+
@logger.debug("Declaring an exchange", :name => @exchange, :type => @exchange_type,
|
|
131
|
+
:durable => @durable)
|
|
132
|
+
@x = @ch.exchange(@exchange, :type => @exchange_type.to_sym, :durable => @durable)
|
|
133
|
+
end
|
|
134
|
+
end # BunnyImpl
|
|
135
|
+
end # LogStash::Outputs::RabbitMQ
|