Module: StackifyRubyAPM::Spies Private
- Extended by:
- Log
- Defined in:
- lib/stackify_apm/spies.rb,
lib/stackify_apm/spies/curb.rb,
lib/stackify_apm/spies/tilt.rb,
lib/stackify_apm/spies/mongo.rb,
lib/stackify_apm/spies/redis.rb,
lib/stackify_apm/spies/httprb.rb,
lib/stackify_apm/spies/sequel.rb,
lib/stackify_apm/spies/sidekiq.rb,
lib/stackify_apm/spies/sinatra.rb,
lib/stackify_apm/spies/httparty.rb,
lib/stackify_apm/spies/net_http.rb,
lib/stackify_apm/spies/curb/easy.rb,
lib/stackify_apm/spies/curb/multi.rb,
lib/stackify_apm/spies/httpclient.rb,
lib/stackify_apm/spies/action_dispatch.rb,
lib/stackify_apm/spies/stackify_logger.rb,
lib/stackify_apm/spies/custom_instrumenter.rb,
lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb,
lib/stackify_apm/spies/sinatra_activerecord/sqlite_adapter.rb,
lib/stackify_apm/spies/sinatra_activerecord/postgresql_adapter.rb
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
Defined Under Namespace
Classes: ActionDispatchSpy, CurbEasySpy, CurbMultiSpy, CurbSpy, HTTPClientSpy, HTTPRbSpy, HTTPartySpy, MongoSpy, MysqlAdapterSpy, NetHTTPSpy, PostgresqlAdapterSpy, RedisSpy, Registration, SequelSpy, SidekiqClientSpy, SinatraSpy, SqliteAdapterSpy, StackifyLoggerSpy, TiltSpy
Constant Summary
Constants included from Log
Class Method Summary collapse
- .class_exists?(class_name) ⇒ Boolean private
- .hook_into(name) ⇒ Object private
- .installed ⇒ Object private
-
.ismethod_exists(class_name, current_method) ⇒ Object
private
rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/PerceivedComplexity.
- .parse_json_config(file) ⇒ Object private
- .register(*args) ⇒ Object private
- .register_require_hook(registration) ⇒ Object private
- .require_hooks ⇒ Object private
- .run_custom_instrumentation ⇒ Object private
- .safe_defined?(const_name) ⇒ Boolean private
Methods included from Log
debug, error, fatal, info, log, warn
Class Method Details
.class_exists?(class_name) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
87 88 89 90 91 92 |
# File 'lib/stackify_apm/spies.rb', line 87 def self.class_exists?(class_name) klass = Module.const_get(class_name) return klass.is_a?(Class) rescue NameError return false end |
.hook_into(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/stackify_apm/spies.rb', line 58 def self.hook_into(name) return unless (registration = require_hooks[name]) return unless safe_defined?(registration.const_name) installed[registration.const_name] = registration registration.install registration.require_paths.each do |path| require_hooks.delete path end end |
.installed ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
37 38 39 |
# File 'lib/stackify_apm/spies.rb', line 37 def self.installed @installed ||= {} end |
.ismethod_exists(class_name, current_method) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/PerceivedComplexity
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/stackify_apm/spies.rb', line 96 def self.ismethod_exists(class_name, current_method) module_consget = Module.const_get(class_name) current_method_without_apm = "_without_apm_#{current_method}" self_current_method_without_apm = "_self_without_apm_#{current_method}" with_flag = module_consget.instance_methods(false).include?(:"#{current_method_without_apm}") self_with_flag = module_consget.instance_methods(false).include?(:"#{self_current_method_without_apm}") current_method_exists = module_consget.instance_methods(false).include?(:"#{current_method}") self_current_method_exists = module_consget.instance_methods(false).include?(:"self.#{current_method}") exists = false if (self_with_flag == false && with_flag == false) && (current_method_exists == true || self_current_method_exists == true) exists = true end if (module_consget.methods.include?(:"#{current_method_without_apm}") == false && module_consget.methods.include?(:"#{self_current_method_without_apm}") == false) && (module_consget.methods.include?(:"#{current_method}") || module_consget.methods.include?(:"self.#{current_method}")) exists = true end exists end |
.parse_json_config(file) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/stackify_apm/spies.rb', line 74 def self.parse_json_config(file) jsondata = {} if ENV['STACKIFY_RUBY_ENV'] == 'rspec' file = 'spec/integration/stackify_spec.json' end return unless File.exist?(file) File.open(file) do |f| jsondata = JSON.parse(f.read) end jsondata end |
.register(*args) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/stackify_apm/spies.rb', line 41 def self.register(*args) registration = Registration.new(*args) if safe_defined?(registration.const_name) registration.install installed[registration.const_name] = registration else register_require_hook registration end end |
.register_require_hook(registration) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
52 53 54 55 56 |
# File 'lib/stackify_apm/spies.rb', line 52 def self.register_require_hook(registration) registration.require_paths.each do |path| require_hooks[path] = registration end end |
.require_hooks ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
33 34 35 |
# File 'lib/stackify_apm/spies.rb', line 33 def self.require_hooks @require_hooks ||= {} end |
.run_custom_instrumentation ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/stackify_apm/spies/custom_instrumenter.rb', line 16 def self.run_custom_instrumentation config = Config.new to_instrument = parse_json_config(config.json_config_file) if config.logger.nil? config.debug_logger config.logger.send(:info, '[StackifyRubyAPM] Error: config/stackify.json does not exist which is required for custom instrumentation!') if to_instrument.nil? end return unless !to_instrument.nil? && !to_instrument.empty? && defined?(to_instrument['instrumentation']) && (to_instrument['instrumentation'].count > 0) to_instrument['instrumentation'].each do |custom_spy| current_class = custom_spy['class'] current_method = custom_spy['method'] tracked_func = custom_spy['trackedFunction'] tracked_func_name = defined?(custom_spy['trackedFunctionName']) ? custom_spy['trackedFunctionName'] : '' transaction = defined?(custom_spy['transaction']) ? custom_spy['transaction'] : nil file_path = defined?(custom_spy['file_path']) ? custom_spy['file_path'] : nil tracked_function_tpl = tracked_func_name.nil? ? '{{ClassName}}.{{MethodName}}' : tracked_func_name tracked_function_name = tracked_function_tpl.sub '{{ClassName}}', current_class tracked_function_name = tracked_function_name.sub '{{MethodName}}', current_method if !class_exists?(current_class) && !file_path.nil? begin require file_path rescue LoadError => e debug "[StackifyRubyAPM] File path doesn't exist." debug e.inspect end end # rubocop:disable Style/Next if class_exists?(current_class) mod_constant = Module.const_get(current_class.to_s) klass_method_flag = mod_constant.method_defined?(current_method.to_s) singleton_method_flag = mod_constant.respond_to?(current_method.to_s) class_location = mod_constant.instance_methods(false).map do |m| mod_constant.instance_method(m).source_location.first end.uniq class_path = class_location.last if klass_method_flag StackifyRubyAPM::InstrumenterHelper.m_class(tracked_func, current_class, class_path, current_method: current_method, tracked_function_name: tracked_function_name, is_transaction: transaction) elsif singleton_method_flag StackifyRubyAPM::InstrumenterHelper.m_singleton(tracked_func, current_class, class_path, current_method: current_method, tracked_function_name: tracked_function_name, is_transaction: transaction) end end # rubocop:enable Style/Next end end |
.safe_defined?(const_name) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
70 71 72 |
# File 'lib/stackify_apm/spies.rb', line 70 def self.safe_defined?(const_name) Util::Inflector.safe_constantize(const_name) end |