newrelic-praxis 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +94 -0
- data/Rakefile +2 -0
- data/lib/newrelic-praxis.rb +5 -0
- data/lib/newrelic-praxis/instrumentation/praxis.rb +22 -0
- data/lib/newrelic-praxis/instrumentation/praxis_blueprints.rb +22 -0
- data/lib/newrelic-praxis/instrumentation/praxis_mapper.rb +28 -0
- data/lib/newrelic-praxis/praxis/action_event.rb +48 -0
- data/lib/newrelic-praxis/praxis/action_subscriber.rb +70 -0
- data/lib/newrelic-praxis/praxis_blueprints/render_event.rb +23 -0
- data/lib/newrelic-praxis/praxis_blueprints/render_subscriber.rb +40 -0
- data/lib/newrelic-praxis/praxis_mapper/finalize_subscriber.rb +42 -0
- data/lib/newrelic-praxis/praxis_mapper/helper.rb +23 -0
- data/lib/newrelic-praxis/praxis_mapper/load_event.rb +13 -0
- data/lib/newrelic-praxis/praxis_mapper/load_subscriber.rb +42 -0
- data/lib/newrelic-praxis/version.rb +5 -0
- data/newrelic-praxis.gemspec +31 -0
- data/screenshot.png +0 -0
- metadata +165 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9d41c5e9b007c877cda2b88973c6a5ea76d93d42
|
4
|
+
data.tar.gz: cda91b0f9bfc6a08d77582971ec752ac55b4f3eb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 787db604f4dfc0b2b7b27044422aa479bdce66dfc7515f8978b89cc0497d92a98f2e5846a585c61aaf0d0fe286d73951f2a54d75b1bb151f26d3ea8966499733
|
7
|
+
data.tar.gz: e55d5598f6c32a433489567055b12f66988f05702fa4dfcba8dc4b42eec9babdb3a950af279400d3fb1363a1f62f229cb0e7ab5e17e021fe538b9c8875c1bd48
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 RightScale
|
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,94 @@
|
|
1
|
+
# Praxis New Relic Support
|
2
|
+
|
3
|
+
New Relic instrumentation for Praxis, Praxis Blueprints, and Praxis Mapper.
|
4
|
+
|
5
|
+
![example trace](screenshot.png)
|
6
|
+
|
7
|
+
## Getting Started
|
8
|
+
|
9
|
+
Add the gem to your Gemfile:
|
10
|
+
```ruby
|
11
|
+
gem 'newrelic-praxis'
|
12
|
+
```
|
13
|
+
|
14
|
+
Require the gem and start the New Relic agent normally.
|
15
|
+
|
16
|
+
For example, you could use a simple initializer like `config/initializers/init_newrelic.rb`:
|
17
|
+
```ruby
|
18
|
+
require 'newrelic_rpm'
|
19
|
+
require 'newrelic-praxis'
|
20
|
+
|
21
|
+
NewRelic::Agent.manual_start
|
22
|
+
```
|
23
|
+
|
24
|
+
## What Is Instrumented
|
25
|
+
|
26
|
+
This gem provides separate instrumentation for Praxis, Praxis Blueprints, and Praxis Mapper. It uses the existing [notifications](http://praxis-framework.io/reference/plugins/notifications/) provided by Praxis where available, and injects additional New Relic-specific instrumentation to Praxis Mapper.
|
27
|
+
|
28
|
+
### Praxis
|
29
|
+
|
30
|
+
With this gem, you'll have three different traces with each request:
|
31
|
+
|
32
|
+
* `Praxis::Application#call` -- your full Praxis app, starting from the `run Praxis::Application.instance` in your `config.ru`. This will include any Rack middleware you've specified in the application configuration, not any prior to that `run`.
|
33
|
+
* `Praxis::Router#call` -- request handling inside Praxis. This includes all of the request stages (i.e. param/payload parsing, validation, the action, and etc.), with their `before`, `after`, and `around` filters.
|
34
|
+
* `ControllerClass#action_method` -- traces *just* the action code in a Controller, without including any filters. This is done by subscribing to the `'praxis.request_stage.execute'` event with `ActiveSupport::Notifications`.
|
35
|
+
|
36
|
+
|
37
|
+
### Praxis::Blueprint
|
38
|
+
|
39
|
+
Reports rendering time for all `Praxis::MediaType` views (and any other `Praxis::Blueprint` subclasses) as `:ClassName/:view_name Template` in New Relic, along with any relevant nesting when rendering related objects.
|
40
|
+
|
41
|
+
This uses the `'praxis.blueprint.render` notification.
|
42
|
+
|
43
|
+
|
44
|
+
### Praxis::Mapper
|
45
|
+
|
46
|
+
Provides three different types of instrumentaiton for `Praxis::Mapper`:
|
47
|
+
|
48
|
+
* `:ModelClass/Load` -- includes the full time and SQL statements associated with executing `IdentityMap.load(ModelClass)` query. This will include any subloads specified by `load`.
|
49
|
+
* `PraxisMapper/Finalize`-- includes the full time and SQL statements associated with executing `IdentityMap#finalize!` to retrieve any records staged by queries using `track`.
|
50
|
+
* `PraxisMapper :ModelClass select` -- Any SQL statements executed (using the Sequel query type) are instrumented as a Datastore in New Relic.
|
51
|
+
|
52
|
+
Additionally, any database interaction outside of Praxis::Mapper (i.e. `ModelClass.all` in Sequel), will use any other instrumentation supported by New Relic.
|
53
|
+
|
54
|
+
|
55
|
+
## Configuration
|
56
|
+
|
57
|
+
Simply requiring the gem, as in the `init_newrelic.rb` example above, is sufficient add all of the instrumentation when the New Relic agent starts.
|
58
|
+
|
59
|
+
You can disable specific portions of the instrumentation with the following configuration flags in your New Relic configuration (typically `newrelic.yml`):
|
60
|
+
|
61
|
+
* `disable_praxis_instrumentation` -- disables the `ControllerClass#action_method` tracing. `Praxis::Application#call` and `Praxis::Router#call` are provided by New Relic as part of its Rack instrumentation.
|
62
|
+
* `disable_praxis_blueprints_instrumentation` -- disables `:ClassName/:view_name Template` tracing for Praxis::Blueprint.
|
63
|
+
* `disable_praxis_mapper_instrumentation` -- disables all tracing for `Praxis::Mapper`.
|
64
|
+
|
65
|
+
*Note:* Disabling `Praxis::Mapper` instrumentation has no effect any other database instrumentation that may be present (i.e., the Sequel support provided by New Relic). This can be either a feature if you wish to remove the database traces from this gem and use another set, or a bug if you wish to completely disable all query tracing. Consult the New Relic documentation in the latter case for how to disable other instrumentation that may be installed.
|
66
|
+
|
67
|
+
|
68
|
+
## Mailing List
|
69
|
+
Join our Google Groups for discussion, support and announcements.
|
70
|
+
* [praxis-support](http://groups.google.com/d/forum/praxis-support) (support for people using
|
71
|
+
Praxis)
|
72
|
+
* [praxis-announce](http://groups.google.com/d/forum/praxis-announce) (announcements)
|
73
|
+
* [praxis-development](http://groups.google.com/d/forum/praxis-development) (discussion about the
|
74
|
+
development of Praxis itself)
|
75
|
+
|
76
|
+
And follow us on twitter: [@praxisapi](http://twitter.com/praxisapi)
|
77
|
+
|
78
|
+
|
79
|
+
## Contributions
|
80
|
+
Contributions to make this gem better are welcome. Please refer to
|
81
|
+
[CONTRIBUTING](https://github.com/rightscale/praxis/blob/master/CONTRIBUTING.md)
|
82
|
+
for further details on what contributions are accepted and how to go about
|
83
|
+
contributing.
|
84
|
+
|
85
|
+
|
86
|
+
## Requirements
|
87
|
+
Praxis requires Ruby 2.1.0 or greater.
|
88
|
+
|
89
|
+
|
90
|
+
## License
|
91
|
+
|
92
|
+
This software is released under the [MIT License](http://www.opensource.org/licenses/MIT). Please see [LICENSE](LICENSE) for further details.
|
93
|
+
|
94
|
+
Copyright (c) 2015 RightScale
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
named :praxis
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Praxis) && defined?(::Praxis::Controller)
|
6
|
+
end
|
7
|
+
|
8
|
+
depends_on do
|
9
|
+
!NewRelic::Agent.config[:disable_praxis_instrumentation]
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::NewRelic::Agent.logger.info 'Installing Praxis instrumentation'
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
require 'newrelic-praxis/praxis/action_event'
|
18
|
+
require 'newrelic-praxis/praxis/action_subscriber'
|
19
|
+
|
20
|
+
NewRelic::Agent::Instrumentation::Praxis::ActionSubscriber.subscribe 'praxis.request_stage.execute'.freeze
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
named :praxis_blueprints
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Praxis) && defined?(::Praxis::Blueprint)
|
6
|
+
end
|
7
|
+
|
8
|
+
depends_on do
|
9
|
+
!NewRelic::Agent.config[:disable_praxis_blueprints_instrumentation]
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::NewRelic::Agent.logger.info 'Installing Praxis::Blueprint instrumentation'
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
require 'newrelic-praxis/praxis_blueprints/render_event'
|
18
|
+
require 'newrelic-praxis/praxis_blueprints/render_subscriber'
|
19
|
+
|
20
|
+
NewRelic::Agent::Instrumentation::Praxis::Blueprint::RenderSubscriber.subscribe 'praxis.blueprint.render'.freeze
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
DependencyDetection.defer do
|
2
|
+
named :praxis_mapper
|
3
|
+
|
4
|
+
depends_on do
|
5
|
+
defined?(::Praxis) && defined?(::Praxis::Mapper)
|
6
|
+
end
|
7
|
+
|
8
|
+
depends_on do
|
9
|
+
!NewRelic::Agent.config[:disable_praxis_mapper_instrumentation]
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
::NewRelic::Agent.logger.info 'Installing Praxis::Mapper instrumentation'
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
require 'newrelic-praxis/praxis_mapper/helper'
|
18
|
+
require 'newrelic-praxis/praxis_mapper/load_event'
|
19
|
+
require 'newrelic-praxis/praxis_mapper/load_subscriber'
|
20
|
+
require 'newrelic-praxis/praxis_mapper/finalize_subscriber'
|
21
|
+
|
22
|
+
NewRelic::Agent::Instrumentation::Praxis::Mapper::LoadSubscriber.subscribe 'praxis.mapper.load'.freeze
|
23
|
+
NewRelic::Agent::Instrumentation::Praxis::Mapper::FinalizeSubscriber.subscribe 'praxis.mapper.finalize'.freeze
|
24
|
+
|
25
|
+
NewRelic::Agent::Instrumentation::Praxis::Mapper.instrument_praxis_mapper
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module NewRelic::Agent::Instrumentation
|
2
|
+
module Praxis
|
3
|
+
|
4
|
+
class ActionEvent < Event
|
5
|
+
attr_accessor :parent
|
6
|
+
attr_reader :queue_start, :request, :controller
|
7
|
+
|
8
|
+
def initialize(name, start, ending, transaction_id, payload, request)
|
9
|
+
# We have a different initialize parameter list, so be explicit
|
10
|
+
super(name, start, ending, transaction_id, payload)
|
11
|
+
|
12
|
+
@controller = payload[:controller]
|
13
|
+
@request = controller.request
|
14
|
+
|
15
|
+
@queue_start = QueueTime.parse_frontend_timestamp(request.env, self.time)
|
16
|
+
end
|
17
|
+
|
18
|
+
def metric_action
|
19
|
+
self.request.action.name
|
20
|
+
end
|
21
|
+
|
22
|
+
def metric_name
|
23
|
+
"Controller/#{controller.class.name}/#{metric_action}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def ignored?
|
27
|
+
_is_filtered?(ControllerInstrumentation::NR_DO_NOT_TRACE_KEY)
|
28
|
+
end
|
29
|
+
|
30
|
+
def apdex_ignored?
|
31
|
+
_is_filtered?(ControllerInstrumentation::NR_IGNORE_APDEX_KEY)
|
32
|
+
end
|
33
|
+
|
34
|
+
# hardcoded to true for Praxis, as it makes no sense for APIs
|
35
|
+
def enduser_ignored?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def _is_filtered?(key)
|
40
|
+
IgnoreActions.is_filtered?(
|
41
|
+
key,
|
42
|
+
self.controller.class,
|
43
|
+
self.metric_action)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module NewRelic
|
2
|
+
module Agent
|
3
|
+
module Instrumentation
|
4
|
+
module Praxis
|
5
|
+
|
6
|
+
class ActionSubscriber < EventedSubscriber
|
7
|
+
|
8
|
+
def start(name, id, payload) #THREAD_LOCAL_ACCESS
|
9
|
+
state = TransactionState.tl_get
|
10
|
+
|
11
|
+
controller = payload[:controller]
|
12
|
+
request = controller.request
|
13
|
+
|
14
|
+
event = ActionEvent.new(name, Time.now, nil, id, payload, request)
|
15
|
+
push_event(event)
|
16
|
+
|
17
|
+
if state.is_execution_traced? && !event.ignored?
|
18
|
+
start_transaction(state, event)
|
19
|
+
else
|
20
|
+
# if this transaction is ignored, make sure child
|
21
|
+
# transaction are also ignored
|
22
|
+
state.current_transaction.ignore! if state.current_transaction
|
23
|
+
NewRelic::Agent.instance.push_trace_execution_flag(false)
|
24
|
+
end
|
25
|
+
rescue => e
|
26
|
+
log_notification_error(e, name, 'start')
|
27
|
+
end
|
28
|
+
|
29
|
+
def finish(name, id, payload) #THREAD_LOCAL_ACCESS
|
30
|
+
event = pop_event(id)
|
31
|
+
event.payload.merge!(payload)
|
32
|
+
|
33
|
+
state = TransactionState.tl_get
|
34
|
+
|
35
|
+
request = event.request
|
36
|
+
attributes = {:'request.parameters' => request.params_hash}
|
37
|
+
attributes.merge!(
|
38
|
+
:'request.api_version' => request.version
|
39
|
+
)
|
40
|
+
|
41
|
+
NewRelic::Agent.add_custom_attributes(attributes)
|
42
|
+
|
43
|
+
if state.is_execution_traced? && !event.ignored?
|
44
|
+
stop_transaction(state, event)
|
45
|
+
else
|
46
|
+
NewRelic::Agent.instance.pop_trace_execution_flag
|
47
|
+
end
|
48
|
+
rescue => e
|
49
|
+
log_notification_error(e, name, 'finish')
|
50
|
+
end
|
51
|
+
|
52
|
+
def start_transaction(state, event)
|
53
|
+
Transaction.start(state, :controller,
|
54
|
+
:transaction_name => event.metric_name,
|
55
|
+
:apdex_start_time => event.queue_start
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def stop_transaction(state, event=nil)
|
60
|
+
txn = state.current_transaction
|
61
|
+
txn.ignore_apdex! if event.apdex_ignored?
|
62
|
+
txn.ignore_enduser! if event.enduser_ignored?
|
63
|
+
Transaction.stop(state)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module NewRelic::Agent::Instrumentation
|
2
|
+
module Praxis
|
3
|
+
module Blueprint
|
4
|
+
class RenderEvent < Event
|
5
|
+
|
6
|
+
def metric_name
|
7
|
+
view_name = self.payload[:view].name
|
8
|
+
blueprint_name = self.payload[:blueprint].class.name
|
9
|
+
|
10
|
+
# mark views rendered with list of fields
|
11
|
+
if self.payload[:fields] && self.payload[:fields].any?
|
12
|
+
view_name = "#{view_name}*"
|
13
|
+
end
|
14
|
+
|
15
|
+
"View/#{blueprint_name}/#{view_name}/Rendering"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module NewRelic
|
2
|
+
module Agent
|
3
|
+
module Instrumentation
|
4
|
+
module Praxis
|
5
|
+
module Blueprint
|
6
|
+
class RenderSubscriber < EventedSubscriber
|
7
|
+
def start(name, id, payload) #THREAD_LOCAL_ACCESS
|
8
|
+
event = RenderEvent.new(name, Time.now, nil, id, payload)
|
9
|
+
push_event(event)
|
10
|
+
|
11
|
+
state = TransactionState.tl_get
|
12
|
+
|
13
|
+
if state.is_execution_traced?
|
14
|
+
stack = state.traced_method_stack
|
15
|
+
event.frame = stack.push_frame(state, :praxis_blueprints, event.time)
|
16
|
+
end
|
17
|
+
rescue => e
|
18
|
+
log_notification_error(e, name, 'start')
|
19
|
+
end
|
20
|
+
|
21
|
+
def finish(name, id, payload) #THREAD_LOCAL_ACCESS
|
22
|
+
event = pop_event(id)
|
23
|
+
event.payload.merge!(payload)
|
24
|
+
|
25
|
+
state = TransactionState.tl_get
|
26
|
+
|
27
|
+
if state.is_execution_traced?
|
28
|
+
stack = state.traced_method_stack
|
29
|
+
stack.pop_frame(state, event.frame, event.metric_name, event.end)
|
30
|
+
end
|
31
|
+
rescue => e
|
32
|
+
log_notification_error(e, name, 'finish')
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module NewRelic
|
2
|
+
module Agent
|
3
|
+
module Instrumentation
|
4
|
+
module Praxis
|
5
|
+
module Mapper
|
6
|
+
|
7
|
+
class FinalizeSubscriber < EventedSubscriber
|
8
|
+
|
9
|
+
def start(name, id, payload) #THREAD_LOCAL_ACCESS
|
10
|
+
event = Event.new(name, Time.now, nil, id, payload)
|
11
|
+
push_event(event)
|
12
|
+
|
13
|
+
state = TransactionState.tl_get
|
14
|
+
|
15
|
+
if state.is_execution_traced?
|
16
|
+
stack = state.traced_method_stack
|
17
|
+
event.frame = stack.push_frame(state, :praxis_mapper, event.time)
|
18
|
+
end
|
19
|
+
rescue => e
|
20
|
+
log_notification_error(e, name, 'start')
|
21
|
+
end
|
22
|
+
|
23
|
+
def finish(name, id, payload) #THREAD_LOCAL_ACCESS
|
24
|
+
event = pop_event(id)
|
25
|
+
event.payload.merge!(payload)
|
26
|
+
|
27
|
+
state = TransactionState.tl_get
|
28
|
+
|
29
|
+
if state.is_execution_traced?
|
30
|
+
stack = state.traced_method_stack
|
31
|
+
stack.pop_frame(state, event.frame, 'Custom/PraxisMapper/Finalize', event.end)
|
32
|
+
end
|
33
|
+
rescue => e
|
34
|
+
log_notification_error(e, name, 'finish')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module NewRelic::Agent::Instrumentation
|
2
|
+
module Praxis
|
3
|
+
module Mapper
|
4
|
+
|
5
|
+
def self.instrument_praxis_mapper
|
6
|
+
::Praxis::Mapper::Query::Sequel.class_eval do
|
7
|
+
|
8
|
+
alias_method :_execute_without_newrelic, :_execute
|
9
|
+
def _execute(ds=nil)
|
10
|
+
rows = nil
|
11
|
+
NewRelic::Agent::Datastores.wrap("PraxisMapper", "select", self.model.name) do
|
12
|
+
NewRelic::Agent.disable_all_tracing do
|
13
|
+
rows = _execute_without_newrelic(ds)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
rows
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module NewRelic
|
2
|
+
module Agent
|
3
|
+
module Instrumentation
|
4
|
+
module Praxis
|
5
|
+
module Mapper
|
6
|
+
|
7
|
+
class LoadSubscriber < EventedSubscriber
|
8
|
+
|
9
|
+
def start(name, id, payload) #THREAD_LOCAL_ACCESS
|
10
|
+
event = LoadEvent.new(name, Time.now, nil, id, payload)
|
11
|
+
push_event(event)
|
12
|
+
|
13
|
+
state = TransactionState.tl_get
|
14
|
+
|
15
|
+
if state.is_execution_traced?
|
16
|
+
stack = state.traced_method_stack
|
17
|
+
event.frame = stack.push_frame(state, :praxis_mapper, event.time)
|
18
|
+
end
|
19
|
+
rescue => e
|
20
|
+
log_notification_error(e, name, 'start')
|
21
|
+
end
|
22
|
+
|
23
|
+
def finish(name, id, payload) #THREAD_LOCAL_ACCESS
|
24
|
+
event = pop_event(id)
|
25
|
+
event.payload.merge!(payload)
|
26
|
+
|
27
|
+
state = TransactionState.tl_get
|
28
|
+
|
29
|
+
if state.is_execution_traced?
|
30
|
+
stack = state.traced_method_stack
|
31
|
+
stack.pop_frame(state, event.frame, event.metric_name, event.end)
|
32
|
+
end
|
33
|
+
rescue => e
|
34
|
+
log_notification_error(e, name, 'finish')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'newrelic-praxis/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "newrelic-praxis"
|
8
|
+
spec.version = Praxis::NewRelic::VERSION
|
9
|
+
spec.authors = ["Josep M. Blanquer","Dane Jensen"]
|
10
|
+
spec.summary = %q{New Relic plugin for Praxis.}
|
11
|
+
spec.email = ["blanquer@gmail.com","dane.jensen@gmail.com"]
|
12
|
+
|
13
|
+
spec.homepage = "https://github.com/rightscale/newrelic-praxis"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = ">=2.1"
|
16
|
+
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
|
21
|
+
spec.add_runtime_dependency 'praxis', [">= 0.18"]
|
22
|
+
spec.add_runtime_dependency 'praxis-blueprints', [">= 2.2"]
|
23
|
+
spec.add_runtime_dependency 'praxis-mapper', [">= 4.1"]
|
24
|
+
|
25
|
+
spec.add_runtime_dependency 'newrelic_rpm', [">= 3.13"]
|
26
|
+
spec.add_runtime_dependency 'activesupport', [">= 3"]
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
29
|
+
spec.add_development_dependency "rake", "~> 0"
|
30
|
+
|
31
|
+
end
|
data/screenshot.png
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: newrelic-praxis
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Josep M. Blanquer
|
8
|
+
- Dane Jensen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-09-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: praxis
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0.18'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0.18'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: praxis-blueprints
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '2.2'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '2.2'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: praxis-mapper
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '4.1'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '4.1'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: newrelic_rpm
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '3.13'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.13'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: activesupport
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '3'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: bundler
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '1.6'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '1.6'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rake
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
description:
|
113
|
+
email:
|
114
|
+
- blanquer@gmail.com
|
115
|
+
- dane.jensen@gmail.com
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- ".gitignore"
|
121
|
+
- CHANGELOG.md
|
122
|
+
- Gemfile
|
123
|
+
- LICENSE
|
124
|
+
- README.md
|
125
|
+
- Rakefile
|
126
|
+
- lib/newrelic-praxis.rb
|
127
|
+
- lib/newrelic-praxis/instrumentation/praxis.rb
|
128
|
+
- lib/newrelic-praxis/instrumentation/praxis_blueprints.rb
|
129
|
+
- lib/newrelic-praxis/instrumentation/praxis_mapper.rb
|
130
|
+
- lib/newrelic-praxis/praxis/action_event.rb
|
131
|
+
- lib/newrelic-praxis/praxis/action_subscriber.rb
|
132
|
+
- lib/newrelic-praxis/praxis_blueprints/render_event.rb
|
133
|
+
- lib/newrelic-praxis/praxis_blueprints/render_subscriber.rb
|
134
|
+
- lib/newrelic-praxis/praxis_mapper/finalize_subscriber.rb
|
135
|
+
- lib/newrelic-praxis/praxis_mapper/helper.rb
|
136
|
+
- lib/newrelic-praxis/praxis_mapper/load_event.rb
|
137
|
+
- lib/newrelic-praxis/praxis_mapper/load_subscriber.rb
|
138
|
+
- lib/newrelic-praxis/version.rb
|
139
|
+
- newrelic-praxis.gemspec
|
140
|
+
- screenshot.png
|
141
|
+
homepage: https://github.com/rightscale/newrelic-praxis
|
142
|
+
licenses:
|
143
|
+
- MIT
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '2.1'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.4.5.1
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: New Relic plugin for Praxis.
|
165
|
+
test_files: []
|