newrelic_rpm 8.9.0 → 8.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +23 -8
  4. data/.rubocop_todo.yml +243 -0
  5. data/.simplecov +10 -2
  6. data/.snyk +11 -0
  7. data/Brewfile +1 -0
  8. data/CHANGELOG.md +78 -0
  9. data/Guardfile +1 -0
  10. data/Rakefile +5 -0
  11. data/Thorfile +6 -0
  12. data/bin/newrelic +2 -1
  13. data/bin/newrelic_cmd +1 -0
  14. data/bin/nrdebug +3 -2
  15. data/init.rb +3 -2
  16. data/install.rb +1 -0
  17. data/lib/new_relic/agent/adaptive_sampler.rb +4 -3
  18. data/lib/new_relic/agent/agent/shutdown.rb +3 -2
  19. data/lib/new_relic/agent/agent/special_startup.rb +3 -2
  20. data/lib/new_relic/agent/agent/start_worker_thread.rb +15 -14
  21. data/lib/new_relic/agent/agent/startup.rb +11 -10
  22. data/lib/new_relic/agent/agent.rb +35 -33
  23. data/lib/new_relic/agent/agent_logger.rb +2 -1
  24. data/lib/new_relic/agent/attribute_filter.rb +1 -0
  25. data/lib/new_relic/agent/attribute_processing.rb +4 -3
  26. data/lib/new_relic/agent/attributes.rb +2 -1
  27. data/lib/new_relic/agent/audit_logger.rb +1 -0
  28. data/lib/new_relic/agent/autostart.rb +1 -0
  29. data/lib/new_relic/agent/chained_call.rb +1 -0
  30. data/lib/new_relic/agent/commands/agent_command.rb +1 -0
  31. data/lib/new_relic/agent/commands/agent_command_router.rb +4 -3
  32. data/lib/new_relic/agent/commands/thread_profiler_session.rb +1 -0
  33. data/lib/new_relic/agent/configuration/default_source.rb +35 -7
  34. data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -0
  35. data/lib/new_relic/agent/configuration/environment_source.rb +2 -1
  36. data/lib/new_relic/agent/configuration/event_harvest_config.rb +1 -0
  37. data/lib/new_relic/agent/configuration/high_security_source.rb +1 -0
  38. data/lib/new_relic/agent/configuration/manager.rb +2 -1
  39. data/lib/new_relic/agent/configuration/manual_source.rb +1 -0
  40. data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -0
  41. data/lib/new_relic/agent/configuration/security_policy_source.rb +7 -3
  42. data/lib/new_relic/agent/configuration/server_source.rb +7 -6
  43. data/lib/new_relic/agent/configuration/yaml_source.rb +4 -1
  44. data/lib/new_relic/agent/configuration.rb +1 -0
  45. data/lib/new_relic/agent/connect/request_builder.rb +1 -0
  46. data/lib/new_relic/agent/connect/response_handler.rb +4 -3
  47. data/lib/new_relic/agent/custom_event_aggregator.rb +5 -4
  48. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -0
  49. data/lib/new_relic/agent/database/obfuscation_helpers.rb +1 -0
  50. data/lib/new_relic/agent/database/obfuscator.rb +2 -1
  51. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -0
  52. data/lib/new_relic/agent/database.rb +3 -2
  53. data/lib/new_relic/agent/database_adapter.rb +1 -0
  54. data/lib/new_relic/agent/datastores/metric_helper.rb +9 -8
  55. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +2 -0
  56. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -0
  57. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +2 -1
  58. data/lib/new_relic/agent/datastores/mongo.rb +1 -0
  59. data/lib/new_relic/agent/datastores/redis.rb +3 -2
  60. data/lib/new_relic/agent/datastores.rb +4 -3
  61. data/lib/new_relic/agent/deprecator.rb +1 -0
  62. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +1 -0
  63. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +16 -16
  64. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +9 -9
  65. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +18 -18
  66. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +8 -8
  67. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +2 -2
  68. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +40 -39
  69. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +16 -14
  70. data/lib/new_relic/agent/distributed_tracing.rb +17 -17
  71. data/lib/new_relic/agent/encoding_normalizer.rb +1 -0
  72. data/lib/new_relic/agent/error_collector.rb +6 -4
  73. data/lib/new_relic/agent/error_event_aggregator.rb +3 -3
  74. data/lib/new_relic/agent/error_filter.rb +1 -0
  75. data/lib/new_relic/agent/error_trace_aggregator.rb +2 -1
  76. data/lib/new_relic/agent/event_aggregator.rb +20 -19
  77. data/lib/new_relic/agent/event_buffer.rb +1 -0
  78. data/lib/new_relic/agent/event_listener.rb +1 -0
  79. data/lib/new_relic/agent/event_loop.rb +7 -6
  80. data/lib/new_relic/agent/external.rb +9 -8
  81. data/lib/new_relic/agent/guid_generator.rb +2 -1
  82. data/lib/new_relic/agent/harvester.rb +1 -0
  83. data/lib/new_relic/agent/heap.rb +3 -2
  84. data/lib/new_relic/agent/hostname.rb +4 -2
  85. data/lib/new_relic/agent/http_clients/abstract.rb +1 -1
  86. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +5 -5
  87. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +4 -4
  88. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +1 -1
  89. data/lib/new_relic/agent/http_clients/uri_util.rb +1 -1
  90. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +6 -4
  91. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +10 -4
  92. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +6 -4
  93. data/lib/new_relic/agent/instrumentation/active_job.rb +2 -1
  94. data/lib/new_relic/agent/instrumentation/active_merchant.rb +2 -1
  95. data/lib/new_relic/agent/instrumentation/active_record.rb +9 -8
  96. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +15 -14
  97. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +3 -2
  98. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +1 -0
  99. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +5 -3
  100. data/lib/new_relic/agent/instrumentation/active_storage.rb +2 -1
  101. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +16 -14
  102. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +1 -0
  103. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +1 -0
  104. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +1 -0
  105. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +2 -1
  106. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +2 -1
  107. data/lib/new_relic/agent/instrumentation/authlogic.rb +2 -1
  108. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +10 -9
  109. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +10 -10
  110. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +4 -3
  111. data/lib/new_relic/agent/instrumentation/bunny.rb +1 -1
  112. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +13 -9
  113. data/lib/new_relic/agent/instrumentation/curb/chain.rb +21 -21
  114. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +8 -8
  115. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +2 -2
  116. data/lib/new_relic/agent/instrumentation/curb.rb +2 -1
  117. data/lib/new_relic/agent/instrumentation/data_mapper.rb +43 -42
  118. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +1 -1
  119. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +2 -2
  120. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +1 -1
  121. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +3 -2
  122. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +3 -2
  123. data/lib/new_relic/agent/instrumentation/excon.rb +2 -1
  124. data/lib/new_relic/agent/instrumentation/grape/chain.rb +6 -5
  125. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +5 -4
  126. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +4 -3
  127. data/lib/new_relic/agent/instrumentation/grape.rb +1 -0
  128. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +98 -0
  129. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +90 -0
  130. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +112 -0
  131. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +31 -0
  132. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +33 -0
  133. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +70 -0
  134. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +135 -0
  135. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +36 -0
  136. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +27 -0
  137. data/lib/new_relic/agent/instrumentation/grpc_client.rb +24 -0
  138. data/lib/new_relic/agent/instrumentation/grpc_server.rb +26 -0
  139. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +1 -0
  140. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +6 -5
  141. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +1 -0
  142. data/lib/new_relic/agent/instrumentation/httpclient.rb +2 -1
  143. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +1 -0
  144. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +4 -3
  145. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +1 -0
  146. data/lib/new_relic/agent/instrumentation/httprb.rb +2 -1
  147. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +2 -1
  148. data/lib/new_relic/agent/instrumentation/logger/chain.rb +2 -1
  149. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +5 -0
  150. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +1 -0
  151. data/lib/new_relic/agent/instrumentation/logger.rb +2 -1
  152. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +2 -2
  153. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +19 -19
  154. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +8 -8
  155. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +17 -14
  156. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +14 -14
  157. data/lib/new_relic/agent/instrumentation/memcache.rb +1 -1
  158. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +1 -0
  159. data/lib/new_relic/agent/instrumentation/mongo.rb +2 -1
  160. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +14 -12
  161. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +1 -0
  162. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +5 -4
  163. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +1 -0
  164. data/lib/new_relic/agent/instrumentation/net_http.rb +2 -1
  165. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +5 -4
  166. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +1 -0
  167. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +1 -0
  168. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +1 -0
  169. data/lib/new_relic/agent/instrumentation/padrino.rb +2 -1
  170. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +3 -2
  171. data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -0
  172. data/lib/new_relic/agent/instrumentation/rack/chain.rb +12 -11
  173. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +1 -0
  174. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +7 -6
  175. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +4 -3
  176. data/lib/new_relic/agent/instrumentation/rack.rb +1 -0
  177. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +6 -5
  178. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -0
  179. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +3 -1
  180. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +3 -1
  181. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +3 -1
  182. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +3 -2
  183. data/lib/new_relic/agent/instrumentation/rake/chain.rb +2 -1
  184. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +1 -1
  185. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +1 -0
  186. data/lib/new_relic/agent/instrumentation/rake.rb +3 -2
  187. data/lib/new_relic/agent/instrumentation/redis/chain.rb +3 -3
  188. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +5 -5
  189. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +3 -3
  190. data/lib/new_relic/agent/instrumentation/redis.rb +2 -1
  191. data/lib/new_relic/agent/instrumentation/resque/chain.rb +2 -1
  192. data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -0
  193. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +1 -0
  194. data/lib/new_relic/agent/instrumentation/resque.rb +3 -2
  195. data/lib/new_relic/agent/instrumentation/sequel.rb +8 -7
  196. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +1 -0
  197. data/lib/new_relic/agent/instrumentation/sidekiq.rb +6 -4
  198. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +1 -0
  199. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +2 -1
  200. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +1 -0
  201. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +1 -0
  202. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +2 -1
  203. data/lib/new_relic/agent/instrumentation/sinatra.rb +2 -1
  204. data/lib/new_relic/agent/instrumentation/sunspot.rb +2 -1
  205. data/lib/new_relic/agent/instrumentation/thread/chain.rb +2 -1
  206. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +1 -0
  207. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +1 -0
  208. data/lib/new_relic/agent/instrumentation/thread.rb +2 -1
  209. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +1 -0
  210. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +1 -0
  211. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +1 -0
  212. data/lib/new_relic/agent/instrumentation/tilt.rb +1 -0
  213. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +1 -0
  214. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +6 -5
  215. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +1 -0
  216. data/lib/new_relic/agent/instrumentation/typhoeus.rb +2 -1
  217. data/lib/new_relic/agent/instrumentation.rb +1 -0
  218. data/lib/new_relic/agent/internal_agent_error.rb +1 -0
  219. data/lib/new_relic/agent/javascript_instrumentor.rb +7 -6
  220. data/lib/new_relic/agent/linking_metadata.rb +2 -2
  221. data/lib/new_relic/agent/log_event_aggregator.rb +6 -5
  222. data/lib/new_relic/agent/log_once.rb +1 -0
  223. data/lib/new_relic/agent/log_priority.rb +1 -0
  224. data/lib/new_relic/agent/logging.rb +13 -12
  225. data/lib/new_relic/agent/memory_logger.rb +1 -0
  226. data/lib/new_relic/agent/messaging.rb +18 -18
  227. data/lib/new_relic/agent/method_tracer.rb +6 -5
  228. data/lib/new_relic/agent/method_tracer_helpers.rb +8 -5
  229. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +3 -2
  230. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +3 -2
  231. data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -0
  232. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +2 -1
  233. data/lib/new_relic/agent/monitors.rb +5 -4
  234. data/lib/new_relic/agent/new_relic_service/encoders.rb +2 -1
  235. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +4 -3
  236. data/lib/new_relic/agent/new_relic_service/marshaller.rb +1 -0
  237. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +1 -0
  238. data/lib/new_relic/agent/new_relic_service.rb +11 -11
  239. data/lib/new_relic/agent/noticible_error.rb +1 -1
  240. data/lib/new_relic/agent/null_logger.rb +1 -0
  241. data/lib/new_relic/agent/obfuscator.rb +2 -1
  242. data/lib/new_relic/agent/parameter_filtering.rb +1 -0
  243. data/lib/new_relic/agent/payload_metric_mapping.rb +1 -0
  244. data/lib/new_relic/agent/pipe_channel_manager.rb +6 -5
  245. data/lib/new_relic/agent/pipe_service.rb +1 -0
  246. data/lib/new_relic/agent/prepend_supportability.rb +2 -1
  247. data/lib/new_relic/agent/priority_sampled_buffer.rb +2 -1
  248. data/lib/new_relic/agent/range_extensions.rb +8 -27
  249. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +2 -1
  250. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +1 -0
  251. data/lib/new_relic/agent/rules_engine.rb +2 -1
  252. data/lib/new_relic/agent/sampler.rb +1 -0
  253. data/lib/new_relic/agent/sampler_collection.rb +1 -0
  254. data/lib/new_relic/agent/samplers/cpu_sampler.rb +1 -0
  255. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +1 -0
  256. data/lib/new_relic/agent/samplers/memory_sampler.rb +5 -4
  257. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -0
  258. data/lib/new_relic/agent/samplers/vm_sampler.rb +1 -0
  259. data/lib/new_relic/agent/span_event_aggregator.rb +2 -1
  260. data/lib/new_relic/agent/span_event_primitive.rb +15 -11
  261. data/lib/new_relic/agent/sql_sampler.rb +7 -6
  262. data/lib/new_relic/agent/stats.rb +3 -1
  263. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -0
  264. data/lib/new_relic/agent/stats_engine/stats_hash.rb +3 -2
  265. data/lib/new_relic/agent/stats_engine.rb +1 -0
  266. data/lib/new_relic/agent/synthetics_event_aggregator.rb +6 -5
  267. data/lib/new_relic/agent/system_info.rb +8 -7
  268. data/lib/new_relic/agent/threading/agent_thread.rb +11 -6
  269. data/lib/new_relic/agent/threading/backtrace_node.rb +6 -3
  270. data/lib/new_relic/agent/threading/backtrace_service.rb +1 -0
  271. data/lib/new_relic/agent/threading/thread_profile.rb +1 -0
  272. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -0
  273. data/lib/new_relic/agent/tracer.rb +17 -14
  274. data/lib/new_relic/agent/transaction/abstract_segment.rb +64 -31
  275. data/lib/new_relic/agent/transaction/datastore_segment.rb +12 -11
  276. data/lib/new_relic/agent/transaction/distributed_tracer.rb +52 -47
  277. data/lib/new_relic/agent/transaction/distributed_tracing.rb +21 -21
  278. data/lib/new_relic/agent/transaction/external_request_segment.rb +36 -27
  279. data/lib/new_relic/agent/transaction/message_broker_segment.rb +6 -5
  280. data/lib/new_relic/agent/transaction/request_attributes.rb +29 -28
  281. data/lib/new_relic/agent/transaction/segment.rb +8 -7
  282. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -0
  283. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -0
  284. data/lib/new_relic/agent/transaction/trace.rb +3 -2
  285. data/lib/new_relic/agent/transaction/trace_builder.rb +10 -9
  286. data/lib/new_relic/agent/transaction/trace_context.rb +22 -19
  287. data/lib/new_relic/agent/transaction/trace_node.rb +9 -8
  288. data/lib/new_relic/agent/transaction/tracing.rb +7 -6
  289. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -0
  290. data/lib/new_relic/agent/transaction.rb +22 -21
  291. data/lib/new_relic/agent/transaction_error_primitive.rb +9 -8
  292. data/lib/new_relic/agent/transaction_event_aggregator.rb +5 -4
  293. data/lib/new_relic/agent/transaction_event_primitive.rb +3 -3
  294. data/lib/new_relic/agent/transaction_event_recorder.rb +14 -12
  295. data/lib/new_relic/agent/transaction_metrics.rb +3 -2
  296. data/lib/new_relic/agent/transaction_sampler.rb +4 -3
  297. data/lib/new_relic/agent/transaction_time_aggregator.rb +13 -12
  298. data/lib/new_relic/agent/utilization/aws.rb +4 -3
  299. data/lib/new_relic/agent/utilization/azure.rb +1 -0
  300. data/lib/new_relic/agent/utilization/gcp.rb +6 -5
  301. data/lib/new_relic/agent/utilization/pcf.rb +3 -2
  302. data/lib/new_relic/agent/utilization/vendor.rb +27 -26
  303. data/lib/new_relic/agent/utilization_data.rb +1 -0
  304. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -0
  305. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -0
  306. data/lib/new_relic/agent/vm/mri_vm.rb +1 -0
  307. data/lib/new_relic/agent/vm/snapshot.rb +1 -0
  308. data/lib/new_relic/agent/vm.rb +1 -0
  309. data/lib/new_relic/agent/worker_loop.rb +2 -1
  310. data/lib/new_relic/agent.rb +11 -10
  311. data/lib/new_relic/cli/command.rb +5 -4
  312. data/lib/new_relic/cli/commands/deployments.rb +9 -8
  313. data/lib/new_relic/cli/commands/install.rb +6 -5
  314. data/lib/new_relic/coerce.rb +4 -4
  315. data/lib/new_relic/collection_helper.rb +2 -1
  316. data/lib/new_relic/control/class_methods.rb +1 -0
  317. data/lib/new_relic/control/frameworks/external.rb +1 -0
  318. data/lib/new_relic/control/frameworks/rails.rb +3 -2
  319. data/lib/new_relic/control/frameworks/rails3.rb +1 -0
  320. data/lib/new_relic/control/frameworks/rails4.rb +1 -0
  321. data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -0
  322. data/lib/new_relic/control/frameworks/ruby.rb +1 -0
  323. data/lib/new_relic/control/frameworks/sinatra.rb +1 -0
  324. data/lib/new_relic/control/frameworks.rb +1 -0
  325. data/lib/new_relic/control/instance_methods.rb +5 -4
  326. data/lib/new_relic/control/instrumentation.rb +7 -6
  327. data/lib/new_relic/control/server_methods.rb +2 -1
  328. data/lib/new_relic/control.rb +1 -0
  329. data/lib/new_relic/delayed_job_injection.rb +1 -0
  330. data/lib/new_relic/dependency_detection.rb +18 -16
  331. data/lib/new_relic/environment_report.rb +1 -0
  332. data/lib/new_relic/helper.rb +4 -3
  333. data/lib/new_relic/language_support.rb +6 -0
  334. data/lib/new_relic/latest_changes.rb +1 -0
  335. data/lib/new_relic/local_environment.rb +5 -6
  336. data/lib/new_relic/metric_data.rb +3 -2
  337. data/lib/new_relic/metric_spec.rb +2 -1
  338. data/lib/new_relic/noticed_error.rb +1 -1
  339. data/lib/new_relic/rack/agent_hooks.rb +1 -0
  340. data/lib/new_relic/rack/agent_middleware.rb +1 -0
  341. data/lib/new_relic/rack/browser_monitoring.rb +3 -2
  342. data/lib/new_relic/rack.rb +1 -0
  343. data/lib/new_relic/recipes/capistrano3.rb +7 -6
  344. data/lib/new_relic/recipes/capistrano_legacy.rb +12 -11
  345. data/lib/new_relic/recipes.rb +1 -0
  346. data/lib/new_relic/supportability_helper.rb +5 -4
  347. data/lib/new_relic/version.rb +3 -2
  348. data/lib/newrelic_rpm.rb +1 -0
  349. data/lib/sequel/extensions/newrelic_instrumentation.rb +6 -5
  350. data/lib/sequel/plugins/newrelic_instrumentation.rb +1 -0
  351. data/lib/tasks/all.rb +1 -0
  352. data/lib/tasks/config.rake +2 -1
  353. data/lib/tasks/coverage_report.rake +22 -11
  354. data/lib/tasks/install.rake +1 -0
  355. data/lib/tasks/instrumentation_generator/README.md +63 -0
  356. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  357. data/lib/tasks/instrumentation_generator/instrumentation.thor +96 -0
  358. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +10 -0
  359. data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
  360. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +7 -0
  361. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +30 -0
  362. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  363. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  364. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  365. data/lib/tasks/instrumentation_generator/templates/prepend.tt +14 -0
  366. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  367. data/lib/tasks/instrumentation_generator/templates/test.tt +16 -0
  368. data/lib/tasks/multiverse.rake +1 -0
  369. data/lib/tasks/multiverse.rb +8 -7
  370. data/lib/tasks/newrelic.rb +1 -0
  371. data/lib/tasks/tests.rake +1 -0
  372. data/newrelic.yml +505 -486
  373. data/newrelic_rpm.gemspec +15 -17
  374. data/recipes/newrelic.rb +1 -0
  375. data/test/agent_helper.rb +114 -118
  376. metadata +58 -89
  377. data/bin/mongrel_rpm +0 -32
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -18,11 +19,11 @@ module NewRelic
18
19
  # See #connect for a description of connection_options.
19
20
  def start_worker_thread(connection_options = {})
20
21
  if disable = NewRelic::Agent.config[:disable_harvest_thread]
21
- NewRelic::Agent.logger.info "Not starting Ruby Agent worker thread because :disable_harvest_thread is #{disable}"
22
+ NewRelic::Agent.logger.info("Not starting Ruby Agent worker thread because :disable_harvest_thread is #{disable}")
22
23
  return
23
24
  end
24
25
 
25
- ::NewRelic::Agent.logger.debug "Creating Ruby Agent worker thread."
26
+ ::NewRelic::Agent.logger.debug("Creating Ruby Agent worker thread.")
26
27
  @worker_thread = Threading::AgentThread.create('Worker Loop') do
27
28
  deferred_work!(connection_options)
28
29
  end
@@ -44,7 +45,7 @@ module NewRelic
44
45
  # Wait the end of the event loop thread.
45
46
  if @worker_thread
46
47
  unless @worker_thread.join(3)
47
- ::NewRelic::Agent.logger.debug "Event loop thread did not stop within 3 seconds"
48
+ ::NewRelic::Agent.logger.debug("Event loop thread did not stop within 3 seconds")
48
49
  end
49
50
  end
50
51
  end
@@ -52,7 +53,7 @@ module NewRelic
52
53
  # Certain event types may sometimes need to be on the same interval as metrics,
53
54
  # so we will check config assigned in EventHarvestConfig to determine the interval
54
55
  # on which to report them
55
- def interval_for event_type
56
+ def interval_for(event_type)
56
57
  interval = Agent.config[:"event_report_period.#{event_type}"]
57
58
  :"#{interval}_second_harvest"
58
59
  end
@@ -66,19 +67,19 @@ module NewRelic
66
67
  transmit_data
67
68
  end
68
69
 
69
- @event_loop.on(interval_for TRANSACTION_EVENT_DATA) do
70
+ @event_loop.on(interval_for(TRANSACTION_EVENT_DATA)) do
70
71
  transmit_analytic_event_data
71
72
  end
72
- @event_loop.on(interval_for CUSTOM_EVENT_DATA) do
73
+ @event_loop.on(interval_for(CUSTOM_EVENT_DATA)) do
73
74
  transmit_custom_event_data
74
75
  end
75
- @event_loop.on(interval_for ERROR_EVENT_DATA) do
76
+ @event_loop.on(interval_for(ERROR_EVENT_DATA)) do
76
77
  transmit_error_event_data
77
78
  end
78
- @event_loop.on(interval_for SPAN_EVENT_DATA) do
79
+ @event_loop.on(interval_for(SPAN_EVENT_DATA)) do
79
80
  transmit_span_event_data
80
81
  end
81
- @event_loop.on(interval_for LOG_EVENT_DATA) do
82
+ @event_loop.on(interval_for(LOG_EVENT_DATA)) do
82
83
  transmit_log_event_data
83
84
  end
84
85
 
@@ -96,18 +97,18 @@ module NewRelic
96
97
  # this clears the data, clears connection attempts, and
97
98
  # waits a while to reconnect.
98
99
  def handle_force_restart(error)
99
- ::NewRelic::Agent.logger.debug error.message
100
+ ::NewRelic::Agent.logger.debug(error.message)
100
101
  drop_buffered_data
101
102
  @service.force_restart if @service
102
103
  @connect_state = :pending
103
- sleep 30
104
+ sleep(30)
104
105
  end
105
106
 
106
107
  # when a disconnect is requested, stop the current thread, which
107
108
  # is the worker thread that gathers data and talks to the
108
109
  # server.
109
110
  def handle_force_disconnect(error)
110
- ::NewRelic::Agent.logger.warn "Agent received a ForceDisconnectException from the server, disconnecting. (#{error.message})"
111
+ ::NewRelic::Agent.logger.warn("Agent received a ForceDisconnectException from the server, disconnecting. (#{error.message})")
111
112
  disconnect
112
113
  end
113
114
 
@@ -115,7 +116,7 @@ module NewRelic
115
116
  # it and disconnecting the agent, since we are now in an
116
117
  # unknown state.
117
118
  def handle_other_error(error)
118
- ::NewRelic::Agent.logger.error "Unhandled error in worker thread, disconnecting."
119
+ ::NewRelic::Agent.logger.error("Unhandled error in worker thread, disconnecting.")
119
120
  # These errors are fatal (that is, they will prevent the agent from
120
121
  # reporting entirely), so we really want backtraces when they happen
121
122
  ::NewRelic::Agent.logger.log_exception(:error, error)
@@ -153,7 +154,7 @@ module NewRelic
153
154
  # never reaches here unless there is a problem or
154
155
  # the agent is exiting
155
156
  else
156
- ::NewRelic::Agent.logger.debug "No connection. Worker thread ending."
157
+ ::NewRelic::Agent.logger.debug("No connection. Worker thread ending.")
157
158
  end
158
159
  end
159
160
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -68,7 +69,7 @@ module NewRelic
68
69
  # Log the environment the app thinks it's running in.
69
70
  # Useful in debugging, as this is the key for config YAML lookups.
70
71
  def log_environment
71
- ::NewRelic::Agent.logger.info "Environment: #{NewRelic::Control.instance.env}"
72
+ ::NewRelic::Agent.logger.info("Environment: #{NewRelic::Control.instance.env}")
72
73
  end
73
74
 
74
75
  # Logs the dispatcher to the log file to assist with
@@ -78,21 +79,21 @@ module NewRelic
78
79
  dispatcher_name = Agent.config[:dispatcher].to_s
79
80
 
80
81
  if dispatcher_name.empty?
81
- ::NewRelic::Agent.logger.info 'No known dispatcher detected.'
82
+ ::NewRelic::Agent.logger.info('No known dispatcher detected.')
82
83
  else
83
- ::NewRelic::Agent.logger.info "Dispatcher: #{dispatcher_name}"
84
+ ::NewRelic::Agent.logger.info("Dispatcher: #{dispatcher_name}")
84
85
  end
85
86
  end
86
87
 
87
88
  def log_app_name
88
- ::NewRelic::Agent.logger.info "Application: #{Agent.config[:app_name].join(", ")}"
89
+ ::NewRelic::Agent.logger.info("Application: #{Agent.config[:app_name].join(", ")}")
89
90
  end
90
91
 
91
92
  def log_ignore_url_regexes
92
93
  regexes = NewRelic::Agent.config[:'rules.ignore_url_regexes']
93
94
 
94
95
  unless regexes.empty?
95
- ::NewRelic::Agent.logger.info "Ignoring URLs that match the following regexes: #{regexes.map(&:inspect).join(", ")}."
96
+ ::NewRelic::Agent.logger.info("Ignoring URLs that match the following regexes: #{regexes.map(&:inspect).join(", ")}.")
96
97
  end
97
98
  end
98
99
 
@@ -100,7 +101,7 @@ module NewRelic
100
101
  # so we can disambiguate processes in the log file and make
101
102
  # sure they're running a reasonable version
102
103
  def log_version_and_pid
103
- ::NewRelic::Agent.logger.debug "New Relic Ruby Agent #{NewRelic::VERSION::STRING} Initialized: pid = #{$$}"
104
+ ::NewRelic::Agent.logger.debug("New Relic Ruby Agent #{NewRelic::VERSION::STRING} Initialized: pid = #{$$}")
104
105
  end
105
106
 
106
107
  # Logs the configured application names
@@ -164,21 +165,21 @@ module NewRelic
164
165
  return false if already_started? || disabled?
165
166
 
166
167
  if defer_for_delayed_job?
167
- ::NewRelic::Agent.logger.debug "Deferring startup for DelayedJob"
168
+ ::NewRelic::Agent.logger.debug("Deferring startup for DelayedJob")
168
169
  return false
169
170
  end
170
171
 
171
172
  if defer_for_resque?
172
- ::NewRelic::Agent.logger.debug "Deferring startup for Resque in case it daemonizes"
173
+ ::NewRelic::Agent.logger.debug("Deferring startup for Resque in case it daemonizes")
173
174
  return false
174
175
  end
175
176
 
176
177
  unless app_name_configured?
177
- NewRelic::Agent.logger.error "No application name configured.",
178
+ NewRelic::Agent.logger.error("No application name configured.",
178
179
  "The Agent cannot start without at least one. Please check your ",
179
180
  "newrelic.yml and ensure that it is valid and has at least one ",
180
181
  "value set for app_name in the #{NewRelic::Control.instance.env} ",
181
- "environment."
182
+ "environment.")
182
183
  return false
183
184
  end
184
185
 
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  require 'socket'
6
7
  require 'net/https'
@@ -69,23 +70,23 @@ module NewRelic
69
70
  @stats_engine = StatsEngine.new
70
71
  @transaction_sampler = TransactionSampler.new
71
72
  @sql_sampler = SqlSampler.new
72
- @agent_command_router = Commands::AgentCommandRouter.new @events
73
- @monitors = Monitors.new @events
74
- @error_collector = ErrorCollector.new @events
73
+ @agent_command_router = Commands::AgentCommandRouter.new(@events)
74
+ @monitors = Monitors.new(@events)
75
+ @error_collector = ErrorCollector.new(@events)
75
76
  @transaction_rules = RulesEngine.new
76
- @harvest_samplers = SamplerCollection.new @events
77
+ @harvest_samplers = SamplerCollection.new(@events)
77
78
  @monotonic_gc_profiler = VM::MonotonicGCProfiler.new
78
- @javascript_instrumentor = JavascriptInstrumentor.new @events
79
+ @javascript_instrumentor = JavascriptInstrumentor.new(@events)
79
80
  @adaptive_sampler = AdaptiveSampler.new(Agent.config[:sampling_target],
80
81
  Agent.config[:sampling_target_period_in_seconds])
81
82
 
82
- @harvester = Harvester.new @events
83
+ @harvester = Harvester.new(@events)
83
84
  @after_fork_lock = Mutex.new
84
85
 
85
- @transaction_event_recorder = TransactionEventRecorder.new @events
86
- @custom_event_aggregator = CustomEventAggregator.new @events
87
- @span_event_aggregator = SpanEventAggregator.new @events
88
- @log_event_aggregator = LogEventAggregator.new @events
86
+ @transaction_event_recorder = TransactionEventRecorder.new(@events)
87
+ @custom_event_aggregator = CustomEventAggregator.new(@events)
88
+ @span_event_aggregator = SpanEventAggregator.new(@events)
89
+ @log_event_aggregator = LogEventAggregator.new(@events)
89
90
 
90
91
  @connect_state = :pending
91
92
  @connect_attempts = 0
@@ -209,7 +210,7 @@ module NewRelic
209
210
  disconnected? ||
210
211
  !control.security_settings_valid?
211
212
 
212
- ::NewRelic::Agent.logger.debug "Starting the worker thread in #{Process.pid} (parent #{Process.ppid}) after forking."
213
+ ::NewRelic::Agent.logger.debug("Starting the worker thread in #{Process.pid} (parent #{Process.ppid}) after forking.")
213
214
 
214
215
  channel_id = options[:report_to_channel]
215
216
  install_pipe_service(channel_id) if channel_id
@@ -356,7 +357,7 @@ module NewRelic
356
357
  # to tell the user what happened, since this is not an error
357
358
  # we can handle gracefully.
358
359
  def log_error(error)
359
- ::NewRelic::Agent.logger.error "Error establishing connection with New Relic Service at #{control.server}:", error
360
+ ::NewRelic::Agent.logger.error("Error establishing connection with New Relic Service at #{control.server}:", error)
360
361
  end
361
362
 
362
363
  # When the server sends us an error with the license key, we
@@ -399,26 +400,27 @@ module NewRelic
399
400
  # connects, then configures the agent using the response from
400
401
  # the connect service
401
402
  def connect_to_server
402
- request_builder = ::NewRelic::Agent::Connect::RequestBuilder.new \
403
+ request_builder = ::NewRelic::Agent::Connect::RequestBuilder.new( \
403
404
  @service,
404
405
  Agent.config,
405
406
  event_harvest_config,
406
407
  environment_for_connect
407
- connect_response = @service.connect request_builder.connect_payload
408
+ )
409
+ connect_response = @service.connect(request_builder.connect_payload)
408
410
 
409
411
  response_handler = ::NewRelic::Agent::Connect::ResponseHandler.new(self, Agent.config)
410
412
  response_handler.configure_agent(connect_response)
411
413
 
412
- log_connection connect_response if connect_response
414
+ log_connection(connect_response) if connect_response
413
415
  connect_response
414
416
  end
415
417
 
416
418
  # Logs when we connect to the server, for debugging purposes
417
419
  # - makes sure we know if an agent has not connected
418
420
  def log_connection(config_data)
419
- ::NewRelic::Agent.logger.debug "Connected to NewRelic Service at #{@service.collector.name}"
420
- ::NewRelic::Agent.logger.debug "Agent Run = #{@service.agent_id}."
421
- ::NewRelic::Agent.logger.debug "Connection data = #{config_data.inspect}"
421
+ ::NewRelic::Agent.logger.debug("Connected to NewRelic Service at #{@service.collector.name}")
422
+ ::NewRelic::Agent.logger.debug("Agent Run = #{@service.agent_id}.")
423
+ ::NewRelic::Agent.logger.debug("Connection data = #{config_data.inspect}")
422
424
  if config_data['messages'] && config_data['messages'].any?
423
425
  log_collector_messages(config_data['messages'])
424
426
  end
@@ -482,7 +484,7 @@ module NewRelic
482
484
 
483
485
  def merge_data_for_endpoint(endpoint, data)
484
486
  if data && !data.empty?
485
- container = container_for_endpoint endpoint
487
+ container = container_for_endpoint(endpoint)
486
488
  if container.respond_to?(:has_metadata?) && container.has_metadata?
487
489
  container_for_endpoint(endpoint).merge!(data, false)
488
490
  else
@@ -522,7 +524,7 @@ module NewRelic
522
524
 
523
525
  return unless should_connect?(opts[:force_reconnect])
524
526
 
525
- ::NewRelic::Agent.logger.debug "Connecting Process to New Relic: #$0"
527
+ ::NewRelic::Agent.logger.debug("Connecting Process to New Relic: #$0")
526
528
  connect_to_server
527
529
  @connected_pid = $$
528
530
  @connect_state = :connected
@@ -541,12 +543,12 @@ module NewRelic
541
543
  log_error(e)
542
544
  if opts[:keep_retrying]
543
545
  note_connect_failure
544
- ::NewRelic::Agent.logger.info "Will re-attempt in #{connect_retry_period} seconds"
545
- sleep connect_retry_period
546
+ ::NewRelic::Agent.logger.info("Will re-attempt in #{connect_retry_period} seconds")
547
+ sleep(connect_retry_period)
546
548
  retry
547
549
  end
548
550
  rescue Exception => e
549
- ::NewRelic::Agent.logger.error "Exception of unexpected type during Agent#connect():", e
551
+ ::NewRelic::Agent.logger.error("Exception of unexpected type during Agent#connect():", e)
550
552
 
551
553
  raise
552
554
  end
@@ -576,14 +578,14 @@ module NewRelic
576
578
  #
577
579
  def harvest_and_send_from_container(container, endpoint)
578
580
  payload = harvest_from_container(container, endpoint)
579
- sample_count = harvest_size container, payload
581
+ sample_count = harvest_size(container, payload)
580
582
  if sample_count > 0
581
583
  NewRelic::Agent.logger.debug("Sending #{sample_count} items to #{endpoint}")
582
584
  send_data_to_endpoint(endpoint, payload, container)
583
585
  end
584
586
  end
585
587
 
586
- def harvest_size container, items
588
+ def harvest_size(container, items)
587
589
  if container.respond_to?(:has_metadata?) && container.has_metadata? && !items.empty?
588
590
  items.last.size
589
591
  else
@@ -657,7 +659,7 @@ module NewRelic
657
659
  end
658
660
 
659
661
  def harvest_and_send_error_event_data
660
- harvest_and_send_from_container @error_collector.error_event_aggregator, :error_event_data
662
+ harvest_and_send_from_container(@error_collector.error_event_aggregator, :error_event_data)
661
663
  end
662
664
 
663
665
  def harvest_and_send_span_event_data
@@ -717,7 +719,7 @@ module NewRelic
717
719
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
718
720
 
719
721
  msg = "Sending #{supportability_name} data to New Relic Service"
720
- ::NewRelic::Agent.logger.debug msg
722
+ ::NewRelic::Agent.logger.debug(msg)
721
723
 
722
724
  @service.session do # use http keep-alive
723
725
  self.send(harvest_method)
@@ -729,7 +731,7 @@ module NewRelic
729
731
 
730
732
  def transmit_data
731
733
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
732
- ::NewRelic::Agent.logger.debug "Sending data to New Relic Service"
734
+ ::NewRelic::Agent.logger.debug("Sending data to New Relic Service")
733
735
 
734
736
  @events.notify(:before_harvest)
735
737
  @service.session do # use http keep-alive
@@ -771,17 +773,17 @@ module NewRelic
771
773
  transmit_log_event_data
772
774
 
773
775
  if @connected_pid == $$ && !@service.kind_of?(NewRelic::Agent::NewRelicService)
774
- ::NewRelic::Agent.logger.debug "Sending New Relic service agent run shutdown message"
776
+ ::NewRelic::Agent.logger.debug("Sending New Relic service agent run shutdown message")
775
777
  @service.shutdown
776
778
  else
777
- ::NewRelic::Agent.logger.debug "This agent connected from parent process #{@connected_pid}--not sending shutdown"
779
+ ::NewRelic::Agent.logger.debug("This agent connected from parent process #{@connected_pid}--not sending shutdown")
778
780
  end
779
- ::NewRelic::Agent.logger.debug "Graceful disconnect complete"
781
+ ::NewRelic::Agent.logger.debug("Graceful disconnect complete")
780
782
  rescue Timeout::Error, StandardError => e
781
- ::NewRelic::Agent.logger.debug "Error when disconnecting #{e.class.name}: #{e.message}"
783
+ ::NewRelic::Agent.logger.debug("Error when disconnecting #{e.class.name}: #{e.message}")
782
784
  end
783
785
  else
784
- ::NewRelic::Agent.logger.debug "Bypassing graceful disconnect - agent not connected"
786
+ ::NewRelic::Agent.logger.debug("Bypassing graceful disconnect - agent not connected")
785
787
  end
786
788
  end
787
789
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  require 'thread'
6
7
  require 'logger'
@@ -178,7 +179,7 @@ module NewRelic
178
179
  StartupLogger.instance.dump(self)
179
180
  end
180
181
 
181
- def self.format_fatal_error message
182
+ def self.format_fatal_error(message)
182
183
  "** [NewRelic] FATAL : #{message}\n"
183
184
  end
184
185
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  # This class applies filtering rules as specified in the Agent Attributes
6
7
  # cross-agent spec.
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -11,9 +12,9 @@ module NewRelic
11
12
  EMPTY_ARRAY_STRING_LITERAL = "[]".freeze
12
13
 
13
14
  def flatten_and_coerce(object, prefix = nil, result = {}, &blk)
14
- if object.is_a? Hash
15
+ if object.is_a?(Hash)
15
16
  flatten_and_coerce_hash(object, prefix, result, &blk)
16
- elsif object.is_a? Array
17
+ elsif object.is_a?(Array)
17
18
  flatten_and_coerce_array(object, prefix, result, &blk)
18
19
  elsif prefix
19
20
  val = Coerce.scalar(object)
@@ -23,7 +24,7 @@ module NewRelic
23
24
  result[prefix] = val
24
25
  end
25
26
  else
26
- NewRelic::Agent.logger.warn "Unexpected object: #{object.inspect} with nil prefix passed to NewRelic::Agent::AttributeProcessing.flatten_and_coerce"
27
+ NewRelic::Agent.logger.warn("Unexpected object: #{object.inspect} with nil prefix passed to NewRelic::Agent::AttributeProcessing.flatten_and_coerce")
27
28
  end
28
29
  result
29
30
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  require 'new_relic/agent/attribute_processing'
6
7
 
@@ -34,7 +35,7 @@ module NewRelic
34
35
  end
35
36
 
36
37
  def add_agent_attribute_with_key_check(key, value, default_destinations)
37
- if exceeds_bytesize_limit? key, KEY_LIMIT
38
+ if exceeds_bytesize_limit?(key, KEY_LIMIT)
38
39
  NewRelic::Agent.logger.debug("Agent attribute #{key} was dropped for exceeding key length limit #{KEY_LIMIT}")
39
40
  return
40
41
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  require 'logger'
6
7
  require 'fileutils'
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  # This class is used by NewRelic::Agent.set_sql_obfuscator to chain multiple
6
7
  # obfuscation blocks when not using the default :replace action
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  # This class is the central point for dispatching get_agent_commands messages
6
7
  # to the various components that actually process them.
@@ -77,16 +78,16 @@ module NewRelic
77
78
 
78
79
  def log_profiles(profiles)
79
80
  if profiles.empty?
80
- ::NewRelic::Agent.logger.debug "No thread profiles with data found to send."
81
+ ::NewRelic::Agent.logger.debug("No thread profiles with data found to send.")
81
82
  else
82
83
  profile_descriptions = profiles.map { |p| p.to_log_description }
83
- ::NewRelic::Agent.logger.debug "Sending thread profiles [#{profile_descriptions.join(", ")}]"
84
+ ::NewRelic::Agent.logger.debug("Sending thread profiles [#{profile_descriptions.join(", ")}]")
84
85
  end
85
86
  end
86
87
 
87
88
  def get_agent_commands
88
89
  commands = new_relic_service.get_agent_commands
89
- NewRelic::Agent.logger.debug "Received get_agent_commands = #{commands.inspect}"
90
+ NewRelic::Agent.logger.debug("Received get_agent_commands = #{commands.inspect}")
90
91
  commands.map { |collector_command| AgentCommand.new(collector_command) }
91
92
  end
92
93
 
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  require 'new_relic/agent/threading/agent_thread'
6
7
  require 'new_relic/agent/threading/backtrace_service'
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  require 'forwardable'
6
7
 
@@ -46,7 +47,7 @@ module NewRelic
46
47
 
47
48
  # Marks the config option as deprecated in the documentation once generated.
48
49
  # Does not appear in logs.
49
- def self.deprecated_description new_setting, description
50
+ def self.deprecated_description(new_setting, description)
50
51
  link_ref = new_setting.to_s.gsub(".", "-")
51
52
  %{Please see: [#{new_setting}](docs/agents/ruby-agent/configuration/ruby-agent-configuration##{link_ref}). \n\n#{description}}
52
53
  end
@@ -117,7 +118,7 @@ module NewRelic
117
118
  def self.config_path
118
119
  Proc.new {
119
120
  found_path = NewRelic::Agent.config[:config_search_paths].detect do |file|
120
- File.expand_path(file) if File.exist? file
121
+ File.expand_path(file) if File.exist?(file)
121
122
  end
122
123
  found_path || NewRelic::EMPTY_STR
123
124
  }
@@ -134,7 +135,7 @@ module NewRelic
134
135
  when 4..7
135
136
  :rails_notifications
136
137
  else
137
- ::NewRelic::Agent.logger.warn "Detected untested Rails version #{Rails::VERSION::STRING}"
138
+ ::NewRelic::Agent.logger.warn("Detected untested Rails version #{Rails::VERSION::STRING}")
138
139
  :rails_notifications
139
140
  end
140
141
  when defined?(::Sinatra) && defined?(::Sinatra::Base) then :sinatra
@@ -211,7 +212,7 @@ module NewRelic
211
212
 
212
213
  def self.api_host
213
214
  Proc.new do
214
- if String(NewRelic::Agent.config[:license_key]).start_with? 'eu'
215
+ if String(NewRelic::Agent.config[:license_key]).start_with?('eu')
215
216
  'rpm.eu.newrelic.com'
216
217
  else
217
218
  'rpm.newrelic.com'
@@ -238,7 +239,7 @@ module NewRelic
238
239
  end
239
240
 
240
241
  SEMICOLON = ';'.freeze
241
- def self.convert_to_list_on_semicolon value
242
+ def self.convert_to_list_on_semicolon(value)
242
243
  case value
243
244
  when Array then value
244
245
  when String then value.split(SEMICOLON)
@@ -1085,6 +1086,32 @@ If `true`, disables agent middleware for Sinatra. This middleware is responsible
1085
1086
  :allowed_from_server => false,
1086
1087
  :description => 'Controls auto-instrumentation of the Tilt template rendering library at start up. May be one of [auto|prepend|chain|disabled].'
1087
1088
  },
1089
+ :'instrumentation.grpc_client' => {
1090
+ :default => instrumentation_value_of(:disable_grpc_client),
1091
+ :documentation_default => 'auto',
1092
+ :public => true,
1093
+ :type => String,
1094
+ :dynamic_name => true,
1095
+ :allowed_from_server => false,
1096
+ :description => 'Controls auto-instrumentation of gRPC clients at start up. May be one of [auto|prepend|chain|disabled].'
1097
+ },
1098
+ :'instrumentation.grpc.host_denylist' => {
1099
+ :default => [],
1100
+ :public => true,
1101
+ :type => Array,
1102
+ :allowed_from_server => false,
1103
+ :transform => DefaultSource.method(:convert_to_regexp_list),
1104
+ :description => %Q(Specifies a list of hostname patterns separated by commas that will match gRPC hostnames that traffic is to be ignored by New Relic for. New Relic's gRPC client instrumentation will ignore traffic streamed to a host matching any of these patterns, and New Relic's gRPC server instrumentation will ignore traffic for a server running on a host whose hostname matches any of these patterns. By default, no traffic is ignored when gRPC instrumentation is itself enabled. For example, "private.com$,exception.*")
1105
+ },
1106
+ :'instrumentation.grpc_server' => {
1107
+ :default => instrumentation_value_of(:disable_grpc_server),
1108
+ :documentation_default => 'auto',
1109
+ :public => true,
1110
+ :type => String,
1111
+ :dynamic_name => true,
1112
+ :allowed_from_server => false,
1113
+ :description => 'Controls auto-instrumentation of gRPC servers at start up. May be one of [auto|prepend|chain|disabled].'
1114
+ },
1088
1115
  :disable_data_mapper => {
1089
1116
  :default => false,
1090
1117
  :public => true,
@@ -2011,11 +2038,12 @@ A map of error classes to a list of messages. When an error of one of the classe
2011
2038
  :description => 'If `true`, the agent decorates logs with metadata to link to entities, hosts, traces, and spans.'
2012
2039
  },
2013
2040
  :'code_level_metrics.enabled' => {
2014
- :default => false,
2041
+ :default => true,
2015
2042
  :public => true,
2016
2043
  :type => Boolean,
2017
2044
  :allowed_from_server => true,
2018
- :description => 'If `true`, the agent will report source code level metrics for traced methods.'
2045
+ :description => "If `true`, the agent will report source code level metrics for traced methods.\nsee: " \
2046
+ 'https://docs.newrelic.com/docs/apm/agents/ruby-agent/features/ruby-codestream-integration/'
2019
2047
  },
2020
2048
  :'instrumentation.active_support_logger' => {
2021
2049
  :default => instrumentation_value_from_boolean(:'application_logging.enabled'),
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent
@@ -42,7 +43,7 @@ module NewRelic
42
43
  def set_dotted_alias(original_config_setting)
43
44
  config_setting = original_config_setting.to_s
44
45
 
45
- if config_setting.include? '.'
46
+ if config_setting.include?('.')
46
47
  config_alias = config_setting.gsub(/\./, '_').to_sym
47
48
  self.alias_map[config_alias] = original_config_setting
48
49
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
4
5
 
5
6
  module NewRelic
6
7
  module Agent