newrelic_rpm 3.15.1.316 → 3.15.2.317

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +41 -0
  3. data/lib/new_relic/agent/agent.rb +1 -1
  4. data/lib/new_relic/agent/autostart.rb +1 -1
  5. data/lib/new_relic/agent/database.rb +72 -165
  6. data/lib/new_relic/agent/database/explain_plan_helpers.rb +127 -0
  7. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -1
  8. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +0 -2
  9. data/lib/new_relic/agent/instrumentation/active_record.rb +5 -5
  10. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +10 -8
  11. data/lib/new_relic/agent/instrumentation/data_mapper.rb +2 -1
  12. data/lib/new_relic/agent/instrumentation/grape.rb +23 -9
  13. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +1 -6
  14. data/lib/new_relic/agent/instrumentation/padrino.rb +36 -0
  15. data/lib/new_relic/agent/method_tracer.rb +20 -18
  16. data/lib/new_relic/agent/new_relic_service.rb +3 -33
  17. data/lib/new_relic/agent/pipe_service.rb +0 -4
  18. data/lib/new_relic/agent/sql_sampler.rb +3 -3
  19. data/lib/new_relic/agent/transaction/trace_node.rb +2 -5
  20. data/lib/new_relic/agent/transaction_sampler.rb +2 -2
  21. data/lib/new_relic/metric_data.rb +6 -14
  22. data/lib/new_relic/version.rb +1 -1
  23. data/newrelic_rpm.gemspec +1 -1
  24. data/test/environments/lib/environments/runner.rb +1 -1
  25. data/test/environments/rails40/Gemfile +9 -0
  26. data/test/environments/rails41/Gemfile +9 -0
  27. data/test/environments/rails42/Gemfile +9 -0
  28. data/test/multiverse/lib/multiverse/suite.rb +12 -0
  29. data/test/multiverse/suites/agent_only/harvest_timestamps_test.rb +0 -31
  30. data/test/multiverse/suites/grape/Envfile +1 -1
  31. data/test/multiverse/suites/mongo/Envfile +3 -0
  32. data/test/multiverse/suites/mongo/mongo2_instrumentation_test.rb +3 -2
  33. data/test/multiverse/suites/padrino/Envfile +8 -0
  34. data/test/multiverse/suites/typhoeus/Envfile +21 -0
  35. data/test/new_relic/agent/database_test.rb +216 -144
  36. data/test/new_relic/agent/new_relic_service_test.rb +0 -58
  37. data/test/new_relic/metric_data_test.rb +24 -71
  38. data/test/new_relic/metric_spec_test.rb +3 -4
  39. data/test/new_relic/rack/developer_mode_test.rb +5 -2
  40. metadata +4 -2
@@ -267,7 +267,6 @@ class NewRelicServiceTest < Minitest::Test
267
267
  @http_handle.respond_to(:metric_data, dummy_rsp)
268
268
  stats_hash = NewRelic::Agent::StatsHash.new
269
269
  stats_hash.harvested_at = Time.now
270
- @service.expects(:fill_metric_id_cache).with(dummy_rsp)
271
270
  response = @service.metric_data(stats_hash)
272
271
 
273
272
  assert_equal 4, @http_handle.last_request_payload.size
@@ -276,7 +275,6 @@ class NewRelicServiceTest < Minitest::Test
276
275
 
277
276
  def test_metric_data_sends_harvest_timestamps
278
277
  @http_handle.respond_to(:metric_data, 'foo')
279
- @service.stubs(:fill_metric_id_cache)
280
278
 
281
279
  t0 = freeze_time
282
280
  stats_hash = NewRelic::Agent::StatsHash.new
@@ -297,36 +295,6 @@ class NewRelicServiceTest < Minitest::Test
297
295
  assert_in_delta(t0.to_f, last_harvest_timestamp, 0.0001)
298
296
  end
299
297
 
300
- def test_fill_metric_id_cache_from_collect_response
301
- response = [[{"scope"=>"Controller/blogs/index", "name"=>"Database/SQL/other"}, 1328],
302
- [{"scope"=>"", "name"=>"WebFrontend/QueueTime"}, 10],
303
- [{"scope"=>"", "name"=>"ActiveRecord/Blog/find"}, 1017]]
304
-
305
- @service.send(:fill_metric_id_cache, response)
306
-
307
- cache = @service.metric_id_cache
308
- assert_equal 1328, cache[NewRelic::MetricSpec.new('Database/SQL/other', 'Controller/blogs/index')]
309
- assert_equal 10, cache[NewRelic::MetricSpec.new('WebFrontend/QueueTime')]
310
- assert_equal 1017, cache[NewRelic::MetricSpec.new('ActiveRecord/Blog/find')]
311
- end
312
-
313
- def test_caches_metric_ids_for_future_use
314
- dummy_rsp = [[{ 'name' => 'a', 'scope' => '' }, 42]]
315
- @http_handle.respond_to(:metric_data, dummy_rsp)
316
-
317
- hash = build_stats_hash('a' => 1)
318
-
319
- @service.metric_data(hash)
320
-
321
- hash = build_stats_hash('a' => 1)
322
- stats = hash[NewRelic::MetricSpec.new('a')]
323
-
324
- results = @service.build_metric_data_array(hash)
325
- assert_nil(results.first.metric_spec)
326
- assert_equal(stats, results.first.stats)
327
- assert_equal(42, results.first.metric_id)
328
- end
329
-
330
298
  def test_metric_data_harvest_time_based_on_stats_hash_creation
331
299
  t0 = freeze_time
332
300
  dummy_rsp = 'met rick date uhh'
@@ -427,7 +395,6 @@ class NewRelicServiceTest < Minitest::Test
427
395
 
428
396
  @service.connect
429
397
  @http_handle.respond_to(:metric_data, 0)
430
- @service.stubs(:fill_metric_id_cache)
431
398
  stats_hash = NewRelic::Agent::StatsHash.new
432
399
  stats_hash.harvested_at = Time.now
433
400
  @service.metric_data(stats_hash)
@@ -680,25 +647,6 @@ class NewRelicServiceTest < Minitest::Test
680
647
  assert_equal(hash[spec2], metric_data_2.stats)
681
648
  end
682
649
 
683
- def test_build_metric_data_array_uses_metric_id_cache_if_possible
684
- hash = NewRelic::Agent::StatsHash.new
685
-
686
- spec1 = NewRelic::MetricSpec.new('foo')
687
- spec2 = NewRelic::MetricSpec.new('bar')
688
- hash.record(spec1, 1)
689
- hash.record(spec2, 1)
690
-
691
- @service.stubs(:metric_id_cache).returns({ spec1 => 42 })
692
- metric_data_array = @service.build_metric_data_array(hash)
693
-
694
- assert_equal(2, metric_data_array.size)
695
-
696
- metric_data1 = metric_data_array.find { |md| md.metric_id == 42 }
697
- metric_data2 = metric_data_array.find { |md| md.metric_spec == spec2 }
698
- assert_nil(metric_data1.metric_spec)
699
- assert_nil(metric_data2.metric_id)
700
- end
701
-
702
650
  def test_build_metric_data_array_omits_empty_stats
703
651
  hash = NewRelic::Agent::StatsHash.new
704
652
 
@@ -804,12 +752,6 @@ class NewRelicServiceTest < Minitest::Test
804
752
  ])
805
753
  end
806
754
 
807
- def test_force_restart_clears_metric_cache
808
- @service.metric_id_cache[1] = "boo"
809
- @service.force_restart
810
- assert_empty @service.metric_id_cache
811
- end
812
-
813
755
  def test_force_restart_closes_shared_connections
814
756
  @service.establish_shared_connection
815
757
  @service.force_restart
@@ -8,19 +8,16 @@ class NewRelic::MetricDataTest < Minitest::Test
8
8
  def test_initialize_basic
9
9
  spec = mock('metric_spec')
10
10
  stats = mock('stats')
11
- metric_id = mock('metric_id')
12
- md = NewRelic::MetricData.new(spec, stats, metric_id)
11
+ md = NewRelic::MetricData.new(spec, stats)
13
12
  assert_equal spec, md.metric_spec
14
13
  assert_equal stats, md.stats
15
- assert_equal metric_id, md.metric_id
16
14
  end
17
15
 
18
16
  def test_eql_basic
19
17
  spec = mock('metric_spec')
20
18
  stats = mock('stats')
21
- metric_id = mock('metric_id')
22
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
23
- md2 = NewRelic::MetricData.new(spec, stats, metric_id)
19
+ md1 = NewRelic::MetricData.new(spec, stats)
20
+ md2 = NewRelic::MetricData.new(spec, stats)
24
21
  assert(md1.eql?(md2), "The example metric data objects should be eql?: #{md1.inspect} #{md2.inspect}")
25
22
  assert(md2.eql?(md1), "The example metric data objects should be eql?: #{md1.inspect} #{md2.inspect}")
26
23
  end
@@ -29,39 +26,26 @@ class NewRelic::MetricDataTest < Minitest::Test
29
26
  spec = mock('metric_spec')
30
27
  other_spec = mock('other_spec')
31
28
  stats = mock('stats')
32
- metric_id = mock('metric_id')
33
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
34
- md2 = NewRelic::MetricData.new(other_spec, stats, metric_id)
29
+ md1 = NewRelic::MetricData.new(spec, stats)
30
+ md2 = NewRelic::MetricData.new(other_spec, stats)
35
31
  assert(!md1.eql?(md2), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
36
32
  assert(!md2.eql?(md1), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
37
33
  end
34
+
38
35
  def test_eql_unequal_stats
39
36
  spec = mock('metric_spec')
40
37
  stats = mock('stats')
41
38
  other_stats = mock('other_stats')
42
- metric_id = mock('metric_id')
43
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
44
- md2 = NewRelic::MetricData.new(spec, other_stats, metric_id)
39
+ md1 = NewRelic::MetricData.new(spec, stats)
40
+ md2 = NewRelic::MetricData.new(spec, other_stats)
45
41
  assert(!md1.eql?(md2), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
46
42
  assert(!md2.eql?(md1), "The example metric data objects should not be eql?: #{md1.inspect} #{md2.inspect}")
47
43
  end
48
44
 
49
- def test_eql_unequal_metric_ids_dont_matter
50
- spec = mock('metric_spec')
51
- stats = mock('stats')
52
- metric_id = mock('metric_id')
53
- other_metric_id = mock('other_metric_id')
54
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
55
- md2 = NewRelic::MetricData.new(spec, stats, other_metric_id)
56
- assert(md1.eql?(md2), "The example metric data objects should be eql? with different metric_ids: #{md1.inspect} #{md2.inspect}")
57
- assert(md2.eql?(md1), "The example metric data objects should be eql? with different metric_ids: #{md1.inspect} #{md2.inspect}")
58
- end
59
-
60
45
  def test_original_spec_basic
61
46
  spec = mock('metric_spec')
62
47
  stats = mock('stats')
63
- metric_id = mock('metric_id')
64
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
48
+ md1 = NewRelic::MetricData.new(spec, stats)
65
49
  original_spec = md1.instance_variable_get('@original_spec')
66
50
  assert_equal(nil, original_spec, "should start with a nil original spec, but was #{original_spec.inspect}")
67
51
  assert_equal(spec, md1.metric_spec, "should return the metric spec for original spec when original spec is nil, but was #{md1.original_spec}")
@@ -69,8 +53,7 @@ class NewRelic::MetricDataTest < Minitest::Test
69
53
 
70
54
  def test_metric_spec_equal_should_not_set_original_spec_with_no_metric_spec
71
55
  stats = mock('stats')
72
- metric_id = mock('metric_id')
73
- md1 = NewRelic::MetricData.new(nil, stats, metric_id)
56
+ md1 = NewRelic::MetricData.new(nil, stats)
74
57
  original_spec = md1.instance_variable_get('@original_spec')
75
58
  assert_equal(nil, original_spec, "should start with a nil original spec, but was #{original_spec.inspect}")
76
59
 
@@ -78,14 +61,13 @@ class NewRelic::MetricDataTest < Minitest::Test
78
61
  assert_equal(new_spec, md1.metric_spec=(new_spec), "should return the new spec")
79
62
 
80
63
  new_original_spec = md1.instance_variable_get('@original_spec')
81
- assert_equal(nil, new_original_spec, "should not set @original_spec but was #{new_original_spec.inspect}")
64
+ assert_equal(nil, new_original_spec, "should not set @original_spec, but was #{new_original_spec.inspect}")
82
65
  end
83
66
 
84
67
  def test_metric_spec_equal_should_set_original_spec_with_existing_metric_spec
85
68
  spec = mock('metric_spec')
86
69
  stats = mock('stats')
87
- metric_id = mock('metric_id')
88
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
70
+ md1 = NewRelic::MetricData.new(spec, stats)
89
71
  original_spec = md1.instance_variable_get('@original_spec')
90
72
  assert_equal(nil, original_spec, "should start with a nil original spec, but was #{original_spec.inspect}")
91
73
 
@@ -99,67 +81,36 @@ class NewRelic::MetricDataTest < Minitest::Test
99
81
  def test_hash
100
82
  spec = mock('metric_spec')
101
83
  stats = mock('stats')
102
- metric_id = mock('metric_id')
103
- md1 = NewRelic::MetricData.new(spec, stats, metric_id)
84
+ md1 = NewRelic::MetricData.new(spec, stats)
104
85
  assert((spec.hash ^ stats.hash) == md1.hash, "expected #{spec.hash ^ stats.hash} to equal #{md1.hash}")
105
86
  end
106
87
 
107
88
  if {}.respond_to?(:to_json)
108
- def test_to_json_no_metric_id
109
- md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', ''), NewRelic::Agent::Stats.new, nil)
89
+ def test_to_json
90
+ md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', ''), NewRelic::Agent::Stats.new)
110
91
  json = md.to_json
111
92
  assert(json.include?('"Custom/test/method"'), "should include the metric spec in the json")
112
- assert(json.include?('"metric_id":null}'), "should have a null metric_id")
113
93
  end
114
94
 
115
- def test_to_json_with_metric_id
116
- md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', ''), NewRelic::Agent::Stats.new, 12345)
117
- assert_equal('{"metric_spec":null,"stats":{"total_exclusive_time":0.0,"min_call_time":0.0,"call_count":0,"sum_of_squares":0.0,"total_call_time":0.0,"max_call_time":0.0},"metric_id":12345}', md.to_json, "should not include the metric spec and should have a metric_id")
118
- end
119
95
  else
120
96
  puts "Skipping tests in #{__FILE__} because Hash#to_json not available"
121
97
  end
122
98
 
123
99
  def test_to_s_with_metric_spec
124
- md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', ''), NewRelic::Agent::Stats.new, 12345)
125
- assert_equal('Custom/test/method(): [ 0 calls 0.0000s / 0.0000s ex]', md.to_s, "should not include the metric id and should include the metric spec")
126
- end
127
-
128
- def test_to_s_without_metric_spec
129
- md = NewRelic::MetricData.new(nil, NewRelic::Agent::Stats.new, 12345)
130
- assert_equal('12345: [ 0 calls 0.0000s / 0.0000s ex]', md.to_s, "should include the metric id and not have a metric spec")
100
+ md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', ''), NewRelic::Agent::Stats.new)
101
+ assert_equal('Custom/test/method(): [ 0 calls 0.0000s / 0.0000s ex]', md.to_s, "should include the metric spec")
131
102
  end
132
103
 
133
104
  def test_to_collector_array_with_spec
134
105
  stats = NewRelic::Agent::Stats.new
135
106
  stats.record_data_point(1.0)
136
107
  stats.record_data_point(2.0, 1.0)
137
- md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', 'scope'),
138
- stats, nil)
108
+ md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', 'scope'), stats)
139
109
  expected = [ {'name' => 'Custom/test/method', 'scope' => 'scope'},
140
110
  [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
141
111
  assert_equal expected, md.to_collector_array
142
112
  end
143
113
 
144
- def test_to_collector_array_with_spec_and_id
145
- stats = NewRelic::Agent::Stats.new
146
- stats.record_data_point(1.0)
147
- stats.record_data_point(2.0, 1.0)
148
- md = NewRelic::MetricData.new(NewRelic::MetricSpec.new('Custom/test/method', 'scope'),
149
- stats, 1234)
150
- expected = [ 1234, [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
151
- assert_equal expected, md.to_collector_array
152
- end
153
-
154
- def test_to_collector_array_with_id
155
- stats = NewRelic::Agent::Stats.new
156
- stats.record_data_point(1.0)
157
- stats.record_data_point(2.0, 1.0)
158
- md = NewRelic::MetricData.new(nil, stats, 1234)
159
- expected = [ 1234, [2, 3.0, 2.0, 1.0, 2.0, 5.0] ]
160
- assert_equal expected, md.to_collector_array
161
- end
162
-
163
114
  # Rationals in metric data? -- https://support.newrelic.com/tickets/28053
164
115
  def test_to_collector_array_with_rationals
165
116
  stats = NewRelic::Agent::Stats.new
@@ -170,8 +121,9 @@ class NewRelic::MetricDataTest < Minitest::Test
170
121
  stats.max_call_time = Rational(5, 1)
171
122
  stats.sum_of_squares = Rational(6, 1)
172
123
 
173
- md = NewRelic::MetricData.new(nil, stats, 1234)
174
- expected = [1234, [1, 2.0, 3.0, 4.0, 5.0, 6.0]]
124
+ spec = NewRelic::MetricSpec.new('foo')
125
+ md = NewRelic::MetricData.new(spec, stats)
126
+ expected = [{"name"=>"foo", "scope"=>""}, [1, 2.0, 3.0, 4.0, 5.0, 6.0]]
175
127
  assert_equal expected, md.to_collector_array
176
128
  end
177
129
 
@@ -184,8 +136,9 @@ class NewRelic::MetricDataTest < Minitest::Test
184
136
  stats.max_call_time = {}
185
137
  stats.sum_of_squares = Exception.new("Boo")
186
138
 
187
- md = NewRelic::MetricData.new(nil, stats, 1234)
188
- expected = [1234, [0, 0, 0, 0, 0, 0]]
139
+ spec = NewRelic::MetricSpec.new('foo')
140
+ md = NewRelic::MetricData.new(spec, stats)
141
+ expected = [{"name"=>"foo", "scope"=>""}, [0, 0, 0, 0, 0, 0]]
189
142
  assert_equal expected, md.to_collector_array
190
143
  end
191
144
  end
@@ -57,7 +57,7 @@ class NewRelic::MetricSpecTest < Minitest::Test
57
57
 
58
58
  compare_stat(stats, import)
59
59
 
60
- metric_data = NewRelic::MetricData.new(spec, stats, 10)
60
+ metric_data = NewRelic::MetricData.new(spec, stats)
61
61
 
62
62
  import = ::ActiveSupport::JSON.decode(metric_data.to_json)
63
63
 
@@ -137,9 +137,8 @@ class NewRelic::MetricSpecTest < Minitest::Test
137
137
  end
138
138
 
139
139
  def compare_metric_data(metric_data, import)
140
- assert_equal 3, import.length
141
- assert_equal metric_data.metric_id, import['metric_id']
142
- compare_spec(metric_data.metric_spec, import['metric_spec']) unless metric_data.metric_id
140
+ assert_equal 2, import.length
141
+ compare_spec(metric_data.metric_spec, import['metric_spec'])
143
142
  compare_stat(metric_data.stats, import['stats'])
144
143
  end
145
144
  end
@@ -54,9 +54,12 @@ class DeveloperModeTest < Minitest::Test
54
54
  def test_explain_sql_displays_query_plan
55
55
  sample = @sampler.dev_mode_sample_buffer.samples[0]
56
56
  sql_segment = app.send(:sql_segments, sample)[0]
57
- explain_results = NewRelic::Agent::Database.process_resultset(dummy_mysql_explain_result, 'mysql')
58
-
57
+ explain_results = [["Id", "Select Type", "Table", "Type", "Possible Keys", "Key", "Key Length",
58
+ "Ref", "Rows", "Extra"],
59
+ [["1", "SIMPLE", "sandwiches", "range", "PRIMARY", "PRIMARY", "4", "", "1",
60
+ "Using index"]]]
59
61
  NewRelic::Agent::Transaction::TraceNode.any_instance.expects(:explain_sql).returns(explain_results)
62
+
60
63
  get "/newrelic/explain_sql?id=#{sample.sample_id}&segment=#{sql_segment.object_id}"
61
64
 
62
65
  assert last_response.ok?
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic_rpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.15.1.316
4
+ version: 3.15.2.317
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Krajcar
8
8
  - Matthew Wear
9
9
  - Katherine Wu
10
10
  - Karl Sandwich
11
+ - Caito Scherr
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2016-03-22 00:00:00.000000000 Z
15
+ date: 2016-04-18 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: rake
@@ -253,6 +254,7 @@ files:
253
254
  - lib/new_relic/agent/cross_app_tracing.rb
254
255
  - lib/new_relic/agent/custom_event_aggregator.rb
255
256
  - lib/new_relic/agent/database.rb
257
+ - lib/new_relic/agent/database/explain_plan_helpers.rb
256
258
  - lib/new_relic/agent/database/obfuscation_helpers.rb
257
259
  - lib/new_relic/agent/database/obfuscator.rb
258
260
  - lib/new_relic/agent/database/postgres_explain_obfuscator.rb