fluent-plugin-anomalydetect 0.1.1 → 0.1.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5dc986d4d340cf2115aaf591724f1f7215dbbbd8
|
4
|
+
data.tar.gz: 9cb4fcb75b4500f544a1d81e1159e60ffdc956d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d414c7d4fc72620c9b35ec135145b67d7042315e3e0280339c0a5e08526c0da9ec104432b60321ff761c00fae1db63e56fb75dd4f758979a604910b41ba74067
|
7
|
+
data.tar.gz: f48841a679ffe543fbba58bdf27443653f50ed0e144f94055562edff663f9e30aa5782f1cc7ad62ace7b9cb922f13c5c509ce622ac669e44cb55d5ab9e919b61
|
data/README.rdoc
CHANGED
@@ -82,6 +82,14 @@ If "store_file" option was specified, a historical stat will be stored to the fi
|
|
82
82
|
|
83
83
|
If "threshold" option was specified, plugin only ouput when the anomalyscore is more than threshold.
|
84
84
|
|
85
|
+
<match access.**>
|
86
|
+
type anomalydetect
|
87
|
+
...
|
88
|
+
trend up
|
89
|
+
</match>
|
90
|
+
|
91
|
+
If "trend" option was specified, plugin only ouput when the input data tends to up (or down).
|
92
|
+
|
85
93
|
== Theory
|
86
94
|
"データマイニングによる異常検知" http://amzn.to/XHXNun
|
87
95
|
|
@@ -3,7 +3,7 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = "fluent-plugin-anomalydetect"
|
6
|
-
gem.version = "0.1.
|
6
|
+
gem.version = "0.1.2"
|
7
7
|
gem.authors = ["Muddy Dixon"]
|
8
8
|
gem.email = ["muddydixon@gmail.com"]
|
9
9
|
gem.description = %q{detect anomal sequential input casually}
|
@@ -15,6 +15,16 @@ module Fluent
|
|
15
15
|
config_param :target, :string, :default => nil
|
16
16
|
config_param :store_file, :string, :default => nil
|
17
17
|
config_param :threshold, :float, :default => -1.0
|
18
|
+
config_param :trend, :default => nil do |val|
|
19
|
+
case val.downcase
|
20
|
+
when 'up'
|
21
|
+
:up
|
22
|
+
when 'down'
|
23
|
+
:down
|
24
|
+
else
|
25
|
+
raise ConfigError, "out_anomaly treand should be 'up' or 'down'"
|
26
|
+
end
|
27
|
+
end
|
18
28
|
|
19
29
|
attr_accessor :outlier
|
20
30
|
attr_accessor :score
|
@@ -177,6 +187,12 @@ module Fluent
|
|
177
187
|
|
178
188
|
$log.debug "out_anomalydetect:#{Thread.current.object_id} flushed:#{flushed} val:#{val} outlier:#{outlier} outlier_buf:#{@outlier_buf} score:#{score}"
|
179
189
|
if @threshold < 0 or (@threshold >= 0 and score > @threshold)
|
190
|
+
case @trend
|
191
|
+
when :up
|
192
|
+
return nil if val < @outlier.mu
|
193
|
+
when :down
|
194
|
+
return nil if val > @outlier.mu
|
195
|
+
end
|
180
196
|
{"outlier" => outlier, "score" => score, "target" => val}
|
181
197
|
else
|
182
198
|
nil
|
@@ -246,4 +246,54 @@ class AnomalyDetectOutputTest < Test::Unit::TestCase
|
|
246
246
|
end
|
247
247
|
end
|
248
248
|
end
|
249
|
+
|
250
|
+
def test_up_trend
|
251
|
+
d = create_driver %[
|
252
|
+
target y
|
253
|
+
trend up
|
254
|
+
]
|
255
|
+
|
256
|
+
# should not output in down trend
|
257
|
+
d.run do
|
258
|
+
d.emit({'y' => 0.0}); d.instance.flush
|
259
|
+
d.emit({'y' => 0.0}); d.instance.flush
|
260
|
+
d.emit({'y' => 0.0}); d.instance.flush
|
261
|
+
d.emit({'y' => -1.0}); r = d.instance.flush
|
262
|
+
assert_equal nil, r
|
263
|
+
end
|
264
|
+
|
265
|
+
# should output in up trend
|
266
|
+
d.run do
|
267
|
+
d.emit({'y' => -1.0}); d.instance.flush
|
268
|
+
d.emit({'y' => -1.0}); d.instance.flush
|
269
|
+
d.emit({'y' => -1.0}); d.instance.flush
|
270
|
+
d.emit({'y' => 0.0}); r = d.instance.flush
|
271
|
+
assert_not_equal nil, r
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_down_trend
|
276
|
+
d = create_driver %[
|
277
|
+
target y
|
278
|
+
trend down
|
279
|
+
]
|
280
|
+
# should output in down trend
|
281
|
+
d.run do
|
282
|
+
d.emit({'y' => 0.0}); d.instance.flush
|
283
|
+
d.emit({'y' => 0.0}); d.instance.flush
|
284
|
+
d.emit({'y' => 0.0}); d.instance.flush
|
285
|
+
d.emit({'y' => -1.0}); r = d.instance.flush
|
286
|
+
assert_not_equal nil, r
|
287
|
+
end
|
288
|
+
|
289
|
+
# should not output in up tread
|
290
|
+
d.run do
|
291
|
+
d.emit({'y' => -1.0}); d.instance.flush
|
292
|
+
d.emit({'y' => -1.0}); d.instance.flush
|
293
|
+
d.emit({'y' => -1.0}); d.instance.flush
|
294
|
+
d.emit({'y' => 0.0})
|
295
|
+
r = d.instance.flush
|
296
|
+
assert_equal nil, r
|
297
|
+
end
|
298
|
+
end
|
249
299
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-anomalydetect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Muddy Dixon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-08-
|
11
|
+
date: 2013-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
76
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.0.
|
77
|
+
rubygems_version: 2.0.2
|
78
78
|
signing_key:
|
79
79
|
specification_version: 4
|
80
80
|
summary: detect anomal sequential input casually
|