instrumental_agent 0.6.1 → 0.7
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 +57 -0
- data/README.md +26 -9
- data/instrumental_agent.gemspec +1 -1
- data/lib/instrumental/agent.rb +36 -11
- data/lib/instrumental/capistrano.rb +42 -0
- data/lib/instrumental/rack/middleware.rb +1 -79
- data/lib/instrumental/version.rb +1 -1
- data/spec/agent_spec.rb +43 -1
- metadata +76 -116
- data/lib/instrumental/rack/rails23.rb +0 -27
- data/lib/instrumental/rack/rails3.rb +0 -27
- data/lib/instrumental/rack/rails3/middleware_bootstrap.rb +0 -6
data/CHANGELOG.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
### 0.7 [January 2, 2012]
|
2
|
+
* .notice added to API to allow tracking project-wide events on graphs
|
3
|
+
* Removed Rack middleware
|
4
|
+
* Logs to STDERR instead of /dev/null
|
5
|
+
* Synchronous mode can be specified in agent initialization contributed by [janxious] from (https://github.com/expectedbehavior/)
|
6
|
+
* Added CHANGELOG :)
|
7
|
+
|
8
|
+
### 0.6.1 [December 16, 2011]
|
9
|
+
* Documentation cleanup
|
10
|
+
|
11
|
+
### 0.6 [December 13, 2011]
|
12
|
+
* Synchronous agent support to allow blocking send of metrics
|
13
|
+
* Message buffer increased to 5000
|
14
|
+
* Code cleanup
|
15
|
+
|
16
|
+
### 0.5.1 [December 12, 2011]
|
17
|
+
* instrument_server moved to instrumental_tools gem (https://github.com/fastestforward/instrumental_tools)
|
18
|
+
|
19
|
+
### 0.5 [December 9, 2011]
|
20
|
+
* Allow negative numbers to be submitted
|
21
|
+
* agent logger now can be configured per instance
|
22
|
+
* Better RSpec formatting for tests
|
23
|
+
|
24
|
+
### 0.4 [December 1, 2011]
|
25
|
+
* Support reconnecting on fork() for forking servers like Passenger
|
26
|
+
|
27
|
+
### 0.3 [November 17, 2011]
|
28
|
+
* Support for test_mode on agent to cause submitted metrics to be thrown away when it reaches Instrumental servers
|
29
|
+
* Fix version not being sent in agent hello
|
30
|
+
* Exceptions in agent get swallowed and reported to logger
|
31
|
+
|
32
|
+
### 0.2 [November 15, 2011]
|
33
|
+
* Refactored agent to use TCPSocket instead of EventMachine
|
34
|
+
|
35
|
+
### 0.1.6 [November 14, 2011]
|
36
|
+
* Middleware doesn't automatically inject itself into Rack middleware stack
|
37
|
+
|
38
|
+
### 0.1.5 [November 1, 2011]
|
39
|
+
* Documentation changes
|
40
|
+
|
41
|
+
### 0.1.4 [November 1, 2011]
|
42
|
+
* Documentation changes
|
43
|
+
|
44
|
+
### 0.1.3 [October 31, 2011]
|
45
|
+
* Rename the watch_server command to instrument_server
|
46
|
+
* Documentation changes
|
47
|
+
|
48
|
+
### 0.1.2 [October 30, 2011]
|
49
|
+
* Add enabled flag to control agent use in test/non-development environments
|
50
|
+
* watch_server runs every 10s
|
51
|
+
|
52
|
+
### 0.1.1 [October 27, 2011]
|
53
|
+
* Linux support for watch_server
|
54
|
+
* Documentation changes
|
55
|
+
|
56
|
+
### 0.1 [OCtober 27, 2011]
|
57
|
+
* Initial version
|
data/README.md
CHANGED
@@ -34,6 +34,14 @@ from any problems our service might suffer. If it is unable to connect
|
|
34
34
|
to the service, it will discard data after reaching a low memory
|
35
35
|
threshold.
|
36
36
|
|
37
|
+
Want to track an event (like an application deploy, or downtime)? You can capture events that
|
38
|
+
are instantaneous, or events that happen over a period of time.
|
39
|
+
|
40
|
+
```sh
|
41
|
+
I.notice('Jeffy deployed rev ef3d6a') # instantaneous event
|
42
|
+
I.notice('Testing socket buffer increase', 3.days.ago, 20.minutes) # an event with a duration
|
43
|
+
```
|
44
|
+
|
37
45
|
## Backfilling
|
38
46
|
|
39
47
|
Streaming data is better with a little historical context. Instrumental
|
@@ -56,7 +64,7 @@ User.find_each do |user|
|
|
56
64
|
end
|
57
65
|
```
|
58
66
|
|
59
|
-
## Server
|
67
|
+
## Server Stats
|
60
68
|
|
61
69
|
Want some general server stats (load, memory, etc.)? Check out the
|
62
70
|
[instrumental_tools](https://github.com/fastestforward/instrumental_tools)
|
@@ -67,18 +75,27 @@ gem install instrumental_tools
|
|
67
75
|
instrument_server
|
68
76
|
```
|
69
77
|
|
70
|
-
##
|
71
|
-
|
72
|
-
Running under Rails? You can also give our experimental Rack middleware
|
73
|
-
a shot by initializing it with:
|
74
|
-
|
75
|
-
```sh
|
76
|
-
Instrumental::Middleware.boot
|
77
|
-
```
|
78
|
+
## Agent Control
|
78
79
|
|
79
80
|
Need to quickly disable the agent? set :enabled to false on
|
80
81
|
initialization and you don't need to change any application code.
|
81
82
|
|
83
|
+
|
84
|
+
## Capistrano Integration
|
85
|
+
|
86
|
+
Add `require "instrumental/capistrano"` to your capistrano configuration
|
87
|
+
and your deploys will be tracked automatically by Instrumental.
|
88
|
+
|
89
|
+
The following configuration will be added:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
before "deploy", "instrumental:util:deploy_start"
|
93
|
+
after "deploy", "instrumental:util:deploy_end"
|
94
|
+
before "deploy:migrations", "instrumental:util:deploy_start"
|
95
|
+
after "deploy:migrations", "instrumental:util:deploy_end"
|
96
|
+
after "instrumental:util:deploy_end", "instrumental:record_deploy_notice"
|
97
|
+
```
|
98
|
+
|
82
99
|
## Troubleshooting & Help
|
83
100
|
|
84
101
|
We are here to help, please email us at
|
data/instrumental_agent.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.email = ["support@instrumentalapp.com"]
|
9
9
|
s.homepage = "http://github.com/fastestforward/instrumental_agent"
|
10
10
|
s.summary = %q{Agent for reporting data to instrumentalapp.com}
|
11
|
-
s.description = %q{
|
11
|
+
s.description = %q{Track anything.}
|
12
12
|
|
13
13
|
s.files = `git ls-files`.split("\n")
|
14
14
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/instrumental/agent.rb
CHANGED
@@ -20,8 +20,12 @@ module Instrumental
|
|
20
20
|
@logger = l
|
21
21
|
end
|
22
22
|
|
23
|
-
def self.logger
|
24
|
-
|
23
|
+
def self.logger
|
24
|
+
if !@logger
|
25
|
+
@logger = Logger.new(STDERR)
|
26
|
+
@logger.level = Logger::WARN
|
27
|
+
end
|
28
|
+
@logger
|
25
29
|
end
|
26
30
|
|
27
31
|
def self.all
|
@@ -40,18 +44,20 @@ module Instrumental
|
|
40
44
|
# Instrumental::Agent.new(API_KEY, :collector => 'hostname:port')
|
41
45
|
def initialize(api_key, options = {})
|
42
46
|
default_options = {
|
43
|
-
:collector
|
44
|
-
:enabled
|
45
|
-
:test_mode
|
47
|
+
:collector => 'instrumentalapp.com:8000',
|
48
|
+
:enabled => true,
|
49
|
+
:test_mode => false,
|
50
|
+
:synchronous => false
|
46
51
|
}
|
47
52
|
options = default_options.merge(options)
|
48
53
|
collector = options[:collector].split(':')
|
49
54
|
|
50
|
-
@api_key
|
51
|
-
@host
|
52
|
-
@port
|
53
|
-
@enabled
|
54
|
-
@test_mode
|
55
|
+
@api_key = api_key
|
56
|
+
@host = collector[0]
|
57
|
+
@port = (collector[1] || 8000).to_i
|
58
|
+
@enabled = options[:enabled]
|
59
|
+
@test_mode = options[:test_mode]
|
60
|
+
@synchronous = options[:synchronous]
|
55
61
|
@pid = Process.pid
|
56
62
|
|
57
63
|
|
@@ -93,6 +99,21 @@ module Instrumental
|
|
93
99
|
nil
|
94
100
|
end
|
95
101
|
|
102
|
+
# Send a notice to the server (deploys, downtime, etc.)
|
103
|
+
#
|
104
|
+
# agent.notice('A notice')
|
105
|
+
def notice(note, time = Time.now, duration = 0)
|
106
|
+
if valid_note?(note)
|
107
|
+
send_command("notice", time.to_i, duration.to_i, note)
|
108
|
+
note
|
109
|
+
else
|
110
|
+
nil
|
111
|
+
end
|
112
|
+
rescue Exception => e
|
113
|
+
report_exception(e)
|
114
|
+
nil
|
115
|
+
end
|
116
|
+
|
96
117
|
def enabled?
|
97
118
|
@enabled
|
98
119
|
end
|
@@ -111,6 +132,10 @@ module Instrumental
|
|
111
132
|
|
112
133
|
private
|
113
134
|
|
135
|
+
def valid_note?(note)
|
136
|
+
note !~ /[\n\r]/
|
137
|
+
end
|
138
|
+
|
114
139
|
def valid?(metric, value, time)
|
115
140
|
valid_metric = metric =~ /^([\d\w\-_]+\.)*[\d\w\-_]+$/i
|
116
141
|
valid_value = value.to_s =~ /^-?\d+(\.\d+)?$/
|
@@ -209,7 +234,7 @@ module Instrumental
|
|
209
234
|
logger.error err.to_s
|
210
235
|
if command_and_args
|
211
236
|
logger.debug "requeueing: #{command_and_args}"
|
212
|
-
@queue << command_and_args
|
237
|
+
@queue << command_and_args
|
213
238
|
end
|
214
239
|
disconnect
|
215
240
|
@failures += 1
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
require 'instrumental_agent'
|
3
|
+
|
4
|
+
if Capistrano::Configuration.instance
|
5
|
+
Capistrano::Configuration.instance.load do
|
6
|
+
namespace :instrumental do
|
7
|
+
namespace :util do
|
8
|
+
desc "marker for beginning of deploy"
|
9
|
+
task :deploy_start do
|
10
|
+
@instrumental_deploy_start = Time.now
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "marker for end of deploy"
|
14
|
+
task :deploy_end do
|
15
|
+
@instrumental_deploy_end = Time.now
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "send a notice to instrumental about the deploy"
|
20
|
+
task :record_deploy_notice do
|
21
|
+
@instrumental_deploy_start ||= Time.now
|
22
|
+
@instrumental_deploy_end ||= Time.now
|
23
|
+
deploy_duration_in_seconds = (@instrumental_deploy_end - @instrumental_deploy_start).to_i
|
24
|
+
deployer = Etc.getlogin.chomp
|
25
|
+
agent_options = {}
|
26
|
+
agent_options[:collector] = instrumental_host if exists?(:instrumental_host)
|
27
|
+
agent = Instrumental::Agent.new(instrumental_key, agent_options)
|
28
|
+
agent.synchronous = true
|
29
|
+
agent.notice("#{deployer} deployed #{current_revision}",
|
30
|
+
@instrumental_deploy_start,
|
31
|
+
deploy_duration_in_seconds)
|
32
|
+
logger.info("Notified Instrumental of deployment")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
before "deploy", "instrumental:util:deploy_start"
|
37
|
+
after "deploy", "instrumental:util:deploy_end"
|
38
|
+
before "deploy:migrations", "instrumental:util:deploy_start"
|
39
|
+
after "deploy:migrations", "instrumental:util:deploy_end"
|
40
|
+
after "instrumental:util:deploy_end", "instrumental:record_deploy_notice"
|
41
|
+
end
|
42
|
+
end
|
@@ -1,85 +1,7 @@
|
|
1
1
|
module Instrumental
|
2
2
|
class Middleware
|
3
3
|
def self.boot
|
4
|
-
|
5
|
-
@stack.install_middleware
|
6
|
-
@enabled = true
|
7
|
-
else
|
8
|
-
@enabled = false
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.stack; @stack; end
|
13
|
-
|
14
|
-
def self.enabled; @enabled; end
|
15
|
-
def self.enabled=(v); @enabled = v; end
|
16
|
-
|
17
|
-
def initialize(app)
|
18
|
-
@app = app
|
19
|
-
end
|
20
|
-
|
21
|
-
def stack
|
22
|
-
Middleware.stack
|
23
|
-
end
|
24
|
-
|
25
|
-
def measure(env, &block)
|
26
|
-
response = nil
|
27
|
-
if Middleware.enabled
|
28
|
-
request = Rack::Request.new(env)
|
29
|
-
key_parts = stack.recognize_uri(request)
|
30
|
-
if key = key_parts.join(".")
|
31
|
-
exc = nil
|
32
|
-
tms = Benchmark.measure do
|
33
|
-
begin
|
34
|
-
response = yield
|
35
|
-
rescue Exception => e
|
36
|
-
exc = e
|
37
|
-
end
|
38
|
-
end
|
39
|
-
begin
|
40
|
-
Agent.all.each do |agent|
|
41
|
-
if exc
|
42
|
-
agent.increment("%s.error.%s" % [key, exc.class])
|
43
|
-
end
|
44
|
-
if response && response.first
|
45
|
-
agent.increment("%s.status.%i" % [key, response.first])
|
46
|
-
else
|
47
|
-
agent.increment(key)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
rescue Exception => e
|
51
|
-
stack.log "Error occurred sending stats: #{e}"
|
52
|
-
stack.log e.backtrace.join("\n")
|
53
|
-
end
|
54
|
-
raise exc if exc
|
55
|
-
end
|
56
|
-
end
|
57
|
-
response ||= yield
|
58
|
-
end
|
59
|
-
|
60
|
-
def call(env)
|
61
|
-
measure(env) do
|
62
|
-
@app.call(env)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
class Stack
|
67
|
-
def self.default_logger
|
68
|
-
@logger ||= Logger.new('/dev/null')
|
69
|
-
end
|
70
|
-
|
71
|
-
def log(msg)
|
72
|
-
Stack.default_logger.error(msg)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
def self.detect_stack
|
79
|
-
[Rails3, Rails23].collect { |klass| klass.create }.detect { |obj| !obj.nil? }
|
4
|
+
Instrumental::Agent.logger.warn "The Instrumental Rails middlware has been removed - contact support@instrumentalapp.com for more information"
|
80
5
|
end
|
81
6
|
end
|
82
7
|
end
|
83
|
-
|
84
|
-
require 'instrumental/rack/rails3'
|
85
|
-
require 'instrumental/rack/rails23'
|
data/lib/instrumental/version.rb
CHANGED
data/spec/agent_spec.rb
CHANGED
@@ -6,6 +6,7 @@ end
|
|
6
6
|
|
7
7
|
describe Instrumental::Agent, "disabled" do
|
8
8
|
before do
|
9
|
+
Instrumental::Agent.logger.level = Logger::UNKNOWN
|
9
10
|
@server = TestServer.new
|
10
11
|
@agent = Instrumental::Agent.new('test_token', :collector => @server.host_and_port, :enabled => false)
|
11
12
|
end
|
@@ -66,12 +67,19 @@ describe Instrumental::Agent, "enabled in test_mode" do
|
|
66
67
|
wait
|
67
68
|
@server.commands.last.should == "increment increment_test 1 #{now.to_i}"
|
68
69
|
end
|
70
|
+
|
71
|
+
it "should send notices to the server" do
|
72
|
+
tm = Time.now
|
73
|
+
@agent.notice("Test note", tm)
|
74
|
+
wait
|
75
|
+
@server.commands.join("\n").should include("notice #{tm.to_i} 0 Test note")
|
76
|
+
end
|
69
77
|
end
|
70
78
|
|
71
79
|
describe Instrumental::Agent, "enabled" do
|
72
80
|
before do
|
73
81
|
@server = TestServer.new
|
74
|
-
@agent = Instrumental::Agent.new('test_token', :collector => @server.host_and_port)
|
82
|
+
@agent = Instrumental::Agent.new('test_token', :collector => @server.host_and_port, :synchronous => false)
|
75
83
|
end
|
76
84
|
|
77
85
|
after do
|
@@ -244,4 +252,38 @@ describe Instrumental::Agent, "enabled" do
|
|
244
252
|
wait
|
245
253
|
@server.commands.join("\n").should_not include("increment agent.invalid_value")
|
246
254
|
end
|
255
|
+
|
256
|
+
it "should send notices to the server" do
|
257
|
+
tm = Time.now
|
258
|
+
@agent.notice("Test note", tm)
|
259
|
+
wait
|
260
|
+
@server.commands.join("\n").should include("notice #{tm.to_i} 0 Test note")
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should prevent a note w/ newline characters from being sent to the server" do
|
264
|
+
@agent.notice("Test note\n").should be_nil
|
265
|
+
wait
|
266
|
+
@server.commands.join("\n").should_not include("notice Test note")
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
describe Instrumental::Agent, "enabled with sync option" do
|
271
|
+
before do
|
272
|
+
@server = TestServer.new
|
273
|
+
@agent = Instrumental::Agent.new('test_token', :collector => @server.host_and_port, :synchronous => true)
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should send all data in synchronous mode" do
|
277
|
+
with_constants('Instrumental::Agent::MAX_BUFFER' => 3) do
|
278
|
+
5.times do |i|
|
279
|
+
@agent.increment('overflow_test', i + 1, 300)
|
280
|
+
end
|
281
|
+
wait # let the server receive the commands
|
282
|
+
@server.commands.should include("increment overflow_test 1 300")
|
283
|
+
@server.commands.should include("increment overflow_test 2 300")
|
284
|
+
@server.commands.should include("increment overflow_test 3 300")
|
285
|
+
@server.commands.should include("increment overflow_test 4 300")
|
286
|
+
@server.commands.should include("increment overflow_test 5 300")
|
287
|
+
end
|
288
|
+
end
|
247
289
|
end
|
metadata
CHANGED
@@ -1,15 +1,10 @@
|
|
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
|
+
version: '0.7'
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 6
|
9
|
-
- 1
|
10
|
-
version: 0.6.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Elijah Miller
|
14
9
|
- Christopher Zelenak
|
15
10
|
- Kristopher Chambers
|
@@ -17,130 +12,103 @@ authors:
|
|
17
12
|
autorequire:
|
18
13
|
bindir: bin
|
19
14
|
cert_chain: []
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
- !ruby/object:Gem::Dependency
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
type: :development
|
34
|
-
prerelease: false
|
15
|
+
date: 2012-01-02 00:00:00.000000000 Z
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
35
18
|
name: rake
|
36
|
-
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
19
|
+
requirement: &70270468082260 !ruby/object:Gem::Requirement
|
39
20
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 2
|
46
|
-
- 0
|
47
|
-
version: "2.0"
|
21
|
+
requirements:
|
22
|
+
- - ! '>='
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '0'
|
48
25
|
type: :development
|
49
26
|
prerelease: false
|
27
|
+
version_requirements: *70270468082260
|
28
|
+
- !ruby/object:Gem::Dependency
|
50
29
|
name: rspec
|
51
|
-
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
30
|
+
requirement: &70270468080880 !ruby/object:Gem::Requirement
|
54
31
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 0
|
61
|
-
version: "0"
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '2.0'
|
62
36
|
type: :development
|
63
37
|
prerelease: false
|
38
|
+
version_requirements: *70270468080880
|
39
|
+
- !ruby/object:Gem::Dependency
|
64
40
|
name: guard
|
65
|
-
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
41
|
+
requirement: &70270468105920 !ruby/object:Gem::Requirement
|
68
42
|
none: false
|
69
|
-
requirements:
|
70
|
-
- -
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
|
73
|
-
segments:
|
74
|
-
- 0
|
75
|
-
version: "0"
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
76
47
|
type: :development
|
77
48
|
prerelease: false
|
49
|
+
version_requirements: *70270468105920
|
50
|
+
- !ruby/object:Gem::Dependency
|
78
51
|
name: guard-rspec
|
79
|
-
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
52
|
+
requirement: &70270468104540 !ruby/object:Gem::Requirement
|
82
53
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
segments:
|
88
|
-
- 0
|
89
|
-
version: "0"
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
90
58
|
type: :development
|
91
59
|
prerelease: false
|
60
|
+
version_requirements: *70270468104540
|
61
|
+
- !ruby/object:Gem::Dependency
|
92
62
|
name: growl_notify
|
93
|
-
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
63
|
+
requirement: &70270468102900 !ruby/object:Gem::Requirement
|
96
64
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
segments:
|
102
|
-
- 0
|
103
|
-
version: "0"
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
104
69
|
type: :development
|
105
70
|
prerelease: false
|
71
|
+
version_requirements: *70270468102900
|
72
|
+
- !ruby/object:Gem::Dependency
|
106
73
|
name: rb-fsevent
|
107
|
-
|
108
|
-
- !ruby/object:Gem::Dependency
|
109
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
74
|
+
requirement: &70270468099960 !ruby/object:Gem::Requirement
|
110
75
|
none: false
|
111
|
-
requirements:
|
112
|
-
- -
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
|
115
|
-
segments:
|
116
|
-
- 0
|
117
|
-
version: "0"
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
118
80
|
type: :development
|
119
81
|
prerelease: false
|
82
|
+
version_requirements: *70270468099960
|
83
|
+
- !ruby/object:Gem::Dependency
|
120
84
|
name: fuubar
|
121
|
-
|
122
|
-
|
123
|
-
|
85
|
+
requirement: &70270468099200 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: *70270468099200
|
94
|
+
description: Track anything.
|
95
|
+
email:
|
124
96
|
- support@instrumentalapp.com
|
125
97
|
executables: []
|
126
|
-
|
127
98
|
extensions: []
|
128
|
-
|
129
99
|
extra_rdoc_files: []
|
130
|
-
|
131
|
-
files:
|
100
|
+
files:
|
132
101
|
- .gitignore
|
133
102
|
- .rspec
|
103
|
+
- CHANGELOG.md
|
134
104
|
- Gemfile
|
135
105
|
- Guardfile
|
136
106
|
- README.md
|
137
107
|
- Rakefile
|
138
108
|
- instrumental_agent.gemspec
|
139
109
|
- lib/instrumental/agent.rb
|
110
|
+
- lib/instrumental/capistrano.rb
|
140
111
|
- lib/instrumental/rack/middleware.rb
|
141
|
-
- lib/instrumental/rack/rails23.rb
|
142
|
-
- lib/instrumental/rack/rails3.rb
|
143
|
-
- lib/instrumental/rack/rails3/middleware_bootstrap.rb
|
144
112
|
- lib/instrumental/version.rb
|
145
113
|
- lib/instrumental_agent.rb
|
146
114
|
- spec/agent_spec.rb
|
@@ -148,38 +116,30 @@ files:
|
|
148
116
|
- spec/test_server.rb
|
149
117
|
homepage: http://github.com/fastestforward/instrumental_agent
|
150
118
|
licenses: []
|
151
|
-
|
152
119
|
post_install_message:
|
153
120
|
rdoc_options: []
|
154
|
-
|
155
|
-
require_paths:
|
121
|
+
require_paths:
|
156
122
|
- lib
|
157
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
158
124
|
none: false
|
159
|
-
requirements:
|
160
|
-
- -
|
161
|
-
- !ruby/object:Gem::Version
|
162
|
-
|
163
|
-
|
164
|
-
- 0
|
165
|
-
version: "0"
|
166
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
130
|
none: false
|
168
|
-
requirements:
|
169
|
-
- -
|
170
|
-
- !ruby/object:Gem::Version
|
171
|
-
|
172
|
-
segments:
|
173
|
-
- 0
|
174
|
-
version: "0"
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
175
135
|
requirements: []
|
176
|
-
|
177
136
|
rubyforge_project:
|
178
137
|
rubygems_version: 1.8.10
|
179
138
|
signing_key:
|
180
139
|
specification_version: 3
|
181
140
|
summary: Agent for reporting data to instrumentalapp.com
|
182
|
-
test_files:
|
141
|
+
test_files:
|
183
142
|
- spec/agent_spec.rb
|
184
143
|
- spec/spec_helper.rb
|
185
144
|
- spec/test_server.rb
|
145
|
+
has_rdoc:
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Instrumental
|
2
|
-
class Middleware
|
3
|
-
class Rails23 < Stack
|
4
|
-
def self.create
|
5
|
-
if (defined?(::RAILS_VERSION) && const_get(:RAILS_VERSION).to_s =~ /^2\.3/) ||
|
6
|
-
(defined?(Rails) && Rails.respond_to?(:version) && Rails.version.to_s =~ /^2\.3/)
|
7
|
-
new
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def install_middleware
|
12
|
-
Rails.configuration.middleware.use Instrumental::Middleware
|
13
|
-
end
|
14
|
-
|
15
|
-
def log(msg)
|
16
|
-
Rails.logger.error msg
|
17
|
-
end
|
18
|
-
|
19
|
-
def recognize_uri(request)
|
20
|
-
params = ActionController::Routing::Routes.recognize_path(request.path, request.env.merge(:method => request.env["REQUEST_METHOD"].downcase.to_sym))
|
21
|
-
["controller", params[:controller], params[:action]]
|
22
|
-
rescue ActionController::RoutingError => e
|
23
|
-
["controller", "unknown"]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Instrumental
|
2
|
-
class Middleware
|
3
|
-
class Rails3 < Stack
|
4
|
-
def self.create
|
5
|
-
if defined?(Rails) && Rails.respond_to?(:version) && Rails.version.to_s =~ /^3/
|
6
|
-
new
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def install_middleware
|
11
|
-
require 'instrumental/rack/rails3/middleware_bootstrap'
|
12
|
-
end
|
13
|
-
|
14
|
-
def log(msg)
|
15
|
-
Rails.logger.error msg
|
16
|
-
end
|
17
|
-
|
18
|
-
def recognize_uri(request)
|
19
|
-
Rails.application.routes.finalize!
|
20
|
-
params = Rails.application.routes.recognize_path(request.url, request.env)
|
21
|
-
["controller", params[:controller], params[:action]]
|
22
|
-
rescue ActionController::RoutingError => e
|
23
|
-
["controller", "unknown"]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|