newrelic-praxis 1.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.
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
@@ -0,0 +1,2 @@
1
+ .ruby-version
2
+ Gemfile.lock
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # newrelic-praxis changelog
2
+
3
+ ## next
4
+
5
+ ## 1.0
6
+
7
+ * Initial release of the Gem:
8
+ * It has support for Praxis (the API framework), Praxis Blueprints and Praxis Mapper.
9
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
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,2 @@
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
@@ -0,0 +1,5 @@
1
+ require 'newrelic_rpm'
2
+
3
+ require 'newrelic-praxis/instrumentation/praxis'
4
+ require 'newrelic-praxis/instrumentation/praxis_blueprints'
5
+ require 'newrelic-praxis/instrumentation/praxis_mapper'
@@ -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,13 @@
1
+ module NewRelic::Agent::Instrumentation
2
+ module Praxis
3
+ module Mapper
4
+ class LoadEvent < Event
5
+ def metric_name
6
+ model_name = self.payload[:model].name
7
+
8
+ "PraxisMapper/#{model_name}/Load"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,5 @@
1
+ module Praxis
2
+ module NewRelic
3
+ VERSION = "1.0"
4
+ end
5
+ 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: []