stackify-ruby-apm 1.13.2 → 1.14.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1ee1b9b91d78729820e74b7fbc014310af4037390de6c0982cb0169cba50a8a
4
- data.tar.gz: 3a7dfe377099f033779e85d591e8ec973039ee4a4b59f20175e57afdd967819a
3
+ metadata.gz: 81a16e2527e1237952803d7082cd0869b932e2af04dd3263490e5bd6538debbd
4
+ data.tar.gz: 3df0659ad3e96984f67c9850e69f38c20fae65ced83948b2791a2a9fe63012af
5
5
  SHA512:
6
- metadata.gz: 143b1fba17994c286ad71dc020d731247079b28a75fda11ee742ed8d49c023557a731e16c0ae8715153d6f5c98dbbb7dbbdaa10a225d4ad8f5f0750aedb7a739
7
- data.tar.gz: 28be6a1c40fa6dab5fc5a35f2c56e99984c579d4e5f84e5481ffa6e5c9b9fa9c615a0425c1af81d5a3d1d7d4088df1b4f777250fde816b48a2049f320a1df1c4
6
+ metadata.gz: d6a34b33a19b3a59c69fdfa105255b234a77b3be6b81a0bbdac68bc39bdc92eb327c33d236d49beb064dafe87b6f4e882df53fb29365b2152572f4d9cf7fdf08
7
+ data.tar.gz: e05ee709696f67a2bb4c7780a2b762393f5be5507c3af5b327c825e500fd3a18786827f2ba2e8d98df8e926af6cc2d4a5dc79fd380f8392fdd8443e04a998c5c
@@ -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
@@ -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
@@ -53,6 +53,8 @@ module StackifyRubyAPM
53
53
  if okay_to_modify?
54
54
  @configuration.already_instrumented_flag = true
55
55
  if @configuration.rum_enabled.is_a?(TrueClass)
56
+ # close old response body proxy to close all db connections
57
+ @rack_body.close if @rack_body.respond_to?(:close)
56
58
  response = Rack::Response.new @rack_body, @rack_status, @rack_headers
57
59
  response.set_cookie(@configuration.rum_cookie_name, value: transaction.id, path: @configuration.rum_cookie_path)
58
60
  resp = response.finish
@@ -125,6 +127,8 @@ module StackifyRubyAPM
125
127
  end
126
128
 
127
129
  def streaming?(env)
130
+ # Not used
131
+ # Possible use of ActiveSupport.on_load(:action_controller_base)
128
132
  return false unless defined?(ActionController::Live)
129
133
 
130
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
 
@@ -29,9 +31,13 @@ module StackifyRubyAPM
29
31
  private
30
32
 
31
33
  def query_variables(payload)
34
+ adapter_config = lookup_adapter_config
32
35
  props = get_common_db_properties
33
36
  props[:PROVIDER] = get_profiler(lookup_adapter)
34
37
  props[:SQL] = payload[:sql]
38
+ if adapter_config
39
+ props[:URL] = "#{adapter_config[:host]}:#{adapter_config[:port]}"
40
+ end
35
41
  props
36
42
  end
37
43
 
@@ -42,6 +48,17 @@ module StackifyRubyAPM
42
48
  nil
43
49
  end
44
50
 
51
+ def lookup_adapter_config
52
+ if Gem::Version.new(Rails::VERSION::STRING) >= Gem::Version.new('6.1')
53
+ ::ActiveRecord::Base.connection_db_config.to_h
54
+ else
55
+ ::ActiveRecord::Base.connection_config.to_h
56
+ end
57
+ rescue StandardError => error
58
+ debug '[SqlNormalizer] lookup_adapter_config err: ' + error.inspect.to_s
59
+ nil
60
+ end
61
+
45
62
  def check_prepared_stmt(statement, payload)
46
63
  if StackifyRubyAPM.agent.config.prefix_enabled
47
64
  case get_profiler(lookup_adapter)
@@ -25,6 +25,7 @@ module StackifyRubyAPM
25
25
  CATEGORY: 'Database',
26
26
  SUBCATEGORY: 'DynamoDB',
27
27
  ACTION: operation_name,
28
+ URL: self.config.endpoint,
28
29
  )
29
30
  rescue Exception => e
30
31
  StackifyRubyAPM.agent.error "[DynamoDBSpy] Error: creating span context."
@@ -55,7 +55,9 @@ module StackifyRubyAPM
55
55
  #
56
56
  ctx = Span::Context.new(
57
57
  CATEGORY: 'MongoDB',
58
- MONGODB_COLLECTION: col
58
+ MONGODB_COLLECTION: col,
59
+ OPERATION: event.command_name.to_s,
60
+ URL: event.address.to_s
59
61
  )
60
62
 
61
63
  # Creates new span from Mongo event
@@ -18,11 +18,13 @@ module StackifyRubyAPM
18
18
  name = command[0].upcase.to_s
19
19
  type = 'db.redis'
20
20
  redis_details = command[1].is_a?(String) ? command[1].split(':') : []
21
- redis_nspace = !redis_details.blank? ? redis_details[0] : ''
21
+ # use length instead of .blank?
22
+ # reason: will throw error if activesupport missing
23
+ redis_nspace = redis_details.length ? redis_details[0] : ''
22
24
  redis_key = ''
23
25
 
24
26
  # Checks CACHEKEY value
25
- if !redis_details.blank? && redis_details[1]
27
+ if redis_details.length && redis_details[1]
26
28
  # Initially sets the CACHEKEY value
27
29
  args = redis_details[1].split('/')
28
30
  redis_key = args[0]
@@ -31,7 +33,11 @@ module StackifyRubyAPM
31
33
  # Possible formats:
32
34
  # `<namespace:key/method_name/expires_in=300/ttl=60/>`
33
35
  # `<namespace:key/expires_in=300/ttl=60/>`
34
- 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
35
41
  end
36
42
 
37
43
  return call_without_apm(command, &block) if command[0] == :auth
@@ -43,10 +49,11 @@ module StackifyRubyAPM
43
49
  COMPONENT_CATEGORY: 'Cache',
44
50
  COMPONENT_DETAIL: 'Execute',
45
51
  THREAD_ID: Thread.current.object_id,
46
- OPERATION: name
52
+ OPERATION: name,
53
+ URL: "#{self.options[:host]}:#{self.options[:port]}"
47
54
  }.tap do |hash|
48
- hash[:CACHEKEY] = redis_key unless redis_key.empty?
49
- 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?
50
57
  end
51
58
 
52
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
@@ -10,6 +13,7 @@ module StackifyRubyAPM
10
13
  # @api private
11
14
  class MysqlAdapterSpy
12
15
  TYPE = 'db.sinatra_active_record.sql'.freeze
16
+ DEFAULT_PORT = 3306
13
17
  if ActiveRecord::VERSION::MAJOR.to_i >= 5
14
18
  def install
15
19
  ActiveRecord::ConnectionAdapters::MySQL::DatabaseStatements.class_eval do
@@ -79,6 +83,7 @@ module StackifyRubyAPM
79
83
  props = get_common_db_properties
80
84
  props[:PROVIDER] = 'mysql'
81
85
  props[:SQL] = payload[:sql]
86
+ props[:URL] = get_host unless !get_host
82
87
  props
83
88
  end
84
89
 
@@ -87,6 +92,13 @@ module StackifyRubyAPM
87
92
  check_prepared_stmt_by_placeholder(payload[:sql].include?('?'), statement, payload)
88
93
  end
89
94
  end
95
+
96
+ def get_host
97
+ query_options = self.raw_connection.query_options.to_h
98
+ "#{query_options[:host]}:#{query_options[:port] || DEFAULT_PORT}"
99
+ rescue StandardError => error
100
+ nil
101
+ end
90
102
  end
91
103
  end
92
104
  else
@@ -112,6 +124,7 @@ module StackifyRubyAPM
112
124
  SQL: sql,
113
125
  PROVIDER: 'mysql'
114
126
  )
127
+ ctx[:URL] = get_host unless !get_host
115
128
 
116
129
  result = exec_query_without_apm(sql, name, binds)
117
130
 
@@ -135,6 +148,7 @@ module StackifyRubyAPM
135
148
  SQL: sql,
136
149
  PROVIDER: 'mysql'
137
150
  )
151
+ ctx[:URL] = get_host unless !get_host
138
152
 
139
153
  result = exec_delete_without_apm(sql, name, binds)
140
154
 
@@ -158,6 +172,7 @@ module StackifyRubyAPM
158
172
  SQL: sql,
159
173
  PROVIDER: 'mysql'
160
174
  )
175
+ ctx[:URL] = get_host unless !get_host
161
176
 
162
177
  result = exec_update_without_apm(sql, name, binds)
163
178
 
@@ -181,6 +196,7 @@ module StackifyRubyAPM
181
196
  SQL: sql,
182
197
  PROVIDER: 'mysql'
183
198
  )
199
+ ctx[:URL] = get_host unless !get_host
184
200
 
185
201
  result = exec_insert_without_apm(sql, name, binds, _pk = nil, _sequence_name = nil)
186
202
 
@@ -188,6 +204,14 @@ module StackifyRubyAPM
188
204
  return result
189
205
  end
190
206
  end
207
+
208
+ def get_host
209
+ config = self.config.to_h
210
+ "#{config[:host]}:#{config[:port] || DEFAULT_PORT}"
211
+ rescue StandardError => error
212
+ nil
213
+ end
214
+
191
215
  end
192
216
  end
193
217
  end
@@ -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
 
@@ -80,6 +82,7 @@ module StackifyRubyAPM
80
82
  props = get_common_db_properties
81
83
  props[:PROVIDER] = 'postgresql'
82
84
  props[:SQL] = payload[:sql]
85
+ props[:URL] = get_host unless !get_host
83
86
  props
84
87
  end
85
88
 
@@ -88,6 +91,13 @@ module StackifyRubyAPM
88
91
  check_prepared_stmt_by_placeholder(!!payload[:sql].match(/\$\d/), statement, payload)
89
92
  end
90
93
  end
94
+
95
+ def get_host
96
+ connection = self.raw_connection
97
+ "#{connection.host}:#{connection.port}"
98
+ rescue StandardError => error
99
+ nil
100
+ end
91
101
  end
92
102
  end
93
103
  end
@@ -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.13.2'.freeze
5
+ VERSION = '1.14.5'.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.13.2
4
+ version: 1.14.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stackify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-01 00:00:00.000000000 Z
11
+ date: 2021-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails