fluent-plugin-event-sniffer 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ca201c293444240925efea476d1bf9c21a12f1bd
4
+ data.tar.gz: d65c37ba4b3721cdfb188cd5971ff9cf36f4c571
5
+ SHA512:
6
+ metadata.gz: d097a271a3541a2ee5fefc00bbb7497c5c590ccb1ccc46d3969fb27a86384425589898c36c851a5053be2181414532a7567a699788a71d02b776a8facb8c902b
7
+ data.tar.gz: 9b9d096cd1221396b453b4c5374c2778a74bc38b50ad3d94e758bfbcf12ba9d7d15f8e42f1e3f167aa63dfbd859a23d61aee1c0f93ea17857a6a7bfb6673cf25
@@ -0,0 +1,26 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+
24
+ node_modules
25
+ bower_components
26
+ public
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-event-sniffer.gemspec
4
+ gemspec
@@ -0,0 +1,59 @@
1
+ module.exports = (grunt)->
2
+ grunt.initConfig
3
+ pkg: grunt.file.readJSON 'package.json'
4
+
5
+ bower:
6
+ install:
7
+ options:
8
+ targetDir: './public/vendor'
9
+ install: true
10
+ verbose: false
11
+ cleanTargetDir: true
12
+ cleanBowerDir: false
13
+ layout: 'byComponent'
14
+
15
+ watch:
16
+ coffee:
17
+ files: ['src/coffee/**/*.coffee']
18
+ tasks: 'coffee'
19
+ stylus:
20
+ files: ['src/stylus/**/*.stylus']
21
+ tasks: 'stylus'
22
+ views:
23
+ files: ['views/**/*.slim']
24
+ ruby:
25
+ files: ['lib/**/*.rb']
26
+
27
+ coffee:
28
+ compile:
29
+ options:
30
+ join: true
31
+ files:
32
+ 'public/js/app.js': 'src/coffee/*.coffee'
33
+
34
+ stylus:
35
+ compile:
36
+ files:
37
+ 'public/css/app.css': 'src/stylus/*.stylus'
38
+
39
+ clean:
40
+ build: ['public/js', 'public/css']
41
+ install: ['public/vendor', 'vendor/bundle']
42
+ bower: ['bower_components']
43
+ npm: ['node_modules']
44
+
45
+ shell:
46
+ bundleInstall:
47
+ command: 'bundle install --path=vendor/bundle'
48
+
49
+ grunt.loadNpmTasks 'grunt-bower-task'
50
+ grunt.loadNpmTasks 'grunt-contrib-coffee'
51
+ grunt.loadNpmTasks 'grunt-contrib-watch'
52
+ grunt.loadNpmTasks 'grunt-contrib-stylus'
53
+ grunt.loadNpmTasks 'grunt-contrib-clean'
54
+ grunt.loadNpmTasks 'grunt-shell'
55
+
56
+ grunt.registerTask 'install', ['bower:install', 'shell:bundleInstall']
57
+ grunt.registerTask 'build', ['coffee', 'stylus']
58
+ grunt.registerTask 'init', ['install', 'build']
59
+ grunt.registerTask 'default', ['watch']
@@ -0,0 +1,13 @@
1
+ Copyright 2014 OKUNO Akihiro
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,2 @@
1
+ web: bundle exec fluentd -c example.conf --use-v1-config
2
+ grunt: grunt watch
@@ -0,0 +1,29 @@
1
+ # Fluent::Plugin::Event::Sniffer
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'fluent-plugin-event-sniffer'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install fluent-plugin-event-sniffer
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/[my-github-username]/fluent-plugin-event-sniffer/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "fluent-plugin-event-sniffer",
3
+ "private": true,
4
+ "dependencies": {
5
+ "knockoutjs": "~3.1.0",
6
+ "jquery": "~2.1.1",
7
+ "bootstrap": "~3.2.0",
8
+ "underscore": "~1.6.0"
9
+ },
10
+ "exportsOverride": {
11
+ "bootstrap": {
12
+ "css": "dist/css/bootstrap.css",
13
+ "js": "dist/js/bootstrap.js",
14
+ "fonts": "dist/fonts/*"
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,13 @@
1
+ configure 'sample' do
2
+ output "dummy.log"
3
+ rate 10
4
+ delimiter "\t"
5
+ labeled true
6
+ field :id, type: :integer, countup: true, format: "%04d"
7
+ field :time, type: :datetime, format: "[%Y-%m-%d %H:%M:%S]", random: false
8
+ field :level, type: :string, any: %w[DEBUG INFO WARN ERROR]
9
+ field :method, type: :string, any: %w[GET POST PUT]
10
+ field :uri, type: :string, any: %w[/api/v1/people /api/v1/textdata]
11
+ field :reqtime, type: :float, range: 0.1..5.0
12
+ field :foobar, type: :string, length: 8
13
+ end
@@ -0,0 +1,23 @@
1
+ <source>
2
+ type forward
3
+ </source>
4
+
5
+ <source>
6
+ type tail
7
+ path dummy.log
8
+ tag dummy.log
9
+ format ltsv
10
+ </source>
11
+
12
+ <source>
13
+ type event_sniffer
14
+ development true
15
+ pattern_bookmarks [
16
+ "test.**",
17
+ "debug.**"
18
+ ]
19
+ </source>
20
+
21
+ <match **>
22
+ type null
23
+ </match>
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "fluent-plugin-event-sniffer"
7
+ spec.version = "0.0.1"
8
+ spec.authors = ["OKUNO Akihiro"]
9
+ spec.email = ["choplin.choplin@gmail.com"]
10
+ spec.summary = %q{Fluentd Event Sniffer}
11
+ spec.description = %q{Fluentd plugin which serves web application sniffing streaming events}
12
+ spec.homepage = "https://github.com/choplin/fluent-plugin-event-sniffer"
13
+ spec.license = "Apache-2.0"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0") + Dir['public/**/*']
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency "fluentd"
21
+ spec.add_runtime_dependency "sinatra"
22
+ spec.add_runtime_dependency "sinatra-rocketio"
23
+ spec.add_runtime_dependency "thin"
24
+ spec.add_runtime_dependency "slim"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.6"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "sinatra-contrib"
29
+ spec.add_development_dependency "foreman"
30
+ spec.add_development_dependency "dummer"
31
+ end
@@ -0,0 +1,74 @@
1
+ require 'sinatra/base'
2
+ require 'sinatra/rocketio'
3
+ require 'slim'
4
+
5
+ require_relative 'engine_util'
6
+
7
+ module Fluent
8
+ module EventSnifferPlugin
9
+ class App < Sinatra::Base
10
+ configure :development do
11
+ require 'sinatra/reloader'
12
+ register Sinatra::Reloader
13
+ end
14
+
15
+ register Sinatra::RocketIO
16
+ io = Sinatra::RocketIO
17
+
18
+ set :root, File.expand_path('../../../../../', __FILE__)
19
+
20
+ current_timer = nil
21
+ current_session = nil
22
+
23
+ get '/' do
24
+ @pattern_bookmarks = settings.pattern_bookmarks
25
+ slim :index
26
+ end
27
+
28
+ post '/pattern' do
29
+ if not current_timer.nil?
30
+ halt 503
31
+ end
32
+
33
+ EngineUtil.sniff(params[:pattern], settings.max_events)
34
+
35
+ current_timer = EM::PeriodicTimer.new(1) do
36
+ res = EngineUtil.get_sniffed_results
37
+ $log.debug res
38
+ io.push(:event, res) if res.size > 0
39
+ end
40
+ current_session = params[:rocketio_session]
41
+
42
+ status 200
43
+ body ''
44
+ end
45
+
46
+ delete '/pattern' do
47
+ if not current_timer.nil?
48
+ current_timer.cancel
49
+ current_timer = nil
50
+ current_session = nil
51
+ EngineUtil.restore
52
+ end
53
+ status 200
54
+ body ''
55
+ end
56
+
57
+ io.on :connect do |client|
58
+ $log.debug "new client available - <#{client.session}> type:#{client.type} from:#{client.address}"
59
+ end
60
+
61
+ io.on :disconnect do |client|
62
+ $log.debug "disconnect client - <#{client.session}> type:#{client.type} from:#{client.address}"
63
+ if not current_timer.nil? and current_session == client.session
64
+ current_timer.cancel
65
+ current_timer = nil
66
+ current_session = nil
67
+ p 'restore'
68
+ EngineUtil.restore
69
+ end
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,57 @@
1
+ module Fluent
2
+ module EventSnifferPlugin
3
+ module EngineUtil
4
+ def self.sniff(pattern, max_events)
5
+ $log.info "start to sniff with pattern '#{pattern}'"
6
+
7
+ Engine.instance_eval do
8
+ alias :original_emit_staream :emit_stream
9
+ @sniff_match_pattern = Fluent::MatchPattern.create(pattern)
10
+ @sniff_match_cache = {}
11
+ @sniff_buf = []
12
+ @sniff_max_events = max_events
13
+
14
+ def emit_stream(tag, es)
15
+ if @sniff_buf.size < @sniff_max_events
16
+ matched = @sniff_match_cache[tag]
17
+
18
+ if matched.nil?
19
+ matched = @sniff_match_pattern.match(tag)
20
+ @sniff_match_cache[tag] = matched
21
+ end
22
+
23
+ if matched
24
+ es.dup.each do |time, record|
25
+ @sniff_buf.push({tag:tag, time:time, record:record})
26
+ end
27
+ end
28
+ end
29
+
30
+ original_emit_staream(tag, es)
31
+ end
32
+ end
33
+ end
34
+
35
+ def self.restore
36
+ $log.info "restore original Engine"
37
+ Engine.instance_eval do
38
+ alias :emit_stream :original_emit_staream
39
+ undef :original_emit_staream
40
+ @sniff_match_pattern = nil
41
+ @sniff_match_cache = nil
42
+ @sniff_buf = nil
43
+ @sniff_max_events = nil
44
+ end
45
+ end
46
+
47
+ def self.get_sniffed_results
48
+ Engine.instance_eval do
49
+ res = @sniff_buf
50
+ @sniff_buf = []
51
+ res
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1,62 @@
1
+ require 'thin'
2
+
3
+ module Fluent
4
+ class EventSniffer < Input
5
+ Plugin.register_input('event_sniffer', self)
6
+
7
+ config_param :bind, :string, :default => '0.0.0.0'
8
+ config_param :port, :integer, :default => 8765
9
+ config_param :access_log_path, :string, :default => nil
10
+
11
+ config_param :pattern_bookmarks, :array, :default => []
12
+ config_param :max_events, :integer, :default => 10
13
+ config_param :refresh_interval, :integer, :default => 1
14
+
15
+ config_param :development, :bool, :default => false
16
+
17
+ def start
18
+ super
19
+
20
+ $log.info "listening http server for event_sniffer on http://#{@bind}:#{@port}"
21
+
22
+ @access_log = File.open(@access_log_path, 'a') if @access_log_path
23
+
24
+ config = {
25
+ development: @development,
26
+ }
27
+ app = Rack::Builder.new do
28
+ ENV['RACK_ENV'] = config[:development] ? 'development' : 'production'
29
+ require_relative 'eventsniffer/app'
30
+ run EventSnifferPlugin::App.new
31
+ end
32
+
33
+ EventSnifferPlugin::App.set :pattern_bookmarks, @pattern_bookmarks
34
+ EventSnifferPlugin::App.set :max_events, @max_events
35
+ EventSnifferPlugin::App.set :refresh_interval, @refresh_interval
36
+
37
+ options = {
38
+ signals: false,
39
+ }
40
+ @srv = ::Thin::Server.new(@bind, @port, app, options)
41
+ @thread = Thread.new { @srv.start }
42
+ end
43
+
44
+ def shutdown
45
+ super
46
+
47
+ if @srv
48
+ @srv.stop
49
+ @srv = nil
50
+ end
51
+
52
+ if @access_log and (not @access_log.closed?)
53
+ @access_log.close
54
+ end
55
+
56
+ if @thread
57
+ @thread.join
58
+ @thread = nil
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,12 @@
1
+ {
2
+ "private": true,
3
+ "devDependencies": {
4
+ "grunt": "^0.4.5",
5
+ "grunt-bower-task": "^0.4.0",
6
+ "grunt-contrib-clean": "^0.5.0",
7
+ "grunt-contrib-coffee": "^0.10.1",
8
+ "grunt-contrib-stylus": "^0.18.0",
9
+ "grunt-contrib-watch": "^0.6.1",
10
+ "grunt-shell": "^0.7.0"
11
+ }
12
+ }
@@ -0,0 +1,96 @@
1
+ class ViewModel
2
+ constructor: (@io, @config) ->
3
+ @running = ko.observable(false)
4
+ @pattern = ko.observable("")
5
+ @events = ko.observableArray([])
6
+ @unexpectedError = ko.observable(false)
7
+ @alreadySniffing = ko.observable(false)
8
+
9
+ @showTable = ko.computed =>
10
+ @events().length > 0
11
+
12
+ @canStart = ko.computed =>
13
+ not @running() and @pattern().length > 0
14
+
15
+
16
+ start: () ->
17
+ this.clearAlert()
18
+ @events([])
19
+ $.ajax '/pattern',
20
+ type: 'POST'
21
+ data:
22
+ pattern: @pattern()
23
+ rocketio_session: @io.session
24
+ success: () =>
25
+ @io.on 'event', (events) =>
26
+ this.rotate(_.map(events, (e) => this.format(e)))
27
+ @running(true)
28
+ error: (jqXHR, textStatus, errorThrown) =>
29
+ if jqXHR.status == 503
30
+ @alreadySniffing(true)
31
+ else
32
+ @unexpectedError(true)
33
+
34
+
35
+ stop: () ->
36
+ this.clearAlert()
37
+ $.ajax '/pattern',
38
+ type: 'DELETE'
39
+ success: () =>
40
+ @io.removeListener('event')
41
+ @running(false)
42
+ error: (jqXHR, textStatus, errorThrown) =>
43
+ @unexpectedError(true)
44
+
45
+ selectPattern: (data, event) ->
46
+ this.clearAlert()
47
+ @pattern(event.toElement.innerText)
48
+ if @running()
49
+ this.stopThenStart()
50
+ else
51
+ this.start()
52
+
53
+ submit: () ->
54
+ this.clearAlert()
55
+ if @pattern().length > 0
56
+ if @running()
57
+ this.stopThenStart()
58
+ else
59
+ this.start()
60
+
61
+ # Private Functions
62
+
63
+ stopThenStart: () ->
64
+ $.ajax '/pattern',
65
+ type: 'DELETE'
66
+ success: () =>
67
+ @io.removeListener('event')
68
+ @running(false)
69
+ this.start()
70
+ error: (jqXHR, textStatus, errorThrown) =>
71
+ @unexpectedError(true)
72
+
73
+ clearAlert: () =>
74
+ @unexpectedError(false)
75
+ @alreadySniffing(false)
76
+
77
+ format: (event) ->
78
+ tag: event.tag
79
+ time: (new Date(event.time * 1000)).toLocaleString()
80
+ record: JSON.stringify(event.record)
81
+
82
+ rotate: (events) ->
83
+ current = @events()
84
+ tmp = current.concat(events)
85
+ if tmp.length > @config.max_events
86
+ @events(tmp.slice(tmp.length - @config.max_events, tmp.length))
87
+ else
88
+ @events(tmp)
89
+
90
+ $ ->
91
+ config_elem = $('#config')
92
+ config =
93
+ max_events: config_elem.data('max-events')
94
+
95
+ io = new RocketIO().connect();
96
+ ko.applyBindings(new ViewModel(io, config))
@@ -0,0 +1,29 @@
1
+ .navbar-inverse
2
+ .navbar-brand
3
+ color white
4
+
5
+ .sidebar
6
+ left 0
7
+ z-index 1000
8
+ display block
9
+ padding 20px
10
+ background-color #f5f5f5
11
+ border-right 1px solid #eee
12
+
13
+ .sidebar-header
14
+ border-bottom 1px solid #eee
15
+ font-size 20px
16
+
17
+ li
18
+ a
19
+ padding 5px
20
+ :hover
21
+ cursor: pointer
22
+
23
+ .sub-header
24
+ padding-bottom 10px
25
+ border-bottom 1px solid #eee
26
+
27
+ .alert
28
+ margin-top 10px
29
+ font-size 15px
@@ -0,0 +1,59 @@
1
+ .row
2
+ .col-md-3
3
+ .sidebar
4
+ .sidebar-header
5
+ p
6
+ span class="glyphicon glyphicon-bookmark"
7
+ |Bookmarks
8
+
9
+ ul.nav
10
+ - for p in @pattern_bookmarks
11
+ li
12
+ a data-bind="click: selectPattern" = p
13
+
14
+ .col-md-9
15
+ .row
16
+ .col-md-8
17
+ form data-bind="submit: submit"
18
+ .input-group
19
+ span.input-group-addon pattern
20
+ input.form-control type="text" data-bind="value: pattern, valueUpdate: 'input'"
21
+ .col-md-4
22
+ .btn-group
23
+ button type="button" class="btn btn-success" disabled=true data-bind="enable: canStart, click: start"
24
+ span class="glyphicon glyphicon-play"
25
+ |Start
26
+ button type="button" class="btn btn-warning" disabled=true data-bind="enable: running, click: stop"
27
+ span class="glyphicon glyphicon-stop"
28
+ |Stop
29
+
30
+ .row style="display: none" data-bind="if: unexpectedError, visible: unexpectedError"
31
+ div class="alert alert-danger alert-dismissible" role="alert"
32
+ button type="button" class="close" data-dismiss="alert"
33
+ span aria-hidden="true" &times;
34
+ span class="sr-only" Close
35
+ |An unexpected error occured.
36
+
37
+ .row style="display: none" data-bind="if: alreadySniffing, visible: alreadySniffing"
38
+ div class="alert alert-warning alert-dismissible" role="alert"
39
+ button type="button" class="close" data-dismiss="alert"
40
+ span aria-hidden="true" &times;
41
+ span class="sr-only" Close
42
+ |Could not start because another client is already sniffing.
43
+
44
+ .row
45
+ h2.sub-header Events
46
+ table class="table table-striped" data-bind="if: showTable"
47
+ thead
48
+ tr
49
+ th tag
50
+ th time
51
+ th record
52
+ tbody data-bind="foreach: events.slice(0).reverse()"
53
+ tr
54
+ td data-bind="text: tag"
55
+ td data-bind="text: time"
56
+ td data-bind="text: record"
57
+
58
+ .row
59
+ div id="config" data-max-events=settings.max_events
@@ -0,0 +1,30 @@
1
+ doctype html
2
+ html
3
+ head
4
+ meta charset="utf-8"
5
+ meta http-equiv="X-UA-Compatible" content="IE=edge"
6
+ meta name="viewport" content="width=device-width, initial-scale=1"
7
+ meta name="description" content=""
8
+ meta name="author" content=""
9
+
10
+ title Fluentd Event Sniffer
11
+
12
+ link href=url("/vendor/bootstrap/css/bootstrap.css") rel="stylesheet"
13
+ link href=url("/css/app.css") rel="stylesheet"
14
+
15
+ script src=url("/vendor/underscore/underscore.js")
16
+ script src=url("/vendor/knockoutjs/knockout.js")
17
+
18
+ body
19
+ div class="navbar navbar-inverse" role="navigation"
20
+ .container
21
+ .navbar-brand
22
+ p Fluentd Event Sniffer
23
+ .container
24
+
25
+ == yield
26
+
27
+ script src = rocketio_js
28
+ script src=url("/vendor/jquery/jquery.js")
29
+ script src=url("/vendor/bootstrap/js/bootstrap.js")
30
+ script src=url("/js/app.js")
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-event-sniffer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - OKUNO Akihiro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sinatra-rocketio
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thin
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: slim
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sinatra-contrib
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: foreman
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: dummer
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Fluentd plugin which serves web application sniffing streaming events
154
+ email:
155
+ - choplin.choplin@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - Gemfile
162
+ - Gruntfile.coffee
163
+ - LICENSE.txt
164
+ - Procfile
165
+ - README.md
166
+ - Rakefile
167
+ - bower.json
168
+ - dummer.conf
169
+ - example.conf
170
+ - fluent-plugin-event-sniffer.gemspec
171
+ - lib/fluent/plugin/eventsniffer/app.rb
172
+ - lib/fluent/plugin/eventsniffer/engine_util.rb
173
+ - lib/fluent/plugin/in_event_sniffer.rb
174
+ - package.json
175
+ - public/css/app.css
176
+ - public/js/app.js
177
+ - public/vendor/bootstrap/css/bootstrap.css
178
+ - public/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot
179
+ - public/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg
180
+ - public/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf
181
+ - public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff
182
+ - public/vendor/bootstrap/js/bootstrap.js
183
+ - public/vendor/jquery/jquery.js
184
+ - public/vendor/knockoutjs/knockout.js
185
+ - public/vendor/underscore/underscore.js
186
+ - src/coffee/app.coffee
187
+ - src/stylus/app.stylus
188
+ - views/index.slim
189
+ - views/layout.slim
190
+ homepage: https://github.com/choplin/fluent-plugin-event-sniffer
191
+ licenses:
192
+ - Apache-2.0
193
+ metadata: {}
194
+ post_install_message:
195
+ rdoc_options: []
196
+ require_paths:
197
+ - lib
198
+ required_ruby_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ requirements: []
209
+ rubyforge_project:
210
+ rubygems_version: 2.2.2
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: Fluentd Event Sniffer
214
+ test_files: []