newrelic_rpm 6.4.0.356 → 6.9.0.363
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +50 -5
- data/CHANGELOG.md +218 -0
- data/Guardfile +16 -1
- data/lib/new_relic/agent.rb +86 -5
- data/lib/new_relic/agent/agent.rb +124 -56
- data/lib/new_relic/agent/agent_logger.rb +4 -0
- data/lib/new_relic/agent/attribute_filter.rb +7 -7
- data/lib/new_relic/agent/attributes.rb +150 -0
- data/lib/new_relic/agent/autostart.rb +19 -14
- data/lib/new_relic/agent/configuration/default_source.rb +133 -14
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +45 -0
- data/lib/new_relic/agent/configuration/manager.rb +13 -9
- data/lib/new_relic/agent/configuration/server_source.rb +34 -10
- data/lib/new_relic/agent/configuration/yaml_source.rb +11 -6
- data/lib/new_relic/agent/connect/request_builder.rb +8 -15
- data/lib/new_relic/agent/connect/response_handler.rb +1 -1
- data/lib/new_relic/agent/database.rb +1 -2
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +2 -2
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +8 -8
- data/lib/new_relic/agent/distributed_tracing.rb +155 -6
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +0 -0
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +60 -45
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_intrinsics.rb +80 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/{distributed_trace_payload.rb → distributed_tracing/distributed_trace_payload.rb} +23 -99
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
- data/lib/new_relic/agent/error_collector.rb +5 -7
- data/lib/new_relic/agent/error_event_aggregator.rb +5 -2
- data/lib/new_relic/agent/error_trace_aggregator.rb +1 -0
- data/lib/new_relic/agent/event_aggregator.rb +26 -32
- data/lib/new_relic/agent/external.rb +7 -7
- data/lib/new_relic/agent/guid_generator.rb +28 -0
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +1 -2
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +24 -38
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +2 -2
- data/lib/new_relic/agent/instrumentation/bunny.rb +1 -1
- data/lib/new_relic/agent/instrumentation/curb.rb +1 -1
- data/lib/new_relic/agent/instrumentation/excon.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grape.rb +5 -10
- data/lib/new_relic/agent/instrumentation/http.rb +1 -1
- data/lib/new_relic/agent/instrumentation/httpclient.rb +1 -1
- data/lib/new_relic/agent/instrumentation/net.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +2 -3
- data/lib/new_relic/agent/instrumentation/resque.rb +3 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +1 -1
- data/lib/new_relic/agent/javascript_instrumentor.rb +1 -1
- data/lib/new_relic/agent/logging.rb +139 -0
- data/lib/new_relic/agent/messaging.rb +5 -73
- data/lib/new_relic/agent/method_tracer.rb +3 -2
- data/lib/new_relic/agent/method_tracer_helpers.rb +1 -1
- data/lib/new_relic/agent/monitors.rb +27 -0
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +3 -3
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +2 -4
- data/lib/new_relic/agent/new_relic_service.rb +7 -5
- data/lib/new_relic/agent/priority_sampled_buffer.rb +2 -0
- data/lib/new_relic/agent/span_event_aggregator.rb +2 -4
- data/lib/new_relic/agent/span_event_primitive.rb +43 -25
- data/lib/new_relic/agent/sql_sampler.rb +3 -3
- data/lib/new_relic/agent/supported_versions.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +35 -3
- data/lib/new_relic/agent/transaction.rb +37 -36
- data/lib/new_relic/agent/transaction/abstract_segment.rb +2 -2
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +171 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +57 -146
- data/lib/new_relic/agent/transaction/external_request_segment.rb +8 -31
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +3 -11
- data/lib/new_relic/agent/transaction/segment.rb +7 -1
- data/lib/new_relic/agent/transaction/trace.rb +2 -4
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +10 -8
- data/lib/new_relic/agent/transaction_error_primitive.rb +5 -12
- data/lib/new_relic/agent/transaction_event_primitive.rb +28 -39
- data/lib/new_relic/agent/transaction_event_recorder.rb +3 -3
- data/lib/new_relic/cli/commands/deployments.rb +1 -1
- data/lib/new_relic/coerce.rb +31 -6
- data/lib/new_relic/constants.rb +34 -0
- data/lib/new_relic/control/instance_methods.rb +10 -1
- data/lib/new_relic/dependency_detection.rb +4 -4
- data/lib/new_relic/noticed_error.rb +10 -8
- data/lib/new_relic/rack/browser_monitoring.rb +4 -0
- data/lib/new_relic/supportability_helper.rb +14 -0
- data/lib/new_relic/version.rb +1 -1
- data/lib/tasks/tests.rake +6 -1
- data/newrelic_rpm.gemspec +16 -5
- data/test/agent_helper.rb +115 -9
- data/true +0 -0
- metadata +97 -30
- data/lib/new_relic/agent/configuration/event_data.rb +0 -39
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -40
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/tasks/versions.html.erb +0 -28
- data/lib/tasks/versions.postface.html +0 -8
- data/lib/tasks/versions.preface.html +0 -9
- data/lib/tasks/versions.rake +0 -65
- 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.
|
24
|
-
# 'autostart.
|
25
|
-
# 'autostart.
|
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
|
-
!
|
28
|
-
!
|
29
|
-
!
|
27
|
+
!denylisted_constants? &&
|
28
|
+
!denylisted_executables? &&
|
29
|
+
!in_denylisted_rake_task?
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
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
|
39
|
-
|
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
|
55
|
+
def denylisted?(value, &block)
|
51
56
|
value.split(/\s*,\s*/).any?(&block)
|
52
57
|
end
|
53
58
|
|
54
|
-
def
|
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
|
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.
|
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
|
-
|
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
|
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 =>
|
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-
|
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
|
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 => '
|
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
|
-
:'
|
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' => {
|
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' => {
|
572
684
|
:default => 60,
|
573
685
|
:public => false,
|
574
686
|
:type => Integer,
|
575
|
-
:deprecated => true,
|
576
687
|
:dynamic_name => true,
|
577
688
|
:allowed_from_server => true,
|
578
|
-
:description => 'Number of seconds
|
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' => {
|
@@ -1222,11 +1334,11 @@ module NewRelic
|
|
1222
1334
|
:description => 'Controls whether to normalize string encodings prior to serializing data for the collector to JSON.'
|
1223
1335
|
},
|
1224
1336
|
:backport_fast_active_record_connection_lookup => {
|
1225
|
-
:default =>
|
1226
|
-
:public =>
|
1337
|
+
:default => false,
|
1338
|
+
:public => true,
|
1227
1339
|
:type => Boolean,
|
1228
1340
|
:allowed_from_server => false,
|
1229
|
-
:description => '
|
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 =>
|
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 =>
|
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
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module Configuration
|
8
|
+
module EventHarvestConfig
|
9
|
+
|
10
|
+
extend self
|
11
|
+
|
12
|
+
EVENT_HARVEST_CONFIG_KEY_MAPPING = {
|
13
|
+
:analytic_event_data => :'analytics_events.max_samples_stored',
|
14
|
+
:custom_event_data => :'custom_insights_events.max_samples_stored',
|
15
|
+
:error_event_data => :'error_collector.max_event_samples_stored',
|
16
|
+
:span_event_data => :'span_events.max_samples_stored'
|
17
|
+
}
|
18
|
+
|
19
|
+
def from_config(config)
|
20
|
+
{:harvest_limits => EVENT_HARVEST_CONFIG_KEY_MAPPING.inject({}) do
|
21
|
+
|connect_payload, (connect_payload_key, config_key)|
|
22
|
+
connect_payload[connect_payload_key] = config[config_key]
|
23
|
+
connect_payload
|
24
|
+
end
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_config_hash(connect_reply)
|
29
|
+
event_harvest_interval = connect_reply['event_harvest_config']['report_period_ms'] / 1000
|
30
|
+
config_hash = EVENT_HARVEST_CONFIG_KEY_MAPPING.inject({}) do
|
31
|
+
|event_harvest_config, (connect_payload_key, config_key)|
|
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
|
37
|
+
event_harvest_config
|
38
|
+
end
|
39
|
+
config_hash[:event_report_period] = event_harvest_interval
|
40
|
+
config_hash
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
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(:
|
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",
|
@@ -38,7 +39,7 @@ module NewRelic
|
|
38
39
|
merge_top_level_keys(merged_settings, connect_reply)
|
39
40
|
merge_agent_config_hash(merged_settings, connect_reply)
|
40
41
|
fix_transaction_threshold(merged_settings)
|
41
|
-
|
42
|
+
add_event_harvest_config(merged_settings, connect_reply)
|
42
43
|
filter_keys(merged_settings)
|
43
44
|
|
44
45
|
apply_feature_gates(merged_settings, connect_reply, existing_config)
|
@@ -69,19 +70,42 @@ 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
|
76
77
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
78
|
+
EVENT_HARVEST_CONFIG_SUPPORTABILITY_METRIC_NAMES = {
|
79
|
+
:'analytics_events.max_samples_stored' => 'Supportability/EventHarvest/AnalyticEventData/HarvestLimit',
|
80
|
+
:'custom_insights_events.max_samples_stored' => 'Supportability/EventHarvest/CustomEventData/HarvestLimit',
|
81
|
+
:'error_collector.max_event_samples_stored'=> 'Supportability/EventHarvest/ErrorEventData/HarvestLimit',
|
82
|
+
:'span_events.max_samples_stored'=> 'Supportability/EventHarvest/SpanEventData/HarvestLimit',
|
83
|
+
:event_report_period => 'Supportability/EventHarvest/ReportPeriod'
|
84
|
+
}
|
85
|
+
|
86
|
+
def add_event_harvest_config(merged_settings, connect_reply)
|
87
|
+
return unless event_harvest_config_is_valid connect_reply
|
88
|
+
|
89
|
+
event_harvest_config = EventHarvestConfig.to_config_hash(connect_reply)
|
90
|
+
EVENT_HARVEST_CONFIG_SUPPORTABILITY_METRIC_NAMES.each do |config_key, metric_name|
|
91
|
+
NewRelic::Agent.record_metric metric_name, event_harvest_config[config_key]
|
92
|
+
end
|
93
|
+
|
94
|
+
merged_settings.merge! event_harvest_config
|
95
|
+
end
|
96
|
+
|
97
|
+
def event_harvest_config_is_valid connect_reply
|
98
|
+
event_harvest_config = connect_reply['event_harvest_config']
|
99
|
+
|
100
|
+
if event_harvest_config.nil? \
|
101
|
+
|| event_harvest_config['harvest_limits'].values.min < 0 \
|
102
|
+
|| (event_harvest_config['report_period_ms'] / 1000) <= 0
|
103
|
+
NewRelic::Agent.logger.warn "Invalid event harvest config found " \
|
104
|
+
"in connect response; using default event report period."
|
105
|
+
false
|
106
|
+
else
|
107
|
+
true
|
108
|
+
end
|
85
109
|
end
|
86
110
|
|
87
111
|
def filter_keys(merged_settings)
|