fnordmetric 1.0.1 → 1.2.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.
- data/Rakefile +1 -1
- data/fnordmetric.gemspec +1 -0
- data/lib/fnordmetric.rb +6 -13
- data/lib/fnordmetric/acceptors/acceptor.rb +20 -7
- data/lib/fnordmetric/acceptors/amqp_acceptor.rb +56 -0
- data/lib/fnordmetric/acceptors/fyrehose_acceptor.rb +43 -0
- data/lib/fnordmetric/acceptors/stomp_acceptor.rb +71 -0
- data/lib/fnordmetric/acceptors/tcp_acceptor.rb +1 -0
- data/lib/fnordmetric/acceptors/udp_acceptor.rb +2 -1
- data/lib/fnordmetric/context.rb +21 -9
- data/lib/fnordmetric/defaults.rb +16 -3
- data/lib/fnordmetric/gauge.rb +8 -3
- data/lib/fnordmetric/gauge_calculations.rb +8 -2
- data/lib/fnordmetric/gauge_modifiers.rb +5 -4
- data/lib/fnordmetric/gauges/server_health_gauge.rb +13 -0
- data/lib/fnordmetric/namespace.rb +53 -17
- data/lib/fnordmetric/util.rb +25 -0
- data/lib/fnordmetric/version.rb +1 -1
- data/lib/fnordmetric/web/app.rb +7 -66
- data/lib/fnordmetric/web/reactor.rb +32 -2
- data/lib/fnordmetric/web/websocket.rb +1 -1
- data/lib/fnordmetric/widgets/bars_widget.rb +1 -1
- data/lib/fnordmetric/widgets/numbers_widget.rb +28 -4
- data/lib/fnordmetric/widgets/timeseries_widget.rb +19 -9
- data/lib/fnordmetric/widgets/toplist_widget.rb +8 -4
- data/lib/fnordmetric/worker.rb +5 -1
- data/lib/fnordmetric/zero_config_gauge.rb +138 -0
- data/spec/context_spec.rb +4 -4
- data/spec/event_spec.rb +11 -11
- data/spec/gauge_modifiers_spec.rb +135 -29
- data/spec/gauge_spec.rb +7 -2
- data/spec/namespace_spec.rb +8 -19
- data/spec/util_spec.rb +46 -0
- data/web/.gitignore +4 -0
- data/web/build.sh +34 -0
- data/web/{fnordmetric.css → css/fnordmetric.core.css} +121 -58
- data/web/haml/app.haml +4 -22
- data/web/{loader.gif → img/loader.gif} +0 -0
- data/web/js/fnordmetric.bars_widget.js +3 -3
- data/web/js/fnordmetric.dashboard_view.js +1 -1
- data/web/js/fnordmetric.gauge_explorer.js +173 -0
- data/web/js/fnordmetric.js +93 -33
- data/web/js/fnordmetric.numbers_widget.js +15 -14
- data/web/js/fnordmetric.session_view.js +0 -1
- data/web/js/fnordmetric.timeline_widget.js +3 -3
- data/web/js/fnordmetric.timeseries_widget.js +46 -29
- data/web/js/fnordmetric.toplist_widget.js +23 -16
- data/web/js/fnordmetric.util.js +12 -8
- data/web/vendor/font-awesome/css/font-awesome-ie7.min.css +22 -0
- data/web/vendor/font-awesome/css/font-awesome.css +522 -221
- data/web/vendor/font-awesome/css/font-awesome.min.css +33 -0
- data/web/vendor/font-awesome/font/FontAwesome.otf +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.eot +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.svg +278 -169
- data/web/vendor/font-awesome/font/fontawesome-webfont.ttf +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.woff +0 -0
- data/web/vendor/jquery-ui.min.js +6 -413
- data/web/vendor/jquery.combobox.js +129 -0
- metadata +55 -48
- data/doc/V1.0-ROADMAP +0 -97
- data/doc/full_example.rb +0 -224
- data/doc/legacy_example.rb +0 -640
- data/doc/minimal_example.rb +0 -26
- data/doc/preview1.png +0 -0
- data/doc/preview2.png +0 -0
- data/doc/preview3.png +0 -0
- data/readme.md +0 -365
- data/web/vendor/d3.v2.js +0 -9382
- data/web/vendor/font-awesome/font/fontawesome-webfont.svgz +0 -0
- data/web/vendor/rickshaw.css +0 -286
- data/web/vendor/rickshaw.fnordmetric.js +0 -2700
data/Rakefile
CHANGED
data/fnordmetric.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.add_development_dependency "shoulda"
|
34
34
|
|
35
35
|
s.files = `git ls-files`.split("\n") - [".gitignore", ".rspec", ".travis.yml"]
|
36
|
+
s.files += ["web/fnordmetric-ui.js", "web/fnordmetric-ui.css", "web/fnordmetric-core.js", "web/fnordmetric-core.css"]
|
36
37
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
37
38
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
38
39
|
s.require_paths = ["lib"]
|
data/lib/fnordmetric.rb
CHANGED
@@ -51,19 +51,7 @@ module FnordMetric
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.default_options(opts = {})
|
54
|
-
|
55
|
-
:redis_url => "redis://localhost:6379",
|
56
|
-
:redis_prefix => "fnordmetric",
|
57
|
-
:inbound_stream => ["0.0.0.0", "1337"],
|
58
|
-
:inbound_protocol => :tcp,
|
59
|
-
:web_interface => ["0.0.0.0", "4242"],
|
60
|
-
:web_interface_server => "thin",
|
61
|
-
:start_worker => true,
|
62
|
-
:print_stats => 3,
|
63
|
-
:event_queue_ttl => 120,
|
64
|
-
:event_data_ttl => 3600*24*30,
|
65
|
-
:session_data_ttl => 3600*24*30
|
66
|
-
}.merge(opts)
|
54
|
+
FnordMetric::DEFAULT_OPTIONS.merge(opts)
|
67
55
|
end
|
68
56
|
|
69
57
|
def self.log(msg)
|
@@ -123,6 +111,7 @@ require "fnordmetric/gauge_modifiers"
|
|
123
111
|
require "fnordmetric/gauge_validations"
|
124
112
|
require "fnordmetric/gauge_rendering"
|
125
113
|
require "fnordmetric/gauge"
|
114
|
+
require "fnordmetric/zero_config_gauge"
|
126
115
|
require "fnordmetric/gauges/timeseries_gauge"
|
127
116
|
require "fnordmetric/gauges/toplist_gauge"
|
128
117
|
require "fnordmetric/gauges/distribution_gauge"
|
@@ -136,6 +125,7 @@ require "fnordmetric/api"
|
|
136
125
|
require "fnordmetric/worker"
|
137
126
|
require "fnordmetric/logger"
|
138
127
|
require "fnordmetric/defaults"
|
128
|
+
require "fnordmetric/util"
|
139
129
|
require "fnordmetric/web/web"
|
140
130
|
require "fnordmetric/web/app_helpers"
|
141
131
|
require "fnordmetric/web/app"
|
@@ -146,6 +136,9 @@ require "fnordmetric/web/dashboard"
|
|
146
136
|
require "fnordmetric/acceptors/acceptor"
|
147
137
|
require "fnordmetric/acceptors/tcp_acceptor"
|
148
138
|
require "fnordmetric/acceptors/udp_acceptor"
|
139
|
+
require "fnordmetric/acceptors/fyrehose_acceptor"
|
140
|
+
require "fnordmetric/acceptors/amqp_acceptor"
|
141
|
+
require "fnordmetric/acceptors/stomp_acceptor"
|
149
142
|
require "fnordmetric/widget"
|
150
143
|
require "fnordmetric/widgets/timeseries_widget"
|
151
144
|
require "fnordmetric/widgets/numbers_widget"
|
@@ -6,11 +6,19 @@ class FnordMetric::Acceptor
|
|
6
6
|
FnordMetric.register(self)
|
7
7
|
end
|
8
8
|
|
9
|
-
def initialized
|
10
|
-
inbound_class = if @opts[:protocol] == :udp
|
9
|
+
def initialized
|
10
|
+
inbound_class = if @opts[:protocol] == :udp
|
11
11
|
FnordMetric::UDPAcceptor
|
12
|
-
|
12
|
+
elsif @opts[:protocol] == :tcp
|
13
13
|
FnordMetric::TCPAcceptor
|
14
|
+
elsif @opts[:protocol] == :fyrehose
|
15
|
+
FnordMetric::FyrehoseAcceptor
|
16
|
+
elsif @opts[:protocol] == :amqp
|
17
|
+
FnordMetric::AMQPAcceptor
|
18
|
+
elsif @opts[:protocol] == :stomp
|
19
|
+
FnordMetric::STOMPAcceptor
|
20
|
+
else
|
21
|
+
raise "unknown protocol: #{@opts[:protocol]}"
|
14
22
|
end
|
15
23
|
|
16
24
|
@opts[:listen] = [
|
@@ -20,10 +28,15 @@ class FnordMetric::Acceptor
|
|
20
28
|
|
21
29
|
begin
|
22
30
|
inbound_stream = inbound_class.start(@opts)
|
23
|
-
|
24
|
-
|
25
|
-
|
31
|
+
if inbound_class.respond_to?(:outbound?) && inbound_class.outbound?
|
32
|
+
FnordMetric.log "connected to #{@opts[:protocol]}://#{@opts[:listen][0..1].join(":")}"
|
33
|
+
else
|
34
|
+
FnordMetric.log "listening on #{@opts[:protocol]}://#{@opts[:listen][0..1].join(":")}"
|
35
|
+
end
|
36
|
+
rescue Exception => e
|
37
|
+
raise e if ENV["FNORDMETRIC_ENV"] == "dev"
|
38
|
+
FnordMetric.log "cant start #{inbound_class.name} on #{@opts[:protocol]}://#{@opts[:listen][0..1].join(":")}. port in use?"
|
26
39
|
end
|
27
40
|
end
|
28
41
|
|
29
|
-
end
|
42
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class FnordMetric::AMQPAcceptor
|
2
|
+
|
3
|
+
def self.start(opts)
|
4
|
+
begin
|
5
|
+
require "amqp"
|
6
|
+
rescue LoadError
|
7
|
+
FnordMetric.error("require 'amqp' failed, you need the amqp gem")
|
8
|
+
exit 1
|
9
|
+
end
|
10
|
+
|
11
|
+
new(opts)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(opts)
|
15
|
+
amqp = AMQP.connect(:host => 'firehose')
|
16
|
+
amqp_channel = AMQP::Channel.new(amqp)
|
17
|
+
|
18
|
+
msg_handler = lambda do |channel, data|
|
19
|
+
event = begin
|
20
|
+
JSON.parse(data)
|
21
|
+
rescue
|
22
|
+
FnordMetric.log("[AMQP] received invalid JSON: #{data[0..60]}")
|
23
|
+
end
|
24
|
+
|
25
|
+
if event
|
26
|
+
event["_type"] ||= channel
|
27
|
+
events << event
|
28
|
+
push_next_event
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
opts[:channels].each do |channel|
|
33
|
+
queue = amqp_channel.queue(channel, :auto_delete => true)
|
34
|
+
queue.subscribe{ |data| msg_handler[channel, data] }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def push_next_event
|
39
|
+
return true if events.empty?
|
40
|
+
api.event(@events.pop)
|
41
|
+
EM.next_tick(&method(:push_next_event))
|
42
|
+
end
|
43
|
+
|
44
|
+
def events
|
45
|
+
@events ||= []
|
46
|
+
end
|
47
|
+
|
48
|
+
def api
|
49
|
+
@api ||= FnordMetric::API.new(FnordMetric.options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.outbound?
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class FnordMetric::FyrehoseAcceptor
|
2
|
+
|
3
|
+
def self.start(opts)
|
4
|
+
require "fyrehose"
|
5
|
+
require "fyrehose/reactor"
|
6
|
+
|
7
|
+
new(opts)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(opts)
|
11
|
+
reactor = EM.connect(opts[:host], opts[:port], Fyrehose::Reactor)
|
12
|
+
|
13
|
+
reactor.on_message do |channel, data|
|
14
|
+
event = JSON.parse(data)
|
15
|
+
event["_type"] ||= channel
|
16
|
+
events << event
|
17
|
+
push_next_event
|
18
|
+
end
|
19
|
+
|
20
|
+
opts[:channels].each do |channel|
|
21
|
+
reactor.subscribe(channel)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def push_next_event
|
26
|
+
return true if events.empty?
|
27
|
+
api.event(@events.pop)
|
28
|
+
EM.next_tick(&method(:push_next_event))
|
29
|
+
end
|
30
|
+
|
31
|
+
def events
|
32
|
+
@events ||= []
|
33
|
+
end
|
34
|
+
|
35
|
+
def api
|
36
|
+
@api ||= FnordMetric::API.new(FnordMetric.options)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.outboud?
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class FnordMetric::STOMPAcceptor
|
2
|
+
|
3
|
+
def self.start(opts)
|
4
|
+
begin
|
5
|
+
require "stomp"
|
6
|
+
rescue LoadError
|
7
|
+
FnordMetric.error("require 'stomp' failed, you need the stomp gem")
|
8
|
+
exit 1
|
9
|
+
end
|
10
|
+
|
11
|
+
new(opts)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(opts)
|
15
|
+
@mutex = Mutex.new
|
16
|
+
|
17
|
+
client = Stomp::Client.new(:hosts => [{
|
18
|
+
:host => opts[:host],
|
19
|
+
:port => opts[:port],
|
20
|
+
:passcode => opts[:password],
|
21
|
+
:login => opts[:username]}])
|
22
|
+
|
23
|
+
msg_handler = lambda do |topic, msg|
|
24
|
+
data = msg.body
|
25
|
+
|
26
|
+
event = begin
|
27
|
+
JSON.parse(data)
|
28
|
+
rescue
|
29
|
+
FnordMetric.log("[STOMP] received invalid JSON: #{data[0..60]}")
|
30
|
+
end
|
31
|
+
|
32
|
+
if event
|
33
|
+
event["_type"] ||= topic.gsub(/^\/topic\//, '')
|
34
|
+
@mutex.synchronize{ events << event }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
opts[:topics].each do |topic|
|
39
|
+
client.subscribe(topic){ |data| msg_handler[topic, data] }
|
40
|
+
end
|
41
|
+
|
42
|
+
Thread.new do
|
43
|
+
client.join
|
44
|
+
end
|
45
|
+
|
46
|
+
EM.next_tick(&method(:push_next_event))
|
47
|
+
end
|
48
|
+
|
49
|
+
def push_next_event
|
50
|
+
nxt = @mutex.synchronize{ events.pop }
|
51
|
+
unless nxt
|
52
|
+
EM::Timer.new(0.01, &method(:push_next_event))
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
api.event(nxt)
|
56
|
+
EM.next_tick(&method(:push_next_event))
|
57
|
+
end
|
58
|
+
|
59
|
+
def events
|
60
|
+
@events ||= []
|
61
|
+
end
|
62
|
+
|
63
|
+
def api
|
64
|
+
@api ||= FnordMetric::API.new(FnordMetric.options)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.outbound?
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/lib/fnordmetric/context.rb
CHANGED
@@ -16,12 +16,13 @@ class FnordMetric::Context
|
|
16
16
|
|
17
17
|
def initialize(opts, block)
|
18
18
|
@block = block
|
19
|
-
@opts = opts
|
19
|
+
@opts = opts
|
20
20
|
end
|
21
21
|
|
22
|
-
def call(event, redis)
|
22
|
+
def call(event, redis, namespace)
|
23
23
|
@redis = redis
|
24
|
-
@event = event
|
24
|
+
@event = event
|
25
|
+
@namespace = namespace
|
25
26
|
proxy.instance_eval(&@block)
|
26
27
|
rescue Exception => e
|
27
28
|
raise e if ENV['FNORDMETRIC_ENV'] == 'test'
|
@@ -33,9 +34,13 @@ class FnordMetric::Context
|
|
33
34
|
@proxy ||= Proxy.new(self)
|
34
35
|
end
|
35
36
|
|
37
|
+
def namespace
|
38
|
+
@namespace
|
39
|
+
end
|
40
|
+
|
36
41
|
def dispatch(method, *args, &block)
|
37
|
-
if args.size > 0 &&
|
38
|
-
|
42
|
+
if args.size > 0 && gauges[args[0]].try(:renderable?)
|
43
|
+
gauges[args.delete_at(0)].execute(method, *args.unshift(self), &block)
|
39
44
|
else
|
40
45
|
send(method, *args, &block)
|
41
46
|
end
|
@@ -56,7 +61,7 @@ private
|
|
56
61
|
end
|
57
62
|
|
58
63
|
def data
|
59
|
-
|
64
|
+
@event
|
60
65
|
end
|
61
66
|
|
62
67
|
def key(gauge)
|
@@ -67,10 +72,18 @@ private
|
|
67
72
|
@event[:_time].to_i
|
68
73
|
end
|
69
74
|
|
75
|
+
def type
|
76
|
+
@event[:_type].to_sym
|
77
|
+
end
|
78
|
+
|
79
|
+
def gauges
|
80
|
+
@namespace.gauges
|
81
|
+
end
|
82
|
+
|
70
83
|
protected
|
71
|
-
|
84
|
+
|
72
85
|
def fetch_gauge(_gauge)
|
73
|
-
_gauge.is_a?(FnordMetric::Gauge) ? _gauge :
|
86
|
+
_gauge.is_a?(FnordMetric::Gauge) ? _gauge : gauges.fetch(_gauge)
|
74
87
|
rescue
|
75
88
|
error! "error: gauge '#{_gauge}' is undefined"
|
76
89
|
end
|
@@ -81,4 +94,3 @@ protected
|
|
81
94
|
|
82
95
|
|
83
96
|
end
|
84
|
-
|
data/lib/fnordmetric/defaults.rb
CHANGED
@@ -1,9 +1,22 @@
|
|
1
1
|
FnordMetric::COLORS = ["#4572a7", "#aa4643", "#89a54e", "#80699b", "#3d96ae", "#db843d"].reverse
|
2
2
|
|
3
|
+
FnordMetric::DEFAULT_PROC = lambda{ |arg| }
|
4
|
+
|
3
5
|
FnordMetric::TICKS = lambda{ |tick, span| [tick, 60, 300, 1200, 3600, 86400]
|
4
6
|
.select{ |t| (t >= tick) && ((span/t) > 5) }
|
5
7
|
.uniq }
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
FnordMetric::DEFAULT_OPTIONS = {
|
10
|
+
:redis_url => "redis://localhost:6379",
|
11
|
+
:redis_prefix => "fnordmetric",
|
12
|
+
:inbound_stream => nil,
|
13
|
+
:inbound_protocol => nil,
|
14
|
+
:web_interface => ["0.0.0.0", "4242"],
|
15
|
+
:web_interface_server => "thin",
|
16
|
+
:start_worker => true,
|
17
|
+
:print_stats => 3,
|
18
|
+
:event_queue_ttl => 120,
|
19
|
+
:event_data_ttl => 3600*24*30,
|
20
|
+
:session_data_ttl => 3600*24*30,
|
21
|
+
:default_flush_interval => 10
|
22
|
+
}
|
data/lib/fnordmetric/gauge.rb
CHANGED
@@ -11,7 +11,8 @@ class FnordMetric::Gauge
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def tick
|
14
|
-
(@opts[:tick] || @opts[:resolution] ||
|
14
|
+
(@opts[:tick] || @opts[:resolution] || @opts[:flush_interval] ||
|
15
|
+
FnordMetric.options[:default_flush_interval]).to_i
|
15
16
|
end
|
16
17
|
|
17
18
|
def retention
|
@@ -34,10 +35,14 @@ class FnordMetric::Gauge
|
|
34
35
|
@opts[:group] || "Gauges"
|
35
36
|
end
|
36
37
|
|
38
|
+
def unit
|
39
|
+
@opts[:unit]
|
40
|
+
end
|
41
|
+
|
37
42
|
def key_nouns
|
38
43
|
@opts[:key_nouns] || ["Key", "Keys"]
|
39
44
|
end
|
40
|
-
|
45
|
+
|
41
46
|
def key(_append=nil)
|
42
47
|
[@opts[:key_prefix], "gauge", name, tick, _append].flatten.compact.join("-")
|
43
48
|
end
|
@@ -89,5 +94,5 @@ class FnordMetric::Gauge
|
|
89
94
|
def error!(msg)
|
90
95
|
FnordMetric.error(msg)
|
91
96
|
end
|
92
|
-
|
97
|
+
|
93
98
|
end
|
@@ -52,12 +52,18 @@ module FnordMetric::GaugeCalculations
|
|
52
52
|
block = @@avg_per_count_proc if average?
|
53
53
|
#block = @@count_per_session_proc if unique?
|
54
54
|
block = @@avg_per_session_proc if unique? && average?
|
55
|
-
|
56
|
-
if block
|
55
|
+
|
56
|
+
calc = if block
|
57
57
|
instance_exec(_v, _t, &block)
|
58
58
|
else
|
59
59
|
_v
|
60
60
|
end
|
61
|
+
|
62
|
+
if calc && @opts[:scale_by]
|
63
|
+
calc = calc.to_f * @opts[:scale_by].to_f
|
64
|
+
end
|
65
|
+
|
66
|
+
calc
|
61
67
|
end
|
62
68
|
|
63
69
|
def field_values_at(time, opts={}, &block)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module FnordMetric::GaugeModifiers
|
2
2
|
|
3
3
|
def incr(gauge_name, value=1)
|
4
|
+
value = value.to_i
|
4
5
|
gauge = fetch_gauge(gauge_name)
|
5
6
|
assure_two_dimensional!(gauge)
|
6
7
|
if gauge.unique?
|
@@ -13,7 +14,7 @@ module FnordMetric::GaugeModifiers
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def incr_tick(gauge, value)
|
16
|
-
if gauge.progressive?
|
17
|
+
if gauge.progressive?
|
17
18
|
@redis.incrby(gauge.key(:head), value).callback do |head|
|
18
19
|
@redis.hsetnx(gauge.key, gauge.tick_at(time), head).callback do |_new|
|
19
20
|
@redis.hincrby(gauge.key, gauge.tick_at(time), value) unless _new
|
@@ -24,7 +25,7 @@ module FnordMetric::GaugeModifiers
|
|
24
25
|
@redis.hincrby(gauge.key, gauge.tick_at(time), value)
|
25
26
|
end
|
26
27
|
end
|
27
|
-
end
|
28
|
+
end
|
28
29
|
|
29
30
|
def incr_uniq(gauge, value, field_name=nil)
|
30
31
|
return false if session_key.blank?
|
@@ -58,7 +59,7 @@ module FnordMetric::GaugeModifiers
|
|
58
59
|
@redis.zincrby(gauge.tick_key(time), value, field_name).callback do
|
59
60
|
@redis.incrby(gauge.tick_key(time, :count), 1)
|
60
61
|
end
|
61
|
-
end
|
62
|
+
end
|
62
63
|
|
63
64
|
def set_value(gauge_name, value)
|
64
65
|
gauge = fetch_gauge(gauge_name)
|
@@ -140,4 +141,4 @@ module FnordMetric::GaugeModifiers
|
|
140
141
|
end
|
141
142
|
end
|
142
143
|
|
143
|
-
end
|
144
|
+
end
|