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,13 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/namespace"
|
|
3
|
+
|
|
4
|
+
# Global config registry.
|
|
5
|
+
module LogStash::Config::Registry
|
|
6
|
+
@registry = Hash.new
|
|
7
|
+
class << self
|
|
8
|
+
attr_accessor :registry
|
|
9
|
+
|
|
10
|
+
# TODO(sissel): Add some helper methods here.
|
|
11
|
+
end
|
|
12
|
+
end # module LogStash::Config::Registry
|
|
13
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module LogStash
|
|
3
|
+
class Error < ::StandardError; end
|
|
4
|
+
class ConfigurationError < Error; end
|
|
5
|
+
class PluginLoadingError < Error; end
|
|
6
|
+
class ShutdownSignal < StandardError; end
|
|
7
|
+
|
|
8
|
+
class Bug < Error; end
|
|
9
|
+
class ThisMethodWasRemoved < Bug; end
|
|
10
|
+
end
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "json"
|
|
3
|
+
require "time"
|
|
4
|
+
require "date"
|
|
5
|
+
require "logstash/namespace"
|
|
6
|
+
require "logstash/util/fieldreference"
|
|
7
|
+
require "logstash/time_addon"
|
|
8
|
+
|
|
9
|
+
# Use a custom serialization for jsonifying Time objects.
|
|
10
|
+
# TODO(sissel): Put this in a separate file.
|
|
11
|
+
class Time
|
|
12
|
+
def to_json(*args)
|
|
13
|
+
return iso8601(3).to_json(*args)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def inspect
|
|
17
|
+
return to_json
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# the logstash event object.
|
|
22
|
+
#
|
|
23
|
+
# An event is simply a tuple of (timestamp, data).
|
|
24
|
+
# The 'timestamp' is an ISO8601 timestamp. Data is anything - any message,
|
|
25
|
+
# context, references, etc that are relevant to this event.
|
|
26
|
+
#
|
|
27
|
+
# Internally, this is represented as a hash with only two guaranteed fields.
|
|
28
|
+
#
|
|
29
|
+
# * "@timestamp" - an ISO8601 timestamp representing the time the event
|
|
30
|
+
# occurred at.
|
|
31
|
+
# * "@version" - the version of the schema. Currently "1"
|
|
32
|
+
#
|
|
33
|
+
# They are prefixed with an "@" symbol to avoid clashing with your
|
|
34
|
+
# own custom fields.
|
|
35
|
+
#
|
|
36
|
+
# When serialized, this is represented in JSON. For example:
|
|
37
|
+
#
|
|
38
|
+
# {
|
|
39
|
+
# "@timestamp": "2013-02-09T20:39:26.234Z",
|
|
40
|
+
# "@version": "1",
|
|
41
|
+
# message: "hello world"
|
|
42
|
+
# }
|
|
43
|
+
class LogStash::Event
|
|
44
|
+
class DeprecatedMethod < StandardError; end
|
|
45
|
+
|
|
46
|
+
CHAR_PLUS = "+"
|
|
47
|
+
TIMESTAMP = "@timestamp"
|
|
48
|
+
VERSION = "@version"
|
|
49
|
+
VERSION_ONE = "1"
|
|
50
|
+
|
|
51
|
+
public
|
|
52
|
+
def initialize(data={})
|
|
53
|
+
@cancelled = false
|
|
54
|
+
|
|
55
|
+
@data = data
|
|
56
|
+
data[VERSION] = VERSION_ONE if !@data.include?(VERSION)
|
|
57
|
+
if data.include?(TIMESTAMP)
|
|
58
|
+
t = data[TIMESTAMP]
|
|
59
|
+
if t.is_a?(String)
|
|
60
|
+
data[TIMESTAMP] = LogStash::Time.parse_iso8601(t)
|
|
61
|
+
end
|
|
62
|
+
else
|
|
63
|
+
data[TIMESTAMP] = ::Time.now.utc
|
|
64
|
+
end
|
|
65
|
+
end # def initialize
|
|
66
|
+
|
|
67
|
+
public
|
|
68
|
+
def cancel
|
|
69
|
+
@cancelled = true
|
|
70
|
+
end # def cancel
|
|
71
|
+
|
|
72
|
+
public
|
|
73
|
+
def uncancel
|
|
74
|
+
@cancelled = false
|
|
75
|
+
end # def uncancel
|
|
76
|
+
|
|
77
|
+
public
|
|
78
|
+
def cancelled?
|
|
79
|
+
return @cancelled
|
|
80
|
+
end # def cancelled?
|
|
81
|
+
|
|
82
|
+
# Create a deep-ish copy of this event.
|
|
83
|
+
public
|
|
84
|
+
def clone
|
|
85
|
+
copy = {}
|
|
86
|
+
@data.each do |k,v|
|
|
87
|
+
# TODO(sissel): Recurse if this is a hash/array?
|
|
88
|
+
copy[k] = v.clone
|
|
89
|
+
end
|
|
90
|
+
return self.class.new(copy)
|
|
91
|
+
end # def clone
|
|
92
|
+
|
|
93
|
+
if RUBY_ENGINE == "jruby"
|
|
94
|
+
public
|
|
95
|
+
def to_s
|
|
96
|
+
return self.sprintf("%{+yyyy-MM-dd'T'HH:mm:ss.SSSZ} %{host} %{message}")
|
|
97
|
+
end # def to_s
|
|
98
|
+
else
|
|
99
|
+
public
|
|
100
|
+
def to_s
|
|
101
|
+
return self.sprintf("#{self["@timestamp"].iso8601} %{host} %{message}")
|
|
102
|
+
end # def to_s
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
public
|
|
106
|
+
def timestamp; return @data[TIMESTAMP]; end # def timestamp
|
|
107
|
+
def timestamp=(val); return @data[TIMESTAMP] = val; end # def timestamp=
|
|
108
|
+
|
|
109
|
+
def unix_timestamp
|
|
110
|
+
raise DeprecatedMethod
|
|
111
|
+
end # def unix_timestamp
|
|
112
|
+
|
|
113
|
+
def ruby_timestamp
|
|
114
|
+
raise DeprecatedMethod
|
|
115
|
+
end # def unix_timestamp
|
|
116
|
+
|
|
117
|
+
# field-related access
|
|
118
|
+
public
|
|
119
|
+
def [](str)
|
|
120
|
+
if str[0,1] == CHAR_PLUS
|
|
121
|
+
# nothing?
|
|
122
|
+
else
|
|
123
|
+
return LogStash::Util::FieldReference.exec(str, @data)
|
|
124
|
+
end
|
|
125
|
+
end # def []
|
|
126
|
+
|
|
127
|
+
public
|
|
128
|
+
def []=(str, value)
|
|
129
|
+
if str == TIMESTAMP && !value.is_a?(Time)
|
|
130
|
+
raise TypeError, "The field '@timestamp' must be a Time, not a #{value.class} (#{value})"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
r = LogStash::Util::FieldReference.exec(str, @data) do |obj, key|
|
|
134
|
+
obj[key] = value
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# The assignment can fail if the given field reference (str) does not exist
|
|
138
|
+
# In this case, we'll want to set the value manually.
|
|
139
|
+
if r.nil?
|
|
140
|
+
# TODO(sissel): Implement this in LogStash::Util::FieldReference
|
|
141
|
+
if str[0,1] != "["
|
|
142
|
+
return @data[str] = value
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# No existing element was found, so let's set one.
|
|
146
|
+
*parents, key = str.scan(/(?<=\[)[^\]]+(?=\])/)
|
|
147
|
+
obj = @data
|
|
148
|
+
parents.each do |p|
|
|
149
|
+
if obj.include?(p)
|
|
150
|
+
obj = obj[p]
|
|
151
|
+
else
|
|
152
|
+
obj[p] = {}
|
|
153
|
+
obj = obj[p]
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
obj[key] = value
|
|
157
|
+
end
|
|
158
|
+
return value
|
|
159
|
+
end # def []=
|
|
160
|
+
|
|
161
|
+
public
|
|
162
|
+
def fields
|
|
163
|
+
raise DeprecatedMethod
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
public
|
|
167
|
+
def to_json(*args)
|
|
168
|
+
return @data.to_json(*args)
|
|
169
|
+
end # def to_json
|
|
170
|
+
|
|
171
|
+
def to_hash
|
|
172
|
+
return @data
|
|
173
|
+
end # def to_hash
|
|
174
|
+
|
|
175
|
+
public
|
|
176
|
+
def overwrite(event)
|
|
177
|
+
@data = event.to_hash
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
public
|
|
181
|
+
def include?(key)
|
|
182
|
+
return !self[key].nil?
|
|
183
|
+
end # def include?
|
|
184
|
+
|
|
185
|
+
# Append an event to this one.
|
|
186
|
+
public
|
|
187
|
+
def append(event)
|
|
188
|
+
# non-destructively merge that event with ourselves.
|
|
189
|
+
LogStash::Util.hash_merge(@data, event.to_hash)
|
|
190
|
+
end # append
|
|
191
|
+
|
|
192
|
+
# Remove a field or field reference. Returns the value of that field when
|
|
193
|
+
# deleted
|
|
194
|
+
public
|
|
195
|
+
def remove(str)
|
|
196
|
+
return LogStash::Util::FieldReference.exec(str, @data) do |obj, key|
|
|
197
|
+
next obj.delete(key)
|
|
198
|
+
end
|
|
199
|
+
end # def remove
|
|
200
|
+
|
|
201
|
+
# sprintf. This could use a better method name.
|
|
202
|
+
# The idea is to take an event and convert it to a string based on
|
|
203
|
+
# any format values, delimited by %{foo} where 'foo' is a field or
|
|
204
|
+
# metadata member.
|
|
205
|
+
#
|
|
206
|
+
# For example, if the event has type == "foo" and source == "bar"
|
|
207
|
+
# then this string:
|
|
208
|
+
# "type is %{type} and source is %{host}"
|
|
209
|
+
# will return
|
|
210
|
+
# "type is foo and source is bar"
|
|
211
|
+
#
|
|
212
|
+
# If a %{name} value is an array, then we will join by ','
|
|
213
|
+
# If a %{name} value does not exist, then no substitution occurs.
|
|
214
|
+
#
|
|
215
|
+
# TODO(sissel): It is not clear what the value of a field that
|
|
216
|
+
# is an array (or hash?) should be. Join by comma? Something else?
|
|
217
|
+
public
|
|
218
|
+
def sprintf(format)
|
|
219
|
+
format = format.to_s
|
|
220
|
+
if format.index("%").nil?
|
|
221
|
+
return format
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
return format.gsub(/%\{[^}]+\}/) do |tok|
|
|
225
|
+
# Take the inside of the %{ ... }
|
|
226
|
+
key = tok[2 ... -1]
|
|
227
|
+
|
|
228
|
+
if key == "+%s"
|
|
229
|
+
# Got %{+%s}, support for unix epoch time
|
|
230
|
+
next @data["@timestamp"].to_i
|
|
231
|
+
elsif key[0,1] == "+"
|
|
232
|
+
t = @data["@timestamp"]
|
|
233
|
+
formatter = org.joda.time.format.DateTimeFormat.forPattern(key[1 .. -1])\
|
|
234
|
+
.withZone(org.joda.time.DateTimeZone::UTC)
|
|
235
|
+
#next org.joda.time.Instant.new(t.tv_sec * 1000 + t.tv_usec / 1000).toDateTime.toString(formatter)
|
|
236
|
+
# Invoke a specific Instant constructor to avoid this warning in JRuby
|
|
237
|
+
# > ambiguous Java methods found, using org.joda.time.Instant(long)
|
|
238
|
+
org.joda.time.Instant.java_class.constructor(Java::long).new_instance(
|
|
239
|
+
t.tv_sec * 1000 + t.tv_usec / 1000
|
|
240
|
+
).to_java.toDateTime.toString(formatter)
|
|
241
|
+
else
|
|
242
|
+
value = self[key]
|
|
243
|
+
case value
|
|
244
|
+
when nil
|
|
245
|
+
tok # leave the %{foo} if this field does not exist in this event.
|
|
246
|
+
when Array
|
|
247
|
+
value.join(",") # Join by ',' if value is an array
|
|
248
|
+
when Hash
|
|
249
|
+
value.to_json # Convert hashes to json
|
|
250
|
+
else
|
|
251
|
+
value # otherwise return the value
|
|
252
|
+
end # case value
|
|
253
|
+
end # 'key' checking
|
|
254
|
+
end # format.gsub...
|
|
255
|
+
end # def sprintf
|
|
256
|
+
|
|
257
|
+
def tag(value)
|
|
258
|
+
# Generalize this method for more usability
|
|
259
|
+
self["tags"] ||= []
|
|
260
|
+
self["tags"] << value unless self["tags"].include?(value)
|
|
261
|
+
end
|
|
262
|
+
end # class LogStash::Event
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/filters/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# INFORMATION:
|
|
6
|
+
# The filter Advisor is designed for capture and confrontation the events.
|
|
7
|
+
# The events must be grep by a filter first, then it can pull out a copy of it, like clone, whit tags "advisor_first",
|
|
8
|
+
# this copy is the first occurrence of this event verified in time_adv.
|
|
9
|
+
# After time_adv Advisor will pull out an event tagged "advisor_info" who will tell you the number of same events verified in time_adv.
|
|
10
|
+
|
|
11
|
+
# INFORMATION ABOUT CLASS:
|
|
12
|
+
|
|
13
|
+
# For do this job, i used a thread that will sleep time adv. I assume that events coming on advisor are tagged, then i use an array for storing different events.
|
|
14
|
+
# If an events is not present on array, then is the first and if the option is activate then advisor push out a copy of event.
|
|
15
|
+
# Else if the event is present on array, then is another same event and not the first, let's count it.
|
|
16
|
+
|
|
17
|
+
# USAGE:
|
|
18
|
+
|
|
19
|
+
# This is an example of logstash config:
|
|
20
|
+
|
|
21
|
+
# filter{
|
|
22
|
+
# advisor {
|
|
23
|
+
# time_adv => 1 #(optional)
|
|
24
|
+
# send_first => true #(optional)
|
|
25
|
+
# }
|
|
26
|
+
# }
|
|
27
|
+
|
|
28
|
+
# We analize this:
|
|
29
|
+
|
|
30
|
+
# time_adv => 1
|
|
31
|
+
# Means the time when the events matched and collected are pushed on outputs with tag "advisor_info".
|
|
32
|
+
|
|
33
|
+
# send_first => true
|
|
34
|
+
# Means you can push out the first events different who came in advisor like clone copy and tagged with "advisor_first"
|
|
35
|
+
|
|
36
|
+
class LogStash::Filters::Advisor < LogStash::Filters::Base
|
|
37
|
+
|
|
38
|
+
config_name "advisor"
|
|
39
|
+
milestone 1
|
|
40
|
+
|
|
41
|
+
# If you do not set time_adv the plugin does nothing.
|
|
42
|
+
config :time_adv, :validate => :number, :default => 0
|
|
43
|
+
|
|
44
|
+
# If you want the first different event will be pushed out like a copy
|
|
45
|
+
config :send_first, :validate => :boolean, :default => true
|
|
46
|
+
|
|
47
|
+
public
|
|
48
|
+
def register
|
|
49
|
+
|
|
50
|
+
# Control the correct config
|
|
51
|
+
if (!(@time_adv == 0))
|
|
52
|
+
|
|
53
|
+
@flag = false
|
|
54
|
+
@first = false
|
|
55
|
+
# Is used for store the different events.
|
|
56
|
+
@sarray = Array.new
|
|
57
|
+
# Is used for count the number of equals events.
|
|
58
|
+
@carray = Array.new
|
|
59
|
+
|
|
60
|
+
@thread = time_alert(@time_adv.to_i*60) do
|
|
61
|
+
# if collected any events then pushed out a new event after time_adv
|
|
62
|
+
if (@sarray.size !=0)
|
|
63
|
+
@flag = true
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
else
|
|
68
|
+
@logger.warn("Advisor: you have not specified Time_adv. This filter will do nothing!")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# This method is used to manage sleep and awaken threads (thanks StackOverflow for the support)
|
|
74
|
+
def time_alert(interval)
|
|
75
|
+
Thread.new do
|
|
76
|
+
loop do
|
|
77
|
+
start_time = Time.now
|
|
78
|
+
yield
|
|
79
|
+
elapsed = Time.now - start_time
|
|
80
|
+
sleep([interval - elapsed, 0].max)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
public
|
|
86
|
+
def filter(event)
|
|
87
|
+
return unless filter?(event)
|
|
88
|
+
|
|
89
|
+
# Control the correct config
|
|
90
|
+
if(!(@time_adv == 0))
|
|
91
|
+
|
|
92
|
+
new_event = true
|
|
93
|
+
@message = event["message"]
|
|
94
|
+
|
|
95
|
+
# control if the events are new or they are came before
|
|
96
|
+
for i in (0..@sarray.size-1)
|
|
97
|
+
if (@message == @sarray[i].to_s)
|
|
98
|
+
@logger.debug("Avisor: Event match")
|
|
99
|
+
# if came before then count it
|
|
100
|
+
new_event = false
|
|
101
|
+
@carray[i] = @carray[i].to_i+1
|
|
102
|
+
@logger.debug("Advisor: "+@carray[i].to_s+" Events matched")
|
|
103
|
+
break
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
if (new_event == true)
|
|
108
|
+
# else is a new event
|
|
109
|
+
|
|
110
|
+
@sarray << @message
|
|
111
|
+
@carray << 1
|
|
112
|
+
if (send_first == true)
|
|
113
|
+
@logger.debug("Advisor: is the first to send out")
|
|
114
|
+
@first = true
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
else
|
|
119
|
+
@logger.warn("Advisor: you have not specified Time_adv. This filter will do nothing!")
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# This method is used for generate events every 5 seconds (Thanks Jordan Sissel for explanation).
|
|
125
|
+
# In this case we generate an event when advisor thread trigger the flag or is the first different event.
|
|
126
|
+
|
|
127
|
+
def flush
|
|
128
|
+
|
|
129
|
+
if (@first == true)
|
|
130
|
+
event = LogStash::Event.new
|
|
131
|
+
event["host"] = Socket.gethostname
|
|
132
|
+
event["message"] = @message
|
|
133
|
+
event.tag "advisor_first"
|
|
134
|
+
filter_matched(event)
|
|
135
|
+
|
|
136
|
+
@first = false
|
|
137
|
+
return [event]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
if (@flag == true)
|
|
141
|
+
|
|
142
|
+
if (@tags.size != 0)
|
|
143
|
+
@tag_path = ""
|
|
144
|
+
for i in (0..@tags.size-1)
|
|
145
|
+
@tag_path += @tags[i].to_s+"."
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Prepare message
|
|
150
|
+
message = "Advisor: Found events who match: "+@tag_path.to_s+"\n\n"
|
|
151
|
+
|
|
152
|
+
# See on messagge partial part of different events
|
|
153
|
+
for i in (0..@sarray.size-1)
|
|
154
|
+
message = message+@carray[i].to_s+" events like: "+(@sarray[i].to_s).slice(0, 300)+"\n\n"
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
event = LogStash::Event.new
|
|
158
|
+
event["host"] = Socket.gethostname
|
|
159
|
+
event["message"] = message
|
|
160
|
+
event.tag << "advisor_info"
|
|
161
|
+
filter_matched(event)
|
|
162
|
+
|
|
163
|
+
# reset flag and counter
|
|
164
|
+
@flag = false
|
|
165
|
+
@carray = nil
|
|
166
|
+
@sarray = nil
|
|
167
|
+
@carray = Array.new
|
|
168
|
+
@sarray = Array.new
|
|
169
|
+
|
|
170
|
+
# push the event
|
|
171
|
+
return [event]
|
|
172
|
+
end
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
end
|
|
178
|
+
# By Bistic:)
|