newrelic_rpm 5.7.0.350 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +15 -1
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +2 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +4056 -2339
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +22 -4
- data/LICENSE +202 -38
- data/README.md +87 -87
- data/Rakefile +27 -27
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +77 -54
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +125 -969
- data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
- data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
- data/lib/new_relic/agent/agent_logger.rb +26 -18
- data/lib/new_relic/agent/attribute_filter.rb +69 -52
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +153 -0
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +34 -28
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
- data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
- data/lib/new_relic/agent/configuration/manager.rb +96 -79
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
- data/lib/new_relic/agent/configuration/server_source.rb +49 -12
- data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +58 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
- data/lib/new_relic/agent/database/obfuscator.rb +3 -3
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +44 -53
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +6 -12
- data/lib/new_relic/agent/datastores.rb +19 -23
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +99 -63
- data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
- data/lib/new_relic/agent/event_aggregator.rb +43 -48
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +27 -25
- data/lib/new_relic/agent/external.rb +20 -51
- data/lib/new_relic/agent/guid_generator.rb +30 -0
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +8 -10
- data/lib/new_relic/agent/hostname.rb +26 -5
- data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
- data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
- data/lib/new_relic/agent/linking_metadata.rb +44 -0
- data/lib/new_relic/agent/local_log_decorator.rb +37 -0
- data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +142 -0
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +81 -164
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +282 -166
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +35 -8
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
- data/lib/new_relic/agent/pipe_service.rb +9 -6
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
- data/lib/new_relic/agent/range_extensions.rb +9 -29
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +4 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
- data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
- data/lib/new_relic/agent/span_event_primitive.rb +118 -58
- data/lib/new_relic/agent/sql_sampler.rb +25 -25
- data/lib/new_relic/agent/stats.rb +79 -42
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +11 -11
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +100 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
- data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +513 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
- data/lib/new_relic/agent/transaction/segment.rb +46 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +21 -24
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -111
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +252 -259
- data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +7 -12
- data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +4 -4
- data/lib/new_relic/agent/utilization/gcp.rb +8 -8
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +44 -29
- data/lib/new_relic/agent/utilization_data.rb +43 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +151 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +94 -45
- data/lib/new_relic/cli/commands/install.rb +24 -26
- data/lib/new_relic/coerce.rb +42 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +39 -0
- data/lib/new_relic/control/class_methods.rb +11 -5
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +24 -18
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +33 -42
- data/lib/new_relic/control/instrumentation.rb +40 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +129 -18
- data/lib/new_relic/environment_report.rb +41 -35
- data/lib/new_relic/helper.rb +49 -8
- data/lib/new_relic/language_support.rb +30 -6
- data/lib/new_relic/latest_changes.rb +9 -8
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +46 -33
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +7 -5
- data/lib/new_relic/rack/browser_monitoring.rb +134 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +4 -62
- data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -118
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/helpers/format.rb +123 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/removers.rb +33 -0
- data/lib/tasks/install.rake +4 -0
- data/lib/tasks/instrumentation_generator/README.md +63 -0
- data/lib/tasks/instrumentation_generator/TODO.md +33 -0
- data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
- data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
- data/lib/tasks/multiverse.rake +4 -0
- data/lib/tasks/multiverse.rb +12 -5
- data/lib/tasks/newrelic.rb +2 -2
- data/lib/tasks/tests.rake +14 -14
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +40 -31
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +419 -98
- metadata +238 -127
- data/.travis.yml +0 -228
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/commands/xray_session.rb +0 -55
- data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
- data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -186
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/control/frameworks/rails5.rb +0 -14
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- 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
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'optparse'
|
6
6
|
|
@@ -15,8 +15,8 @@ module NewRelic
|
|
15
15
|
# Capture a failure to execute the command.
|
16
16
|
class CommandFailure < StandardError
|
17
17
|
attr_reader :options
|
18
|
-
def initialize
|
19
|
-
super
|
18
|
+
def initialize(message, opt_parser = nil)
|
19
|
+
super(message)
|
20
20
|
@options = opt_parser
|
21
21
|
end
|
22
22
|
end
|
@@ -32,13 +32,13 @@ module NewRelic
|
|
32
32
|
def initialize(command_line_args)
|
33
33
|
if Hash === command_line_args
|
34
34
|
# command line args is an options hash
|
35
|
-
command_line_args.each do |
|
36
|
-
instance_variable_set
|
35
|
+
command_line_args.each do |key, value|
|
36
|
+
instance_variable_set("@#{key}", value.to_s) if value
|
37
37
|
end
|
38
38
|
else
|
39
39
|
# parse command line args. Throw an exception on a bad arg.
|
40
|
-
@options = options do |
|
41
|
-
opts.on("-h", "Show this help") {
|
40
|
+
@options = options do |opts|
|
41
|
+
opts.on("-h", "Show this help") { raise CommandFailure, opts.to_s }
|
42
42
|
end
|
43
43
|
@leftover = @options.parse(command_line_args)
|
44
44
|
end
|
@@ -55,8 +55,7 @@ module NewRelic
|
|
55
55
|
Dir[cmds].each { |command| require command }
|
56
56
|
|
57
57
|
def self.run
|
58
|
-
|
59
|
-
@command_names = @commands.map{ |c| c.command }
|
58
|
+
@command_names = @commands.map { |c| c.command }
|
60
59
|
|
61
60
|
extra = []
|
62
61
|
options = ARGV.options do |opts|
|
@@ -65,27 +64,26 @@ module NewRelic
|
|
65
64
|
$stdout.puts "warning: the 'newrelic_cmd' script has been renamed 'newrelic'"
|
66
65
|
script_name = 'newrelic'
|
67
66
|
end
|
68
|
-
opts.banner = "Usage: #{script_name} [ #{
|
69
|
-
opts.separator
|
67
|
+
opts.banner = "Usage: #{script_name} [ #{@command_names.join(" | ")} ] [options]"
|
68
|
+
opts.separator("use '#{script_name} <command> -h' to see detailed command options")
|
70
69
|
opts
|
71
70
|
end
|
72
71
|
extra = options.order!
|
73
72
|
command = extra.shift
|
74
73
|
# just make it a little easier on them
|
75
|
-
command = 'deployments' if command
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
74
|
+
command = 'deployments' if command.include?('deploy')
|
75
|
+
if command.nil?
|
76
|
+
STDERR.puts options
|
77
|
+
elsif !@command_names.include?(command)
|
78
|
+
STDERR.puts "Unrecognized command: #{command}"
|
79
|
+
STDERR.puts options
|
80
|
+
else
|
81
|
+
command_class = @commands.find { |c| c.command == command }
|
82
|
+
command_class.new(extra).run
|
83
|
+
end
|
85
84
|
rescue OptionParser::InvalidOption => e
|
86
85
|
raise NewRelic::Cli::Command::CommandFailure, e.message
|
87
86
|
end
|
88
87
|
end
|
89
|
-
|
90
88
|
end
|
91
89
|
end
|
@@ -1,17 +1,16 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
# This is a class for executing commands related to deployment
|
6
6
|
# events. It runs without loading the rails environment
|
7
7
|
|
8
8
|
require 'yaml'
|
9
9
|
require 'net/http'
|
10
|
-
require 'rexml/document'
|
11
10
|
require 'new_relic/agent/hostname'
|
12
11
|
|
13
12
|
# We need to use the Control object but we don't want to load
|
14
|
-
# the rails
|
13
|
+
# the rails environment. The defined? clause is so that
|
15
14
|
# it won't load it twice, something it does when run inside a test
|
16
15
|
require 'new_relic/control' unless defined? NewRelic::Control
|
17
16
|
|
@@ -28,19 +27,20 @@ class NewRelic::Cli::Deployments < NewRelic::Cli::Command
|
|
28
27
|
#
|
29
28
|
# Will throw CommandFailed exception if there's any error.
|
30
29
|
#
|
31
|
-
def initialize
|
30
|
+
def initialize(command_line_args)
|
32
31
|
@control = NewRelic::Control.instance
|
33
32
|
@environment = nil
|
34
|
-
@changelog
|
35
|
-
@user
|
33
|
+
@changelog = nil
|
34
|
+
@user = nil
|
36
35
|
super(command_line_args)
|
37
36
|
@description ||= @leftover && @leftover.join(" ")
|
38
37
|
@user ||= ENV['USER']
|
39
38
|
control.env = @environment if @environment
|
40
39
|
|
41
40
|
load_yaml_from_env(control.env)
|
42
|
-
@appname ||= NewRelic::Agent.config
|
41
|
+
@appname ||= NewRelic::Agent.config[:app_name][0] || control.env || 'development'
|
43
42
|
@license_key ||= NewRelic::Agent.config[:license_key]
|
43
|
+
@api_key ||= NewRelic::Agent.config[:api_key]
|
44
44
|
|
45
45
|
setup_logging(control.env)
|
46
46
|
end
|
@@ -65,35 +65,34 @@ class NewRelic::Cli::Deployments < NewRelic::Cli::Command
|
|
65
65
|
def run
|
66
66
|
begin
|
67
67
|
@description = nil if @description && @description.strip.empty?
|
68
|
-
create_params = {}
|
69
|
-
{
|
70
|
-
:application_id => @appname,
|
71
|
-
:host => NewRelic::Agent::Hostname.get,
|
72
|
-
:description => @description,
|
73
|
-
:user => @user,
|
74
|
-
:revision => @revision,
|
75
|
-
:changelog => @changelog
|
76
|
-
}.each do |k, v|
|
77
|
-
create_params["deployment[#{k}]"] = v unless v.nil? || v == ''
|
78
|
-
end
|
79
|
-
http = ::NewRelic::Agent::NewRelicService.new(nil, control.api_server).http_connection
|
80
|
-
|
81
|
-
uri = "/deployments.xml"
|
82
68
|
|
83
69
|
if @license_key.nil? || @license_key.empty?
|
84
|
-
raise "license_key
|
70
|
+
raise "license_key not set in newrelic.yml for #{control.env}. api_key also required to use New Relic REST API v2"
|
85
71
|
end
|
86
|
-
request = Net::HTTP::Post.new(uri, {'x-license-key' => @license_key})
|
87
|
-
request.content_type = "application/octet-stream"
|
88
72
|
|
89
|
-
|
73
|
+
if !api_v1? && (@revision.nil? || @revision.empty?)
|
74
|
+
raise "revision required when using New Relic REST API v2 with api_key. Pass in revision using: -r, --revision=REV"
|
75
|
+
end
|
76
|
+
|
77
|
+
request = if api_v1?
|
78
|
+
uri = "/deployments.xml"
|
79
|
+
create_request(uri, {'x-license-key' => @license_key}, "application/octet-stream").tap do |req|
|
80
|
+
set_params_v1(req)
|
81
|
+
end
|
82
|
+
else
|
83
|
+
uri = "/v2/applications/#{application_id}/deployments.json"
|
84
|
+
create_request(uri, {"Api-Key" => @api_key}, "application/json").tap do |req|
|
85
|
+
set_params_v2(req)
|
86
|
+
end
|
87
|
+
end
|
90
88
|
|
89
|
+
http = ::NewRelic::Agent::NewRelicService.new(nil, control.api_server).http_connection
|
91
90
|
response = http.request(request)
|
92
91
|
|
93
|
-
if response.is_a?
|
94
|
-
info
|
92
|
+
if response.is_a?(Net::HTTPSuccess)
|
93
|
+
info("Recorded deployment to '#{@appname}' (#{@description || Time.now})")
|
95
94
|
else
|
96
|
-
err_string = REXML::Document.new(response.body).elements['errors/error'].map(&:to_s).join("; ") rescue
|
95
|
+
err_string = REXML::Document.new(response.body).elements['errors/error'].map(&:to_s).join("; ") rescue response.message
|
97
96
|
raise NewRelic::Cli::Command::CommandFailure, "Deployment not recorded: #{err_string}"
|
98
97
|
end
|
99
98
|
rescue SystemCallError, SocketError => e
|
@@ -103,35 +102,85 @@ class NewRelic::Cli::Deployments < NewRelic::Cli::Command
|
|
103
102
|
rescue NewRelic::Cli::Command::CommandFailure
|
104
103
|
raise
|
105
104
|
rescue => e
|
106
|
-
err
|
107
|
-
info
|
105
|
+
err("Unexpected error attempting to connect to #{control.api_server}")
|
106
|
+
info("#{e}: #{e.backtrace.join("\n ")}")
|
108
107
|
raise NewRelic::Cli::Command::CommandFailure.new(e.to_s)
|
109
108
|
end
|
110
109
|
end
|
111
110
|
|
111
|
+
def api_v1?
|
112
|
+
@api_key.nil? || @api_key.empty?
|
113
|
+
end
|
114
|
+
|
112
115
|
private
|
113
116
|
|
117
|
+
def create_request(uri, headers, content_type)
|
118
|
+
Net::HTTP::Post.new(uri, headers).tap do |req|
|
119
|
+
req.content_type = content_type
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def application_id
|
124
|
+
return @application_id if @application_id
|
125
|
+
|
126
|
+
# Need to connect to collector to acquire application id from the connect response
|
127
|
+
# but set monitor_mode false because we don't want to actually report anything
|
128
|
+
begin
|
129
|
+
NewRelic::Agent.manual_start(monitor_mode: false)
|
130
|
+
NewRelic::Agent.agent.connect_to_server
|
131
|
+
@application_id = NewRelic::Agent.config[:primary_application_id]
|
132
|
+
ensure
|
133
|
+
NewRelic::Agent.shutdown
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def set_params_v1(request)
|
138
|
+
params = {
|
139
|
+
:application_id => @appname,
|
140
|
+
:host => NewRelic::Agent::Hostname.get,
|
141
|
+
:description => @description,
|
142
|
+
:user => @user,
|
143
|
+
:revision => @revision,
|
144
|
+
:changelog => @changelog
|
145
|
+
}.each_with_object({}) do |(k, v), h|
|
146
|
+
h["deployment[#{k}]"] = v unless v.nil? || v == ''
|
147
|
+
end
|
148
|
+
request.set_form_data(params)
|
149
|
+
end
|
150
|
+
|
151
|
+
def set_params_v2(request)
|
152
|
+
request.body = {
|
153
|
+
"deployment" => {
|
154
|
+
:description => @description,
|
155
|
+
:user => @user,
|
156
|
+
:revision => @revision,
|
157
|
+
:changelog => @changelog
|
158
|
+
}
|
159
|
+
}.to_json
|
160
|
+
end
|
161
|
+
|
114
162
|
def options
|
115
|
-
OptionParser.new
|
116
|
-
o.separator
|
163
|
+
OptionParser.new(%Q(Usage: #{$0} #{self.class.command} [OPTIONS] ["description"] ), 40) do |o|
|
164
|
+
o.separator("OPTIONS:")
|
117
165
|
o.on("-a", "--appname=NAME", String,
|
118
|
-
|
119
|
-
|
166
|
+
"Set the application name.",
|
167
|
+
"Default is app_name setting in newrelic.yml. Available only when using API v1.") { |e| @appname = e }
|
168
|
+
o.on("-i", "--appid=ID", String,
|
169
|
+
"Set the application ID",
|
170
|
+
"If not provided, will connect to the New Relic collector to get it") { |i| @application_id = i }
|
120
171
|
o.on("-e", "--environment=name", String,
|
121
|
-
|
122
|
-
|
172
|
+
"Override the (RAILS|RUBY|RACK)_ENV setting",
|
173
|
+
"currently: #{control.env}") { |e| @environment = e }
|
123
174
|
o.on("-u", "--user=USER", String,
|
124
|
-
|
125
|
-
|
175
|
+
"Specify the user deploying, for information only",
|
176
|
+
"Default: #{@user || '<none>'}") { |u| @user = u }
|
126
177
|
o.on("-r", "--revision=REV", String,
|
127
|
-
|
178
|
+
"Specify the revision being deployed. Required when using New Relic REST API v2") { |r| @revision = r }
|
128
179
|
o.on("-l", "--license-key=KEY", String,
|
129
|
-
|
180
|
+
"Specify the license key of the account for the app being deployed") { |l| @license_key = l }
|
130
181
|
o.on("-c", "--changes",
|
131
|
-
|
132
|
-
yield
|
182
|
+
"Read in a change log from the standard input") { @changelog = STDIN.read }
|
183
|
+
yield(o) if block_given?
|
133
184
|
end
|
134
185
|
end
|
135
|
-
|
136
|
-
|
137
186
|
end
|
@@ -1,13 +1,12 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'fileutils'
|
6
6
|
require 'new_relic/version'
|
7
7
|
require 'erb'
|
8
8
|
|
9
9
|
class NewRelic::Cli::Install < NewRelic::Cli::Command
|
10
|
-
|
11
10
|
NO_LICENSE_KEY = "<PASTE LICENSE KEY HERE>"
|
12
11
|
|
13
12
|
def self.command; "install"; end
|
@@ -21,12 +20,12 @@ class NewRelic::Cli::Install < NewRelic::Cli::Command
|
|
21
20
|
# Will throw CommandFailed exception if there's any error.
|
22
21
|
#
|
23
22
|
attr_reader :dest_dir, :license_key, :generated_for_user, :quiet, :src_file, :app_name
|
24
|
-
def initialize
|
23
|
+
def initialize(command_line_args = {})
|
25
24
|
@dest_dir = nil
|
26
|
-
super
|
25
|
+
super(command_line_args)
|
27
26
|
if @dest_dir.nil?
|
28
27
|
# Install a newrelic.yml file into the local config directory.
|
29
|
-
if File.directory?
|
28
|
+
if File.directory?("config")
|
30
29
|
@dest_dir = "config"
|
31
30
|
else
|
32
31
|
@dest_dir = "."
|
@@ -40,31 +39,31 @@ class NewRelic::Cli::Install < NewRelic::Cli::Command
|
|
40
39
|
|
41
40
|
def run
|
42
41
|
dest_file = File.expand_path(@dest_dir + "/newrelic.yml")
|
43
|
-
if File.exist?(dest_file)
|
44
|
-
raise NewRelic::Cli::Command::CommandFailure, "newrelic.yml file already exists.
|
42
|
+
if File.exist?(dest_file) && !@force
|
43
|
+
raise NewRelic::Cli::Command::CommandFailure, "newrelic.yml file already exists. Use --force flag to overwrite."
|
45
44
|
end
|
46
|
-
File.open(dest_file, 'w') { | out | out.puts(content) }
|
47
45
|
|
48
|
-
|
46
|
+
File.open(dest_file, 'w') { |out| out.puts(content) }
|
49
47
|
|
50
|
-
|
51
|
-
#{dest_file}.
|
52
|
-
EOF
|
53
|
-
puts <<-EOF unless quiet || @license_key != NO_LICENSE_KEY
|
48
|
+
puts <<~EOF unless quiet
|
54
49
|
|
55
|
-
|
56
|
-
|
57
|
-
you receive upon registration.
|
50
|
+
Installed a default configuration file at
|
51
|
+
#{dest_file}.
|
58
52
|
EOF
|
59
|
-
puts
|
53
|
+
puts <<~EOF unless quiet || @license_key != NO_LICENSE_KEY
|
60
54
|
|
61
|
-
|
55
|
+
To monitor your application in production mode, sign up for an account
|
56
|
+
at www.newrelic.com, and replace the newrelic.yml file with the one
|
57
|
+
you receive upon registration.
|
62
58
|
EOF
|
59
|
+
puts <<~EOF unless quiet
|
63
60
|
|
61
|
+
Visit support.newrelic.com if you are experiencing installation issues.
|
62
|
+
EOF
|
64
63
|
end
|
65
64
|
|
66
65
|
def content
|
67
|
-
@src_file ||= File.expand_path(File.join(File.dirname(__FILE__),"..","..","..","..","newrelic.yml"))
|
66
|
+
@src_file ||= File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "..", "newrelic.yml"))
|
68
67
|
template = File.read(@src_file)
|
69
68
|
ERB.new(template).result(binding)
|
70
69
|
end
|
@@ -72,14 +71,13 @@ Visit support.newrelic.com if you are experiencing installation issues.
|
|
72
71
|
private
|
73
72
|
|
74
73
|
def options
|
75
|
-
OptionParser.new
|
74
|
+
OptionParser.new("Usage: #{$0} #{self.class.command} [ OPTIONS] 'application name'", 40) do |o|
|
75
|
+
o.on("-f", "--force", "Overwrite newrelic.yml if it exists") { |e| @force = true }
|
76
76
|
o.on("-l", "--license_key=NAME", String,
|
77
|
-
|
77
|
+
"Use the given license key") { |e| @license_key = e }
|
78
78
|
o.on("-d", "--destdir=name", String,
|
79
|
-
|
80
|
-
yield
|
79
|
+
"Write the newrelic.yml to the given directory, default is '.'") { |e| @dest_dir = e }
|
80
|
+
yield(o) if block_given?
|
81
81
|
end
|
82
82
|
end
|
83
|
-
|
84
|
-
|
85
83
|
end
|
data/lib/new_relic/coerce.rb
CHANGED
@@ -1,47 +1,51 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
|
-
# We really don't want to send bad values to the collector, and it doesn't
|
7
|
-
# accept types like Rational that have occasionally slipped into our data.
|
8
|
-
#
|
9
|
-
# These methods are intended to safely coerce things into the form we want,
|
10
|
-
# to provide documentation of expected types on to_collector_array methods,
|
11
|
-
# and to log failures if totally invalid data gets into outgoing data
|
12
6
|
module Coerce
|
13
7
|
module_function
|
14
8
|
|
15
|
-
|
9
|
+
# We really don't want to send bad values to the collector, and it doesn't
|
10
|
+
# accept types like Rational that have occasionally slipped into our data.
|
11
|
+
#
|
12
|
+
# These non-bang methods are intended to safely coerce things into the form we want,
|
13
|
+
# to provide documentation of expected types on to_collector_array methods,
|
14
|
+
# and to log failures if totally invalid data gets into outgoing data
|
15
|
+
|
16
|
+
def int(value, context = nil)
|
16
17
|
Integer(value)
|
17
18
|
rescue => error
|
18
19
|
log_failure(value, Integer, context, error)
|
19
20
|
0
|
20
21
|
end
|
21
22
|
|
22
|
-
def int_or_nil(value, context=nil)
|
23
|
+
def int_or_nil(value, context = nil)
|
23
24
|
return nil if value.nil?
|
25
|
+
|
24
26
|
Integer(value)
|
25
27
|
rescue => error
|
26
28
|
log_failure(value, Integer, context, error)
|
27
29
|
nil
|
28
30
|
end
|
29
31
|
|
30
|
-
def float(value, context=nil)
|
32
|
+
def float(value, context = nil)
|
31
33
|
result = Float(value)
|
32
34
|
raise "Value #{result.inspect} is not finite." unless result.finite?
|
35
|
+
|
33
36
|
result
|
34
37
|
rescue => error
|
35
38
|
log_failure(value, Float, context, error)
|
36
39
|
0.0
|
37
40
|
end
|
38
41
|
|
39
|
-
def string(value, context=nil)
|
42
|
+
def string(value, context = nil)
|
40
43
|
return value if value.nil?
|
44
|
+
|
41
45
|
String(value)
|
42
46
|
rescue => error
|
43
47
|
log_failure(value.class, String, context, error)
|
44
|
-
|
48
|
+
EMPTY_STR
|
45
49
|
end
|
46
50
|
|
47
51
|
def scalar(val)
|
@@ -51,8 +55,6 @@ module NewRelic
|
|
51
55
|
when Float
|
52
56
|
if val.finite?
|
53
57
|
val
|
54
|
-
else
|
55
|
-
nil
|
56
58
|
end
|
57
59
|
when Symbol
|
58
60
|
val.to_s
|
@@ -61,6 +63,31 @@ module NewRelic
|
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
66
|
+
def int!(value)
|
67
|
+
return nil unless value_or_nil(value)
|
68
|
+
|
69
|
+
Integer(value)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Use when you plan to perform a boolean check using the integer 1
|
73
|
+
# for true and the integer 0 for false
|
74
|
+
# String values will be converted to 0
|
75
|
+
def boolean_int!(value)
|
76
|
+
value.to_i
|
77
|
+
end
|
78
|
+
|
79
|
+
def float!(value, precision = NewRelic::PRIORITY_PRECISION)
|
80
|
+
return nil unless value_or_nil(value)
|
81
|
+
|
82
|
+
value.to_f.round(precision)
|
83
|
+
end
|
84
|
+
|
85
|
+
def value_or_nil(value)
|
86
|
+
return nil if value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
87
|
+
|
88
|
+
value
|
89
|
+
end
|
90
|
+
|
64
91
|
def log_failure(value, type, context, error)
|
65
92
|
msg = "Unable to convert '#{value}' to #{type}"
|
66
93
|
msg += " in context '#{context}'" if context
|
@@ -1,61 +1,63 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module CollectionHelper
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
7
|
+
DEFAULT_TRUNCATION_SIZE = 16 * 1024
|
8
|
+
DEFAULT_ARRAY_TRUNCATION_SIZE = 128
|
9
|
+
# Transform parameter hash into a hash whose values are strictly
|
10
|
+
# strings
|
11
|
+
def normalize_params(params)
|
12
|
+
case params
|
13
|
+
when Hash
|
14
|
+
# Optimize for empty hash since that is often what this is called with.
|
15
|
+
return params if params.empty?
|
16
|
+
|
17
|
+
new_params = {}
|
18
|
+
params.each do |key, value|
|
19
|
+
new_params[truncate(normalize_params(key), 64)] = normalize_params(value)
|
20
|
+
end
|
21
|
+
new_params
|
22
|
+
when Symbol, FalseClass, TrueClass, nil
|
23
|
+
params
|
24
|
+
when Numeric
|
25
|
+
truncate(params.to_s)
|
26
|
+
when String
|
27
|
+
truncate(params)
|
28
|
+
when Array
|
29
|
+
params.first(DEFAULT_ARRAY_TRUNCATION_SIZE).map { |item| normalize_params(item) }
|
30
|
+
else
|
31
|
+
truncate(flatten(params))
|
32
|
+
end
|
31
33
|
end
|
32
|
-
end
|
33
34
|
|
34
|
-
|
35
|
+
private
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
# Convert any kind of object to a short string.
|
38
|
+
def flatten(object)
|
39
|
+
case object
|
40
|
+
when nil then ''
|
41
|
+
when object.instance_of?(String) then object
|
42
|
+
when String then String.new(object) # convert string subclasses to strings
|
43
|
+
else String.new("#<#{object.class}>")
|
44
|
+
end
|
43
45
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
46
|
+
|
47
|
+
def truncate(string, len = DEFAULT_TRUNCATION_SIZE)
|
48
|
+
case string
|
49
|
+
when Symbol then string
|
50
|
+
when nil then EMPTY_STR
|
51
|
+
when String
|
52
|
+
real_string = flatten(string)
|
53
|
+
if real_string.size > len
|
54
|
+
real_string = real_string.slice(0...len)
|
55
|
+
real_string << "..."
|
56
|
+
end
|
57
|
+
real_string
|
58
|
+
else
|
59
|
+
truncate(flatten(string), len)
|
54
60
|
end
|
55
|
-
real_string
|
56
|
-
else
|
57
|
-
truncate(flatten(string), len)
|
58
61
|
end
|
59
62
|
end
|
60
|
-
end
|
61
63
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
PRIORITY_PRECISION = 6
|
7
|
+
|
8
|
+
EMPTY_ARRAY = [].freeze
|
9
|
+
EMPTY_HASH = {}.freeze
|
10
|
+
EMPTY_STR = ""
|
11
|
+
|
12
|
+
HTTP = "HTTP"
|
13
|
+
HTTPS = "HTTPS"
|
14
|
+
UNKNOWN = "Unknown"
|
15
|
+
|
16
|
+
FORMAT_NON_RACK = 0
|
17
|
+
FORMAT_RACK = 1
|
18
|
+
|
19
|
+
NEWRELIC_KEY = "newrelic"
|
20
|
+
CANDIDATE_NEWRELIC_KEYS = [
|
21
|
+
NEWRELIC_KEY,
|
22
|
+
'NEWRELIC',
|
23
|
+
'NewRelic',
|
24
|
+
'Newrelic'
|
25
|
+
].freeze
|
26
|
+
|
27
|
+
TRACEPARENT_KEY = "traceparent"
|
28
|
+
TRACESTATE_KEY = "tracestate"
|
29
|
+
|
30
|
+
STANDARD_OUT = 'STDOUT'
|
31
|
+
|
32
|
+
HTTP_TRACEPARENT_KEY = "HTTP_#{TRACEPARENT_KEY.upcase}"
|
33
|
+
HTTP_TRACESTATE_KEY = "HTTP_#{TRACESTATE_KEY.upcase}"
|
34
|
+
HTTP_NEWRELIC_KEY = "HTTP_#{NEWRELIC_KEY.upcase}"
|
35
|
+
|
36
|
+
CONNECT_RETRY_PERIODS = [15, 15, 30, 60, 120, 300]
|
37
|
+
MIN_RETRY_PERIOD = 15
|
38
|
+
MAX_RETRY_PERIOD = 300
|
39
|
+
end
|