newrelic_rpm 6.5.0.357 → 6.10.0.364

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +65 -5
  4. data/CHANGELOG.md +243 -0
  5. data/Guardfile +18 -1
  6. data/lib/new_relic/agent.rb +89 -7
  7. data/lib/new_relic/agent/agent.rb +116 -57
  8. data/lib/new_relic/agent/agent_logger.rb +4 -0
  9. data/lib/new_relic/agent/attribute_filter.rb +7 -7
  10. data/lib/new_relic/agent/attributes.rb +150 -0
  11. data/lib/new_relic/agent/autostart.rb +19 -14
  12. data/lib/new_relic/agent/configuration/default_source.rb +132 -13
  13. data/lib/new_relic/agent/configuration/event_harvest_config.rb +11 -5
  14. data/lib/new_relic/agent/configuration/manager.rb +13 -9
  15. data/lib/new_relic/agent/configuration/server_source.rb +3 -2
  16. data/lib/new_relic/agent/configuration/yaml_source.rb +11 -6
  17. data/lib/new_relic/agent/connect/request_builder.rb +5 -13
  18. data/lib/new_relic/agent/connect/response_handler.rb +1 -1
  19. data/lib/new_relic/agent/database.rb +1 -2
  20. data/lib/new_relic/agent/datastores/mongo.rb +1 -1
  21. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +2 -2
  22. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +8 -8
  23. data/lib/new_relic/agent/distributed_tracing.rb +155 -6
  24. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +0 -0
  25. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +60 -45
  26. data/lib/new_relic/agent/distributed_tracing/distributed_trace_intrinsics.rb +80 -0
  27. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  28. data/lib/new_relic/agent/{distributed_trace_payload.rb → distributed_tracing/distributed_trace_payload.rb} +23 -99
  29. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
  30. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
  31. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
  32. data/lib/new_relic/agent/error_collector.rb +35 -18
  33. data/lib/new_relic/agent/error_event_aggregator.rb +9 -6
  34. data/lib/new_relic/agent/error_trace_aggregator.rb +1 -0
  35. data/lib/new_relic/agent/event_aggregator.rb +26 -32
  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/rails_notifications/action_cable.rb +2 -3
  69. data/lib/new_relic/agent/instrumentation/redis.rb +9 -3
  70. data/lib/new_relic/agent/instrumentation/resque.rb +3 -0
  71. data/lib/new_relic/agent/instrumentation/sidekiq.rb +0 -1
  72. data/lib/new_relic/agent/instrumentation/typhoeus.rb +23 -6
  73. data/lib/new_relic/agent/javascript_instrumentor.rb +1 -1
  74. data/lib/new_relic/agent/logging.rb +139 -0
  75. data/lib/new_relic/agent/messaging.rb +5 -73
  76. data/lib/new_relic/agent/method_tracer.rb +3 -2
  77. data/lib/new_relic/agent/method_tracer_helpers.rb +2 -2
  78. data/lib/new_relic/agent/monitors.rb +27 -0
  79. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
  80. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
  81. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +3 -3
  82. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +2 -4
  83. data/lib/new_relic/agent/new_relic_service.rb +7 -5
  84. data/lib/new_relic/agent/noticible_error.rb +22 -0
  85. data/lib/new_relic/agent/span_event_aggregator.rb +2 -4
  86. data/lib/new_relic/agent/span_event_primitive.rb +82 -53
  87. data/lib/new_relic/agent/sql_sampler.rb +3 -3
  88. data/lib/new_relic/agent/supported_versions.rb +2 -2
  89. data/lib/new_relic/agent/tracer.rb +65 -18
  90. data/lib/new_relic/agent/transaction.rb +84 -79
  91. data/lib/new_relic/agent/transaction/abstract_segment.rb +28 -2
  92. data/lib/new_relic/agent/transaction/distributed_tracer.rb +171 -0
  93. data/lib/new_relic/agent/transaction/distributed_tracing.rb +57 -146
  94. data/lib/new_relic/agent/transaction/external_request_segment.rb +29 -36
  95. data/lib/new_relic/agent/transaction/message_broker_segment.rb +3 -11
  96. data/lib/new_relic/agent/transaction/segment.rb +7 -1
  97. data/lib/new_relic/agent/transaction/trace.rb +2 -4
  98. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  99. data/lib/new_relic/agent/transaction/trace_node.rb +10 -8
  100. data/lib/new_relic/agent/transaction_error_primitive.rb +10 -15
  101. data/lib/new_relic/agent/transaction_event_primitive.rb +28 -39
  102. data/lib/new_relic/agent/transaction_event_recorder.rb +3 -3
  103. data/lib/new_relic/cli/commands/deployments.rb +1 -1
  104. data/lib/new_relic/cli/commands/install.rb +3 -2
  105. data/lib/new_relic/coerce.rb +31 -6
  106. data/lib/new_relic/constants.rb +34 -0
  107. data/lib/new_relic/control/instance_methods.rb +10 -1
  108. data/lib/new_relic/dependency_detection.rb +4 -4
  109. data/lib/new_relic/noticed_error.rb +38 -17
  110. data/lib/new_relic/rack/browser_monitoring.rb +5 -0
  111. data/lib/new_relic/supportability_helper.rb +14 -0
  112. data/lib/new_relic/version.rb +1 -1
  113. data/lib/tasks/multiverse.rb +25 -0
  114. data/lib/tasks/tests.rake +6 -1
  115. data/newrelic_rpm.gemspec +16 -5
  116. data/test/agent_helper.rb +329 -70
  117. data/true +0 -0
  118. metadata +98 -30
  119. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  120. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -40
  121. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  122. data/lib/new_relic/agent/transaction/attributes.rb +0 -154
  123. data/lib/tasks/versions.html.erb +0 -28
  124. data/lib/tasks/versions.postface.html +0 -8
  125. data/lib/tasks/versions.preface.html +0 -9
  126. data/lib/tasks/versions.rake +0 -65
  127. 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' => {
541
+ :default => '',
542
+ :public => true,
543
+ :type => String,
544
+ :deprecated => true,
545
+ :allowed_from_server => false,
546
+ :transform => DefaultSource.method(:convert_to_constant_list),
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' => {
466
554
  :default => '',
467
555
  :public => true,
468
556
  :type => String,
469
557
  :allowed_from_server => false,
470
558
  :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>.'
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' => {
660
+ :default => 60,
661
+ :public => false,
662
+ :type => Integer,
663
+ :dynamic_name => true,
664
+ :allowed_from_server => true,
665
+ :description => 'Number of seconds betwixt connections to the New Relic analytic event collection services.'
666
+ },
667
+ :'event_report_period.custom_event_data' => {
572
668
  :default => 60,
573
669
  :public => false,
574
670
  :type => Integer,
575
- :deprecated => true,
576
671
  :dynamic_name => true,
577
672
  :allowed_from_server => true,
578
- :description => 'Number of seconds between connections to the New Relic data collection service for sending transaction event data.'
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,
@@ -1017,6 +1128,7 @@ module NewRelic
1017
1128
  :public => true,
1018
1129
  :type => Boolean,
1019
1130
  :allowed_from_server => true,
1131
+ :dynamic_name => true,
1020
1132
  :description => 'If <code>true</code>, the agent collects <a href="https://docs.newrelic.com/docs/insights/new-relic-insights/decorating-events/error-event-default-attributes-insights">TransactionError events</a>.'
1021
1133
  },
1022
1134
  :'error_collector.max_event_samples_stored' => {
@@ -1223,10 +1335,10 @@ module NewRelic
1223
1335
  },
1224
1336
  :backport_fast_active_record_connection_lookup => {
1225
1337
  :default => false,
1226
- :public => false,
1338
+ :public => true,
1227
1339
  :type => Boolean,
1228
1340
  :allowed_from_server => false,
1229
- :description => 'Enables patching of "sql.active_record" AS Notification to include :connection in payload. Note that this setting may not be compatible with other gems that patch ActiveRecord.'
1341
+ :description => 'Backports the faster ActiveRecord connection lookup introduced in Rails 6, which improves agent performance when instrumenting ActiveRecord. Note that this setting may not be compatible with other gems that patch ActiveRecord.'
1230
1342
  },
1231
1343
  :disable_vm_sampler => {
1232
1344
  :default => false,
@@ -1804,17 +1916,24 @@ module NewRelic
1804
1916
  },
1805
1917
  :'span_events.enabled' => {
1806
1918
  :default => true,
1807
- :public => false,
1919
+ :public => true,
1808
1920
  :type => Boolean,
1809
1921
  :allowed_from_server => true,
1810
1922
  :description => 'If <code>true</code>, enables span event sampling.'
1811
1923
  },
1812
1924
  :'span_events.max_samples_stored' => {
1813
1925
  :default => 1000,
1814
- :public => false,
1926
+ :public => true,
1815
1927
  :type => Integer,
1816
1928
  :allowed_from_server => true,
1817
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."
1818
1937
  }
1819
1938
  }.freeze
1820
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
@@ -95,6 +95,7 @@ module NewRelic
95
95
  reset_cache
96
96
  log_config(:add, source)
97
97
 
98
+ notify_server_source_added if ServerSource === source
98
99
  notify_finished_configuring if !was_finished && finished_configuring?
99
100
  end
100
101
 
@@ -171,8 +172,19 @@ module NewRelic
171
172
  end
172
173
  end
173
174
 
175
+ # This event is intended to be fired every time the server source is
176
+ # applied. This happens after the agent's initial connect, and again
177
+ # on every forced reconnect.
178
+ def notify_server_source_added
179
+ NewRelic::Agent.instance.events.notify(:server_source_configuration_added)
180
+ end
181
+
182
+ # This event is intended to be fired once during the entire lifespan of
183
+ # an agent run, after the server source has been applied for the first
184
+ # time. This should indicate that all configuration has been applied,
185
+ # and the main functions of the agent are safe to start.
174
186
  def notify_finished_configuring
175
- NewRelic::Agent.instance.events.notify(:finished_configuring)
187
+ NewRelic::Agent.instance.events.notify(:initial_configuration_complete)
176
188
  end
177
189
 
178
190
  def finished_configuring?
@@ -216,14 +228,6 @@ module NewRelic
216
228
  end
217
229
  end
218
230
 
219
- def app_names
220
- case NewRelic::Agent.config[:app_name]
221
- when Array then NewRelic::Agent.config[:app_name]
222
- when String then NewRelic::Agent.config[:app_name].split(';')
223
- else []
224
- end
225
- end
226
-
227
231
  MALFORMED_LABELS_WARNING = "Skipping malformed labels configuration"
228
232
  PARSING_LABELS_FAILURE = "Failure during parsing labels. Ignoring and carrying on with connect."
229
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