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 CHANGED
@@ -1,3 +1,6 @@
1
+ ### 0.8.0 [January 10, 2012]
2
+ * Initial support for timing events.
3
+
1
4
  ### 0.7.2 [January 5, 2012]
2
5
  * Deploy durations tracking fixed.
3
6
 
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) # value at a point in time
29
- I.increment('signups') # increasing value, think "events"
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
@@ -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 }
@@ -1,3 +1,3 @@
1
1
  module Instrumental
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
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
- version: 0.7.2
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
- date: 2012-01-05 00:00:00.000000000 Z
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
18
- name: rake
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
- version_requirements: *70284097131220
28
- - !ruby/object:Gem::Dependency
29
- name: rspec
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
- version: '2.0'
36
- type: :development
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
- version_requirements: *70284097130700
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
- prerelease: false
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
- version: '0'
58
- type: :development
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
- version_requirements: *70284097129740
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
- prerelease: false
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
- version: '0'
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
- version_requirements: *70284097128780
83
- - !ruby/object:Gem::Dependency
84
- name: fuubar
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
- version: '0'
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
- files:
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
- require_paths:
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
- version: '0'
129
- segments:
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ hash: 3
162
+ segments:
130
163
  - 0
131
- hash: 2495915029626424189
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
- version: '0'
138
- segments:
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ hash: 3
171
+ segments:
139
172
  - 0
140
- hash: 2495915029626424189
173
+ version: "0"
141
174
  requirements: []
175
+
142
176
  rubyforge_project:
143
- rubygems_version: 1.8.12
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