ffwd 0.3.7 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/lib/ffwd/core/processor.rb +2 -2
- data/lib/ffwd/core/reporter.rb +2 -2
- data/lib/ffwd/flushing_output.rb +4 -4
- data/lib/ffwd/plugin/log/writer.rb +4 -2
- data/lib/ffwd/plugin_channel.rb +4 -4
- data/lib/ffwd/producing_client.rb +10 -10
- data/lib/ffwd/protocol/tcp/bind.rb +3 -3
- data/lib/ffwd/protocol/tcp/flushing_connect.rb +8 -8
- data/lib/ffwd/protocol/tcp/plain_connect.rb +7 -7
- data/lib/ffwd/protocol/udp/bind.rb +5 -5
- data/lib/ffwd/protocol/udp/connect.rb +5 -5
- data/lib/ffwd/reporter.rb +6 -3
- data/lib/ffwd/statistics/collector.rb +6 -3
- data/lib/ffwd/statistics/system_statistics.rb +18 -17
- data/lib/ffwd/tunnel/tcp.rb +4 -4
- data/lib/ffwd/tunnel/udp.rb +4 -4
- data/lib/ffwd/version.rb +1 -1
- metadata +25 -28
- data/lib/ffwd/processor/count.rb +0 -130
- data/lib/ffwd/processor/histogram.rb +0 -212
- data/lib/ffwd/processor/rate.rb +0 -127
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDFjMDgxMTcyNzdkYmVmYWUxMzZlNDdmZjY1ZjUxYWE4ZTA3YjQwYg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b64d17883b2270f2881852ba03b835186eb7b5b8
|
4
|
+
data.tar.gz: 73fb67085c33020061b6673a38bd253a672de0be
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZTNjMWI4ZjkyYzdlZmNlMWRiMDEyM2Q3YzMyMjJhNGJlNjYyMWI2NWQ0OTQ0
|
11
|
-
ZjIxYWVhOTczOGQ5ODBiNTk3ZTcyZjgwMGRjNmI0MWEzN2VhYjQ=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MzllOTIxOGM5YjJiYjY1NDM4NDA2Zjc0NjBhMjhjY2EyMTAyMTFkY2QxNjg3
|
14
|
-
YTc2MTdjOWZlYTU4MjZhZjFiNjNlN2M4NGI4NWY3M2M4ZDk5YzI3Y2E3Mjhi
|
15
|
-
YzgwYjQ2YTcyNzI1ZGRmN2QwNzBhYTNiMWJhYzRiNWZjZTNlMTQ=
|
6
|
+
metadata.gz: 06dc1d8011388e4d1a754e70bf5c40ec45b4037cd8c94a3327dec0a26217c65b1607d54b79df50f08f47d8e4b72fe4fb0c10f007f3ebbc0f14b95e7a2fe3aa77
|
7
|
+
data.tar.gz: eed054fc3a895e30a5351b3e96e2ecbd679036961b60ced3521c4a7dd4f3c4c81e44b716693e6024b74aa316e8d1a1aaafae1f68465666aa0c189f95974eafcc
|
data/lib/ffwd/core/processor.rb
CHANGED
data/lib/ffwd/core/reporter.rb
CHANGED
data/lib/ffwd/flushing_output.rb
CHANGED
@@ -21,11 +21,11 @@ module FFWD
|
|
21
21
|
class FlushingOutput
|
22
22
|
include FFWD::Reporter
|
23
23
|
|
24
|
-
report_meta :direction => :
|
24
|
+
report_meta :direction => :output
|
25
25
|
|
26
|
-
report_key :dropped_metrics, :meta => {:what =>
|
27
|
-
report_key :failed_metrics, :meta => {:what =>
|
28
|
-
report_key :sent_metrics, :meta => {:what =>
|
26
|
+
report_key :dropped_metrics, :meta => {:what => "dropped-metrics", :unit => :metric}
|
27
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
28
|
+
report_key :sent_metrics, :meta => {:what => "sent-metrics", :unit => :metric}
|
29
29
|
|
30
30
|
attr_reader :log, :reporter_meta
|
31
31
|
|
@@ -13,6 +13,8 @@
|
|
13
13
|
# License for the specific language governing permissions and limitations under
|
14
14
|
# the License.
|
15
15
|
|
16
|
+
require 'json'
|
17
|
+
|
16
18
|
require_relative '../../logging'
|
17
19
|
|
18
20
|
module FFWD::Plugin::Log
|
@@ -28,11 +30,11 @@ module FFWD::Plugin::Log
|
|
28
30
|
log.info "Started (prefix: '#{@p}')"
|
29
31
|
|
30
32
|
subs << core.output.event_subscribe do |e|
|
31
|
-
log.info "Event: #{@p}#{e.to_h}"
|
33
|
+
log.info "Event: #{@p}#{JSON.dump(e.to_h)}"
|
32
34
|
end
|
33
35
|
|
34
36
|
subs << core.output.metric_subscribe do |m|
|
35
|
-
log.info "Metric: #{@p}#{m.to_h}"
|
37
|
+
log.info "Metric: #{@p}#{JSON.dump(m.to_h)}"
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
data/lib/ffwd/plugin_channel.rb
CHANGED
@@ -26,9 +26,9 @@ module FFWD
|
|
26
26
|
include FFWD::Reporter
|
27
27
|
include FFWD::Logging
|
28
28
|
|
29
|
-
report_meta :component => :
|
30
|
-
report_key :metrics, :meta => {:what =>
|
31
|
-
report_key :events, :meta => {:what =>
|
29
|
+
report_meta :component => :channel
|
30
|
+
report_key :metrics, :meta => {:what => "seen-metrics", :unit => :metric}
|
31
|
+
report_key :events, :meta => {:what => "seen-events", :unit => :event}
|
32
32
|
|
33
33
|
attr_reader :id, :events, :metrics, :reporter_meta
|
34
34
|
|
@@ -42,7 +42,7 @@ module FFWD
|
|
42
42
|
@id = id
|
43
43
|
@events = events
|
44
44
|
@metrics = metrics
|
45
|
-
@reporter_meta = {:
|
45
|
+
@reporter_meta = {:channel => @id}
|
46
46
|
end
|
47
47
|
|
48
48
|
def event_subscribe &block
|
@@ -32,34 +32,34 @@ module FFWD
|
|
32
32
|
report_meta :component => :producing_client
|
33
33
|
|
34
34
|
# number of events/metrics that we attempted to dispatch but failed.
|
35
|
-
report_key :failed_events, :meta => {:what =>
|
36
|
-
report_key :failed_metrics, :meta => {:what =>
|
35
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
36
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
37
37
|
|
38
38
|
# number of events/metrics that were dropped because the output buffers
|
39
39
|
# are full.
|
40
|
-
report_key :dropped_events, :meta => {:what =>
|
41
|
-
report_key :dropped_metrics, :meta => {:what =>
|
40
|
+
report_key :dropped_events, :meta => {:what => "dropped-events", :unit => :event}
|
41
|
+
report_key :dropped_metrics, :meta => {:what => "dropped-metrics", :unit => :event}
|
42
42
|
|
43
43
|
# number of events/metrics successfully sent.
|
44
|
-
report_key :sent_events, :meta => {:what =>
|
45
|
-
report_key :sent_metrics, :meta => {:what =>
|
44
|
+
report_key :sent_events, :meta => {:what => "sent-events", :unit => :event}
|
45
|
+
report_key :sent_metrics, :meta => {:what => "sent-metrics", :unit => :event}
|
46
46
|
|
47
47
|
# number of requests that take longer than the allowed period.
|
48
|
-
report_key :slow_requests, :meta => {:what =>
|
48
|
+
report_key :slow_requests, :meta => {:what => "slow-requests", :unit => :request}
|
49
49
|
|
50
50
|
def reporter_meta
|
51
51
|
return {} if @producer_is_reporter
|
52
52
|
@producer.class.reporter_meta.merge(@producer.reporter_meta)
|
53
53
|
end
|
54
54
|
|
55
|
-
def report!
|
56
|
-
super do |m|
|
55
|
+
def report!(diff)
|
56
|
+
super(diff) do |m|
|
57
57
|
yield m
|
58
58
|
end
|
59
59
|
|
60
60
|
return unless @producer_is_reporter
|
61
61
|
|
62
|
-
@producer.report! do |m|
|
62
|
+
@producer.report!(diff) do |m|
|
63
63
|
yield m
|
64
64
|
end
|
65
65
|
end
|
@@ -30,10 +30,10 @@ module FFWD::TCP
|
|
30
30
|
opts
|
31
31
|
end
|
32
32
|
|
33
|
-
report_meta :protocol => :tcp, :direction => :
|
33
|
+
report_meta :protocol => :tcp, :direction => :input
|
34
34
|
|
35
|
-
report_key :failed_events, :meta => {:what =>
|
36
|
-
report_key :received_events, :meta => {:what =>
|
35
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
36
|
+
report_key :received_events, :meta => {:what => "received-events", :unit => :event}
|
37
37
|
|
38
38
|
report_key :failed_metrics, :meta => {:what => :failed_metrics, :unit => :metric}
|
39
39
|
report_key :received_metrics, :meta => {:what => :received_metrics, :unit => :metric}
|
@@ -29,18 +29,18 @@ module FFWD::TCP
|
|
29
29
|
# maximum amount of metrics to buffer up.
|
30
30
|
DEFAULT_METRIC_LIMIT = 10000
|
31
31
|
|
32
|
-
report_meta :protocol => :tcp, :direction => :
|
32
|
+
report_meta :protocol => :tcp, :direction => :output
|
33
33
|
|
34
|
-
report_key :dropped_events, :meta => {:what =>
|
35
|
-
report_key :dropped_metrics, :meta => {:what =>
|
34
|
+
report_key :dropped_events, :meta => {:what => "dropped-events", :unit => :event}
|
35
|
+
report_key :dropped_metrics, :meta => {:what => "dropped-metrics", :unit => :metric}
|
36
36
|
|
37
|
-
report_key :sent_events, :meta => {:what =>
|
38
|
-
report_key :sent_metrics, :meta => {:what =>
|
37
|
+
report_key :sent_events, :meta => {:what => "sent-events", :unit => :event}
|
38
|
+
report_key :sent_metrics, :meta => {:what => "sent-metrics", :unit => :metric}
|
39
39
|
|
40
|
-
report_key :failed_events, :meta => {:what =>
|
41
|
-
report_key :failed_metrics, :meta => {:what =>
|
40
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
41
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
42
42
|
|
43
|
-
report_key :forced_flush, :meta => {:what =>
|
43
|
+
report_key :forced_flush, :meta => {:what => "forced-flush", :unit => :flush}
|
44
44
|
|
45
45
|
attr_reader :log
|
46
46
|
|
@@ -25,16 +25,16 @@ module FFWD::TCP
|
|
25
25
|
opts
|
26
26
|
end
|
27
27
|
|
28
|
-
report_meta :protocol => :tcp, :direction => :
|
28
|
+
report_meta :protocol => :tcp, :direction => :output
|
29
29
|
|
30
|
-
report_key :dropped_events, :meta => {:what =>
|
31
|
-
report_key :dropped_metrics, :meta => {:what =>
|
30
|
+
report_key :dropped_events, :meta => {:what => "dropped-events", :unit => :event}
|
31
|
+
report_key :dropped_metrics, :meta => {:what => "dropped-metrics", :unit => :metric}
|
32
32
|
|
33
|
-
report_key :sent_events, :meta => {:what =>
|
34
|
-
report_key :sent_metrics, :meta => {:what =>
|
33
|
+
report_key :sent_events, :meta => {:what => "sent-events", :unit => :event}
|
34
|
+
report_key :sent_metrics, :meta => {:what => "sent-metrics", :unit => :metric}
|
35
35
|
|
36
|
-
report_key :failed_events, :meta => {:what =>
|
37
|
-
report_key :failed_metrics, :meta => {:what =>
|
36
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
37
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
38
38
|
|
39
39
|
def reporter_meta
|
40
40
|
@c.reporter_meta
|
@@ -32,13 +32,13 @@ module FFWD::UDP
|
|
32
32
|
opts
|
33
33
|
end
|
34
34
|
|
35
|
-
report_meta :protocol => :udp, :direction => :
|
35
|
+
report_meta :protocol => :udp, :direction => :output
|
36
36
|
|
37
|
-
report_key :received_events, :meta => {:what =>
|
38
|
-
report_key :received_metrics, :meta => {:what =>
|
37
|
+
report_key :received_events, :meta => {:what => "received-events", :unit => :event}
|
38
|
+
report_key :received_metrics, :meta => {:what => "received-metrics", :unit => :metric}
|
39
39
|
|
40
|
-
report_key :failed_events, :meta => {:what =>
|
41
|
-
report_key :failed_metrics, :meta => {:what =>
|
40
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
41
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
42
42
|
|
43
43
|
attr_reader :reporter_meta, :log, :config
|
44
44
|
|
@@ -29,13 +29,13 @@ module FFWD::UDP
|
|
29
29
|
|
30
30
|
attr_reader :reporter_meta, :log, :config
|
31
31
|
|
32
|
-
report_meta :protocol => :udp, :direction => :
|
32
|
+
report_meta :protocol => :udp, :direction => :output
|
33
33
|
|
34
|
-
report_key :sent_events, :meta => {:what =>
|
35
|
-
report_key :sent_metrics, :meta => {:what =>
|
34
|
+
report_key :sent_events, :meta => {:what => "sent-events", :unit => :event}
|
35
|
+
report_key :sent_metrics, :meta => {:what => "sent-metrics", :unit => :metric}
|
36
36
|
|
37
|
-
report_key :dropped_events, :meta => {:what =>
|
38
|
-
report_key :dropped_metrics, :meta => {:what =>
|
37
|
+
report_key :dropped_events, :meta => {:what => "dropped-events", :unit => :event}
|
38
|
+
report_key :dropped_metrics, :meta => {:what => "dropped-metrics", :unit => :metric}
|
39
39
|
|
40
40
|
def initialize core, log, host, port, handler, config
|
41
41
|
@log = log
|
data/lib/ffwd/reporter.rb
CHANGED
@@ -25,7 +25,9 @@ module FFWD::Reporter
|
|
25
25
|
meta = meta.merge(instance.send(:reporter_meta))
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
meta = meta.merge(k[:meta])
|
29
|
+
meta[:unit] = "#{meta[:unit] || 'n'}/s"
|
30
|
+
return meta
|
29
31
|
end
|
30
32
|
|
31
33
|
module ClassMethods
|
@@ -71,15 +73,16 @@ module FFWD::Reporter
|
|
71
73
|
reporter_data[n] += c
|
72
74
|
end
|
73
75
|
|
74
|
-
def report!
|
76
|
+
def report! diff
|
75
77
|
self.class.reporter_keys.each do |key|
|
76
78
|
k = key[:key]
|
77
79
|
v = reporter_data[k]
|
78
80
|
reporter_data[k] = 0
|
79
81
|
|
80
82
|
meta = ((@_reporter_meta ||= {})[k] ||= FFWD::Reporter.build_meta(self, key))
|
83
|
+
rate = (v / diff).round(3)
|
81
84
|
|
82
|
-
yield(:key => k, :value =>
|
85
|
+
yield(:key => k, :value => rate, :meta => meta)
|
83
86
|
end
|
84
87
|
end
|
85
88
|
end
|
@@ -78,9 +78,12 @@ module FFWD::Statistics
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def generate! last, now
|
81
|
+
diff = now - last
|
82
|
+
return if diff <= 0
|
83
|
+
|
81
84
|
if @system
|
82
|
-
@system.collect @channel do |key, value|
|
83
|
-
attributes = FFWD.merge_hashes @attributes, {:what => key, :component => :system}
|
85
|
+
@system.collect @channel do |key, unit, value|
|
86
|
+
attributes = FFWD.merge_hashes @attributes, {:what => key, :unit => unit, :component => :system}
|
84
87
|
@emitter.metric.emit(
|
85
88
|
:key => @prefix, :value => value,
|
86
89
|
:tags => @tags, :attributes => attributes)
|
@@ -88,7 +91,7 @@ module FFWD::Statistics
|
|
88
91
|
end
|
89
92
|
|
90
93
|
@reporters.each do |id, reporter|
|
91
|
-
reporter.report! do |d|
|
94
|
+
reporter.report!(diff) do |d|
|
92
95
|
attributes = FFWD.merge_hashes @attributes, d[:meta]
|
93
96
|
@emitter.metric.emit(
|
94
97
|
:key => @prefix, :value => d[:value],
|
@@ -99,21 +99,18 @@ module FFWD::Statistics
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def collect channel
|
102
|
-
|
103
|
-
|
102
|
+
cpu = cpu_use
|
103
|
+
memory = memory_use
|
104
104
|
|
105
|
-
|
106
|
-
yield "
|
105
|
+
cpu.each do |key, value|
|
106
|
+
yield "cpu-#{key}", "%", value
|
107
107
|
end
|
108
108
|
|
109
|
-
|
110
|
-
yield "
|
109
|
+
memory.each do |key, value|
|
110
|
+
yield "memory-#{key}", "B", value
|
111
111
|
end
|
112
112
|
|
113
|
-
channel << {
|
114
|
-
:cpu => cpu_use,
|
115
|
-
:memory => memory_use,
|
116
|
-
}
|
113
|
+
channel << {:memory => memory}
|
117
114
|
end
|
118
115
|
|
119
116
|
def check
|
@@ -140,7 +137,7 @@ module FFWD::Statistics
|
|
140
137
|
return true
|
141
138
|
end
|
142
139
|
|
143
|
-
def
|
140
|
+
def memory_use
|
144
141
|
result = {:resident => 0, :total => read_total_memory}
|
145
142
|
|
146
143
|
read_smaps do |smap|
|
@@ -150,7 +147,7 @@ module FFWD::Statistics
|
|
150
147
|
result
|
151
148
|
end
|
152
149
|
|
153
|
-
def
|
150
|
+
def cpu_use
|
154
151
|
stat = read_pid_stat
|
155
152
|
|
156
153
|
current = {
|
@@ -167,11 +164,15 @@ module FFWD::Statistics
|
|
167
164
|
@cpu_prev = current
|
168
165
|
end
|
169
166
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
167
|
+
total = current[:total] - prev[:total]
|
168
|
+
system = current[:system] - prev[:system]
|
169
|
+
user = current[:user] - prev[:user]
|
170
|
+
|
171
|
+
if total == 0
|
172
|
+
return {:user => 0, :system => 0}
|
173
|
+
end
|
174
|
+
|
175
|
+
{:user => (user / total).round(3), :system => (system / total).round(3)}
|
175
176
|
end
|
176
177
|
|
177
178
|
private
|
data/lib/ffwd/tunnel/tcp.rb
CHANGED
@@ -23,11 +23,11 @@ module FFWD::Tunnel
|
|
23
23
|
|
24
24
|
report_meta :protocol => :tunnel_tcp
|
25
25
|
|
26
|
-
report_key :received_events, :meta => {:what =>
|
27
|
-
report_key :received_metrics, :meta => {:what =>
|
26
|
+
report_key :received_events, :meta => {:what => "received-events", :unit => :event}
|
27
|
+
report_key :received_metrics, :meta => {:what => "received-metrics", :unit => :metric}
|
28
28
|
|
29
|
-
report_key :failed_events, :meta => {:what =>
|
30
|
-
report_key :failed_metrics, :meta => {:what =>
|
29
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
30
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
31
31
|
|
32
32
|
attr_reader :log
|
33
33
|
|
data/lib/ffwd/tunnel/udp.rb
CHANGED
@@ -23,11 +23,11 @@ module FFWD::Tunnel
|
|
23
23
|
|
24
24
|
report_meta :protocol => :tunnel_udp
|
25
25
|
|
26
|
-
report_key :received_events, :meta => {:what =>
|
27
|
-
report_key :received_metrics, :meta => {:what =>
|
26
|
+
report_key :received_events, :meta => {:what => "received-events", :unit => :event}
|
27
|
+
report_key :received_metrics, :meta => {:what => "received-metrics", :unit => :metric}
|
28
28
|
|
29
|
-
report_key :failed_events, :meta => {:what =>
|
30
|
-
report_key :failed_metrics, :meta => {:what =>
|
29
|
+
report_key :failed_events, :meta => {:what => "failed-events", :unit => :event}
|
30
|
+
report_key :failed_metrics, :meta => {:what => "failed-metrics", :unit => :metric}
|
31
31
|
|
32
32
|
attr_reader :log
|
33
33
|
|
data/lib/ffwd/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffwd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John-John Tedro
|
@@ -9,62 +9,62 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-03-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - '='
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 1.0.4
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - '='
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 1.0.4
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - '>='
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - '>='
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rspec-mocks
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - '>='
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - '>='
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: autoversion
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - '>='
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
description:
|
@@ -81,18 +81,17 @@ files:
|
|
81
81
|
- bin/fwc
|
82
82
|
- lib/em/all.rb
|
83
83
|
- lib/em/protocols/frame_object_protocol.rb
|
84
|
-
- lib/ffwd.rb
|
85
84
|
- lib/ffwd/channel.rb
|
86
85
|
- lib/ffwd/connection.rb
|
87
|
-
- lib/ffwd/core.rb
|
88
86
|
- lib/ffwd/core/emitter.rb
|
89
87
|
- lib/ffwd/core/interface.rb
|
90
88
|
- lib/ffwd/core/processor.rb
|
91
89
|
- lib/ffwd/core/reporter.rb
|
92
|
-
- lib/ffwd/
|
90
|
+
- lib/ffwd/core.rb
|
93
91
|
- lib/ffwd/debug/connection.rb
|
94
92
|
- lib/ffwd/debug/monitor_session.rb
|
95
93
|
- lib/ffwd/debug/tcp.rb
|
94
|
+
- lib/ffwd/debug.rb
|
96
95
|
- lib/ffwd/event.rb
|
97
96
|
- lib/ffwd/event_emitter.rb
|
98
97
|
- lib/ffwd/flushing_output.rb
|
@@ -102,32 +101,29 @@ files:
|
|
102
101
|
- lib/ffwd/logging.rb
|
103
102
|
- lib/ffwd/metric.rb
|
104
103
|
- lib/ffwd/metric_emitter.rb
|
105
|
-
- lib/ffwd/plugin.rb
|
106
|
-
- lib/ffwd/plugin/json.rb
|
107
104
|
- lib/ffwd/plugin/json/connection.rb
|
108
|
-
- lib/ffwd/plugin/
|
105
|
+
- lib/ffwd/plugin/json.rb
|
109
106
|
- lib/ffwd/plugin/log/writer.rb
|
107
|
+
- lib/ffwd/plugin/log.rb
|
108
|
+
- lib/ffwd/plugin.rb
|
110
109
|
- lib/ffwd/plugin_channel.rb
|
111
110
|
- lib/ffwd/plugin_loader.rb
|
112
111
|
- lib/ffwd/processor.rb
|
113
|
-
- lib/ffwd/processor/count.rb
|
114
|
-
- lib/ffwd/processor/histogram.rb
|
115
|
-
- lib/ffwd/processor/rate.rb
|
116
112
|
- lib/ffwd/producing_client.rb
|
117
|
-
- lib/ffwd/protocol.rb
|
118
|
-
- lib/ffwd/protocol/tcp.rb
|
119
113
|
- lib/ffwd/protocol/tcp/bind.rb
|
120
114
|
- lib/ffwd/protocol/tcp/connection.rb
|
121
115
|
- lib/ffwd/protocol/tcp/flushing_connect.rb
|
122
116
|
- lib/ffwd/protocol/tcp/plain_connect.rb
|
123
|
-
- lib/ffwd/protocol/
|
117
|
+
- lib/ffwd/protocol/tcp.rb
|
124
118
|
- lib/ffwd/protocol/udp/bind.rb
|
125
119
|
- lib/ffwd/protocol/udp/connect.rb
|
120
|
+
- lib/ffwd/protocol/udp.rb
|
121
|
+
- lib/ffwd/protocol.rb
|
126
122
|
- lib/ffwd/reporter.rb
|
127
123
|
- lib/ffwd/retrier.rb
|
128
|
-
- lib/ffwd/schema.rb
|
129
124
|
- lib/ffwd/schema/default.rb
|
130
125
|
- lib/ffwd/schema/spotify100.rb
|
126
|
+
- lib/ffwd/schema.rb
|
131
127
|
- lib/ffwd/statistics/collector.rb
|
132
128
|
- lib/ffwd/statistics/system_statistics.rb
|
133
129
|
- lib/ffwd/test/protocol.rb
|
@@ -136,6 +132,7 @@ files:
|
|
136
132
|
- lib/ffwd/tunnel/udp.rb
|
137
133
|
- lib/ffwd/utils.rb
|
138
134
|
- lib/ffwd/version.rb
|
135
|
+
- lib/ffwd.rb
|
139
136
|
- lib/fwc.rb
|
140
137
|
homepage: https://github.com/spotify/ffwd
|
141
138
|
licenses:
|
@@ -147,17 +144,17 @@ require_paths:
|
|
147
144
|
- lib
|
148
145
|
required_ruby_version: !ruby/object:Gem::Requirement
|
149
146
|
requirements:
|
150
|
-
- -
|
147
|
+
- - '>='
|
151
148
|
- !ruby/object:Gem::Version
|
152
149
|
version: '0'
|
153
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
151
|
requirements:
|
155
|
-
- -
|
152
|
+
- - '>='
|
156
153
|
- !ruby/object:Gem::Version
|
157
154
|
version: '0'
|
158
155
|
requirements: []
|
159
156
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.
|
157
|
+
rubygems_version: 2.0.14
|
161
158
|
signing_key:
|
162
159
|
specification_version: 4
|
163
160
|
summary: Core framework for the FastForward Daemon.
|
data/lib/ffwd/processor/count.rb
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
# $LICENSE
|
2
|
-
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
-
#
|
4
|
-
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
-
# (the "License"); you may not use this file except in compliance with the
|
6
|
-
# License. You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
-
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
-
# License for the specific language governing permissions and limitations under
|
14
|
-
# the License.
|
15
|
-
|
16
|
-
require_relative '../processor'
|
17
|
-
require_relative '../logging'
|
18
|
-
require_relative '../event'
|
19
|
-
require_relative '../utils'
|
20
|
-
require_relative '../reporter'
|
21
|
-
|
22
|
-
module FFWD::Processor
|
23
|
-
#
|
24
|
-
# Implements counting statistics (similar to statsd).
|
25
|
-
#
|
26
|
-
class CountProcessor
|
27
|
-
include FFWD::Logging
|
28
|
-
include FFWD::Processor
|
29
|
-
include FFWD::Reporter
|
30
|
-
|
31
|
-
register_processor "count"
|
32
|
-
|
33
|
-
report_meta :component => :processor, :processor => :count
|
34
|
-
report_key :dropped, :meta => {:what => :count_dropped, :unit => :value}
|
35
|
-
report_key :received, :meta => {:what => :count_received, :unit => :value}
|
36
|
-
|
37
|
-
def self.prepare config
|
38
|
-
config[:cache_limit] ||= 1000
|
39
|
-
config[:timeout] ||= 300
|
40
|
-
config[:window] ||= 30
|
41
|
-
config
|
42
|
-
end
|
43
|
-
|
44
|
-
def initialize emitter, config={}
|
45
|
-
@emitter = emitter
|
46
|
-
|
47
|
-
@cache_limit = config[:cache_limit]
|
48
|
-
@timeout = config[:timeout]
|
49
|
-
@window = config[:window]
|
50
|
-
|
51
|
-
@cache = {}
|
52
|
-
@timer = nil
|
53
|
-
|
54
|
-
starting do
|
55
|
-
log.info "Started"
|
56
|
-
log.info " config: #{config.inspect}"
|
57
|
-
end
|
58
|
-
|
59
|
-
stopping do
|
60
|
-
log.info "Stopping count processor"
|
61
|
-
@timer.cancel if @timer
|
62
|
-
@timer = nil
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def flush_caches! now
|
67
|
-
@cache.each do |cache_key, entry|
|
68
|
-
key = entry[:key]
|
69
|
-
count = entry[:count]
|
70
|
-
last = entry[:last]
|
71
|
-
|
72
|
-
# OK to modify the hash being iterated over.
|
73
|
-
if now - last > @timeout
|
74
|
-
@cache.delete cache_key
|
75
|
-
next
|
76
|
-
end
|
77
|
-
|
78
|
-
attributes = entry[:attributes]
|
79
|
-
tags = entry[:tags]
|
80
|
-
|
81
|
-
entry[:count] = 0
|
82
|
-
|
83
|
-
@emitter.metric.emit(
|
84
|
-
:key => key, :value => count, :source => key,
|
85
|
-
:attributes => attributes, :tags => tags)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def check_timer
|
90
|
-
return if @timer
|
91
|
-
|
92
|
-
log.debug "Starting timer"
|
93
|
-
|
94
|
-
@timer = EM::Timer.new(@window) do
|
95
|
-
@timer = nil
|
96
|
-
digest! Time.now
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def digest! now
|
101
|
-
ms = FFWD.timing do
|
102
|
-
flush_caches! now
|
103
|
-
end
|
104
|
-
|
105
|
-
log.debug "Digest took #{ms}ms"
|
106
|
-
end
|
107
|
-
|
108
|
-
def process m
|
109
|
-
key = m[:key]
|
110
|
-
value = m[:value]
|
111
|
-
|
112
|
-
now = Time.now
|
113
|
-
|
114
|
-
cache_key = [key, (m[:attributes] || {}), (m[:tags] || [])].hash
|
115
|
-
|
116
|
-
unless (entry = @cache[cache_key])
|
117
|
-
return increment :dropped if @cache.size >= @cache_limit
|
118
|
-
entry = @cache[cache_key] = {
|
119
|
-
:key => key,
|
120
|
-
:count => 0, :last => now, :tags => m[:tags],
|
121
|
-
:attributes => m[:attributes]}
|
122
|
-
end
|
123
|
-
|
124
|
-
increment :received
|
125
|
-
entry[:count] += value
|
126
|
-
entry[:last] = now
|
127
|
-
check_timer
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
@@ -1,212 +0,0 @@
|
|
1
|
-
# $LICENSE
|
2
|
-
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
-
#
|
4
|
-
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
-
# (the "License"); you may not use this file except in compliance with the
|
6
|
-
# License. You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
-
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
-
# License for the specific language governing permissions and limitations under
|
14
|
-
# the License.
|
15
|
-
|
16
|
-
require 'ffwd/event'
|
17
|
-
require 'ffwd/logging'
|
18
|
-
require 'ffwd/processor'
|
19
|
-
require 'ffwd/reporter'
|
20
|
-
require 'ffwd/utils'
|
21
|
-
|
22
|
-
module FFWD::Processor
|
23
|
-
#
|
24
|
-
# Implements histogram statistics over a tumbling time window.
|
25
|
-
#
|
26
|
-
# Histogram received metrics continiuosly and regularly flushes out the
|
27
|
-
# following statistics.
|
28
|
-
#
|
29
|
-
# <key>.min - Min value collected.
|
30
|
-
# <key>.max - Max value collected.
|
31
|
-
# <key>.mean - Mean value collected.
|
32
|
-
# <key>.p50 - The 50th percentile value collected.
|
33
|
-
# <key>.p75 - The 75th percentile value collected.
|
34
|
-
# <key>.p95 - The 95th percentile value collected.
|
35
|
-
# <key>.p99 - The 99th percentile value collected.
|
36
|
-
# <key>.p999 - The 99.9th percentile value collected.
|
37
|
-
#
|
38
|
-
class HistogramProcessor
|
39
|
-
include FFWD::Processor
|
40
|
-
include FFWD::Logging
|
41
|
-
include FFWD::Reporter
|
42
|
-
|
43
|
-
register_processor "histogram"
|
44
|
-
|
45
|
-
report_meta :component => :processor, :processor => :histogram
|
46
|
-
report_key :dropped, {:meta => {:what => :dropped, :unit => :value}}
|
47
|
-
report_key :bucket_dropped, {:meta => {:what => :bucket_dropped, :unit => :value}}
|
48
|
-
report_key :received, {:meta => {:what => :received, :unit => :value}}
|
49
|
-
|
50
|
-
DEFAULT_MISSING = 0
|
51
|
-
|
52
|
-
DEFAULT_PERCENTILES = {
|
53
|
-
:p50 => {:q => 0.50, :info => "50th"},
|
54
|
-
:p75 => {:q => 0.75, :info => "75th"},
|
55
|
-
:p95 => {:q => 0.95, :info => "95th"},
|
56
|
-
:p99 => {:q => 0.99, :info => "99th"},
|
57
|
-
:p999 => {:q => 0.999, :info => "99.9th"},
|
58
|
-
}
|
59
|
-
|
60
|
-
def self.prepare config
|
61
|
-
config[:window] ||= 10
|
62
|
-
config[:cache_limit] ||= 1000
|
63
|
-
config[:bucket_limit] ||= 10000
|
64
|
-
config[:precision] ||= 3
|
65
|
-
config[:missing] ||= DEFAULT_MISSING
|
66
|
-
config[:percentiles] ||= DEFAULT_PERCENTILES
|
67
|
-
config
|
68
|
-
end
|
69
|
-
|
70
|
-
#
|
71
|
-
# Options:
|
72
|
-
#
|
73
|
-
# :window - Define at what period the cache is flushed and generates
|
74
|
-
# metrics.
|
75
|
-
# :cache_limit - Limit the amount of cache entries (by key).
|
76
|
-
# :bucket_limit - Limit the amount of limits for each cache entry.
|
77
|
-
# :precision - Precision of emitted metrics.
|
78
|
-
# :percentiles - Configuration hash of percentile metrics.
|
79
|
-
# Structure:
|
80
|
-
# {:p10 => {:info => "Some description", :q => 0.1}, ...}
|
81
|
-
def initialize emitter, config={}
|
82
|
-
@emitter = emitter
|
83
|
-
|
84
|
-
@window = config[:window]
|
85
|
-
@cache_limit = config[:cache_limit]
|
86
|
-
@bucket_limit = config[:bucket_limit]
|
87
|
-
@precision = config[:precision]
|
88
|
-
@missing = config[:missing]
|
89
|
-
@percentiles = config[:percentiles]
|
90
|
-
|
91
|
-
# Dropped values that would have gone into a bucket.
|
92
|
-
@cache = {}
|
93
|
-
|
94
|
-
starting do
|
95
|
-
log.info "Started"
|
96
|
-
log.info " config: #{config.inspect}"
|
97
|
-
end
|
98
|
-
|
99
|
-
stopping do
|
100
|
-
log.info "Stopping histogram processor"
|
101
|
-
@timer.cancel if @timer
|
102
|
-
@timer = nil
|
103
|
-
digest!
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def check_timer
|
108
|
-
return if @timer
|
109
|
-
|
110
|
-
log.debug "Starting timer"
|
111
|
-
|
112
|
-
@timer = EM::Timer.new(@window) do
|
113
|
-
@timer = nil
|
114
|
-
digest!
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
# Digest the cache.
|
119
|
-
def digest!
|
120
|
-
if @cache.empty?
|
121
|
-
return
|
122
|
-
end
|
123
|
-
|
124
|
-
ms = FFWD.timing do
|
125
|
-
@cache.each do |key, bucket|
|
126
|
-
calculate(bucket) do |p, info, value|
|
127
|
-
@emitter.metric.emit(
|
128
|
-
:key => "#{key}.#{p}", :source => key,
|
129
|
-
:value => value, :description => "#{info} of #{key}")
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
@cache = {}
|
134
|
-
end
|
135
|
-
|
136
|
-
log.debug "Digest took #{ms}ms"
|
137
|
-
end
|
138
|
-
|
139
|
-
def calculate bucket
|
140
|
-
total = bucket.size
|
141
|
-
|
142
|
-
map = {}
|
143
|
-
|
144
|
-
@percentiles.each do |k, v|
|
145
|
-
index = (total * v[:q]).ceil - 1
|
146
|
-
|
147
|
-
if (c = map[index]).nil?
|
148
|
-
info = "#{v[:info]} percentile"
|
149
|
-
c = map[index] = {:info => info, :values => []}
|
150
|
-
end
|
151
|
-
|
152
|
-
c[:values] << {:name => k, :value => nil}
|
153
|
-
end
|
154
|
-
|
155
|
-
max = nil
|
156
|
-
min = nil
|
157
|
-
sum = 0.0
|
158
|
-
mean = nil
|
159
|
-
|
160
|
-
bucket.sort.each_with_index do |t, index|
|
161
|
-
max = t if max.nil? or t > max
|
162
|
-
min = t if min.nil? or t < min
|
163
|
-
sum += t
|
164
|
-
|
165
|
-
unless (c = map[index]).nil?
|
166
|
-
c[:values].each{|d| d[:value] = t}
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
mean = sum / total
|
171
|
-
|
172
|
-
unless @precision.nil?
|
173
|
-
max = max.round(@precision)
|
174
|
-
min = min.round(@precision)
|
175
|
-
sum = sum.round(@precision)
|
176
|
-
mean = mean.round(@precision)
|
177
|
-
|
178
|
-
map.each do |index, c|
|
179
|
-
c[:values].each{|d| d[:value] = d[:value].round(@precision)}
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
yield "max", "Max", max
|
184
|
-
yield "min", "Min", min
|
185
|
-
yield "sum", "Sum", sum
|
186
|
-
yield "mean", "Mean", mean
|
187
|
-
|
188
|
-
map.each do |index, c|
|
189
|
-
c[:values].each do |d|
|
190
|
-
yield d[:name], c[:info], d[:value]
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
def process m
|
196
|
-
key = m[:key]
|
197
|
-
value = m[:value] || @missing
|
198
|
-
|
199
|
-
if (bucket = @cache[key]).nil?
|
200
|
-
return increment :dropped if @cache.size >= @cache_limit
|
201
|
-
@cache[key] = bucket = []
|
202
|
-
end
|
203
|
-
|
204
|
-
return increment :bucket_dropped if bucket.size >= @bucket_limit
|
205
|
-
return increment :dropped if stopped?
|
206
|
-
increment :received
|
207
|
-
|
208
|
-
bucket << value
|
209
|
-
check_timer
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
data/lib/ffwd/processor/rate.rb
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
# $LICENSE
|
2
|
-
# Copyright 2013-2014 Spotify AB. All rights reserved.
|
3
|
-
#
|
4
|
-
# The contents of this file are licensed under the Apache License, Version 2.0
|
5
|
-
# (the "License"); you may not use this file except in compliance with the
|
6
|
-
# License. You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
-
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
-
# License for the specific language governing permissions and limitations under
|
14
|
-
# the License.
|
15
|
-
|
16
|
-
require 'ffwd/processor'
|
17
|
-
require 'ffwd/logging'
|
18
|
-
require 'ffwd/reporter'
|
19
|
-
|
20
|
-
module FFWD::Processor
|
21
|
-
#
|
22
|
-
# Implements rate statistics (similar to derive in collectd).
|
23
|
-
#
|
24
|
-
class RateProcessor
|
25
|
-
include FFWD::Logging
|
26
|
-
include FFWD::Processor
|
27
|
-
include FFWD::Reporter
|
28
|
-
|
29
|
-
register_processor "rate"
|
30
|
-
|
31
|
-
report_meta :component => :processor, :processor => :rate
|
32
|
-
report_key :dropped, {:meta => {:what => :dropped, :unit => :value}}
|
33
|
-
report_key :expired, {:meta => {:what => :expired, :unit => :value}}
|
34
|
-
report_key :received, {:meta => {:what => :received, :unit => :value}}
|
35
|
-
|
36
|
-
# Options:
|
37
|
-
#
|
38
|
-
# :precision - The precision to round to for emitted values.
|
39
|
-
# :cache_limit - Maxiumum amount of items allowed in the cache.
|
40
|
-
# :min_age - Minimum age that an item has to have in the cache to calculate
|
41
|
-
# rates.
|
42
|
-
# This exists to prevent too frequent updates to the cache which would
|
43
|
-
# yield very static or jumpy rates.
|
44
|
-
# Can be set to null to disable.
|
45
|
-
# :ttl - Allowed age of items in cache in seconds.
|
46
|
-
# If this is nil, items will never expire, so old elements will not be
|
47
|
-
# expunged until data type is restarted.
|
48
|
-
def self.prepare config={}
|
49
|
-
config[:precision] ||= 3
|
50
|
-
config[:cache_limit] ||= 10000
|
51
|
-
config[:min_age] ||= 0.5
|
52
|
-
config[:ttl] ||= 600
|
53
|
-
config
|
54
|
-
end
|
55
|
-
|
56
|
-
def initialize emitter, config={}
|
57
|
-
@emitter = emitter
|
58
|
-
|
59
|
-
@precision = config[:precision]
|
60
|
-
@limit = config[:cache_limit]
|
61
|
-
@min_age = config[:min_age]
|
62
|
-
@ttl = config[:ttl]
|
63
|
-
|
64
|
-
# keep a reference to the expire cache to prevent having to allocate it
|
65
|
-
# all the time.
|
66
|
-
@expire = Hash.new
|
67
|
-
# Cache of active events.
|
68
|
-
@cache = Hash.new
|
69
|
-
|
70
|
-
starting do
|
71
|
-
@timer = EM.add_periodic_timer(@ttl){expire!} unless @ttl.nil?
|
72
|
-
log.info "Started"
|
73
|
-
log.info " config: #{config.inspect}"
|
74
|
-
end
|
75
|
-
|
76
|
-
stopping do
|
77
|
-
log.info "Stopping rate processor"
|
78
|
-
@timer.cancel if @timer
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# Expire cached events that are too old.
|
83
|
-
def expire!
|
84
|
-
now = Time.new
|
85
|
-
|
86
|
-
@cache.each do |key, value|
|
87
|
-
diff = (now - value[:time])
|
88
|
-
next if diff < @ttl
|
89
|
-
@expire[key] = value
|
90
|
-
end
|
91
|
-
|
92
|
-
unless @expire.empty?
|
93
|
-
increment :expired, @cache.size - @expire.size
|
94
|
-
@cache = @expire
|
95
|
-
@expire = Hash.new
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def process msg
|
100
|
-
key = msg[:key]
|
101
|
-
time = msg[:time]
|
102
|
-
value = msg[:value] || 0
|
103
|
-
|
104
|
-
unless (prev = @cache[key]).nil?
|
105
|
-
prev_time = prev[:time]
|
106
|
-
prev_value = prev[:value]
|
107
|
-
|
108
|
-
diff = (time - prev_time)
|
109
|
-
|
110
|
-
valid = @ttl.nil? or diff < @ttl
|
111
|
-
aged = @min_age.nil? or diff > @min_age
|
112
|
-
|
113
|
-
if diff > 0 and valid and aged
|
114
|
-
rate = ((value - prev_value) / diff)
|
115
|
-
rate = rate.round(@precision) unless @precision.nil?
|
116
|
-
@emitter.metric.emit(
|
117
|
-
:key => "#{key}.rate", :source => key, :value => rate)
|
118
|
-
end
|
119
|
-
else
|
120
|
-
return increment :dropped if @cache.size >= @limit
|
121
|
-
end
|
122
|
-
|
123
|
-
increment :received
|
124
|
-
@cache[key] = {:key => key, :time => time, :value => value}
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|