newrelic_rpm 6.6.0.358 → 6.11.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of newrelic_rpm might be problematic. Click here for more details.

Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +65 -5
  4. data/CHANGELOG.md +222 -0
  5. data/Gemfile +5 -2
  6. data/Guardfile +18 -1
  7. data/LICENSE +1 -1
  8. data/Rakefile +2 -0
  9. data/lib/new_relic/agent.rb +89 -7
  10. data/lib/new_relic/agent/agent.rb +114 -55
  11. data/lib/new_relic/agent/agent_logger.rb +4 -0
  12. data/lib/new_relic/agent/attribute_filter.rb +7 -7
  13. data/lib/new_relic/agent/attributes.rb +150 -0
  14. data/lib/new_relic/agent/autostart.rb +19 -14
  15. data/lib/new_relic/agent/configuration/default_source.rb +127 -9
  16. data/lib/new_relic/agent/configuration/event_harvest_config.rb +11 -5
  17. data/lib/new_relic/agent/configuration/manager.rb +0 -8
  18. data/lib/new_relic/agent/configuration/server_source.rb +3 -2
  19. data/lib/new_relic/agent/configuration/yaml_source.rb +11 -6
  20. data/lib/new_relic/agent/connect/request_builder.rb +5 -13
  21. data/lib/new_relic/agent/database.rb +1 -2
  22. data/lib/new_relic/agent/datastores/mongo.rb +1 -1
  23. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +2 -2
  24. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +8 -8
  25. data/lib/new_relic/agent/distributed_tracing.rb +155 -6
  26. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +0 -0
  27. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +60 -45
  28. data/lib/new_relic/agent/distributed_tracing/distributed_trace_intrinsics.rb +80 -0
  29. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  30. data/lib/new_relic/agent/{distributed_trace_payload.rb → distributed_tracing/distributed_trace_payload.rb} +23 -99
  31. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
  32. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
  33. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
  34. data/lib/new_relic/agent/error_collector.rb +33 -16
  35. data/lib/new_relic/agent/error_event_aggregator.rb +7 -5
  36. data/lib/new_relic/agent/external.rb +7 -7
  37. data/lib/new_relic/agent/guid_generator.rb +28 -0
  38. data/lib/new_relic/agent/hostname.rb +7 -1
  39. data/lib/new_relic/agent/http_clients/abstract.rb +82 -0
  40. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +24 -19
  41. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +28 -13
  42. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +17 -21
  43. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +10 -11
  44. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +16 -4
  45. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +4 -6
  46. data/lib/new_relic/agent/http_clients/uri_util.rb +3 -2
  47. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +5 -7
  48. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +4 -0
  49. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +11 -2
  50. data/lib/new_relic/agent/instrumentation/active_record.rb +4 -2
  51. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +7 -2
  52. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +8 -4
  53. data/lib/new_relic/agent/instrumentation/bunny.rb +45 -28
  54. data/lib/new_relic/agent/instrumentation/curb.rb +59 -18
  55. data/lib/new_relic/agent/instrumentation/data_mapper.rb +3 -1
  56. data/lib/new_relic/agent/instrumentation/excon.rb +1 -1
  57. data/lib/new_relic/agent/instrumentation/excon/connection.rb +6 -3
  58. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +2 -1
  59. data/lib/new_relic/agent/instrumentation/grape.rb +5 -10
  60. data/lib/new_relic/agent/instrumentation/http.rb +6 -3
  61. data/lib/new_relic/agent/instrumentation/httpclient.rb +5 -3
  62. data/lib/new_relic/agent/instrumentation/memcache.rb +3 -1
  63. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +6 -2
  64. data/lib/new_relic/agent/instrumentation/mongo.rb +9 -3
  65. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +13 -0
  66. data/lib/new_relic/agent/instrumentation/net.rb +6 -3
  67. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +25 -1
  68. data/lib/new_relic/agent/instrumentation/redis.rb +9 -3
  69. data/lib/new_relic/agent/instrumentation/resque.rb +3 -0
  70. data/lib/new_relic/agent/instrumentation/sidekiq.rb +0 -1
  71. data/lib/new_relic/agent/instrumentation/typhoeus.rb +23 -6
  72. data/lib/new_relic/agent/logging.rb +139 -0
  73. data/lib/new_relic/agent/messaging.rb +5 -73
  74. data/lib/new_relic/agent/method_tracer.rb +3 -2
  75. data/lib/new_relic/agent/method_tracer_helpers.rb +2 -2
  76. data/lib/new_relic/agent/monitors.rb +27 -0
  77. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
  78. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
  79. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +1 -1
  80. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +2 -4
  81. data/lib/new_relic/agent/new_relic_service.rb +7 -5
  82. data/lib/new_relic/agent/noticible_error.rb +22 -0
  83. data/lib/new_relic/agent/span_event_aggregator.rb +1 -0
  84. data/lib/new_relic/agent/span_event_primitive.rb +82 -53
  85. data/lib/new_relic/agent/sql_sampler.rb +3 -3
  86. data/lib/new_relic/agent/supported_versions.rb +2 -2
  87. data/lib/new_relic/agent/tracer.rb +65 -18
  88. data/lib/new_relic/agent/transaction.rb +84 -79
  89. data/lib/new_relic/agent/transaction/abstract_segment.rb +28 -2
  90. data/lib/new_relic/agent/transaction/distributed_tracer.rb +171 -0
  91. data/lib/new_relic/agent/transaction/distributed_tracing.rb +57 -146
  92. data/lib/new_relic/agent/transaction/external_request_segment.rb +29 -36
  93. data/lib/new_relic/agent/transaction/message_broker_segment.rb +3 -11
  94. data/lib/new_relic/agent/transaction/segment.rb +7 -1
  95. data/lib/new_relic/agent/transaction/trace.rb +2 -4
  96. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  97. data/lib/new_relic/agent/transaction/trace_node.rb +10 -8
  98. data/lib/new_relic/agent/transaction_error_primitive.rb +10 -15
  99. data/lib/new_relic/agent/transaction_event_primitive.rb +28 -39
  100. data/lib/new_relic/cli/commands/deployments.rb +1 -1
  101. data/lib/new_relic/cli/commands/install.rb +3 -2
  102. data/lib/new_relic/coerce.rb +31 -6
  103. data/lib/new_relic/constants.rb +34 -0
  104. data/lib/new_relic/control/instance_methods.rb +10 -1
  105. data/lib/new_relic/dependency_detection.rb +4 -4
  106. data/lib/new_relic/noticed_error.rb +38 -17
  107. data/lib/new_relic/rack/browser_monitoring.rb +5 -0
  108. data/lib/new_relic/supportability_helper.rb +14 -0
  109. data/lib/new_relic/version.rb +1 -1
  110. data/lib/tasks/multiverse.rb +25 -0
  111. data/lib/tasks/tests.rake +6 -1
  112. data/newrelic_rpm.gemspec +18 -7
  113. data/test/agent_helper.rb +322 -70
  114. metadata +98 -32
  115. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  116. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -40
  117. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  118. data/lib/new_relic/agent/transaction/attributes.rb +0 -154
  119. data/lib/tasks/versions.html.erb +0 -28
  120. data/lib/tasks/versions.postface.html +0 -8
  121. data/lib/tasks/versions.preface.html +0 -9
  122. data/lib/tasks/versions.rake +0 -65
  123. data/lib/tasks/versions.txt.erb +0 -14
@@ -20,23 +20,28 @@ module NewRelic
20
20
 
21
21
 
22
22
  # The constants, executables (i.e. $0) and rake tasks used can be
23
- # configured with the config keys 'autostart.blacklisted_constants',
24
- # 'autostart.blacklisted_executables' and
25
- # 'autostart.blacklisted_rake_tasks'
23
+ # configured with the config keys 'autostart.denylisted_constants',
24
+ # 'autostart.denylisted_executables' and
25
+ # 'autostart.denylisted_rake_tasks'
26
26
  def agent_should_start?
27
- !blacklisted_constants? &&
28
- !blacklisted_executables? &&
29
- !in_blacklisted_rake_task?
27
+ !denylisted_constants? &&
28
+ !denylisted_executables? &&
29
+ !in_denylisted_rake_task?
30
30
  end
31
31
 
32
- def blacklisted_constants?
33
- blacklisted?(NewRelic::Agent.config[:'autostart.blacklisted_constants']) do |name|
32
+ COMMA = ",".freeze
33
+
34
+ def denylisted_constants?
35
+ # For backwards compatibility until :'autostart_blacklisted_constants' config option is removed
36
+ constants = NewRelic::Agent.config[:'autostart.denylisted_constants'] << COMMA << NewRelic::Agent.config[:'autostart.blacklisted_constants']
37
+
38
+ denylisted?(constants) do |name|
34
39
  constant_is_defined?(name)
35
40
  end
36
41
  end
37
42
 
38
- def blacklisted_executables?
39
- blacklisted?(NewRelic::Agent.config[:'autostart.blacklisted_executables']) do |bin|
43
+ def denylisted_executables?
44
+ denylisted?(NewRelic::Agent.config[:'autostart.denylisted_executables']) do |bin|
40
45
  File.basename($0) == bin
41
46
  end
42
47
  end
@@ -47,18 +52,18 @@ module NewRelic
47
52
  !!::NewRelic::LanguageSupport.constantize(const_name)
48
53
  end
49
54
 
50
- def blacklisted?(value, &block)
55
+ def denylisted?(value, &block)
51
56
  value.split(/\s*,\s*/).any?(&block)
52
57
  end
53
58
 
54
- def in_blacklisted_rake_task?
59
+ def in_denylisted_rake_task?
55
60
  tasks = begin
56
61
  ::Rake.application.top_level_tasks
57
62
  rescue => e
58
- ::NewRelic::Agent.logger.debug("Not in Rake environment so skipping blacklisted_rake_tasks check: #{e}")
63
+ ::NewRelic::Agent.logger.debug("Not in Rake environment so skipping denylisted_rake_tasks check: #{e}")
59
64
  []
60
65
  end
61
- !(tasks & ::NewRelic::Agent.config[:'autostart.blacklisted_rake_tasks'].split(/\s*,\s*/)).empty?
66
+ !(tasks & ::NewRelic::Agent.config[:'autostart.denylisted_rake_tasks'].split(/\s*,\s*/)).empty?
62
67
  end
63
68
  end
64
69
  end
@@ -196,6 +196,15 @@ module NewRelic
196
196
  end
197
197
  end
198
198
 
199
+ SEMICOLON = ';'.freeze
200
+ def self.convert_to_list_on_semicolon value
201
+ case value
202
+ when Array then value
203
+ when String then value.split(SEMICOLON)
204
+ else []
205
+ end
206
+ end
207
+
199
208
  def self.convert_to_constant_list(raw_value)
200
209
  const_names = convert_to_list(raw_value)
201
210
  const_names.map! do |class_name|
@@ -209,9 +218,19 @@ module NewRelic
209
218
  end
210
219
  const_names.compact
211
220
  end
221
+
222
+ def self.enforce_fallback(allowed_values: nil, fallback: nil)
223
+ Proc.new do |configured_value|
224
+ if allowed_values.any? { |v| v =~ /#{configured_value}/i }
225
+ configured_value
226
+ else
227
+ fallback
228
+ end
229
+ end
230
+ end
212
231
  end
213
232
 
214
- AUTOSTART_BLACKLISTED_RAKE_TASKS = [
233
+ AUTOSTART_DENYLISTED_RAKE_TASKS = [
215
234
  'about',
216
235
  'assets:clean',
217
236
  'assets:clobber',
@@ -291,8 +310,17 @@ module NewRelic
291
310
  :public => true,
292
311
  :type => String,
293
312
  :allowed_from_server => false,
313
+ :transform => DefaultSource.method(:convert_to_list_on_semicolon),
294
314
  :description => 'Specify the <a href="https://docs.newrelic.com/docs/apm/new-relic-apm/installation-configuration/name-your-application">application name</a> used to aggregate data in the New Relic UI. To report data to <a href="https://docs.newrelic.com/docs/apm/new-relic-apm/installation-configuration/using-multiple-names-app">multiple apps at the same time</a>, specify a list of names separated by a semicolon <code>;</code>. For example, <code>MyApp</code> or <code>MyStagingApp;Instance1</code>.'
295
315
  },
316
+ :entity_guid => {
317
+ :default => nil,
318
+ :allow_nil => true,
319
+ :public => true,
320
+ :type => String,
321
+ :allowed_from_server => true,
322
+ :description => 'The <a href="https://docs.newrelic.com/attribute-dictionary/span/entityguid">Entity GUID</a> for the entity running this agent.'
323
+ },
296
324
  :monitor_mode => {
297
325
  :default => value_of(:enabled),
298
326
  :public => true,
@@ -367,7 +395,21 @@ module NewRelic
367
395
  :public => true,
368
396
  :type => Boolean,
369
397
  :allowed_from_server => false,
370
- :description => 'When <code>true</code>, the agent captures HTTP request parameters and attaches them to transaction traces, traced errors, and <a href="https://docs.newrelic.com/docs/insights/new-relic-insights/decorating-events/error-event-default-attributes-insights">TransactionError events</a>.'
398
+ :description => 'When <code>true</code>, the agent captures HTTP request parameters ' \
399
+ 'and attaches them to transaction traces, traced errors, and ' \
400
+ '<a href="https://docs.newrelic.com/attribute-dictionary?attribute_name=&events_tids%5B%5D=8241">'\
401
+ '<code>TransactionError</code> events.' \
402
+ "\n" \
403
+ '<div class="callout-warning">' \
404
+ "\n" \
405
+ '<p>When using the <code>capture_params</code> setting, the Ruby agent will not attempt ' \
406
+ 'to filter secret information. <b>Recommendation:</b> To filter secret information from ' \
407
+ 'request parameters, use the <a href="/docs/agents/ruby-agent/attributes/enable-disable-attributes-ruby">' \
408
+ '<code>attributes.include</code> setting</a> instead. For more information, see the ' \
409
+ '<a href="/docs/agents/ruby-agent/attributes/ruby-attribute-examples#ex_req_params">' \
410
+ 'Ruby attribute examples</a>.' \
411
+ "</p>\n" \
412
+ '</div>'
371
413
  },
372
414
  :config_path => {
373
415
  :default => DefaultSource.config_path,
@@ -398,6 +440,17 @@ module NewRelic
398
440
  :description => 'Autodetected application framework used to enable framework-specific functionality.'
399
441
  },
400
442
  :'autostart.blacklisted_constants' => {
443
+ :default => 'Rails::Console',
444
+ :public => true,
445
+ :type => String,
446
+ :allowed_from_server => false,
447
+ :description => 'Deprecated. ' \
448
+ 'For agent versions 6.8.0 or higher, ' \
449
+ 'use <a href="#autostart-denylisted_constants"><code>' \
450
+ 'autostart.denylisted_constants' \
451
+ '</code></a> instead.'
452
+ },
453
+ :'autostart.denylisted_constants' => {
401
454
  :default => 'Rails::Console',
402
455
  :public => true,
403
456
  :type => String,
@@ -409,10 +462,32 @@ module NewRelic
409
462
  :public => true,
410
463
  :type => String,
411
464
  :allowed_from_server => false,
465
+ :description => 'Deprecated. ' \
466
+ 'For agent versions 6.8.0 or higher, ' \
467
+ 'use <a href="#autostart-denylisted_executables"><code>' \
468
+ 'autostart.denylisted_executables' \
469
+ '</code></a> instead.'
470
+ },
471
+ :'autostart.denylisted_executables' => {
472
+ :default => value_of(:'autostart.blacklisted_executables'),
473
+ :public => true,
474
+ :type => String,
475
+ :allowed_from_server => false,
412
476
  :description => 'Defines a comma-delimited list of executables that the agent should not instrument. For example, <code>rake,my_ruby_script.rb</code>.'
413
477
  },
414
478
  :'autostart.blacklisted_rake_tasks' => {
415
- :default => AUTOSTART_BLACKLISTED_RAKE_TASKS,
479
+ :default => AUTOSTART_DENYLISTED_RAKE_TASKS,
480
+ :public => true,
481
+ :type => String,
482
+ :allowed_from_server => false,
483
+ :description => 'Deprecated. ' \
484
+ 'For agent versions 6.8.0 or higher, ' \
485
+ 'use <a href="#autostart-denylisted_rake_tasks"><code>' \
486
+ 'autostart.denylisted_rake_tasks' \
487
+ '</code></a> instead.'
488
+ },
489
+ :'autostart.denylisted_rake_tasks' => {
490
+ :default => value_of(:'autostart.blacklisted_rake_tasks'),
416
491
  :public => true,
417
492
  :type => String,
418
493
  :allowed_from_server => false,
@@ -460,15 +535,28 @@ module NewRelic
460
535
  :public => true,
461
536
  :type => Boolean,
462
537
  :allowed_from_server => false,
463
- :description => 'If true, the agent strips messages from all exceptions except those in the <a href="#strip_exception_messages-whitelist">whitelist</a>. Enabled automatically in <a href="https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security">high security mode</a>.'
538
+ :description => 'If true, the agent strips messages from all exceptions except those in the <a href="#strip_exception_messages-allowlist">allowlist</a>. Enabled automatically in <a href="https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security">high security mode</a>.'
464
539
  },
465
540
  :'strip_exception_messages.whitelist' => {
466
541
  :default => '',
467
542
  :public => true,
468
543
  :type => String,
544
+ :deprecated => true,
469
545
  :allowed_from_server => false,
470
546
  :transform => DefaultSource.method(:convert_to_constant_list),
471
- :description => 'Specify a whitelist of exceptions you do not want the agent to strip when <a href="#strip_exception_messages-enabled">strip_exception_messages</a> is <code>true</code>. Separate exceptions with a comma. For example, <code>"ImportantException,PreserveMessageException"</code>.'
547
+ :description => 'Deprecated. ' \
548
+ 'For agent versions 6.8.0 or higher, ' \
549
+ 'use <a href="#strip_exception_messages.allowed_classes"><code>' \
550
+ 'strip_exception_messages.allowed_classes' \
551
+ '</code></a> instead.'
552
+ },
553
+ :'strip_exception_messages.allowed_classes' => {
554
+ :default => '',
555
+ :public => true,
556
+ :type => String,
557
+ :allowed_from_server => false,
558
+ :transform => DefaultSource.method(:convert_to_constant_list),
559
+ :description => 'Specify a list of exceptions you do not want the agent to strip when <a href="#strip_exception_messages-enabled">strip_exception_messages</a> is <code>true</code>. Separate exceptions with a comma. For example, <code>"ImportantException,PreserveMessageException"</code>.'
472
560
  },
473
561
  :host => {
474
562
  :default => DefaultSource.host,
@@ -527,7 +615,7 @@ module NewRelic
527
615
  :description => 'Use HTTP PUT requests instead of POST.'
528
616
  },
529
617
  :compressed_content_encoding => {
530
- :default => 'deflate',
618
+ :default => 'gzip',
531
619
  :public => false,
532
620
  :type => String,
533
621
  :allowed_from_server => false,
@@ -568,14 +656,37 @@ module NewRelic
568
656
  :allowed_from_server => true,
569
657
  :description => 'Number of seconds betwixt connections to the New Relic event collection services.'
570
658
  },
571
- :'data_report_periods.analytic_event_data' => {
659
+ :'event_report_period.analytic_event_data' => {
572
660
  :default => 60,
573
661
  :public => false,
574
662
  :type => Integer,
575
- :deprecated => true,
576
663
  :dynamic_name => true,
577
664
  :allowed_from_server => true,
578
- :description => 'Number of seconds between connections to the New Relic data collection service for sending transaction event data.'
665
+ :description => 'Number of seconds betwixt connections to the New Relic analytic event collection services.'
666
+ },
667
+ :'event_report_period.custom_event_data' => {
668
+ :default => 60,
669
+ :public => false,
670
+ :type => Integer,
671
+ :dynamic_name => true,
672
+ :allowed_from_server => true,
673
+ :description => 'Number of seconds betwixt connections to the New Relic custom event collection services.'
674
+ },
675
+ :'event_report_period.error_event_data' => {
676
+ :default => 60,
677
+ :public => false,
678
+ :type => Integer,
679
+ :dynamic_name => true,
680
+ :allowed_from_server => true,
681
+ :description => 'Number of seconds betwixt connections to the New Relic error event collection services.'
682
+ },
683
+ :'event_report_period.span_event_data' => {
684
+ :default => 60,
685
+ :public => false,
686
+ :type => Integer,
687
+ :dynamic_name => true,
688
+ :allowed_from_server => true,
689
+ :description => 'Number of seconds betwixt connections to the New Relic span event collection services.'
579
690
  },
580
691
  :keep_retrying => {
581
692
  :default => true,
@@ -1816,6 +1927,13 @@ module NewRelic
1816
1927
  :type => Integer,
1817
1928
  :allowed_from_server => true,
1818
1929
  :description => 'Defines the maximum number of span events reported from a single harvest.'
1930
+ },
1931
+ :'exclude_newrelic_header' => {
1932
+ :default => false,
1933
+ :public => true,
1934
+ :type => Boolean,
1935
+ :allowed_from_server => true,
1936
+ :description => "Allows newrelic distributed tracing headers to be suppressed on outbound requests."
1819
1937
  }
1820
1938
  }.freeze
1821
1939
  end
@@ -12,7 +12,8 @@ module NewRelic
12
12
  EVENT_HARVEST_CONFIG_KEY_MAPPING = {
13
13
  :analytic_event_data => :'analytics_events.max_samples_stored',
14
14
  :custom_event_data => :'custom_insights_events.max_samples_stored',
15
- :error_event_data => :'error_collector.max_event_samples_stored'
15
+ :error_event_data => :'error_collector.max_event_samples_stored',
16
+ :span_event_data => :'span_events.max_samples_stored'
16
17
  }
17
18
 
18
19
  def from_config(config)
@@ -25,15 +26,20 @@ module NewRelic
25
26
  end
26
27
 
27
28
  def to_config_hash(connect_reply)
28
- config_hash = EVENT_HARVEST_CONFIG_KEY_MAPPING.inject({}) do
29
+ event_harvest_interval = connect_reply['event_harvest_config']['report_period_ms'] / 1000
30
+ config_hash = EVENT_HARVEST_CONFIG_KEY_MAPPING.inject({}) do
29
31
  |event_harvest_config, (connect_payload_key, config_key)|
30
- event_harvest_config[config_key] = connect_reply['event_harvest_config']['harvest_limits'][connect_payload_key.to_s]
32
+ if harvest_limit = connect_reply['event_harvest_config']['harvest_limits'][connect_payload_key.to_s]
33
+ event_harvest_config[config_key] = harvest_limit
34
+ report_period_key = :"event_report_period.#{connect_payload_key}"
35
+ event_harvest_config[report_period_key] = event_harvest_interval
36
+ end
31
37
  event_harvest_config
32
38
  end
33
- config_hash[:event_report_period] = connect_reply['event_harvest_config']['report_period_ms'] / 1000
39
+ config_hash[:event_report_period] = event_harvest_interval
34
40
  config_hash
35
41
  end
36
42
  end
37
43
  end
38
44
  end
39
- end
45
+ end
@@ -228,14 +228,6 @@ module NewRelic
228
228
  end
229
229
  end
230
230
 
231
- def app_names
232
- case NewRelic::Agent.config[:app_name]
233
- when Array then NewRelic::Agent.config[:app_name]
234
- when String then NewRelic::Agent.config[:app_name].split(';')
235
- else []
236
- end
237
- end
238
-
239
231
  MALFORMED_LABELS_WARNING = "Skipping malformed labels configuration"
240
232
  PARSING_LABELS_FAILURE = "Failure during parsing labels. Ignoring and carrying on with connect."
241
233
 
@@ -21,6 +21,7 @@ module NewRelic
21
21
  "cross_process_id",
22
22
  "data_report_period",
23
23
  "encoding_key",
24
+ "entity_guid",
24
25
  "error_beacon",
25
26
  "js_agent_file",
26
27
  "js_agent_loader",
@@ -69,7 +70,7 @@ module NewRelic
69
70
 
70
71
  def fix_transaction_threshold(merged_settings)
71
72
  # when value is "apdex_f" remove the config and defer to default
72
- if merged_settings['transaction_tracer.transaction_threshold'] =~ /apdex_f/i
73
+ if merged_settings['transaction_tracer.transaction_threshold'].to_s =~ /apdex_f/i
73
74
  merged_settings.delete('transaction_tracer.transaction_threshold')
74
75
  end
75
76
  end
@@ -78,6 +79,7 @@ module NewRelic
78
79
  :'analytics_events.max_samples_stored' => 'Supportability/EventHarvest/AnalyticEventData/HarvestLimit',
79
80
  :'custom_insights_events.max_samples_stored' => 'Supportability/EventHarvest/CustomEventData/HarvestLimit',
80
81
  :'error_collector.max_event_samples_stored'=> 'Supportability/EventHarvest/ErrorEventData/HarvestLimit',
82
+ :'span_events.max_samples_stored'=> 'Supportability/EventHarvest/SpanEventData/HarvestLimit',
81
83
  :event_report_period => 'Supportability/EventHarvest/ReportPeriod'
82
84
  }
83
85
 
@@ -100,7 +102,6 @@ module NewRelic
100
102
  || (event_harvest_config['report_period_ms'] / 1000) <= 0
101
103
  NewRelic::Agent.logger.warn "Invalid event harvest config found " \
102
104
  "in connect response; using default event report period."
103
- NewRelic::Agent.record_metric('Supportability/Agent/Collector/MissingEventHarvestConfig', 1)
104
105
  false
105
106
  else
106
107
  true
@@ -12,6 +12,7 @@ module NewRelic
12
12
  attr_reader :generated_for_user, :license_key
13
13
 
14
14
  def initialize(path, env)
15
+ @path = path
15
16
  config = {}
16
17
  @failures = []
17
18
 
@@ -111,30 +112,34 @@ module NewRelic
111
112
 
112
113
  def substitute_transaction_threshold(config)
113
114
  if config['transaction_tracer'] &&
114
- config['transaction_tracer']['transaction_threshold'] =~ /apdex_f/i
115
+ config['transaction_tracer']['transaction_threshold'].to_s =~ /apdex_f/i
115
116
  # when value is "apdex_f" remove the config and defer to default
116
117
  config['transaction_tracer'].delete('transaction_threshold')
117
118
  end
118
119
  end
119
120
 
120
121
  def booleanify_values(config, *keys)
121
- # auto means defer ro default
122
+ # auto means defer to default
122
123
  keys.each do |option|
123
- if config[option] == 'auto'
124
+ if 'auto' == config[option]
124
125
  config.delete(option)
125
126
  elsif !config[option].nil? && !is_boolean?(config[option])
126
- config[option] = !!(config[option] =~ /yes|on|true/i)
127
+ coerced_value = !!(config[option].to_s =~ /yes|on|true/i)
128
+ if !coerced_value
129
+ log_failure "Unexpected value (#{config[option]}) for '#{option}' in #{@path}"
130
+ end
131
+ config[option] = coerced_value
127
132
  end
128
133
  end
129
134
  end
130
135
 
131
136
  def is_boolean?(value)
132
- value == !!value
137
+ !!value == value
133
138
  end
134
139
 
135
140
  def log_failure(*messages)
136
141
  ::NewRelic::Agent.logger.error(*messages)
137
- @failures << messages
142
+ messages.each { |message| @failures << message }
138
143
  end
139
144
  end
140
145
  end
@@ -11,10 +11,11 @@ module NewRelic
11
11
 
12
12
  class RequestBuilder
13
13
 
14
- def initialize(new_relic_service, config, event_harvest_config)
14
+ def initialize(new_relic_service, config, event_harvest_config, environment_report)
15
15
  @service = new_relic_service
16
16
  @config = config
17
17
  @event_harvest_config = event_harvest_config
18
+ @environment_report = sanitize_environment_report(environment_report)
18
19
  end
19
20
 
20
21
 
@@ -25,16 +26,16 @@ module NewRelic
25
26
  :pid => $$,
26
27
  :host => local_host,
27
28
  :display_host => Agent.config[:'process_host.display_name'],
28
- :app_name => Agent.config.app_names,
29
+ :app_name => Agent.config[:app_name],
29
30
  :language => 'ruby',
30
31
  :labels => Agent.config.parsed_labels,
31
32
  :agent_version => NewRelic::VERSION::STRING,
32
- :environment => sanitize_environment_report(environment_report),
33
+ :environment => @environment_report,
33
34
  :metadata => environment_metadata,
34
35
  :settings => Agent.config.to_collector_hash,
35
36
  :high_security => Agent.config[:high_security],
36
37
  :utilization => UtilizationData.new.to_collector_hash,
37
- :identifier => "ruby:#{local_host}:#{Agent.config.app_names.sort.join(',')}",
38
+ :identifier => "ruby:#{local_host}:#{Agent.config[:app_name].sort.join(',')}",
38
39
  :event_harvest_config => @event_harvest_config
39
40
  }
40
41
  end
@@ -47,15 +48,6 @@ module NewRelic
47
48
  environment_report
48
49
  end
49
50
 
50
- # Checks whether we should send environment info, and if so,
51
- # returns the snapshot from the local environment.
52
- # Generating the EnvironmentReport has the potential to trigger
53
- # require calls in Rails environments, so this method should only
54
- # be called synchronously from on the main thread.
55
- def environment_report
56
- Agent.config[:send_environment_info] ? Array(EnvironmentReport.new) : []
57
- end
58
-
59
51
  def environment_metadata
60
52
  ENV.select {|k, v| k =~ /^NEW_RELIC_METADATA_/}
61
53
  end