instrumental_agent 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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