lockistics 0.1.2 → 0.1.3
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/README.md +28 -0
- data/lib/lockistics/meterable.rb +54 -0
- data/lib/lockistics/version.rb +1 -1
- data/lib/lockistics.rb +14 -0
- data/spec/meterable_spec.rb +43 -0
- metadata +7 -4
data/README.md
CHANGED
@@ -138,6 +138,34 @@ It works exactly like the above, but the method is `meterlock`.
|
|
138
138
|
end
|
139
139
|
```
|
140
140
|
|
141
|
+
#### Wrapping instance methods of a class
|
142
|
+
|
143
|
+
This is still experimental and I'm not quite happy with the implementation.
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
class SomeClass
|
147
|
+
include Lockistics::Meterable
|
148
|
+
meter :some_instance_method
|
149
|
+
# or:
|
150
|
+
meter :all, :except => :not_this_method
|
151
|
+
|
152
|
+
def some_instance_method
|
153
|
+
do_something
|
154
|
+
end
|
155
|
+
|
156
|
+
def not_this_method
|
157
|
+
do_something
|
158
|
+
end
|
159
|
+
end
|
160
|
+
```
|
161
|
+
|
162
|
+
Now each call to `some_instance_method` should be wrapped inside a meter
|
163
|
+
block and the key name is "someclass_some_instance_method".
|
164
|
+
|
165
|
+
The include and meter commands should be placed above any method
|
166
|
+
definitions in the file. Prettier implementation would be appreciated,
|
167
|
+
preferably one that would work with class methods also.
|
168
|
+
|
141
169
|
#### Getting the statistics out
|
142
170
|
|
143
171
|
You can query statistics for locking/metering keys.
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Lockistics
|
2
|
+
module Meterable
|
3
|
+
def self.included(where)
|
4
|
+
where.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
@@_metered_methods = {}
|
9
|
+
@@_meter_all = false
|
10
|
+
|
11
|
+
def meter_wrap(meth_name)
|
12
|
+
@@_metered_methods[meth_name][:method] = instance_method(meth_name)
|
13
|
+
define_method(meth_name) do |*args, &block|
|
14
|
+
Lockistics.meter("#{@@_metered_methods[meth_name][:options][:prefix]}_#{meth_name}") do
|
15
|
+
@@_metered_methods[meth_name][:method].bind(self).call *args, &block
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def meter(*args)
|
21
|
+
if args.last.kind_of?(Hash)
|
22
|
+
options = args.pop
|
23
|
+
else
|
24
|
+
options = {}
|
25
|
+
end
|
26
|
+
options = {
|
27
|
+
:prefix => self.name.downcase
|
28
|
+
}.merge(options)
|
29
|
+
|
30
|
+
if args.first.eql?(:all)
|
31
|
+
@@_meter_all = true
|
32
|
+
@@_meter_all_options = {:except => []}.merge(options)
|
33
|
+
end
|
34
|
+
|
35
|
+
Array(args).each do |meth_name|
|
36
|
+
@@_metered_methods[meth_name] = {}
|
37
|
+
@@_metered_methods[meth_name][:options] = options
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_added(meth_name)
|
42
|
+
super
|
43
|
+
if @@_metered_methods && @@_metered_methods[meth_name] && @@_metered_methods[meth_name][:method].nil?
|
44
|
+
meter_wrap meth_name
|
45
|
+
elsif @@_meter_all && !Array(@@_meter_all_options[:except]).include?(meth_name) && @@_metered_methods[meth_name].nil?
|
46
|
+
@@_metered_methods[meth_name] = {}
|
47
|
+
@@_metered_methods[meth_name][:options] = @@_meter_all_options
|
48
|
+
meter_wrap meth_name
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/lockistics/version.rb
CHANGED
data/lib/lockistics.rb
CHANGED
@@ -3,6 +3,7 @@ require "lockistics/configuration"
|
|
3
3
|
require "lockistics/lock"
|
4
4
|
require "lockistics/meter"
|
5
5
|
require "lockistics/statistics"
|
6
|
+
require "lockistics/meterable"
|
6
7
|
|
7
8
|
# Lockistics is basically a distributed mutex on Redis.
|
8
9
|
#
|
@@ -19,6 +20,19 @@ require "lockistics/statistics"
|
|
19
20
|
# - Minimum and maximum duration
|
20
21
|
# - Minimum and maximum memory growth (using OS gem)
|
21
22
|
# - Arbitary metrics you add during execution
|
23
|
+
#
|
24
|
+
# Theres also an experimental module you can use to wrap any instance
|
25
|
+
# methods inside a meter block.
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# class SomeClass
|
29
|
+
# include Lockistics::Meterable
|
30
|
+
# meter :instance_method_name
|
31
|
+
#
|
32
|
+
# def instance_method_name
|
33
|
+
# do_something
|
34
|
+
# end
|
35
|
+
# end
|
22
36
|
module Lockistics
|
23
37
|
|
24
38
|
# Configure the gem
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.expand_path('../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
class MeterableTest
|
4
|
+
|
5
|
+
include Lockistics::Meterable
|
6
|
+
|
7
|
+
meter :all, :except => [
|
8
|
+
:do_not_meter_this_instance_method,
|
9
|
+
:meter_this_instance_method_too
|
10
|
+
]
|
11
|
+
meter :meter_this_instance_method_too
|
12
|
+
|
13
|
+
def self.meter_this_class
|
14
|
+
"ok_class"
|
15
|
+
end
|
16
|
+
|
17
|
+
def meter_this_instance_method
|
18
|
+
"ok"
|
19
|
+
end
|
20
|
+
|
21
|
+
def meter_this_instance_method_too
|
22
|
+
"ok"
|
23
|
+
end
|
24
|
+
|
25
|
+
def do_not_meter_this_instance_method
|
26
|
+
"ok"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "Lockistics.meterable" do
|
32
|
+
it "should wrap desired methods into meters" do
|
33
|
+
MeterableTest.new.meter_this_instance_method.should eq "ok"
|
34
|
+
last_total = Lockistics.redis.hgetall("lockistics.meterabletest_meter_this_instance_method.total")
|
35
|
+
last_total.should_not be_empty
|
36
|
+
MeterableTest.new.meter_this_instance_method_too.should eq "ok"
|
37
|
+
last_total = Lockistics.redis.hgetall("lockistics.meterabletest_meter_this_instance_method_too.total")
|
38
|
+
last_total.should_not be_empty
|
39
|
+
MeterableTest.new.do_not_meter_this_instance_method.should eq "ok"
|
40
|
+
last_total = Lockistics.redis.hgetall("lockistics.meterabletest_do_not_meter_this_instance_method.total")
|
41
|
+
last_total.should be_empty
|
42
|
+
end
|
43
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lockistics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kimmo Lehto
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-
|
18
|
+
date: 2014-06-03 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -122,11 +122,13 @@ files:
|
|
122
122
|
- lib/lockistics/configuration.rb
|
123
123
|
- lib/lockistics/lock.rb
|
124
124
|
- lib/lockistics/meter.rb
|
125
|
+
- lib/lockistics/meterable.rb
|
125
126
|
- lib/lockistics/statistics.rb
|
126
127
|
- lib/lockistics/version.rb
|
127
128
|
- lockistics.gemspec
|
128
129
|
- spec/locking_spec.rb
|
129
130
|
- spec/meter_spec.rb
|
131
|
+
- spec/meterable_spec.rb
|
130
132
|
- spec/spec_helper.rb
|
131
133
|
- spec/statistics_spec.rb
|
132
134
|
homepage: https://github.com/kke/lockistics
|
@@ -165,5 +167,6 @@ summary: With lockistics you can use Redis to create distributed locks and colle
|
|
165
167
|
test_files:
|
166
168
|
- spec/locking_spec.rb
|
167
169
|
- spec/meter_spec.rb
|
170
|
+
- spec/meterable_spec.rb
|
168
171
|
- spec/spec_helper.rb
|
169
172
|
- spec/statistics_spec.rb
|