stackify-ruby-apm 1.14.2 → 1.14.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4db351752b697f408b2c683f6d6e82bb406f4b1acedd9cc8136bd38de622f613
4
- data.tar.gz: baa9790e6ecbec16c9c27a68b7e60cdf3955ad60ab75b19fdd6f232efbec26b4
3
+ metadata.gz: 881446a181c81d422cdd81f2de4b4ccef409989171d96a53833bbe425f8105c0
4
+ data.tar.gz: ed31e237779e881ab4a57d7db2c4dcc7936bbe01b6af256ac4f53d9ae4c96054
5
5
  SHA512:
6
- metadata.gz: 611d7584183fc9491055c5dc86f3141a4e6d72fc408e18a7e8b4d54fa1ee598a5ca6197b30ecd047793e1a5a139de89a18f0a6e4006605e0d17a2800558b871e
7
- data.tar.gz: 3ce7f56cbabf25ac2c55d049eba7f76b86a056f8e8a248b7625d6762ec0717a680a4f28b03b9b84fb0be49eb074f19ca6f4c54ad9390dfca5812cd3500aa3a03
6
+ metadata.gz: 293677dce94cf22be5e9a45fb1e7d9b7090fcbbe76a4a1bb679da719896d3ced92c5e34bc6ef0315ef8c05c3ee8621bcd51bac552e6f02bfce635aa13205f23e
7
+ data.tar.gz: 581165dd6ee9b10a02d206a7f985b6980ee1ddb46a9a2de05e194a6a9578596114823eff12cd4dab96277e82e533bb9c742c0ee72e109de2a8e819405fb5f4ce
@@ -41,6 +41,8 @@ module StackifyRubyAPM
41
41
  end
42
42
 
43
43
  def rails_req?(env)
44
+ # Not used
45
+ # Possible use of ActiveSupport.on_load(:action_dispatch_request)
44
46
  defined?(ActionDispatch::Request) &&
45
47
  env.is_a?(ActionDispatch::Request)
46
48
  end
@@ -19,6 +19,8 @@ module DatabaseHelper
19
19
  'db2'
20
20
  elsif driver.include? 'sqlite'
21
21
  'sqlite'
22
+ else
23
+ 'generic'
22
24
  end
23
25
  end
24
26
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -8,6 +8,7 @@
8
8
  module StackifyRubyAPM
9
9
  # @api private
10
10
  class LogDevice < Logger::LogDevice
11
+ MAX_LOG_FILES_COUNT = 10
11
12
  alias_method 'write_without_apm', 'write'
12
13
  def write(message)
13
14
  if @filename
@@ -84,6 +85,24 @@ module StackifyRubyAPM
84
85
  def create_logfile(filename)
85
86
  logdev = super
86
87
  File.chmod(0o777, filename)
88
+
89
+ begin
90
+ dir_name = File.dirname(filename)
91
+ # repath current file due to windows separator \\ doesn't work with Dir.glob
92
+ dir_name = dir_name.split(File::ALT_SEPARATOR).join(File::SEPARATOR)
93
+ search_files = File.join("#{dir_name}", "{[!stackify-ruby-apm]*}.log")
94
+ log_files = Dir.glob(search_files).sort_by { |f| File.stat(f).mtime}.reverse
95
+
96
+ if log_files.length > MAX_LOG_FILES_COUNT
97
+ files_to_delete = log_files[MAX_LOG_FILES_COUNT..-1]
98
+ files_to_delete.each { |f|
99
+ File.delete(f) if File.exists? f
100
+ }
101
+ end
102
+ rescue
103
+ # nothing to do here
104
+ end
105
+
87
106
  logdev
88
107
  end
89
108
  # rubocop:enable Style/RescueModifier
@@ -127,6 +127,8 @@ module StackifyRubyAPM
127
127
  end
128
128
 
129
129
  def streaming?(env)
130
+ # Not used
131
+ # Possible use of ActiveSupport.on_load(:action_controller_base)
130
132
  return false unless defined?(ActionController::Live)
131
133
 
132
134
  env['action_controller.instance'].class.included_modules.include?(ActionController::Live)
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+ # Not used
3
+ # Possible use of ActiveSupport.on_load(:active_record)
2
4
 
3
5
  require 'stackify_apm/helper/database_helper'
4
6
 
@@ -12,8 +14,6 @@ module StackifyRubyAPM
12
14
 
13
15
  def initialize(*args)
14
16
  super(*args)
15
-
16
- @type = format('db.%s.sql', lookup_adapter || 'unknown').freeze
17
17
  end
18
18
 
19
19
  def normalize(_transaction, _name, payload)
@@ -23,7 +23,9 @@ module StackifyRubyAPM
23
23
  check_prepared_stmt(statement, payload)
24
24
  name = payload[:sql] || payload[:name] || 'Default'
25
25
  context = Span::Context.new(statement)
26
- [name, @type, context]
26
+
27
+ type = format('db.%s.sql', lookup_adapter(payload) || 'unknown').freeze
28
+ [name, type, context]
27
29
  end
28
30
 
29
31
  private
@@ -31,7 +33,7 @@ module StackifyRubyAPM
31
33
  def query_variables(payload)
32
34
  adapter_config = lookup_adapter_config
33
35
  props = get_common_db_properties
34
- props[:PROVIDER] = get_profiler(lookup_adapter)
36
+ props[:PROVIDER] = get_profiler(lookup_adapter(payload))
35
37
  props[:SQL] = payload[:sql]
36
38
  if adapter_config
37
39
  props[:URL] = "#{adapter_config[:host]}:#{adapter_config[:port]}"
@@ -39,15 +41,63 @@ module StackifyRubyAPM
39
41
  props
40
42
  end
41
43
 
42
- def lookup_adapter
43
- ::ActiveRecord::Base.connection.adapter_name.downcase
44
+ # Ideally the application doesn't connect to the database during boot,
45
+ # but sometimes it does. In case it did, we want to empty out the
46
+ # connection pools so that a non-database-using process (e.g. a master
47
+ # process in a forking server model) doesn't retain a needless
48
+ # connection. If it was needed, the incremental cost of reestablishing
49
+ # this connection is trivial: the rest of the pool would need to be
50
+ # populated anyway.
51
+ #
52
+ # Reference: https://github.com/rails/rails/blob/main/activerecord/lib/active_record/railtie.rb#L253
53
+ #
54
+ # Miko: Considering we are getting the connection method, it is retrieving connection from the connection pool
55
+ # Connection Method: lib/active_record/connection_handling.rb#L264
56
+ # Retrieve Connection: lib/active_record/connection_handling.rb#L309
57
+ # Handler Retrieve Connection: lib/active_record/connection_adapters/abstract/connection_pool.rb#L1111
58
+
59
+ def lookup_adapter(payload)
60
+ connection = nil
61
+ if (payload.key?(:connection))
62
+ connection = payload[:connection]
63
+ elsif ::ActiveRecord::Base.connection_pool.instance_variable_defined?(:@reserved_connections) and payload.key?(:connection_id)
64
+ connection_id = payload[:connection_id] # Connection ID here is the object_id of the connection object
65
+ connections = ::ActiveRecord::Base.connection_pool.instance_variable_get(:@reserved_connections) # Lets check the reserved connections
66
+
67
+ if (
68
+ (connections.class != nil and connections.respond_to?(:class) and
69
+ (connections.class.to_s == 'ThreadSafe::Cache' or connections.class.to_s == 'Hash')
70
+ ) and connections.size()
71
+ )
72
+ connections.each_value do |val|
73
+ if val.object_id == connection_id
74
+ connection = val
75
+ break
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ if (connection.nil?)
82
+ return 'generic'
83
+ end
84
+
85
+ if (connection.respond_to?(:adapter_name) && connection.adapter_name.nil?)
86
+ return 'generic'
87
+ end
88
+
89
+ connection.adapter_name.downcase
44
90
  rescue StandardError => error
45
91
  debug '[SqlNormalizer] lookup_adapter err: ' + error.inspect.to_s
46
92
  nil
47
93
  end
48
94
 
49
95
  def lookup_adapter_config
50
- ::ActiveRecord::Base.connection_config.to_h
96
+ if Gem::Version.new(Rails::VERSION::STRING) >= Gem::Version.new('6.1')
97
+ ::ActiveRecord::Base.connection_db_config.to_h
98
+ else
99
+ ::ActiveRecord::Base.connection_config.to_h
100
+ end
51
101
  rescue StandardError => error
52
102
  debug '[SqlNormalizer] lookup_adapter_config err: ' + error.inspect.to_s
53
103
  nil
@@ -55,7 +105,7 @@ module StackifyRubyAPM
55
105
 
56
106
  def check_prepared_stmt(statement, payload)
57
107
  if StackifyRubyAPM.agent.config.prefix_enabled
58
- case get_profiler(lookup_adapter)
108
+ case get_profiler(lookup_adapter(payload))
59
109
  when 'generic', 'mysql', 'sqlite', 'oracle', 'db2'
60
110
  check_prepared_stmt_by_placeholder(payload[:sql].include?('?'), statement, payload)
61
111
  when 'postgresql'
@@ -33,7 +33,11 @@ module StackifyRubyAPM
33
33
  # Possible formats:
34
34
  # `<namespace:key/method_name/expires_in=300/ttl=60/>`
35
35
  # `<namespace:key/expires_in=300/ttl=60/>`
36
- redis_key = args[0..1].join('/') if args.length > 1 && !args[1].include?('=')
36
+ if redis_key.nil?
37
+ redis_key = redis_details[1]
38
+ else
39
+ redis_key = args[0..1].join('/') if args.length > 1 && !args[1].include?('=')
40
+ end
37
41
  end
38
42
 
39
43
  return call_without_apm(command, &block) if command[0] == :auth
@@ -48,8 +52,8 @@ module StackifyRubyAPM
48
52
  OPERATION: name,
49
53
  URL: "#{self.options[:host]}:#{self.options[:port]}"
50
54
  }.tap do |hash|
51
- hash[:CACHEKEY] = redis_key unless redis_key.empty?
52
- hash[:CACHENAME] = redis_nspace unless redis_nspace.empty?
55
+ hash[:CACHEKEY] = redis_key unless redis_key.nil? || redis_key.empty?
56
+ hash[:CACHENAME] = redis_nspace unless redis_nspace.nil? || redis_nspace.empty?
53
57
  end
54
58
 
55
59
  ctx = Span::Context.new(context)
@@ -2,6 +2,9 @@
2
2
 
3
3
  # Spies for active record when sinatra framework is used and active_record is being extended. (mysql adapter)
4
4
 
5
+ # Not used
6
+ # Possible use of ActiveSupport.on_load(:active_record)
7
+
5
8
  require 'stackify_apm/helper/database_helper'
6
9
 
7
10
  module StackifyRubyAPM
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Spies for active record when sinatra framework is used and active_record is being extended. (mysql adapter)
4
+ # Not used
5
+ # Possible use of ActiveSupport.on_load(:active_record)
4
6
 
5
7
  require 'stackify_apm/helper/database_helper'
6
8
 
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Spies for active record when sinatra framework is used and active_record is being extended. (mysql adapter)
4
+ # Not used
5
+ # Possible use of ActiveSupport.on_load(:active_record)
4
6
 
5
7
  require 'stackify_apm/helper/database_helper'
6
8
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Sets the version of the APM
4
4
  module StackifyRubyAPM
5
- VERSION = '1.14.2'.freeze
5
+ VERSION = '1.14.7'.freeze
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stackify-ruby-apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.2
4
+ version: 1.14.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stackify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-21 00:00:00.000000000 Z
11
+ date: 2021-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails