instrumental_agent 0.7.2 → 0.8.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/CHANGELOG.md +3 -0
- data/README.md +10 -2
- data/lib/instrumental/agent.rb +30 -0
- data/lib/instrumental/capistrano.rb +0 -2
- data/lib/instrumental/version.rb +1 -1
- data/spec/agent_spec.rb +37 -0
- metadata +121 -87
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -25,8 +25,16 @@ can verify stats in one, and release them to production in another.
|
|
25
25
|
Now you can begin to use Instrumental to track your application.
|
26
26
|
|
27
27
|
```sh
|
28
|
-
I.gauge('load', 1.23)
|
29
|
-
|
28
|
+
I.gauge('load', 1.23) # value at a point in time
|
29
|
+
|
30
|
+
I.increment('signups') # increasing value, think "events"
|
31
|
+
|
32
|
+
I.time('query_time') do # time a block of code
|
33
|
+
post = Post.find(1)
|
34
|
+
end
|
35
|
+
I.time_ms('query_time_in_ms') do # prefer milliseconds?
|
36
|
+
post = Post.find(1)
|
37
|
+
end
|
30
38
|
```
|
31
39
|
|
32
40
|
**Note**: For your app's safety, the agent is meant to isolate your app
|
data/lib/instrumental/agent.rb
CHANGED
@@ -84,6 +84,36 @@ module Instrumental
|
|
84
84
|
nil
|
85
85
|
end
|
86
86
|
|
87
|
+
# Store the duration of a block in a metric. multiplier can be used
|
88
|
+
# to scale the duration to desired unit or change the duration in
|
89
|
+
# some meaningful way.
|
90
|
+
#
|
91
|
+
# agent.time('response_time') do
|
92
|
+
# # potentially slow stuff
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# agent.time('response_time_in_ms', 1000) do
|
96
|
+
# # potentially slow stuff
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# ids = [1, 2, 3]
|
100
|
+
# agent.time('find_time_per_post', 1 / ids.size.to_f) do
|
101
|
+
# Post.find(ids)
|
102
|
+
# end
|
103
|
+
def time(metric, multiplier = 1)
|
104
|
+
start = Time.now
|
105
|
+
result = yield
|
106
|
+
finish = Time.now
|
107
|
+
duration = finish - start
|
108
|
+
gauge(metric, duration * multiplier, start)
|
109
|
+
result
|
110
|
+
end
|
111
|
+
|
112
|
+
# Calls time and changes durations into milliseconds.
|
113
|
+
def time_ms(metric, &block)
|
114
|
+
time(metric, 1000, &block)
|
115
|
+
end
|
116
|
+
|
87
117
|
# Increment a metric, optionally more than one or at a specific time.
|
88
118
|
#
|
89
119
|
# agent.increment('users')
|
@@ -20,8 +20,6 @@ if Capistrano::Configuration.instance
|
|
20
20
|
task :record_deploy_notice do
|
21
21
|
start_at = exists?(:instrumental_deploy_start) ? instrumental_deploy_start : Time.now
|
22
22
|
end_at = exists?(:instrumental_deploy_end) ? instrumental_deploy_end : start_at
|
23
|
-
puts "@instrumental_deploy_start = #{start_at.inspect}"
|
24
|
-
puts "@instrumental_deploy_end = #{end_at.inspect}"
|
25
23
|
deploy_duration_in_seconds = end_at - start_at
|
26
24
|
deployer = Etc.getlogin.chomp
|
27
25
|
agent_options = { :synchronous => true }
|
data/lib/instrumental/version.rb
CHANGED
data/spec/agent_spec.rb
CHANGED
@@ -61,6 +61,30 @@ describe Instrumental::Agent, "enabled in test_mode" do
|
|
61
61
|
@server.commands.last.should == "gauge gauge_test 123 #{now.to_i}"
|
62
62
|
end
|
63
63
|
|
64
|
+
it "should report a time as gauge and return the block result" do
|
65
|
+
now = Time.now
|
66
|
+
@agent.time("time_value_test") do
|
67
|
+
sleep 0.1
|
68
|
+
1 + 1
|
69
|
+
end.should == 2
|
70
|
+
wait
|
71
|
+
@server.commands.last.should =~ /gauge time_value_test .* #{now.to_i}/
|
72
|
+
time = @server.commands.last.scan(/gauge time_value_test (.*) #{now.to_i}/)[0][0].to_f
|
73
|
+
time.should > 0.1
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should report a time as a millisecond gauge and return the block result" do
|
77
|
+
now = Time.now
|
78
|
+
@agent.time_ms("time_ms_test") do
|
79
|
+
sleep 0.1
|
80
|
+
1 + 1
|
81
|
+
end.should == 2
|
82
|
+
wait
|
83
|
+
@server.commands.last.should =~ /gauge time_ms_test .* #{now.to_i}/
|
84
|
+
time = @server.commands.last.scan(/gauge time_ms_test (.*) #{now.to_i}/)[0][0].to_f
|
85
|
+
time.should > 100
|
86
|
+
end
|
87
|
+
|
64
88
|
it "should report an increment" do
|
65
89
|
now = Time.now
|
66
90
|
@agent.increment("increment_test")
|
@@ -108,6 +132,15 @@ describe Instrumental::Agent, "enabled" do
|
|
108
132
|
@server.commands.last.should == "gauge gauge_test 123 #{now.to_i}"
|
109
133
|
end
|
110
134
|
|
135
|
+
it "should report a time as gauge and return the block result" do
|
136
|
+
now = Time.now
|
137
|
+
@agent.time("time_value_test") do
|
138
|
+
1 + 1
|
139
|
+
end.should == 2
|
140
|
+
wait
|
141
|
+
@server.commands.last.should =~ /gauge time_value_test .* #{now.to_i}/
|
142
|
+
end
|
143
|
+
|
111
144
|
it "should return the value gauged" do
|
112
145
|
now = Time.now
|
113
146
|
@agent.gauge('gauge_test', 123).should == 123
|
@@ -209,6 +242,10 @@ describe Instrumental::Agent, "enabled" do
|
|
209
242
|
wait
|
210
243
|
end
|
211
244
|
|
245
|
+
it "should let exceptions in time bubble up" do
|
246
|
+
expect { @agent.time('za') { raise "fail" } }.to raise_error
|
247
|
+
end
|
248
|
+
|
212
249
|
it "should return nil if the user overflows the MAX_BUFFER" do
|
213
250
|
thread = @agent.instance_variable_get(:@thread)
|
214
251
|
thread.kill
|
metadata
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: instrumental_agent
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Elijah Miller
|
9
14
|
- Christopher Zelenak
|
10
15
|
- Kristopher Chambers
|
@@ -12,92 +17,118 @@ authors:
|
|
12
17
|
autorequire:
|
13
18
|
bindir: bin
|
14
19
|
cert_chain: []
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
requirement: &70284097131220 !ruby/object:Gem::Requirement
|
20
|
-
none: false
|
21
|
-
requirements:
|
22
|
-
- - ! '>='
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version: '0'
|
20
|
+
|
21
|
+
date: 2012-01-11 00:00:00 Z
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
25
24
|
type: :development
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
version: "0"
|
34
|
+
name: rake
|
35
|
+
version_requirements: *id001
|
26
36
|
prerelease: false
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
requirement: &70284097130700 !ruby/object:Gem::Requirement
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
type: :development
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
40
|
none: false
|
32
|
-
requirements:
|
41
|
+
requirements:
|
33
42
|
- - ~>
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
|
36
|
-
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 0
|
48
|
+
version: "2.0"
|
49
|
+
name: rspec
|
50
|
+
version_requirements: *id002
|
37
51
|
prerelease: false
|
38
|
-
|
39
|
-
- !ruby/object:Gem::Dependency
|
40
|
-
name: guard
|
41
|
-
requirement: &70284097130220 !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
|
-
requirements:
|
44
|
-
- - ! '>='
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
52
|
+
- !ruby/object:Gem::Dependency
|
47
53
|
type: :development
|
48
|
-
|
49
|
-
version_requirements: *70284097130220
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: guard-rspec
|
52
|
-
requirement: &70284097129740 !ruby/object:Gem::Requirement
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
55
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
name: guard
|
64
|
+
version_requirements: *id003
|
59
65
|
prerelease: false
|
60
|
-
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: growl_notify
|
63
|
-
requirement: &70284097129260 !ruby/object:Gem::Requirement
|
64
|
-
none: false
|
65
|
-
requirements:
|
66
|
-
- - ! '>='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
66
|
+
- !ruby/object:Gem::Dependency
|
69
67
|
type: :development
|
70
|
-
|
71
|
-
version_requirements: *70284097129260
|
72
|
-
- !ruby/object:Gem::Dependency
|
73
|
-
name: rb-fsevent
|
74
|
-
requirement: &70284097128780 !ruby/object:Gem::Requirement
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
75
69
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
name: guard-rspec
|
78
|
+
version_requirements: *id004
|
79
|
+
prerelease: false
|
80
|
+
- !ruby/object:Gem::Dependency
|
80
81
|
type: :development
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
name: growl_notify
|
92
|
+
version_requirements: *id005
|
81
93
|
prerelease: false
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
requirement: &70284097128300 !ruby/object:Gem::Requirement
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
type: :development
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
86
97
|
none: false
|
87
|
-
requirements:
|
88
|
-
- -
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
name: rb-fsevent
|
106
|
+
version_requirements: *id006
|
107
|
+
prerelease: false
|
108
|
+
- !ruby/object:Gem::Dependency
|
91
109
|
type: :development
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 3
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
version: "0"
|
119
|
+
name: fuubar
|
120
|
+
version_requirements: *id007
|
92
121
|
prerelease: false
|
93
|
-
version_requirements: *70284097128300
|
94
122
|
description: Track anything.
|
95
|
-
email:
|
123
|
+
email:
|
96
124
|
- support@instrumentalapp.com
|
97
125
|
executables: []
|
126
|
+
|
98
127
|
extensions: []
|
128
|
+
|
99
129
|
extra_rdoc_files: []
|
100
|
-
|
130
|
+
|
131
|
+
files:
|
101
132
|
- .gitignore
|
102
133
|
- .rspec
|
103
134
|
- CHANGELOG.md
|
@@ -116,35 +147,38 @@ files:
|
|
116
147
|
- spec/test_server.rb
|
117
148
|
homepage: http://github.com/fastestforward/instrumental_agent
|
118
149
|
licenses: []
|
150
|
+
|
119
151
|
post_install_message:
|
120
152
|
rdoc_options: []
|
121
|
-
|
153
|
+
|
154
|
+
require_paths:
|
122
155
|
- lib
|
123
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
157
|
none: false
|
125
|
-
requirements:
|
126
|
-
- -
|
127
|
-
- !ruby/object:Gem::Version
|
128
|
-
|
129
|
-
segments:
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
hash: 3
|
162
|
+
segments:
|
130
163
|
- 0
|
131
|
-
|
132
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
+
version: "0"
|
165
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
166
|
none: false
|
134
|
-
requirements:
|
135
|
-
- -
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
|
138
|
-
segments:
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
171
|
+
segments:
|
139
172
|
- 0
|
140
|
-
|
173
|
+
version: "0"
|
141
174
|
requirements: []
|
175
|
+
|
142
176
|
rubyforge_project:
|
143
|
-
rubygems_version: 1.8.
|
177
|
+
rubygems_version: 1.8.10
|
144
178
|
signing_key:
|
145
179
|
specification_version: 3
|
146
180
|
summary: Agent for reporting data to instrumentalapp.com
|
147
|
-
test_files:
|
181
|
+
test_files:
|
148
182
|
- spec/agent_spec.rb
|
149
183
|
- spec/spec_helper.rb
|
150
184
|
- spec/test_server.rb
|