fluent-plugin-anomalydetect 0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.rdoc +47 -0
- data/Rakefile +10 -0
- data/fluent-plugin-anormalydetect.gemspec +21 -0
- data/lib/fluent/plugin/change_finder.rb +69 -0
- data/lib/fluent/plugin/out_anomalydetect.rb +139 -0
- data/test/helper.rb +28 -0
- data/test/plugin/test_out_anomalydetect.rb +139 -0
- data/test/stock.2432.csv +262 -0
- metadata +81 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 muddydixon
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Fluent::Plugin::Anomalydetect
|
2
|
+
|
3
|
+
To detect anomaly for log stream, use this plugin.
|
4
|
+
Then you can find changes in logs casually.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'fluent-plugin-anomalydetect'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install fluent-plugin-anomalydetect
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
```
|
23
|
+
<source>
|
24
|
+
type file
|
25
|
+
...
|
26
|
+
tag access.log
|
27
|
+
</source>
|
28
|
+
|
29
|
+
<match access.**>
|
30
|
+
type anomalydetect
|
31
|
+
tag anomaly.access
|
32
|
+
tick 86400
|
33
|
+
</match>
|
34
|
+
|
35
|
+
<match anomaly.access>
|
36
|
+
type file
|
37
|
+
...
|
38
|
+
</match>
|
39
|
+
```
|
40
|
+
|
41
|
+
Then the plugin output anomaly log counts in each day.
|
42
|
+
|
43
|
+
## Theory
|
44
|
+
"データマイニングによる異常検知" http://amzn.to/XHXNun
|
45
|
+
|
46
|
+
|
47
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "fluent-plugin-anomalydetect"
|
6
|
+
gem.version = 0.0
|
7
|
+
gem.authors = ["Muddy Dixon"]
|
8
|
+
gem.email = ["muddydixon@gmail.com"]
|
9
|
+
gem.description = %q{detect anomal sequential input casually}
|
10
|
+
gem.summary = %q{detect anomal sequential input casually}
|
11
|
+
gem.homepage = "https://github.com/muddydixon/fluent-plugin-anomalydetect"
|
12
|
+
|
13
|
+
|
14
|
+
gem.files = `git ls-files`.split($/)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
|
19
|
+
gem.add_development_dependency "fluentd"
|
20
|
+
gem.add_runtime_dependency "fluentd"
|
21
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module Fluent
|
3
|
+
class ChangeFinder
|
4
|
+
require 'matrix'
|
5
|
+
|
6
|
+
def initialize(term, r)
|
7
|
+
@term = term
|
8
|
+
@r = r
|
9
|
+
@data = []
|
10
|
+
@mu = 0
|
11
|
+
@sigma = 0
|
12
|
+
@c = (0..@term - 1).map do |i| rand end
|
13
|
+
end
|
14
|
+
def next(x)
|
15
|
+
len = @data.size
|
16
|
+
|
17
|
+
# update @mu
|
18
|
+
@mu = (1 - @r) * @mu + @r * x
|
19
|
+
|
20
|
+
# update @c
|
21
|
+
c = @sigma
|
22
|
+
for j in 0..@term - 1
|
23
|
+
if @data[len - 1 - j]
|
24
|
+
@c[j] = (1 - @r) * @c[j] + @r * (x - @mu) * (@data[len - 1 - j] - @mu)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
cc = Matrix.zero(@term).to_a
|
29
|
+
for j in 0..(@term - 1)
|
30
|
+
for i in j..@term - 1
|
31
|
+
cc[j][i] = cc[i][j] = @c[i - j]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
w = (Matrix.rows(cc).inv * Vector.elements(@c)).to_a
|
35
|
+
xt = @data.each.with_index.inject(@mu) do |sum, (v, idx)|
|
36
|
+
sum += w[idx] * (v - @mu)
|
37
|
+
end
|
38
|
+
@sigma = (1 - @r) * @sigma + @r * (x - xt) * (x - xt)
|
39
|
+
|
40
|
+
@data.push x
|
41
|
+
if @data.size > @term
|
42
|
+
@data.shift
|
43
|
+
end
|
44
|
+
|
45
|
+
score(prob xt, @sigma, x)
|
46
|
+
end
|
47
|
+
|
48
|
+
def prob (mu, sigma, v)
|
49
|
+
return 0 if sigma == 0
|
50
|
+
|
51
|
+
Math.exp( - 0.5 * (v - mu) ** 2 / sigma) / ((2 * Math::PI) ** 0.5 * sigma ** 0.5)
|
52
|
+
end
|
53
|
+
|
54
|
+
def score (p)
|
55
|
+
return 0 if p <= 0
|
56
|
+
-Math.log(p)
|
57
|
+
end
|
58
|
+
|
59
|
+
def smooth(size)
|
60
|
+
_end = @data.size
|
61
|
+
_begin = [_end - size, 0].max
|
62
|
+
@data.slice(_begin, _end).inject(0.0) do |sum, v| sum += v end / (_end - _begin)
|
63
|
+
end
|
64
|
+
|
65
|
+
def showStatus
|
66
|
+
{:sigma => @sigma, :mu => @mu, :data => @data, :c => @c}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module Fluent
|
3
|
+
class AnomalyDetectOutput < Output
|
4
|
+
Fluent::Plugin.register_output('anomalydetect', self)
|
5
|
+
|
6
|
+
require 'fluent/plugin/change_finder'
|
7
|
+
|
8
|
+
config_param :outlier_term, :integer, :default => 28
|
9
|
+
config_param :outlier_discount, :float, :default => 0.05
|
10
|
+
config_param :smooth_term, :integer, :default => 7
|
11
|
+
config_param :score_term, :integer, :default => 14
|
12
|
+
config_param :score_discount, :float, :default => 0.1
|
13
|
+
config_param :tick, :integer, :default => 60 * 5
|
14
|
+
config_param :tag, :string, :default => "anomaly"
|
15
|
+
config_param :target, :string, :default => ""
|
16
|
+
|
17
|
+
attr_accessor :outlier
|
18
|
+
attr_accessor :score
|
19
|
+
attr_accessor :recordCount
|
20
|
+
|
21
|
+
attr_accessor :outliers
|
22
|
+
|
23
|
+
attr_accessor :records
|
24
|
+
|
25
|
+
def configure (conf)
|
26
|
+
super
|
27
|
+
unless 0 < @outlier_discount and @outlier_discount < 1
|
28
|
+
raise Fluent::ConfigError, "discount ratio should be between (0, 1)"
|
29
|
+
end
|
30
|
+
unless 0 < @score_discount and @score_discount < 1
|
31
|
+
raise Fluent::ConfigError, "discount ratio should be between (0, 1)"
|
32
|
+
end
|
33
|
+
if @outlier_term < 1
|
34
|
+
raise Fluent::ConfigError, "outlier term should be greater than 0"
|
35
|
+
end
|
36
|
+
if @score_term < 1
|
37
|
+
raise Fluent::ConfigError, "score term should be greater than 0"
|
38
|
+
end
|
39
|
+
if @smooth_term < 1
|
40
|
+
raise Fluent::ConfigError, "smooth term should be greater than 0"
|
41
|
+
end
|
42
|
+
if @tick < 1
|
43
|
+
raise Fluent::ConfigError, "tick timer should be greater than 1 sec"
|
44
|
+
end
|
45
|
+
|
46
|
+
@outliers = []
|
47
|
+
@outlier = ChangeFinder.new(@outlier_term, @outlier_discount)
|
48
|
+
@score = ChangeFinder.new(@score_term, @score_discount)
|
49
|
+
|
50
|
+
@records = []
|
51
|
+
@mutex = Mutex.new
|
52
|
+
|
53
|
+
if @target == ""
|
54
|
+
@recordCount = true
|
55
|
+
else
|
56
|
+
@recordCount = false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def start
|
61
|
+
super
|
62
|
+
init_records
|
63
|
+
start_watch
|
64
|
+
end
|
65
|
+
|
66
|
+
def shutdown
|
67
|
+
super
|
68
|
+
if @watcher
|
69
|
+
@watcher.terminate
|
70
|
+
@watcher.join
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def start_watch
|
75
|
+
@watcher = Thread.new(&method(:watch))
|
76
|
+
end
|
77
|
+
|
78
|
+
def watch
|
79
|
+
|
80
|
+
@last_checked = Fluent::Engine.now
|
81
|
+
while true
|
82
|
+
sleep 0.5
|
83
|
+
if Fluent::Engine.now - @last_checked >= @tick
|
84
|
+
now = Fluent::Engine.now
|
85
|
+
flush_emit(now - @last_checked)
|
86
|
+
@last_checked = now
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def init_records
|
92
|
+
@records = []
|
93
|
+
end
|
94
|
+
|
95
|
+
def flush_emit(step)
|
96
|
+
output = flush
|
97
|
+
Fluent::Engine.emit(@tag, Fluent::Engine.now, output)
|
98
|
+
end
|
99
|
+
|
100
|
+
def flush
|
101
|
+
flushed, @records = @records, init_records
|
102
|
+
|
103
|
+
val = 0
|
104
|
+
if @recordCount
|
105
|
+
val = flushed.size
|
106
|
+
else
|
107
|
+
val = flushed.inject(0.0) do |sum, record| sum += record[@target].to_f if record[@target]; end / flushed.size
|
108
|
+
end
|
109
|
+
|
110
|
+
outlier = @outlier.next(val)
|
111
|
+
@outliers.push outlier
|
112
|
+
@outliers.shift() if @outliers.size > @smooth_term
|
113
|
+
score = @score.next(@outliers.inject(0) do |sum, v| sum += v end / @outliers.size)
|
114
|
+
|
115
|
+
{"outlier" => outlier, "score" => score, "target" => val}
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
def tickTime (time)
|
120
|
+
(time - time % @tick).to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
def pushRecords (records)
|
124
|
+
@mutex.synchronize do
|
125
|
+
@records.concat(records)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def emit (tag, es, chain)
|
130
|
+
records = []
|
131
|
+
es.each do |time, record|
|
132
|
+
records.push record
|
133
|
+
end
|
134
|
+
pushRecords records
|
135
|
+
|
136
|
+
chain.next
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
|
+
require 'fluent/test'
|
15
|
+
unless ENV.has_key?('VERBOSE')
|
16
|
+
nulllogger = Object.new
|
17
|
+
nulllogger.instance_eval {|obj|
|
18
|
+
def method_missing(method, *args)
|
19
|
+
# pass
|
20
|
+
end
|
21
|
+
}
|
22
|
+
$log = nulllogger
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'fluent/plugin/out_anomalydetect'
|
26
|
+
|
27
|
+
class Test::Unit::TestCase
|
28
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class AnomalyDetectOutputTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Fluent::Test.setup
|
6
|
+
end
|
7
|
+
|
8
|
+
CONFIG = %[
|
9
|
+
tag test.anomaly
|
10
|
+
outlier_term 28
|
11
|
+
outlier_discount 0.05
|
12
|
+
score_term 28
|
13
|
+
score_discount 0.05
|
14
|
+
tick 10
|
15
|
+
smooth_term 3
|
16
|
+
target y
|
17
|
+
]
|
18
|
+
|
19
|
+
def create_driver (conf=CONFIG, tag="debug.anomaly")
|
20
|
+
Fluent::Test::OutputTestDriver.new(Fluent::AnomalyDetectOutput, tag).configure(conf)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_configure
|
24
|
+
d = create_driver('')
|
25
|
+
assert_equal 28, d.instance.outlier_term
|
26
|
+
assert_equal 0.05, d.instance.outlier_discount
|
27
|
+
assert_equal 7, d.instance.smooth_term
|
28
|
+
assert_equal 14, d.instance.score_term
|
29
|
+
assert_equal 0.1, d.instance.score_discount
|
30
|
+
assert_equal 300, d.instance.tick
|
31
|
+
assert_equal "", d.instance.target
|
32
|
+
assert_equal true, d.instance.recordCount
|
33
|
+
|
34
|
+
d = create_driver
|
35
|
+
assert_equal 28, d.instance.outlier_term
|
36
|
+
assert_equal 0.05, d.instance.outlier_discount
|
37
|
+
assert_equal 3, d.instance.smooth_term
|
38
|
+
assert_equal 28, d.instance.score_term
|
39
|
+
assert_equal 0.05, d.instance.score_discount
|
40
|
+
assert_equal 10, d.instance.tick
|
41
|
+
assert_equal "y", d.instance.target
|
42
|
+
assert_equal 'test.anomaly', d.instance.tag
|
43
|
+
assert_equal false, d.instance.recordCount
|
44
|
+
|
45
|
+
assert_raise(Fluent::ConfigError) {
|
46
|
+
d = create_driver %[
|
47
|
+
outlier_discount 1.3
|
48
|
+
]
|
49
|
+
}
|
50
|
+
assert_raise(Fluent::ConfigError) {
|
51
|
+
d = create_driver %[
|
52
|
+
score_discount 1.3
|
53
|
+
]
|
54
|
+
}
|
55
|
+
assert_raise(Fluent::ConfigError) {
|
56
|
+
d = create_driver %[
|
57
|
+
outlier_discount -0.3
|
58
|
+
]
|
59
|
+
}
|
60
|
+
assert_raise(Fluent::ConfigError) {
|
61
|
+
d = create_driver %[
|
62
|
+
score_discount -0.3
|
63
|
+
]
|
64
|
+
}
|
65
|
+
assert_raise(Fluent::ConfigError) {
|
66
|
+
d = create_driver %[
|
67
|
+
outlier_term 0
|
68
|
+
]
|
69
|
+
}
|
70
|
+
assert_raise(Fluent::ConfigError) {
|
71
|
+
d = create_driver %[
|
72
|
+
score_term 0
|
73
|
+
]
|
74
|
+
}
|
75
|
+
assert_raise(Fluent::ConfigError) {
|
76
|
+
d = create_driver %[
|
77
|
+
smooth_term 0
|
78
|
+
]
|
79
|
+
}
|
80
|
+
assert_raise(Fluent::ConfigError) {
|
81
|
+
d = create_driver %[
|
82
|
+
tick 0
|
83
|
+
]
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_array_init
|
88
|
+
d = create_driver
|
89
|
+
assert_equal [], d.instance.outliers
|
90
|
+
assert_equal [], d.instance.records
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_sdar
|
94
|
+
d = create_driver
|
95
|
+
assert_instance_of Fluent::ChangeFinder, d.instance.outlier
|
96
|
+
assert_instance_of Fluent::ChangeFinder, d.instance.score
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_emit_record_count
|
100
|
+
d = create_driver %[
|
101
|
+
tag test.anomaly
|
102
|
+
outlier_term 28
|
103
|
+
outlier_discount 0.05
|
104
|
+
score_term 28
|
105
|
+
score_discount 0.05
|
106
|
+
tick 10
|
107
|
+
smooth_term 3
|
108
|
+
]
|
109
|
+
|
110
|
+
data = (0..10).map do || (rand * 100).to_i end
|
111
|
+
data.push 0
|
112
|
+
d.run do
|
113
|
+
data.each do |val|
|
114
|
+
(0..val - 1).each do ||
|
115
|
+
d.emit({'y' => 1})
|
116
|
+
end
|
117
|
+
r = d.instance.flush
|
118
|
+
assert_equal val, r['target']
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_emit_stock_data
|
124
|
+
require 'csv'
|
125
|
+
reader = CSV.open("test/stock.2432.csv", "r")
|
126
|
+
header = reader.take(1)[0]
|
127
|
+
d = create_driver
|
128
|
+
d.run do
|
129
|
+
reader.each_with_index do |row, idx|
|
130
|
+
break if idx > 5
|
131
|
+
d.emit({'y' => row[4].to_i})
|
132
|
+
r = d.instance.flush
|
133
|
+
assert r['target']
|
134
|
+
assert r['outlier']
|
135
|
+
assert r['score']
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/test/stock.2432.csv
ADDED
@@ -0,0 +1,262 @@
|
|
1
|
+
x,s,M,m,y,o
|
2
|
+
20110104,2914,2978,2906,2969,1379000
|
3
|
+
20110105,2990,2995,2914,2931,1521100
|
4
|
+
20110106,2949,2952,2919,2932,1086300
|
5
|
+
20110107,2922,2969,2912,2917,1216000
|
6
|
+
20110111,2924,2965,2919,2957,1369100
|
7
|
+
20110112,2958,3045,2957,3025,2080700
|
8
|
+
20110113,3050,3055,2973,3035,1570800
|
9
|
+
20110114,3035,3095,2993,3030,2167700
|
10
|
+
20110117,3055,3060,2970,2985,1311800
|
11
|
+
20110118,2962,2967,2920,2940,1416800
|
12
|
+
20110119,2951,2976,2920,2972,1357100
|
13
|
+
20110120,2967,2985,2873,2902,2164300
|
14
|
+
20110121,2865,2896,2706,2780,3223900
|
15
|
+
20110124,2764,2812,2752,2778,1596100
|
16
|
+
20110125,2759,2809,2750,2785,1616800
|
17
|
+
20110126,2787,2901,2770,2897,2419200
|
18
|
+
20110127,2950,2989,2932,2979,2768300
|
19
|
+
20110128,2967,3010,2950,3005,2234200
|
20
|
+
20110131,2935,3020,2918,2959,1434700
|
21
|
+
20110201,3010,3145,2993,3100,4213100
|
22
|
+
20110202,2989,3030,2925,2926,7932000
|
23
|
+
20110203,2937,2957,2858,2890,2932700
|
24
|
+
20110204,2872,2928,2852,2859,2080900
|
25
|
+
20110207,2865,2909,2860,2878,1276800
|
26
|
+
20110208,2907,2924,2840,2849,1858700
|
27
|
+
20110209,2869,2872,2819,2862,1738000
|
28
|
+
20110210,2872,2924,2850,2912,1878000
|
29
|
+
20110214,2899,2916,2884,2907,1030300
|
30
|
+
20110215,2922,3020,2915,3015,3603200
|
31
|
+
20110216,3050,3070,3000,3040,2737100
|
32
|
+
20110217,2991,3060,2970,3030,1493400
|
33
|
+
20110218,3005,3070,2996,3055,1921200
|
34
|
+
20110221,3080,3255,3080,3250,5817200
|
35
|
+
20110222,3235,3240,3150,3150,2419800
|
36
|
+
20110223,3095,3225,3085,3135,2376000
|
37
|
+
20110224,3130,3150,3030,3040,2173700
|
38
|
+
20110225,2998,3045,2970,3020,2799300
|
39
|
+
20110228,3040,3175,3035,3155,2501700
|
40
|
+
20110301,3185,3200,3150,3190,1605800
|
41
|
+
20110302,3115,3215,3110,3150,1901200
|
42
|
+
20110303,3175,3310,3165,3270,4072800
|
43
|
+
20110304,3335,3350,3240,3275,2222900
|
44
|
+
20110307,3280,3360,3255,3290,1993200
|
45
|
+
20110308,3285,3320,3260,3280,1639200
|
46
|
+
20110309,3330,3335,3245,3290,1777100
|
47
|
+
20110310,3260,3280,3210,3260,1769400
|
48
|
+
20110311,3190,3230,3150,3170,1913000
|
49
|
+
20110314,2860,3040,2797,2815,4323000
|
50
|
+
20110315,2730,2800,2490,2655,5408700
|
51
|
+
20110316,2790,2904,2760,2852,3199900
|
52
|
+
20110317,2762,3000,2753,2967,2674100
|
53
|
+
20110318,2989,3030,2904,2936,1998100
|
54
|
+
20110322,3060,3070,2973,3010,1597400
|
55
|
+
20110323,2999,3110,2971,3035,1754400
|
56
|
+
20110324,3035,3165,3030,3145,2141800
|
57
|
+
20110325,3175,3205,3115,3145,2021100
|
58
|
+
20110328,3115,3120,2994,3020,1504700
|
59
|
+
20110329,2996,3050,2980,3005,1415100
|
60
|
+
20110330,3000,3075,3000,3020,1783900
|
61
|
+
20110331,3020,3040,2956,3005,2226700
|
62
|
+
20110401,3015,3045,2986,2986,1644900
|
63
|
+
20110404,2999,3020,2987,3005,975500
|
64
|
+
20110405,3010,3010,2875,2889,1838900
|
65
|
+
20110406,2900,2918,2837,2882,1293100
|
66
|
+
20110407,2924,2998,2910,2939,1683800
|
67
|
+
20110408,2925,2980,2901,2970,1083400
|
68
|
+
20110411,2993,3020,2970,2981,1065800
|
69
|
+
20110412,2965,2984,2871,2890,1512300
|
70
|
+
20110413,2876,2945,2815,2871,2040800
|
71
|
+
20110414,2867,2869,2817,2853,1759100
|
72
|
+
20110415,2868,2898,2831,2852,1568200
|
73
|
+
20110418,2855,2873,2820,2820,1217700
|
74
|
+
20110419,2791,2798,2740,2748,1696500
|
75
|
+
20110420,2770,2819,2725,2726,3476700
|
76
|
+
20110421,2754,2798,2741,2785,2346600
|
77
|
+
20110422,2805,2855,2786,2836,2522300
|
78
|
+
20110425,2855,2892,2816,2831,1657100
|
79
|
+
20110426,2910,3005,2906,2988,5475500
|
80
|
+
20110427,2989,3020,2956,3000,2510500
|
81
|
+
20110428,3005,3030,2966,3025,2697600
|
82
|
+
20110502,2970,2989,2857,2866,6418500
|
83
|
+
20110506,2817,2865,2776,2804,3688800
|
84
|
+
20110509,2777,2808,2759,2791,2509300
|
85
|
+
20110510,2783,2861,2783,2843,2327700
|
86
|
+
20110511,2855,2898,2846,2891,2577500
|
87
|
+
20110512,2878,2924,2865,2891,2603200
|
88
|
+
20110513,2909,2918,2811,2827,1619700
|
89
|
+
20110516,2812,2846,2776,2783,1116400
|
90
|
+
20110517,2768,2821,2752,2808,1556800
|
91
|
+
20110518,2800,2860,2798,2840,939100
|
92
|
+
20110519,2885,2911,2863,2906,2369500
|
93
|
+
20110520,2900,2945,2870,2883,2247900
|
94
|
+
20110523,2879,2890,2806,2852,1609700
|
95
|
+
20110524,2832,2934,2829,2924,1806700
|
96
|
+
20110525,2939,2959,2893,2924,1525200
|
97
|
+
20110526,2820,2856,2791,2818,7961100
|
98
|
+
20110527,2853,2886,2838,2868,2808400
|
99
|
+
20110530,2870,2873,2829,2837,2032900
|
100
|
+
20110531,2835,2885,2821,2885,2953500
|
101
|
+
20110601,2923,3050,2908,3050,5114700
|
102
|
+
20110602,3010,3080,2981,3045,3222100
|
103
|
+
20110603,3060,3080,2991,3035,2027800
|
104
|
+
20110606,3030,3150,3020,3130,2989800
|
105
|
+
20110607,3155,3175,3105,3170,2845300
|
106
|
+
20110608,3140,3275,3135,3265,3878000
|
107
|
+
20110609,3200,3255,3165,3205,2879000
|
108
|
+
20110610,3150,3220,3105,3150,2851500
|
109
|
+
20110613,3120,3235,3105,3230,2363200
|
110
|
+
20110614,3230,3345,3225,3240,4376800
|
111
|
+
20110615,3215,3220,3150,3185,2041000
|
112
|
+
20110616,3155,3220,3130,3130,1423000
|
113
|
+
20110617,3300,3325,3235,3240,4231300
|
114
|
+
20110620,3310,3340,3200,3250,2633200
|
115
|
+
20110621,3295,3455,3290,3440,4401300
|
116
|
+
20110622,3490,3510,3430,3455,2961400
|
117
|
+
20110623,3520,3545,3405,3425,2430000
|
118
|
+
20110624,3425,3430,3285,3360,2639300
|
119
|
+
20110627,3360,3405,3325,3350,1244400
|
120
|
+
20110628,3325,3360,3290,3300,1298300
|
121
|
+
20110629,3365,3470,3355,3450,2755000
|
122
|
+
20110630,3455,3480,3400,3455,1821500
|
123
|
+
20110701,3450,3475,3410,3425,1310100
|
124
|
+
20110704,3500,3520,3440,3460,1232100
|
125
|
+
20110705,3490,3495,3450,3485,866400
|
126
|
+
20110706,3500,3515,3450,3500,928100
|
127
|
+
20110707,3510,3605,3495,3595,2170600
|
128
|
+
20110708,3665,3800,3660,3785,4691500
|
129
|
+
20110711,3775,3865,3725,3755,3158200
|
130
|
+
20110712,3795,3815,3680,3690,2665900
|
131
|
+
20110713,3700,3835,3695,3825,2636500
|
132
|
+
20110714,3890,4025,3865,4025,5563300
|
133
|
+
20110715,4000,4020,3895,3920,3766600
|
134
|
+
20110719,3855,3910,3815,3820,3735400
|
135
|
+
20110720,3870,3895,3825,3835,1651900
|
136
|
+
20110721,3860,3945,3855,3940,2109200
|
137
|
+
20110722,3985,4000,3910,3940,1966300
|
138
|
+
20110725,3935,3980,3920,3950,1201100
|
139
|
+
20110726,3985,4055,3955,4050,3881600
|
140
|
+
20110727,4025,4070,3975,3995,2057200
|
141
|
+
20110728,3955,4055,3890,3955,2461500
|
142
|
+
20110729,3935,3960,3795,3845,2868700
|
143
|
+
20110801,3805,4025,3805,3960,2637700
|
144
|
+
20110802,3920,4045,3920,4020,3095900
|
145
|
+
20110803,3970,4000,3910,3960,2052300
|
146
|
+
20110804,4070,4090,3900,3915,3133100
|
147
|
+
20110805,3795,3985,3660,3985,4110100
|
148
|
+
20110808,3920,3930,3595,3635,6041600
|
149
|
+
20110809,3550,3705,3450,3640,6167500
|
150
|
+
20110810,3780,3870,3705,3800,4560200
|
151
|
+
20110811,3730,3945,3685,3945,5398400
|
152
|
+
20110812,3940,3965,3840,3890,3894800
|
153
|
+
20110815,3890,3930,3815,3910,2538600
|
154
|
+
20110816,3915,4150,3895,4040,6665100
|
155
|
+
20110817,4110,4185,4015,4135,5588600
|
156
|
+
20110818,4185,4330,4155,4255,8056300
|
157
|
+
20110819,4115,4210,4015,4030,6759900
|
158
|
+
20110822,4100,4150,3765,3780,5888500
|
159
|
+
20110823,3785,3860,3600,3775,8136200
|
160
|
+
20110824,3845,3850,3555,3580,5260500
|
161
|
+
20110825,3585,3655,3500,3530,5926300
|
162
|
+
20110826,3580,3780,3555,3775,5545000
|
163
|
+
20110829,3810,3935,3785,3920,5392600
|
164
|
+
20110830,3920,4040,3880,4005,4572100
|
165
|
+
20110831,4070,4070,3910,3960,4496300
|
166
|
+
20110901,4000,4010,3925,3960,2999100
|
167
|
+
20110902,3970,4055,3950,4030,4258900
|
168
|
+
20110905,3980,4050,3965,3965,3150300
|
169
|
+
20110906,3905,3915,3655,3700,4819200
|
170
|
+
20110907,3840,4010,3815,3995,5131500
|
171
|
+
20110908,4040,4040,3815,3915,4423100
|
172
|
+
20110909,3930,3980,3835,3885,2635000
|
173
|
+
20110912,3745,3905,3730,3815,2946000
|
174
|
+
20110913,3840,3935,3760,3850,3049600
|
175
|
+
20110914,3825,3910,3720,3745,2772700
|
176
|
+
20110915,3820,3830,3595,3615,3546300
|
177
|
+
20110916,3655,3755,3580,3740,3091400
|
178
|
+
20110920,3690,3730,3555,3585,2840100
|
179
|
+
20110921,3545,3590,3450,3455,3331700
|
180
|
+
20110922,3360,3425,3230,3245,4986400
|
181
|
+
20110926,3255,3345,3230,3290,4330000
|
182
|
+
20110927,3360,3370,3080,3190,4788000
|
183
|
+
20110928,3185,3360,3175,3300,4141600
|
184
|
+
20110929,3260,3380,3230,3350,3908500
|
185
|
+
20110930,3335,3345,3210,3270,3186900
|
186
|
+
20111003,3190,3325,3180,3220,2449200
|
187
|
+
20111004,3175,3305,3175,3265,3160900
|
188
|
+
20111005,3430,3545,3410,3530,7924400
|
189
|
+
20111006,3530,3610,3480,3555,3090200
|
190
|
+
20111007,3560,3605,3515,3600,1896400
|
191
|
+
20111011,3660,3670,3535,3540,1835000
|
192
|
+
20111012,3525,3525,3390,3405,1977000
|
193
|
+
20111013,3390,3535,3365,3510,2241000
|
194
|
+
20111014,3515,3580,3465,3495,1564700
|
195
|
+
20111017,3540,3555,3485,3490,1119000
|
196
|
+
20111018,3470,3490,3335,3405,1254900
|
197
|
+
20111019,3300,3340,3125,3135,5804200
|
198
|
+
20111020,3200,3250,3140,3180,3698900
|
199
|
+
20111021,3175,3210,3060,3105,2284600
|
200
|
+
20111024,3075,3230,3020,3215,2450400
|
201
|
+
20111025,3200,3240,3140,3180,1358400
|
202
|
+
20111026,3185,3235,3155,3215,1121800
|
203
|
+
20111027,3185,3315,3150,3290,2582900
|
204
|
+
20111028,3335,3415,3275,3340,3205100
|
205
|
+
20111031,3365,3510,3365,3425,2603900
|
206
|
+
20111101,2725,2884,2725,2725,24491800
|
207
|
+
20111102,2649,2708,2572,2640,17998500
|
208
|
+
20111104,2640,2667,2510,2627,14766700
|
209
|
+
20111107,2658,2777,2652,2759,14467300
|
210
|
+
20111108,2790,2831,2694,2731,12980300
|
211
|
+
20111109,2734,2757,2662,2707,5999100
|
212
|
+
20111110,2652,2776,2642,2762,6639700
|
213
|
+
20111111,2750,2783,2736,2762,3749300
|
214
|
+
20111114,2794,2819,2758,2786,3658500
|
215
|
+
20111115,2790,2800,2752,2781,2722300
|
216
|
+
20111116,2762,2766,2668,2670,4120300
|
217
|
+
20111117,2650,2713,2616,2651,3286100
|
218
|
+
20111118,2604,2648,2578,2627,3266300
|
219
|
+
20111121,2560,2594,2285,2302,11355900
|
220
|
+
20111122,2152,2310,2104,2229,16013500
|
221
|
+
20111124,2250,2310,2173,2181,6894800
|
222
|
+
20111125,2162,2270,2150,2215,5068300
|
223
|
+
20111128,2255,2298,2220,2267,3058700
|
224
|
+
20111129,2280,2346,2270,2309,4831400
|
225
|
+
20111130,2324,2378,2315,2357,3798700
|
226
|
+
20111201,2399,2414,2296,2330,5295400
|
227
|
+
20111202,2412,2528,2410,2519,9853900
|
228
|
+
20111205,2558,2563,2476,2519,5885100
|
229
|
+
20111206,2500,2531,2446,2450,4426100
|
230
|
+
20111207,2472,2509,2446,2484,3075600
|
231
|
+
20111208,2450,2479,2412,2424,3698700
|
232
|
+
20111209,2390,2419,2376,2392,2761100
|
233
|
+
20111212,2411,2445,2397,2413,2608100
|
234
|
+
20111213,2395,2405,2345,2378,2478400
|
235
|
+
20120223,2613,2637,2573,2587,3856400
|
236
|
+
20120224,2531,2647,2520,2638,7743200
|
237
|
+
20120316,2273,2296,2227,2244,7611000
|
238
|
+
20120319,2245,2270,2160,2167,5324000
|
239
|
+
20120321,2187,2280,2179,2236,8134000
|
240
|
+
20120322,2268,2288,2233,2259,5919700
|
241
|
+
20120323,2262,2283,2231,2260,3544800
|
242
|
+
20120326,2268,2277,2146,2199,7376500
|
243
|
+
20120327,2200,2264,2168,2247,4001700
|
244
|
+
20120328,2192,2247,2178,2202,2892200
|
245
|
+
20120329,2232,2355,2230,2340,6893700
|
246
|
+
20120330,2305,2320,2248,2293,6171500
|
247
|
+
20120402,2354,2384,2340,2371,4993400
|
248
|
+
20120403,2350,2371,2274,2321,5195300
|
249
|
+
20120404,2358,2417,2344,2393,7283400
|
250
|
+
20120405,2393,2432,2335,2393,6148800
|
251
|
+
20120406,2416,2430,2365,2384,4419100
|
252
|
+
20120409,2359,2419,2340,2390,3065200
|
253
|
+
20120410,2375,2390,2291,2302,3968700
|
254
|
+
20120411,2286,2381,2256,2377,4988300
|
255
|
+
20120412,2381,2425,2356,2413,4470100
|
256
|
+
20120413,2401,2469,2383,2422,4478700
|
257
|
+
20120416,2408,2429,2393,2406,1897500
|
258
|
+
20120417,2415,2526,2406,2519,6338900
|
259
|
+
20120418,2510,2545,2474,2521,4773300
|
260
|
+
20120419,2521,2592,2510,2549,4322200
|
261
|
+
20120420,2533,2575,2491,2539,3876000
|
262
|
+
20120423,2544,2643,2544,2635,5467000
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-anomalydetect
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.0'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Muddy Dixon
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: fluentd
|
16
|
+
requirement: &2152223980 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152223980
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: fluentd
|
27
|
+
requirement: &2152223420 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2152223420
|
36
|
+
description: detect anomal sequential input casually
|
37
|
+
email:
|
38
|
+
- muddydixon@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- LICENSE.txt
|
46
|
+
- README.rdoc
|
47
|
+
- Rakefile
|
48
|
+
- fluent-plugin-anormalydetect.gemspec
|
49
|
+
- lib/fluent/plugin/change_finder.rb
|
50
|
+
- lib/fluent/plugin/out_anomalydetect.rb
|
51
|
+
- test/helper.rb
|
52
|
+
- test/plugin/test_out_anomalydetect.rb
|
53
|
+
- test/stock.2432.csv
|
54
|
+
homepage: https://github.com/muddydixon/fluent-plugin-anomalydetect
|
55
|
+
licenses: []
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 1.8.11
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: detect anomal sequential input casually
|
78
|
+
test_files:
|
79
|
+
- test/helper.rb
|
80
|
+
- test/plugin/test_out_anomalydetect.rb
|
81
|
+
- test/stock.2432.csv
|