fluent-plugin-metricsense 0.3.2 → 0.4.0
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 +5 -5
- data/SECURITY.md +7 -0
- data/VERSION +1 -1
- data/fluent-plugin-metricsense.gemspec +1 -1
- data/lib/fluent/plugin/out_metricsense.rb +56 -68
- data/test/plugin/test_out_metricsense.rb +74 -12
- metadata +12 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 7371bfe5a22e6d5bcad59eb8519ee42b74ca08f563a914cb3e81c14d0920599a
|
|
4
|
+
data.tar.gz: 66f6e9c5c425419c6f8aad48a8a2fc7d2eadddfed2777341e164a692d6a4b48b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 817364fce002c27ad75bea81cafc6f002253688c7feb39077ba5927f2b8611d16e6cd65880f4961f1fafdca6b4898fb88507bd7691242343f953fcd2fb0e6833
|
|
7
|
+
data.tar.gz: 896b4d773cda010e95ab7d617945f63ee44707213c1c2cecb65bbdc938842bb5b541caa4afb4ceee19d5fd6d18a450742b5e8cd656ef45e4e4b69dbf7517fd77
|
data/SECURITY.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
Treasure Data values the security of its customers and is committed to ensuring that the systems and products are secure. We invite all bug bounty researchers to join our efforts in identifying and reporting vulnerabilities in our systems.
|
|
6
|
+
|
|
7
|
+
Submit your findings to our dedicated bug bounty email address [vulnerabilities@treasuredata.com](mailto:vulnerabilities@treasuredata.com) and help us keep Treasure Data secure. Let’s work together to make the Internet a safer place!
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.4.0
|
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
18
|
|
|
19
|
-
s.add_dependency "fluentd", ">= 0.
|
|
19
|
+
s.add_dependency "fluentd", [">= 0.14.0", "< 2"]
|
|
20
20
|
s.add_dependency "dogapi"
|
|
21
21
|
s.add_development_dependency "rake", ">= 0.8.7"
|
|
22
22
|
s.add_development_dependency 'bundler', ['>= 1.0.0']
|
|
@@ -18,9 +18,19 @@
|
|
|
18
18
|
#
|
|
19
19
|
module Fluent
|
|
20
20
|
|
|
21
|
-
class MetricSenseOutput < Fluent::
|
|
21
|
+
class MetricSenseOutput < Fluent::Plugin::Output
|
|
22
22
|
Fluent::Plugin.register_output('metricsense', self)
|
|
23
23
|
|
|
24
|
+
helpers :compat_parameters
|
|
25
|
+
|
|
26
|
+
def formatted_to_msgpack_binary?
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def compat_parameters_default_chunk_key
|
|
31
|
+
""
|
|
32
|
+
end
|
|
33
|
+
|
|
24
34
|
BACKENDS = {}
|
|
25
35
|
|
|
26
36
|
def self.register_backend(name, klass)
|
|
@@ -36,7 +46,7 @@ module Fluent
|
|
|
36
46
|
|
|
37
47
|
class Backend
|
|
38
48
|
UpdateMode = MetricSenseOutput::UpdateMode
|
|
39
|
-
include Configurable
|
|
49
|
+
include Fluent::Configurable
|
|
40
50
|
|
|
41
51
|
attr_accessor :log
|
|
42
52
|
|
|
@@ -69,11 +79,8 @@ module Fluent
|
|
|
69
79
|
|
|
70
80
|
config_param :aggregate_interval, :time, :default => 60
|
|
71
81
|
|
|
72
|
-
unless method_defined?(:log)
|
|
73
|
-
define_method(:log) { $log }
|
|
74
|
-
end
|
|
75
|
-
|
|
76
82
|
def configure(conf)
|
|
83
|
+
compat_parameters_convert(conf, :buffer)
|
|
77
84
|
super
|
|
78
85
|
|
|
79
86
|
if @remove_tag_prefix
|
|
@@ -111,81 +118,62 @@ module Fluent
|
|
|
111
118
|
end
|
|
112
119
|
|
|
113
120
|
def shutdown
|
|
114
|
-
super
|
|
115
121
|
@backend.shutdown
|
|
122
|
+
super
|
|
116
123
|
end
|
|
117
124
|
|
|
118
|
-
def
|
|
119
|
-
# modify tag
|
|
125
|
+
def format(tag, time, record)
|
|
120
126
|
tag = tag.sub(@remove_tag_prefix, '') if @remove_tag_prefix
|
|
121
|
-
tag = "#{add_tag_prefix}.#{tag}" if @add_tag_prefix
|
|
122
|
-
|
|
123
|
-
out = ''
|
|
124
|
-
es.each do |time,record|
|
|
125
|
-
# dup record to modify
|
|
126
|
-
record = record.dup
|
|
127
|
+
tag = "#{@add_tag_prefix}.#{tag}" if @add_tag_prefix
|
|
127
128
|
|
|
128
|
-
|
|
129
|
-
value = record.delete(@value_key)
|
|
130
|
-
|
|
131
|
-
# ignore record if value is missing
|
|
132
|
-
next if value.nil?
|
|
133
|
-
|
|
134
|
-
# ignore record if value is invalid
|
|
135
|
-
begin
|
|
136
|
-
fv = value.to_f
|
|
137
|
-
rescue
|
|
138
|
-
next
|
|
139
|
-
end
|
|
140
|
-
next if fv.nan? || fv.infinite?
|
|
129
|
+
record = record.dup
|
|
141
130
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if iv.to_f == fv
|
|
145
|
-
value = iv
|
|
146
|
-
else
|
|
147
|
-
value = fv
|
|
148
|
-
end
|
|
131
|
+
value = record.delete(@value_key)
|
|
132
|
+
return nil if value.nil?
|
|
149
133
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
134
|
+
begin
|
|
135
|
+
fv = value.to_f
|
|
136
|
+
rescue
|
|
137
|
+
return nil
|
|
138
|
+
end
|
|
139
|
+
return nil if fv.nan? || fv.infinite?
|
|
140
|
+
|
|
141
|
+
iv = fv.to_i
|
|
142
|
+
value = iv.to_f == fv ? iv : fv
|
|
143
|
+
|
|
144
|
+
update_mode = record.delete(@update_mode_key)
|
|
145
|
+
case update_mode
|
|
146
|
+
when "max"
|
|
147
|
+
update_mode = UpdateMode::MAX
|
|
148
|
+
when "average"
|
|
149
|
+
update_mode = UpdateMode::AVERAGE
|
|
150
|
+
when "count"
|
|
151
|
+
update_mode = UpdateMode::COUNT
|
|
152
|
+
else
|
|
153
|
+
update_mode = UpdateMode::ADD
|
|
154
|
+
end
|
|
163
155
|
|
|
164
|
-
|
|
165
|
-
|
|
156
|
+
if @no_segment_keys
|
|
157
|
+
segments = {}
|
|
158
|
+
else
|
|
159
|
+
if @only_segment_keys
|
|
166
160
|
segments = {}
|
|
161
|
+
@only_segment_keys.each {|key|
|
|
162
|
+
if v = record[key]
|
|
163
|
+
segments[key] = v
|
|
164
|
+
end
|
|
165
|
+
}
|
|
167
166
|
else
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
else
|
|
176
|
-
segments = record
|
|
177
|
-
end
|
|
178
|
-
if @exclude_segment_keys
|
|
179
|
-
@exclude_segment_keys.each {|key|
|
|
180
|
-
segments.delete(key)
|
|
181
|
-
}
|
|
182
|
-
end
|
|
167
|
+
segments = record
|
|
168
|
+
end
|
|
169
|
+
if @exclude_segment_keys
|
|
170
|
+
@exclude_segment_keys.each {|key|
|
|
171
|
+
segments.delete(key)
|
|
172
|
+
}
|
|
183
173
|
end
|
|
184
|
-
|
|
185
|
-
[tag, time, value, segments, update_mode].to_msgpack(out)
|
|
186
174
|
end
|
|
187
175
|
|
|
188
|
-
|
|
176
|
+
[tag, time.to_i, value, segments, update_mode].to_msgpack
|
|
189
177
|
end
|
|
190
178
|
|
|
191
179
|
class AddUpdater
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
require 'test-unit'
|
|
1
2
|
require 'fluent/test'
|
|
3
|
+
require 'fluent/test/driver/output'
|
|
4
|
+
require 'fluent/test/helpers'
|
|
2
5
|
require 'fluent/plugin/out_metricsense'
|
|
3
6
|
|
|
4
7
|
class MetricsenseOutputTest < Test::Unit::TestCase
|
|
8
|
+
include Fluent::Test::Helpers
|
|
9
|
+
|
|
5
10
|
class TestBackend < Fluent::MetricSenseOutput::Backend
|
|
6
11
|
Fluent::MetricSenseOutput.register_backend('test', self)
|
|
7
12
|
|
|
@@ -11,6 +16,10 @@ class MetricsenseOutputTest < Test::Unit::TestCase
|
|
|
11
16
|
@@data
|
|
12
17
|
end
|
|
13
18
|
|
|
19
|
+
def self.clear
|
|
20
|
+
@@data = []
|
|
21
|
+
end
|
|
22
|
+
|
|
14
23
|
def write(data)
|
|
15
24
|
@@data << data
|
|
16
25
|
end
|
|
@@ -22,20 +31,22 @@ class MetricsenseOutputTest < Test::Unit::TestCase
|
|
|
22
31
|
|
|
23
32
|
def setup
|
|
24
33
|
Fluent::Test.setup
|
|
34
|
+
TestBackend.clear
|
|
25
35
|
end
|
|
26
36
|
|
|
27
|
-
def create_driver(conf)
|
|
28
|
-
Fluent::Test::
|
|
37
|
+
def create_driver(conf = CONFIG)
|
|
38
|
+
Fluent::Test::Driver::Output.new(Fluent::MetricSenseOutput).configure(conf)
|
|
29
39
|
end
|
|
30
40
|
|
|
31
41
|
def test_emit
|
|
32
42
|
now = Time.now.to_i
|
|
33
|
-
d = create_driver
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
d = create_driver
|
|
44
|
+
d.run(default_tag: 'test') do
|
|
45
|
+
d.feed(now, {'value' => 1, 'user_id' => 23456, 'path' => '/auth/login'})
|
|
46
|
+
end
|
|
37
47
|
|
|
38
48
|
t = now / 60 * 60
|
|
49
|
+
assert_true TestBackend.data.length > 0
|
|
39
50
|
TestBackend.data.each do |written|
|
|
40
51
|
assert_equal ['test', t, 1, 'user_id', 23456, 0], written.shift
|
|
41
52
|
assert_equal ['test', t, 1, 'path', "/auth/login", 0], written.shift
|
|
@@ -44,13 +55,64 @@ class MetricsenseOutputTest < Test::Unit::TestCase
|
|
|
44
55
|
end
|
|
45
56
|
|
|
46
57
|
# server restart can cause broken buffer and broken chunk.
|
|
47
|
-
# out_metricsense ignore the chunk with warning log
|
|
58
|
+
# out_metricsense should ignore the chunk with warning log.
|
|
59
|
+
# Note: v1 driver validates inputs, so we hand-roll a corrupt chunk
|
|
60
|
+
# to exercise write's error handling directly.
|
|
48
61
|
def test_skip_broken_chunk
|
|
49
|
-
d = create_driver
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
62
|
+
d = create_driver
|
|
63
|
+
|
|
64
|
+
corrupt_chunk = Object.new
|
|
65
|
+
def corrupt_chunk.msgpack_each
|
|
66
|
+
yield ['test', 'not_a_number', 1, {}, 0]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
assert_nothing_raised do
|
|
70
|
+
d.instance.write(corrupt_chunk)
|
|
71
|
+
end
|
|
72
|
+
assert_equal [[]], TestBackend.data
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_format_skips_nil_value
|
|
76
|
+
now = Time.now.to_i
|
|
77
|
+
d = create_driver
|
|
78
|
+
d.run(default_tag: 'test') do
|
|
79
|
+
d.feed(now, {'no_value_key' => 'x'})
|
|
80
|
+
d.feed(now, {'value' => 1})
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
assert_nil d.formatted.first
|
|
84
|
+
assert_equal 1, d.formatted.compact.length
|
|
85
|
+
assert_equal 1, TestBackend.data.flatten(1).length
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_format_skips_nan_value
|
|
89
|
+
now = Time.now.to_i
|
|
90
|
+
d = create_driver
|
|
91
|
+
d.run(default_tag: 'test') do
|
|
92
|
+
d.feed(now, {'value' => Float::NAN})
|
|
93
|
+
d.feed(now, {'value' => 1})
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
assert_nil d.formatted.first
|
|
97
|
+
assert_equal 1, d.formatted.compact.length
|
|
98
|
+
assert_equal 1, TestBackend.data.flatten(1).length
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_format_skips_infinite_value
|
|
102
|
+
now = Time.now.to_i
|
|
103
|
+
d = create_driver
|
|
104
|
+
d.run(default_tag: 'test') do
|
|
105
|
+
d.feed(now, {'value' => Float::INFINITY})
|
|
106
|
+
d.feed(now, {'value' => 1})
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
assert_nil d.formatted.first
|
|
110
|
+
assert_equal 1, d.formatted.compact.length
|
|
111
|
+
assert_equal 1, TestBackend.data.flatten(1).length
|
|
112
|
+
end
|
|
53
113
|
|
|
54
|
-
|
|
114
|
+
def test_reloadable
|
|
115
|
+
d = create_driver
|
|
116
|
+
assert_true d.instance.reloadable_plugin?
|
|
55
117
|
end
|
|
56
118
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fluent-plugin-metricsense
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sadayuki Furuhashi
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-09-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: fluentd
|
|
@@ -16,14 +16,20 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.
|
|
19
|
+
version: 0.14.0
|
|
20
|
+
- - "<"
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '2'
|
|
20
23
|
type: :runtime
|
|
21
24
|
prerelease: false
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
26
|
requirements:
|
|
24
27
|
- - ">="
|
|
25
28
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.
|
|
29
|
+
version: 0.14.0
|
|
30
|
+
- - "<"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2'
|
|
27
33
|
- !ruby/object:Gem::Dependency
|
|
28
34
|
name: dogapi
|
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -105,6 +111,7 @@ files:
|
|
|
105
111
|
- LICENSE
|
|
106
112
|
- README.rdoc
|
|
107
113
|
- Rakefile
|
|
114
|
+
- SECURITY.md
|
|
108
115
|
- VERSION
|
|
109
116
|
- fluent-plugin-metricsense.gemspec
|
|
110
117
|
- lib/fluent/plugin/backends/datadog_backend.rb
|
|
@@ -132,8 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
132
139
|
- !ruby/object:Gem::Version
|
|
133
140
|
version: '0'
|
|
134
141
|
requirements: []
|
|
135
|
-
|
|
136
|
-
rubygems_version: 2.6.8
|
|
142
|
+
rubygems_version: 3.0.3.1
|
|
137
143
|
signing_key:
|
|
138
144
|
specification_version: 4
|
|
139
145
|
summary: MetricSense - application metrics aggregation plugin for Fluentd
|