newrelic_moped 0.0.3 → 0.0.4

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 CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
- #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
1
+ require "rake/testtask"
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs = ['test']
5
+ t.test_files = FileList['test/*_test.rb']
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
@@ -13,28 +13,46 @@ DependencyDetection.defer do
13
13
 
14
14
  executes do
15
15
  Moped::Node.class_eval do
16
- def process_with_newrelic_trace(operation, &callback)
17
- if operation.respond_to?(:collection)
18
- collection = operation.collection
16
+ include NewRelic::Moped::Instrumentation
17
+ alias_method :logging_without_newrelic_trace, :logging
18
+ alias_method :logging, :logging_with_newrelic_trace
19
+ end
20
+ end
21
+ end
19
22
 
20
- self.class.trace_execution_scoped(["Moped::process[#{collection}]"]) do
21
- t0 = Time.now
23
+ module NewRelic
24
+ module Moped
25
+ module Instrumentation
26
+ def logging_with_newrelic_trace(operations, &blk)
27
+ operation_name, collection = determine_operation_and_collection(operations.first)
28
+ log_statement = operations.first.log_inspect
22
29
 
23
- begin
24
- process_without_newrelic_trace(operation, &callback)
25
- ensure
26
- elapsed_time = (Time.now - t0).to_f
27
- NewRelic::Agent.instance.transaction_sampler.notice_sql(operation.log_inspect,
28
- nil, elapsed_time)
29
- NewRelic::Agent.instance.sql_sampler.notice_sql(operation.log_inspect, nil,
30
- nil, elapsed_time)
31
- end
32
- end
30
+ self.class.trace_execution_scoped("Database/#{collection}/#{operation_name}") do
31
+ t0 = Time.now
32
+ res = logging_without_newrelic_trace(operations, &blk)
33
+ elapsed_time = (Time.now - t0).to_f
34
+ NewRelic::Agent.instance.transaction_sampler.notice_sql(log_statement, nil, elapsed_time)
35
+ NewRelic::Agent.instance.sql_sampler.notice_sql(log_statement, nil, nil, elapsed_time)
36
+ res
33
37
  end
34
38
  end
35
39
 
36
- alias_method :process_without_newrelic_trace, :process
37
- alias_method :process, :process_with_newrelic_trace
40
+ def determine_operation_and_collection(operation)
41
+ log_statement = operation.log_inspect
42
+ collection = "Unknown"
43
+ if operation.respond_to?(:collection)
44
+ collection = operation.collection
45
+ end
46
+ operation_name = log_statement.split[0]
47
+ if operation_name == 'COMMAND' && log_statement.include?(":mapreduce")
48
+ operation_name = 'MAPREDUCE'
49
+ collection = log_statement[/:mapreduce=>"([^"]+)/,1]
50
+ elsif operation_name == 'COMMAND' && log_statement.include?(":count")
51
+ operation_name = 'COUNT'
52
+ collection = log_statement[/:count=>"([^"]+)/,1]
53
+ end
54
+ return operation_name, collection
55
+ end
38
56
  end
39
57
  end
40
- end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module NewrelicMoped
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -14,4 +14,8 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "newrelic_moped"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = NewrelicMoped::VERSION
17
+ gem.add_dependency 'newrelic_rpm', '~> 3.5.3.25'
18
+ gem.add_dependency 'moped'
19
+
20
+ gem.add_development_dependency 'rake'
17
21
  end
@@ -3,6 +3,7 @@ require 'test/unit'
3
3
  require 'moped'
4
4
 
5
5
  require File.expand_path(File.dirname(__FILE__) + '/../lib/newrelic_moped/instrumentation')
6
+ require File.expand_path(File.dirname(__FILE__) + '/moped_command_fake')
6
7
 
7
8
  class FakeOpWithCollection < Struct.new(:collection, :log_inspect)
8
9
  end
@@ -14,18 +15,16 @@ class TestInstrumentation < Test::Unit::TestCase
14
15
  include NewRelic::Agent::Instrumentation::ControllerInstrumentation
15
16
 
16
17
  def setup
17
- DependencyDetection.detect!
18
18
  NewRelic::Agent.manual_start
19
19
  @engine = NewRelic::Agent.instance.stats_engine
20
20
  @engine.clear_stats
21
21
 
22
22
  @sampler = NewRelic::Agent.instance.transaction_sampler
23
- @sampler.enable
24
23
  @sampler.reset!
25
24
  @sampler.start_builder
26
25
 
27
26
  Moped::Node.class_eval do
28
- def process_without_newrelic_trace(operation, &callback)
27
+ def logging_with_newrelic_trace(operations, &callback)
29
28
  # do nothing
30
29
  end
31
30
  end
@@ -41,7 +40,7 @@ class TestInstrumentation < Test::Unit::TestCase
41
40
  fake_op = FakeOpWithCollection.new([], "Fake")
42
41
 
43
42
  assert_nothing_raised do
44
- @node.process_with_newrelic_trace(fake_op)
43
+ @node.logging_with_newrelic_trace(fake_op)
45
44
  end
46
45
  end
47
46
 
@@ -49,7 +48,39 @@ class TestInstrumentation < Test::Unit::TestCase
49
48
  fake_op = FakeOpWithoutCollection.new("Fake")
50
49
 
51
50
  assert_nothing_raised do
52
- @node.process_with_newrelic_trace(fake_op)
51
+ @node.logging_with_newrelic_trace(fake_op)
53
52
  end
54
53
  end
55
54
  end
55
+
56
+ class NewRelicMopedInstrumentationTest < Test::Unit::TestCase
57
+ include NewRelic::Moped::Instrumentation
58
+
59
+ def test_when_command_is_mapreduce
60
+ command = MopedCommandWithCollectionFake.new("COMMAND database=my_database command={:mapreduce=>\"users\", :query=>{}}", "other_collection")
61
+ operation, collection = determine_operation_and_collection(command)
62
+ assert_equal("MAPREDUCE", operation)
63
+ assert_equal("users", collection, "it should parse collection from statement")
64
+ end
65
+
66
+ def test_query_when_operation_responds_to_collection
67
+ command = MopedCommandWithCollectionFake.new("QUERY database=my_database collection=xyz", "users")
68
+ operation, collection = determine_operation_and_collection(command)
69
+ assert_equal("QUERY", operation)
70
+ assert_equal("users", collection, "it should use collection from operation")
71
+ end
72
+
73
+ def test_when_command_is_count
74
+ command = MopedCommandWithCollectionFake.new("COMMAND database=my_database command={:count=>\"users\", query=>{}}", "other_collection")
75
+ operation, collection = determine_operation_and_collection(command)
76
+ assert_equal("COUNT", operation)
77
+ assert_equal("users", collection, "it should parse collection from statement")
78
+ end
79
+
80
+ def test_command_when_operation_does_not_respond_to_collection
81
+ command = MopedCommandFake.new("COMMAND database=admin command={:ismaster=>1}")
82
+ operation, collection = determine_operation_and_collection(command)
83
+ assert_equal("COMMAND", operation)
84
+ assert_equal("Unknown", collection, "it should set collection name to Unknown")
85
+ end
86
+ end
@@ -0,0 +1,27 @@
1
+
2
+ class MopedCommandFake
3
+
4
+ def initialize(log_statement)
5
+ @log_statement = log_statement
6
+ end
7
+
8
+ def log_inspect
9
+ @log_statement
10
+ end
11
+ end
12
+
13
+ class MopedCommandWithCollectionFake
14
+
15
+ def initialize(log_statement, collection)
16
+ @log_statement = log_statement
17
+ @collection = collection
18
+ end
19
+
20
+ def log_inspect
21
+ @log_statement
22
+ end
23
+
24
+ def collection
25
+ @collection
26
+ end
27
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic_moped
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,56 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-10 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-12-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: newrelic_rpm
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.5.3.25
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: 3.5.3.25
30
+ - !ruby/object:Gem::Dependency
31
+ name: moped
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
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
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
14
62
  description: New Relic Instrumentation for Moped & Mongoid 3
15
63
  email:
16
64
  - stephenbartholomew@gmail.com
@@ -19,6 +67,7 @@ extensions: []
19
67
  extra_rdoc_files: []
20
68
  files:
21
69
  - .gitignore
70
+ - Gemfile
22
71
  - LICENSE
23
72
  - README.md
24
73
  - Rakefile
@@ -27,6 +76,7 @@ files:
27
76
  - lib/newrelic_moped/version.rb
28
77
  - newrelic_moped.gemspec
29
78
  - test/instrumentation_test.rb
79
+ - test/moped_command_fake.rb
30
80
  homepage: ''
31
81
  licenses: []
32
82
  post_install_message:
@@ -53,3 +103,5 @@ specification_version: 3
53
103
  summary: New Relic Instrumentation for Moped & Mongoid 3
54
104
  test_files:
55
105
  - test/instrumentation_test.rb
106
+ - test/moped_command_fake.rb
107
+ has_rdoc: