rails-dtrace 0.0.1
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/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +99 -0
- data/Rakefile +2 -0
- data/lib/rails-dtrace/railtie.rb +9 -0
- data/lib/rails-dtrace/responder.rb +41 -0
- data/lib/rails-dtrace/version.rb +3 -0
- data/lib/rails-dtrace.rb +4 -0
- data/rails-dtrace.gemspec +20 -0
- data/spec/spec_helper.rb +17 -0
- metadata +97 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Eric Saxby
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# rails-dtrace
|
2
|
+
|
3
|
+
The rails-dtrace gem hooks into the ActiveSupport::Notifications
|
4
|
+
instruments in Rails, turning them into DTrace probes.
|
5
|
+
|
6
|
+
## Requirements
|
7
|
+
|
8
|
+
An OS that supports DTrace. For example:
|
9
|
+
* MacOS X
|
10
|
+
* Illumos
|
11
|
+
* SmartOS
|
12
|
+
* Solaris
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
Add this line to your application's Gemfile:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
gem 'ruby-usdt', :git => 'https://github.com/chrisa/ruby-usdt.git',
|
20
|
+
:submodules => true, :branch => 'disable_provider'
|
21
|
+
gem 'rails-dtrace'
|
22
|
+
```
|
23
|
+
|
24
|
+
And then execute:
|
25
|
+
|
26
|
+
```bash
|
27
|
+
$ bundle
|
28
|
+
```
|
29
|
+
|
30
|
+
## Warning
|
31
|
+
|
32
|
+
This gem in an experiment in progress. The code does not have automated
|
33
|
+
tests, and the performance impact of ActiveSupport::Notifications
|
34
|
+
combined with ruby-usdt and libusdt are unknown. **DO NOT USE THIS IN
|
35
|
+
PRODUCTION** unless you love risk.
|
36
|
+
|
37
|
+
Also, this gem requires experimental behavior in libusdt/ruby-usdt.
|
38
|
+
Core behavior may drastically change between releases/commits of this
|
39
|
+
gem. When this is no longer the case (and I figure out how to write
|
40
|
+
tests around this gem) these warnings will disappear.
|
41
|
+
|
42
|
+
## Usage
|
43
|
+
|
44
|
+
Once you add the gem to your Rails application, it will automatically
|
45
|
+
subscribe to all notifications, turning them into DTrace probes. The
|
46
|
+
arguments to the probes will be:
|
47
|
+
|
48
|
+
* `arg0` - Start time of notification - Integer
|
49
|
+
* `arg1` - End time of notification - Integer
|
50
|
+
* `arg2` - Unique identifier of notification - String
|
51
|
+
* `arg3` - Stringified hash of notification payload - String
|
52
|
+
|
53
|
+
The following dtrace command can be used, as an example:
|
54
|
+
|
55
|
+
```bash
|
56
|
+
sudo dtrace -n 'ruby*:rails:: { printf("%d %d %s %s", arg0, arg1,
|
57
|
+
copyinstr(arg2), copyinstr(arg3)) }'
|
58
|
+
```
|
59
|
+
|
60
|
+
Notifications are lazy-loaded, so even though rails-dtrace subscribes to
|
61
|
+
all available instruments, they will only be converted to probes as
|
62
|
+
they fire in Rails code. For this reason, in order to get a full picture
|
63
|
+
of what is happening in a Rails process, enough load should be generated
|
64
|
+
to ensure that all important probes are registered before tracing.
|
65
|
+
|
66
|
+
## Contributing
|
67
|
+
|
68
|
+
1. Fork it
|
69
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
70
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
71
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
72
|
+
5. Create new Pull Request
|
73
|
+
|
74
|
+
## Suggestions for Contributions
|
75
|
+
|
76
|
+
* How the F do you test this thing?
|
77
|
+
* Can Rails instruments be detected at initialization time?
|
78
|
+
* Notifications do start/end in one instrument. DTrace probes tend to
|
79
|
+
fire multiple probes, on entry and exit. This lets you write scripts
|
80
|
+
to do neat analytics on event timing. Can Notifications be hacked to
|
81
|
+
do this?
|
82
|
+
* The Responder turns the Notification payload (a hash) into a string.
|
83
|
+
This can surely be better.
|
84
|
+
|
85
|
+
## License
|
86
|
+
|
87
|
+
Copyright 2012 Eric Saxby
|
88
|
+
|
89
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
90
|
+
you may not use this file except in compliance with the License.
|
91
|
+
You may obtain a copy of the License at
|
92
|
+
|
93
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
94
|
+
|
95
|
+
Unless required by applicable law or agreed to in writing, software
|
96
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
97
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
98
|
+
See the License for the specific language governing permissions and
|
99
|
+
limitations under the License.
|
data/Rakefile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'usdt'
|
2
|
+
|
3
|
+
=begin
|
4
|
+
|
5
|
+
Problems:
|
6
|
+
* How do you dynamically enable/disable probes?
|
7
|
+
* Split name on '.' sucks
|
8
|
+
* Notifications include entry AND exit. Can we fire our own entry/exit probes?
|
9
|
+
|
10
|
+
=end
|
11
|
+
|
12
|
+
module DTrace
|
13
|
+
class Responder
|
14
|
+
cattr_reader :probes, :provider
|
15
|
+
cattr_writer :logger
|
16
|
+
|
17
|
+
@@provider = USDT::Provider.create :ruby, :rails
|
18
|
+
@@probes = {}
|
19
|
+
@@enabled = false
|
20
|
+
|
21
|
+
def self.logger
|
22
|
+
@@logger || Logger.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.call(name, started, finished, unique_id, payload)
|
26
|
+
unless probes.keys.include?(name)
|
27
|
+
func_name, probe_name = name.split('.')
|
28
|
+
p = @@provider.probe(func_name, probe_name, :integer, :integer, :string, :string)
|
29
|
+
probes[name] = p
|
30
|
+
logger.debug "Adding dtrace probe: #{name}"
|
31
|
+
@@provider.disable if @@enabled
|
32
|
+
@@provider.enable
|
33
|
+
@@enabled = true
|
34
|
+
end
|
35
|
+
|
36
|
+
if probes[name].enabled?
|
37
|
+
probes[name].fire(started.to_i, finished.to_i, unique_id, payload.inspect)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/rails-dtrace.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/rails-dtrace/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Eric Saxby"]
|
6
|
+
gem.email = ["sax@livinginthepast.org"]
|
7
|
+
gem.description = %q{Turn ActiveSupport::Notification instruments into DTrace probes. This allows you to trace Rails apps.}
|
8
|
+
gem.summary = %q{Add DTrace probes to Rails}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| ::File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "rails-dtrace"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Dtrace::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'ruby-usdt'
|
19
|
+
gem.add_development_dependency 'rspec'
|
20
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.filter_run :focus
|
11
|
+
|
12
|
+
# Run specs in random order to surface order dependencies. If you find an
|
13
|
+
# order dependency and want to debug it, you can fix the order by providing
|
14
|
+
# the seed, which is printed after each run.
|
15
|
+
# --seed 1234
|
16
|
+
config.order = 'random'
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-dtrace
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Eric Saxby
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ruby-usdt
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Turn ActiveSupport::Notification instruments into DTrace probes. This
|
47
|
+
allows you to trace Rails apps.
|
48
|
+
email:
|
49
|
+
- sax@livinginthepast.org
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- .gitignore
|
55
|
+
- .rspec
|
56
|
+
- Gemfile
|
57
|
+
- LICENSE
|
58
|
+
- README.md
|
59
|
+
- Rakefile
|
60
|
+
- lib/rails-dtrace.rb
|
61
|
+
- lib/rails-dtrace/railtie.rb
|
62
|
+
- lib/rails-dtrace/responder.rb
|
63
|
+
- lib/rails-dtrace/version.rb
|
64
|
+
- rails-dtrace.gemspec
|
65
|
+
- spec/spec_helper.rb
|
66
|
+
homepage: ''
|
67
|
+
licenses: []
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
hash: 1821254754778372356
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
hash: 1821254754778372356
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.8.23
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Add DTrace probes to Rails
|
96
|
+
test_files:
|
97
|
+
- spec/spec_helper.rb
|