rpm_contrib 1.0.0 → 1.0.2

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 CHANGED
@@ -1,3 +1,11 @@
1
+ * Version 1.0.2
2
+
3
+ Improved Camping support
4
+
5
+ * Version 1.0.1
6
+
7
+ Removed DelayedJob, put back in core agent
8
+
1
9
  * Version 1.0.0
2
10
 
3
11
  Initial Release:
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ begin
18
18
  gem.email = "support@newrelic.com"
19
19
  gem.homepage = "http://github.com/newrelic/rpm_contrib"
20
20
  gem.author = "Bill Kayser"
21
- gem.add_dependency 'newrelic_rpm', '>= 2.10.2.2'
21
+ gem.add_dependency 'newrelic_rpm', '>= 2.10.6'
22
22
  gem.version = version
23
23
  gem.files = FileList['LICENSE', 'README*', 'lib/**/*.rb', 'bin/*', '[A-Z]*', 'test/**/*'].to_a
24
24
  end
@@ -0,0 +1,12 @@
1
+ require 'new_relic/control/ruby'
2
+ # This is the framework control object for Camping apps.
3
+ # It is loaded by virtue of detecting 'camping' as the framework
4
+ # in the rpm_contrib/detection/camping.rb file. It gets loaded
5
+ # by the new_relic/control.rb file.
6
+ class NewRelic::Control::Camping < NewRelic::Control::Ruby
7
+ def init_config(options)
8
+ super
9
+ @local_env.dispatcher = 'camping'
10
+ self['app_name'] ||= 'Camping Application'
11
+ end
12
+ end
data/lib/rpm_contrib.rb CHANGED
@@ -1,17 +1,25 @@
1
- # Hook instrumentation and samplers in this gem into the normal RPM
2
- # start up sequence.
3
- require 'newrelic_rpm'
1
+
2
+ RPM_CONTRIB_LIB = File.dirname(__FILE__)
3
+
4
4
  module RPMContrib
5
-
6
- lib_root = File.dirname(__FILE__)
7
-
8
- # Tell the agent to load all the files in the rpm_contrib/instrumentation directory.
9
-
10
- NewRelic::Agent.add_instrumentation(lib_root+"/rpm_contrib/instrumentation/**/*.rb")
11
-
12
- # Load all the Sampler class definitions. These will register
13
- # automatically with the agent.
14
- Dir.glob(lib_root + "/rpm_contrib/samplers/**/*.rb") { |file| require file }
15
-
16
- VERSION = File.read(lib_root+"/../CHANGELOG")[/Version ([\d\.]+)$/, 1]
5
+ VERSION = File.read(RPM_CONTRIB_LIB+"/../CHANGELOG")[/Version ([\d\.]+)$/, 1]
17
6
  end
7
+
8
+
9
+ # Perform any framework/dispatcher detection before loading the rpm
10
+ # gem.
11
+
12
+ raise "The rpm_contrib gem must be loaded before the newrelic_rpm gem." if defined?(::NewRelic)
13
+
14
+ Dir.glob(RPM_CONTRIB_LIB + "/rpm_contrib/detection/**/*.rb") { |file| require file }
15
+
16
+ require 'newrelic_rpm'
17
+
18
+ # Tell the agent to load all the files in the rpm_contrib/instrumentation directory.
19
+
20
+ NewRelic::Agent.add_instrumentation(RPM_CONTRIB_LIB+"/rpm_contrib/instrumentation/**/*.rb")
21
+
22
+ # Load all the Sampler class definitions. These will register
23
+ # automatically with the agent.
24
+ Dir.glob(RPM_CONTRIB_LIB + "/rpm_contrib/samplers/**/*.rb") { |file| require file }
25
+
@@ -0,0 +1,23 @@
1
+ # Detect when running under camping and set the framework and dispatcher.
2
+
3
+ module NewRelic
4
+ class LocalEnvironment
5
+ module Camping
6
+ def discover_framework
7
+ if defined?(::Camping)
8
+ puts "framework is camping"
9
+ @framework = 'camping'
10
+ else
11
+ super
12
+ end
13
+ end
14
+ def discover_dispatcher
15
+ super
16
+ if defined?(::Camping) && @dispatcher.nil?
17
+ @dispatcher = 'camping'
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -4,39 +4,33 @@ module RPMContrib
4
4
  module Instrumentation
5
5
  # == Instrumentation for Camping
6
6
  # To instrument all controllers do the following:
7
- # 1. Add the necessary NewRelic-specific requires in your require section
7
+ # 1. Add require 'rpm_contrib' after loading camping.
8
8
  # 2. Add an include at the end of your main Camping app module
9
- # 3. Add a call to NewRelic::Agent.manual_start at the end of the file to start the agent
10
- # 4. Run the following command to get the NewRelic license key to use: heroku config -all
11
- # 5. Create a newrelic.yml under the /config folder with the following content:
9
+ # 3. Run the following command to get the NewRelic license key to use: heroku config -all
10
+ # 4. Create a newrelic.yml under the /config folder with the following content:
12
11
  #
13
- # common: &default_settings
14
- # license_key: 'PASTE THE VALUE OF NEW_RELIC_LICENSE_KEY HERE'
15
- # agent_enabled: true
16
- # app_name: PASTE THE NAME OF YOUR CAMPING APP HERE
17
- # enabled: true
12
+ # common: &default_settings
13
+ # license_key: 'PASTE THE VALUE OF NEW_RELIC_LICENSE_KEY HERE'
14
+ # app_name: PASTE THE NAME OF YOUR CAMPING APP HERE
15
+ # monitor_mode: true
18
16
  #
19
- # production:
20
- # <<: *default_settings
21
- # enabled: true
17
+ # production:
18
+ # <<: *default_settings
19
+ #
20
+ # Camping code example:
21
+ # -------------------------------------------------------------------------------------
22
22
  #
23
- # Camping code example:
24
- # --------------------------------------------------------------------------------------
25
23
  # require "newrelic_rpm"
26
- # require 'new_relic/agent/agent'
27
- # require 'new_relic/agent/instrumentation/controller_instrumentation'
28
- # require 'new_relic/agent/instrumentation/camping'
29
24
  #
30
25
  # Camping.goes :NewRelicCampingTest
31
26
  #
32
27
  # module NewRelicCampingTest
33
- # # your code
28
+ # # your code
29
+ #
30
+ # include NewRelic::Agent::Instrumentation::Camping
34
31
  #
35
- # include NewRelic::Agent::Instrumentation::ControllerInstrumentation
36
- # include NewRelic::Agent::Instrumentation::Camping
37
32
  # end
38
33
  #
39
- # NewRelic::Agent.manual_start
40
34
  #
41
35
 
42
36
  module Camping
@@ -49,23 +43,8 @@ module RPMContrib
49
43
  # we need to evaluate "weld" the NewRelic plugin in the context of the new Base
50
44
 
51
45
  (Kernel.const_get(mod.name)::Base).module_eval do
52
-
53
- # Add the new method to the Camping app's Base module
54
- # since the Camping::Base module is being included
55
- # in every Camping controller
56
-
57
- def service_with_newrelic(*args)
58
- perform_action_with_newrelic_trace(:category => :rack) do
59
- service_without_newrelic(*args)
60
- end
61
- end
62
-
63
- # Alias the "standard" service method
64
- # so we can provide a level of indirection
65
- # to perform the tracing for NewRelic
66
-
67
- alias service_without_newrelic service
68
- alias service service_with_newrelic
46
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
47
+ add_transaction_tracer :service
69
48
  end
70
49
  end
71
50
 
data/test/helper.rb CHANGED
@@ -3,7 +3,10 @@ require 'test/unit'
3
3
 
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ require 'newrelic_rpm'
6
7
  require 'rpm_contrib'
7
8
 
8
9
  class Test::Unit::TestCase
9
10
  end
11
+
12
+ require 'schema.rb'
data/test/schema.rb ADDED
@@ -0,0 +1,19 @@
1
+ # Use this file to add tables you need to do testing
2
+ # These are created in a sqllite memory DB
3
+
4
+ begin
5
+ require 'sqlite3'
6
+ require 'active_record'
7
+
8
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
9
+ ActiveRecord::Migration.verbose = false
10
+
11
+ ActiveRecord::Schema.define do
12
+
13
+ create_table :stories, :force => true do |table|
14
+ table.string :text
15
+ end
16
+ end
17
+ rescue LoadError
18
+ # Skip AR tests
19
+ end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require "#{File.dirname(__FILE__)}/helper"
2
2
 
3
3
  class TestRpmContrib < Test::Unit::TestCase
4
4
  def test_something_for_real
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpm_contrib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 2
9
+ version: 1.0.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - Bill Kayser
@@ -9,19 +14,23 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-01-28 00:00:00 -08:00
17
+ date: 2010-03-05 00:00:00 -08:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: newrelic_rpm
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
23
- version: 2.10.2.2
24
- version:
27
+ segments:
28
+ - 2
29
+ - 10
30
+ - 6
31
+ version: 2.10.6
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  description: " Community contributed instrumentation for various frameworks based on\n the New Relic Ruby monitoring gem newrelic_rpm.\n"
26
35
  email: support@newrelic.com
27
36
  executables: []
@@ -36,14 +45,14 @@ files:
36
45
  - LICENSE
37
46
  - README.md
38
47
  - Rakefile
48
+ - lib/new_relic/control/camping.rb
39
49
  - lib/rpm_contrib.rb
50
+ - lib/rpm_contrib/detection/camping.rb
40
51
  - lib/rpm_contrib/instrumentation/authlogic.rb
41
52
  - lib/rpm_contrib/instrumentation/camping.rb
42
- - lib/rpm_contrib/instrumentation/delayed_job_instrumentation.rb
43
53
  - lib/rpm_contrib/instrumentation/paperclip.rb
44
- - lib/rpm_contrib/samplers/delayed_job_lock_sampler.rb
45
- - test/delayed_job_instrumentation/delayed_job_test.rb
46
54
  - test/helper.rb
55
+ - test/schema.rb
47
56
  - test/test_rpm_contrib.rb
48
57
  has_rdoc: true
49
58
  homepage: http://github.com/newrelic/rpm_contrib
@@ -58,22 +67,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
67
  requirements:
59
68
  - - ">="
60
69
  - !ruby/object:Gem::Version
70
+ segments:
71
+ - 0
61
72
  version: "0"
62
- version:
63
73
  required_rubygems_version: !ruby/object:Gem::Requirement
64
74
  requirements:
65
75
  - - ">="
66
76
  - !ruby/object:Gem::Version
77
+ segments:
78
+ - 0
67
79
  version: "0"
68
- version:
69
80
  requirements: []
70
81
 
71
82
  rubyforge_project:
72
- rubygems_version: 1.3.5
83
+ rubygems_version: 1.3.6
73
84
  signing_key:
74
85
  specification_version: 3
75
86
  summary: Contributed Instrumentation for New Relic RPM
76
87
  test_files:
77
- - test/delayed_job_instrumentation/delayed_job_test.rb
78
88
  - test/helper.rb
89
+ - test/schema.rb
79
90
  - test/test_rpm_contrib.rb
@@ -1,45 +0,0 @@
1
- module RPMContrib::Instrumentation::DelayedJobInstrumentation
2
- extend self
3
- Delayed::Job.class_eval do
4
- include NewRelic::Agent::Instrumentation::ControllerInstrumentation
5
- if self.instance_methods.include?('name')
6
- add_transaction_tracer "invoke_job", :category => :task, :name => '#{self.name}'
7
- else
8
- add_transaction_tracer "invoke_job", :category => :task
9
- end
10
- end
11
-
12
- Delayed::Worker.class_eval do
13
- def initialize_with_new_relic(*args)
14
- initialize_without_new_relic(*args)
15
- NewRelic::.delayed_worker = self
16
- end
17
-
18
- alias initialize_without_new_relic initialize
19
- alias initialize initialize_with_new_relic
20
- end
21
-
22
- def delayed_worker=(w)
23
- @delayed_worker = w
24
- env = NewRelic::Control.instance.local_env
25
- env.dispatcher = :delayed_job
26
- env.dispatcher_instance_id = case
27
- when @delayed_worker.respond_to?(:name)
28
- @delayed_worker.name
29
- when @delayed_worker.class.respond_to?(:default_name)
30
- @delayed_worker.class.default_name
31
- else
32
- "host:#{Socket.gethostname} pid:#{Process.pid}" rescue "pid:#{Process.pid}"
33
- end
34
-
35
- env.append_environment_value 'Dispatcher', @dispatcher.to_s
36
- env.append_environment_value 'Dispatcher instance id', @dispatcher_instance_id
37
-
38
- @delayed_worker
39
- end
40
-
41
- def delayed_worker
42
- @delayed_worker
43
- end
44
-
45
- end if defined?(Delayed::Job)
@@ -1,28 +0,0 @@
1
- module NewRelic::Agent::Samplers
2
- class DelayedJobLockSampler < NewRelic::Agent::Sampler
3
- def initialize
4
- super :delayed_job_lock
5
- raise Unsupported, "No delayed job workers running" unless Instrumentation::DelayedJobInstrumentation.delayed_worker
6
- end
7
-
8
- def stats
9
- stats_engine.get_stats("DJ/Locked Jobs", false)
10
- end
11
-
12
- def local_env
13
- NewRelic::Control.instance.local_env
14
- end
15
-
16
- def worker_name
17
- local_env.dispatcher_instance_id
18
- end
19
-
20
- def locked_jobs
21
- Delayed::Job.count(:conditions => {:locked_by => worker_name})
22
- end
23
-
24
- def poll
25
- stats.record_data_point locked_jobs
26
- end
27
- end
28
- end
@@ -1,108 +0,0 @@
1
- module DelayedJobInstrumentation
2
- require File.expand_path(File.join(File.dirname(__FILE__),'/../test_helper'))
3
-
4
- class LongRunningJob
5
- def perform
6
- sleep 5
7
- end
8
- end
9
-
10
- class NamedJob
11
- def display_name
12
- 'some custom name'
13
- end
14
- def perform
15
- true
16
- end
17
- end
18
-
19
- class DelayedJobTest < Test::Unit::TestCase
20
- def local_env
21
- NewRelic::Control.instance.local_env
22
- end
23
-
24
- def worker_name
25
- local_env.dispatcher_instance_id
26
- end
27
-
28
- def lock_n_jobs(n=1)
29
- n.times do
30
- job = Delayed::Job.create
31
- job.update_attributes({
32
- :locked_at => Time.now,
33
- :locked_by => worker_name
34
- })
35
- end
36
- end
37
-
38
- def setup
39
- NewRelic::Agent.manual_start
40
- @agent = NewRelic::Agent.instance
41
-
42
- @agent.transaction_sampler.harvest
43
- @agent.stats_engine.clear_stats
44
- end
45
-
46
- def teardown
47
- @agent.instance_variable_set("@histogram", NewRelic::Histogram.new)
48
- end
49
-
50
- def test_job_instrumentation
51
- job = Delayed::Job.new(:payload_object => LongRunningJob.new)
52
- job_name = "Controller/Task/Delayed::Job/LongRunningJob"
53
-
54
- job.invoke_job
55
- job_stats = @agent.stats_engine.get_stats(job_name)
56
-
57
- assert @agent.stats_engine.metrics.include?(job_name)
58
- assert_equal 1, job_stats.call_count
59
- end
60
-
61
- def test_custom_name
62
- job = Delayed::Job.new(:payload_object => NamedJob.new)
63
- job_name = "Controller/Task/Delayed::Job/some custom name"
64
-
65
- job.invoke_job
66
- job_stats = @agent.stats_engine.get_stats(job_name)
67
-
68
- assert @agent.stats_engine.metrics.include?(job_name)
69
- assert_equal 1, job_stats.call_count
70
- end
71
-
72
- def test_lock_sampler
73
- stats_engine = NewRelic::Agent::StatsEngine.new
74
- sampler = NewRelic::Agent::Samplers::DelayedJobLockSampler.new
75
- sampler.stats_engine = stats_engine
76
-
77
- lock_n_jobs(1)
78
- sampler.poll
79
-
80
- assert_equal 1, sampler.stats.data_point_count
81
- assert_equal 1, sampler.stats.min_call_time
82
- assert_equal 1, sampler.stats.max_call_time
83
-
84
- lock_n_jobs(4)
85
- sampler.poll
86
-
87
- assert_equal 2, sampler.stats.data_point_count
88
- assert_equal 1, sampler.stats.min_call_time
89
- assert_equal 5, sampler.stats.max_call_time
90
-
91
- lock_n_jobs(5)
92
- sampler.poll
93
- sampler.poll
94
-
95
- assert_equal 4, sampler.stats.data_point_count
96
- assert_equal 1, sampler.stats.min_call_time
97
- assert_equal 10, sampler.stats.max_call_time
98
-
99
- Delayed::Job.destroy_all
100
- sampler.poll
101
-
102
- assert_equal 5, sampler.stats.data_point_count
103
- assert_equal 0, sampler.stats.min_call_time
104
- assert_equal 10, sampler.stats.max_call_time
105
- end
106
-
107
- end
108
- end if defined? Delayed::Job