appsignal 3.4.0 → 3.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +63 -21
  3. data/.rubocop_todo.yml +68 -54
  4. data/.semaphore/semaphore.yml +11 -11
  5. data/CHANGELOG.md +37 -0
  6. data/Rakefile +15 -99
  7. data/appsignal.gemspec +3 -4
  8. data/bin/appsignal +4 -2
  9. data/build_matrix.yml +4 -4
  10. data/ext/._appsignal-agent +0 -0
  11. data/ext/Rakefile +22 -21
  12. data/ext/agent.rb +2 -0
  13. data/ext/base.rb +14 -17
  14. data/ext/extconf.rb +4 -1
  15. data/lib/appsignal/auth_check.rb +3 -3
  16. data/lib/appsignal/capistrano.rb +1 -1
  17. data/lib/appsignal/cli/demo.rb +5 -2
  18. data/lib/appsignal/cli/diagnose/paths.rb +4 -1
  19. data/lib/appsignal/cli/diagnose/utils.rb +7 -3
  20. data/lib/appsignal/cli/diagnose.rb +7 -5
  21. data/lib/appsignal/cli/helpers.rb +1 -4
  22. data/lib/appsignal/cli/install.rb +4 -10
  23. data/lib/appsignal/cli.rb +3 -2
  24. data/lib/appsignal/config.rb +105 -102
  25. data/lib/appsignal/demo.rb +2 -1
  26. data/lib/appsignal/environment.rb +2 -0
  27. data/lib/appsignal/event_formatter/action_view/render_formatter.rb +2 -1
  28. data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +13 -13
  29. data/lib/appsignal/event_formatter.rb +5 -4
  30. data/lib/appsignal/extension/jruby.rb +11 -9
  31. data/lib/appsignal/extension.rb +1 -1
  32. data/lib/appsignal/helpers/instrumentation.rb +50 -35
  33. data/lib/appsignal/hooks/action_cable.rb +6 -4
  34. data/lib/appsignal/hooks/action_mailer.rb +2 -0
  35. data/lib/appsignal/hooks/active_job.rb +11 -10
  36. data/lib/appsignal/hooks/active_support_notifications.rb +3 -4
  37. data/lib/appsignal/hooks/data_mapper.rb +1 -1
  38. data/lib/appsignal/hooks/gvl.rb +3 -0
  39. data/lib/appsignal/hooks/http.rb +1 -1
  40. data/lib/appsignal/hooks/mri.rb +2 -0
  41. data/lib/appsignal/hooks/net_http.rb +1 -1
  42. data/lib/appsignal/hooks/que.rb +1 -1
  43. data/lib/appsignal/hooks/rake.rb +1 -1
  44. data/lib/appsignal/hooks/redis.rb +1 -1
  45. data/lib/appsignal/hooks/resque.rb +1 -1
  46. data/lib/appsignal/hooks/shoryuken.rb +2 -4
  47. data/lib/appsignal/hooks/sidekiq.rb +1 -1
  48. data/lib/appsignal/hooks/unicorn.rb +2 -2
  49. data/lib/appsignal/hooks/webmachine.rb +1 -1
  50. data/lib/appsignal/hooks.rb +2 -2
  51. data/lib/appsignal/integrations/active_support_notifications.rb +1 -1
  52. data/lib/appsignal/integrations/capistrano/appsignal.cap +6 -3
  53. data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +5 -4
  54. data/lib/appsignal/integrations/delayed_job_plugin.rb +3 -5
  55. data/lib/appsignal/integrations/grape.rb +1 -1
  56. data/lib/appsignal/integrations/hanami.rb +1 -1
  57. data/lib/appsignal/integrations/object.rb +2 -3
  58. data/lib/appsignal/integrations/padrino.rb +2 -4
  59. data/lib/appsignal/integrations/que.rb +6 -6
  60. data/lib/appsignal/integrations/railtie.rb +72 -0
  61. data/lib/appsignal/integrations/sidekiq.rb +9 -11
  62. data/lib/appsignal/integrations/sinatra.rb +1 -3
  63. data/lib/appsignal/integrations/webmachine.rb +4 -6
  64. data/lib/appsignal/logger.rb +31 -6
  65. data/lib/appsignal/marker.rb +4 -5
  66. data/lib/appsignal/minutely.rb +7 -7
  67. data/lib/appsignal/probes/gvl.rb +9 -4
  68. data/lib/appsignal/probes/helpers.rb +4 -6
  69. data/lib/appsignal/probes/mri.rb +7 -5
  70. data/lib/appsignal/probes/sidekiq.rb +3 -0
  71. data/lib/appsignal/probes.rb +2 -0
  72. data/lib/appsignal/rack/generic_instrumentation.rb +1 -5
  73. data/lib/appsignal/rack/sinatra_instrumentation.rb +3 -5
  74. data/lib/appsignal/rack/streaming_listener.rb +11 -13
  75. data/lib/appsignal/span.rb +5 -5
  76. data/lib/appsignal/system.rb +10 -11
  77. data/lib/appsignal/transaction.rb +49 -25
  78. data/lib/appsignal/transmitter.rb +4 -2
  79. data/lib/appsignal/utils/deprecation_message.rb +2 -0
  80. data/lib/appsignal/utils/hash_sanitizer.rb +1 -1
  81. data/lib/appsignal/utils/integration_logger.rb +5 -3
  82. data/lib/appsignal/utils/json.rb +1 -1
  83. data/lib/appsignal/utils/query_params_sanitizer.rb +1 -1
  84. data/lib/appsignal/version.rb +1 -1
  85. data/lib/appsignal.rb +5 -4
  86. data/lib/puma/plugin/appsignal.rb +16 -18
  87. data/script/lint_git +1 -1
  88. data/spec/lib/appsignal/capistrano2_spec.rb +6 -3
  89. data/spec/lib/appsignal/capistrano3_spec.rb +6 -3
  90. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +1 -3
  91. data/spec/lib/appsignal/cli/diagnose_spec.rb +33 -30
  92. data/spec/lib/appsignal/cli/install_spec.rb +5 -6
  93. data/spec/lib/appsignal/cli_spec.rb +1 -1
  94. data/spec/lib/appsignal/config_spec.rb +43 -37
  95. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +11 -5
  96. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +4 -4
  97. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +1 -4
  98. data/spec/lib/appsignal/event_formatter_spec.rb +11 -9
  99. data/spec/lib/appsignal/hooks/action_cable_spec.rb +5 -2
  100. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +2 -1
  101. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +1 -1
  102. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +1 -1
  103. data/spec/lib/appsignal/hooks/activejob_spec.rb +21 -12
  104. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +1 -0
  105. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +12 -12
  106. data/spec/lib/appsignal/hooks/excon_spec.rb +2 -2
  107. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +3 -1
  108. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +4 -2
  109. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +2 -1
  110. data/spec/lib/appsignal/hooks_spec.rb +5 -4
  111. data/spec/lib/appsignal/integrations/grape_spec.rb +8 -4
  112. data/spec/lib/appsignal/integrations/hanami_spec.rb +16 -8
  113. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +2 -4
  114. data/spec/lib/appsignal/integrations/object_spec.rb +6 -1
  115. data/spec/lib/appsignal/integrations/padrino_spec.rb +4 -2
  116. data/spec/lib/appsignal/integrations/railtie_spec.rb +213 -6
  117. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +54 -41
  118. data/spec/lib/appsignal/logger_spec.rb +20 -4
  119. data/spec/lib/appsignal/marker_spec.rb +2 -2
  120. data/spec/lib/appsignal/minutely_spec.rb +3 -3
  121. data/spec/lib/appsignal/probes/gvl_spec.rb +60 -12
  122. data/spec/lib/appsignal/probes/mri_spec.rb +7 -4
  123. data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +2 -1
  124. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +2 -1
  125. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +10 -5
  126. data/spec/lib/appsignal/rack/streaming_listener_spec.rb +7 -5
  127. data/spec/lib/appsignal/transaction_spec.rb +20 -13
  128. data/spec/lib/appsignal/utils/data_spec.rb +10 -1
  129. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +11 -11
  130. data/spec/lib/appsignal/utils/json_spec.rb +4 -2
  131. data/spec/lib/appsignal_spec.rb +49 -35
  132. data/spec/lib/puma/appsignal_spec.rb +9 -11
  133. data/spec/spec_helper.rb +14 -2
  134. data/spec/support/fixtures/projects/valid/config/appsignal.yml +1 -1
  135. data/spec/support/helpers/config_helpers.rb +2 -1
  136. data/spec/support/helpers/dependency_helper.rb +1 -9
  137. data/spec/support/helpers/std_streams_helper.rb +1 -3
  138. data/spec/support/helpers/wait_for_helper.rb +2 -3
  139. data/spec/support/mocks/appsignal_mock.rb +1 -1
  140. data/spec/support/mocks/fake_gvl_tools.rb +2 -10
  141. data/spec/support/testing.rb +4 -3
  142. metadata +9 -135
@@ -4,11 +4,11 @@ require "json"
4
4
 
5
5
  module Appsignal
6
6
  class Transaction
7
- HTTP_REQUEST = "http_request".freeze
8
- BACKGROUND_JOB = "background_job".freeze
9
- ACTION_CABLE = "action_cable".freeze
10
- FRONTEND = "frontend".freeze
11
- BLANK = "".freeze
7
+ HTTP_REQUEST = "http_request"
8
+ BACKGROUND_JOB = "background_job"
9
+ ACTION_CABLE = "action_cable"
10
+ FRONTEND = "frontend"
11
+ BLANK = ""
12
12
  ALLOWED_TAG_KEY_TYPES = [Symbol, String].freeze
13
13
  ALLOWED_TAG_VALUE_TYPES = [Symbol, String, Integer].freeze
14
14
  BREADCRUMB_LIMIT = 20
@@ -16,19 +16,21 @@ module Appsignal
16
16
  class << self
17
17
  def create(id, namespace, request, options = {})
18
18
  # Allow middleware to force a new transaction
19
- if options.include?(:force) && options[:force]
20
- Thread.current[:appsignal_transaction] = nil
21
- end
19
+ Thread.current[:appsignal_transaction] = nil if options.include?(:force) && options[:force]
22
20
 
23
21
  # Check if we already have a running transaction
24
22
  if Thread.current[:appsignal_transaction].nil?
25
23
  # If not, start a new transaction
26
- Thread.current[:appsignal_transaction] = Appsignal::Transaction.new(id, namespace, request, options)
24
+ Thread.current[:appsignal_transaction] =
25
+ Appsignal::Transaction.new(id, namespace, request, options)
27
26
  else
28
27
  # Otherwise, log the issue about trying to start another transaction
29
- Appsignal.logger.warn_once_then_debug :transaction_id, "Trying to start new transaction with id " \
30
- "'#{id}', but a transaction with id '#{current.transaction_id}' " \
31
- "is already running. Using transaction '#{current.transaction_id}'."
28
+ Appsignal.logger.warn_once_then_debug(
29
+ :transaction_id,
30
+ "Trying to start new transaction with id " \
31
+ "'#{id}', but a transaction with id '#{current.transaction_id}' " \
32
+ "is already running. Using transaction '#{current.transaction_id}'."
33
+ )
32
34
 
33
35
  # And return the current transaction instead
34
36
  current
@@ -56,7 +58,9 @@ module Appsignal
56
58
  def complete_current!
57
59
  current.complete
58
60
  rescue => e
59
- Appsignal.logger.error("Failed to complete transaction ##{current.transaction_id}. #{e.message}")
61
+ Appsignal.logger.error(
62
+ "Failed to complete transaction ##{current.transaction_id}. #{e.message}"
63
+ )
60
64
  ensure
61
65
  clear_current_transaction!
62
66
  end
@@ -68,7 +72,8 @@ module Appsignal
68
72
  end
69
73
  end
70
74
 
71
- attr_reader :ext, :transaction_id, :action, :namespace, :request, :paused, :tags, :options, :discarded, :breadcrumbs
75
+ attr_reader :ext, :transaction_id, :action, :namespace, :request, :paused, :tags, :options,
76
+ :discarded, :breadcrumbs
72
77
 
73
78
  # @!attribute params
74
79
  # Attribute for parameters of the transaction.
@@ -146,6 +151,7 @@ module Appsignal
146
151
 
147
152
  def params
148
153
  return @params if defined?(@params)
154
+
149
155
  request_params
150
156
  end
151
157
 
@@ -202,6 +208,7 @@ module Appsignal
202
208
  # @since 2.2.0
203
209
  def set_action(action)
204
210
  return unless action
211
+
205
212
  @action = action
206
213
  @ext.set_action(action)
207
214
  end
@@ -222,6 +229,7 @@ module Appsignal
222
229
  # @since 2.2.0
223
230
  def set_action_if_nil(action)
224
231
  return if @action
232
+
225
233
  set_action(action)
226
234
  end
227
235
 
@@ -242,12 +250,14 @@ module Appsignal
242
250
  # @since 2.2.0
243
251
  def set_namespace(namespace)
244
252
  return unless namespace
253
+
245
254
  @namespace = namespace
246
255
  @ext.set_namespace(namespace)
247
256
  end
248
257
 
249
258
  def set_http_or_background_action(from = request.params)
250
259
  return unless from
260
+
251
261
  group_and_action = [
252
262
  from[:controller] || from[:class],
253
263
  from[:action] || from[:method]
@@ -267,6 +277,7 @@ module Appsignal
267
277
  # @return [void]
268
278
  def set_queue_start(start)
269
279
  return unless start
280
+
270
281
  @ext.set_queue_start(start)
271
282
  rescue RangeError
272
283
  Appsignal.logger.warn("Queue start value #{start} is too big")
@@ -297,11 +308,13 @@ module Appsignal
297
308
 
298
309
  def set_metadata(key, value)
299
310
  return unless key && value
311
+
300
312
  @ext.set_metadata(key, value)
301
313
  end
302
314
 
303
315
  def set_sample_data(key, data)
304
316
  return unless key && data && (data.is_a?(Array) || data.is_a?(Hash))
317
+
305
318
  @ext.set_sample_data(
306
319
  key.to_s,
307
320
  Appsignal::Utils::Data.generate(data)
@@ -309,20 +322,24 @@ module Appsignal
309
322
  rescue RuntimeError => e
310
323
  begin
311
324
  inspected_data = data.inspect
312
- Appsignal.logger.error("Error generating data (#{e.class}: #{e.message}) for '#{inspected_data}'")
325
+ Appsignal.logger.error(
326
+ "Error generating data (#{e.class}: #{e.message}) for '#{inspected_data}'"
327
+ )
313
328
  rescue => e
314
- Appsignal.logger.error("Error generating data (#{e.class}: #{e.message}). Can't inspect data.")
329
+ Appsignal.logger.error(
330
+ "Error generating data (#{e.class}: #{e.message}). Can't inspect data."
331
+ )
315
332
  end
316
333
  end
317
334
 
318
335
  def sample_data
319
336
  {
320
- :params => sanitized_params,
321
- :environment => sanitized_environment,
337
+ :params => sanitized_params,
338
+ :environment => sanitized_environment,
322
339
  :session_data => sanitized_session_data,
323
- :metadata => metadata,
324
- :tags => sanitized_tags,
325
- :breadcrumbs => breadcrumbs
340
+ :metadata => metadata,
341
+ :tags => sanitized_tags,
342
+ :breadcrumbs => breadcrumbs
326
343
  }.each do |key, data|
327
344
  set_sample_data(key, data)
328
345
  end
@@ -348,11 +365,13 @@ module Appsignal
348
365
 
349
366
  def start_event
350
367
  return if paused?
368
+
351
369
  @ext.start_event(0)
352
370
  end
353
371
 
354
372
  def finish_event(name, title, body, body_format = Appsignal::EventFormatter::DEFAULT)
355
373
  return if paused?
374
+
356
375
  @ext.finish_event(
357
376
  name,
358
377
  title || BLANK,
@@ -364,6 +383,7 @@ module Appsignal
364
383
 
365
384
  def record_event(name, title, body, duration, body_format = Appsignal::EventFormatter::DEFAULT)
366
385
  return if paused?
386
+
367
387
  @ext.record_event(
368
388
  name,
369
389
  title || BLANK,
@@ -410,6 +430,7 @@ module Appsignal
410
430
  def background_queue_start
411
431
  env = environment
412
432
  return unless env
433
+
413
434
  queue_start = env[:queue_start]
414
435
  return unless queue_start
415
436
 
@@ -424,9 +445,11 @@ module Appsignal
424
445
  def http_queue_start
425
446
  env = environment
426
447
  return unless env
427
- env_var = env["HTTP_X_QUEUE_START".freeze] || env["HTTP_X_REQUEST_START".freeze]
448
+
449
+ env_var = env["HTTP_X_QUEUE_START"] || env["HTTP_X_REQUEST_START"]
428
450
  return unless env_var
429
- cleaned_value = env_var.tr("^0-9".freeze, "".freeze)
451
+
452
+ cleaned_value = env_var.tr("^0-9", "")
430
453
  return if cleaned_value.empty?
431
454
 
432
455
  value = cleaned_value.to_i
@@ -489,7 +512,8 @@ module Appsignal
489
512
  # @return [Hash<String, Object>]
490
513
  def sanitized_session_data
491
514
  return if !Appsignal.config[:send_session_data] ||
492
- !request.respond_to?(:session)
515
+ !request.respond_to?(:session)
516
+
493
517
  session = request.session
494
518
  return unless session
495
519
 
@@ -555,7 +579,7 @@ module Appsignal
555
579
  # transaction, so that it's still safe to call methods on it if there is no
556
580
  # current transaction.
557
581
  class NilTransaction
558
- def method_missing(m, *args, &block)
582
+ def method_missing(_method, *args, &block)
559
583
  end
560
584
 
561
585
  # Instrument should still yield
@@ -9,7 +9,7 @@ require "json"
9
9
  module Appsignal
10
10
  # @api private
11
11
  class Transmitter
12
- CONTENT_TYPE = "application/json; charset=UTF-8".freeze
12
+ CONTENT_TYPE = "application/json; charset=UTF-8"
13
13
 
14
14
  HTTP_ERRORS = [
15
15
  EOFError,
@@ -84,7 +84,7 @@ module Appsignal
84
84
  if ca_file && File.exist?(ca_file) && File.readable?(ca_file)
85
85
  http.ca_file = ca_file
86
86
  else
87
- config.logger.warn "Ignoring non-existing or unreadable "\
87
+ config.logger.warn "Ignoring non-existing or unreadable " \
88
88
  "`ca_file_path`: #{ca_file}"
89
89
  end
90
90
  end
@@ -97,11 +97,13 @@ module Appsignal
97
97
 
98
98
  def proxy_addr
99
99
  return unless config[:http_proxy]
100
+
100
101
  proxy_uri.host
101
102
  end
102
103
 
103
104
  def proxy_port
104
105
  return unless config[:http_proxy]
106
+
105
107
  proxy_uri.port
106
108
  end
107
109
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Appsignal
2
4
  module Utils
3
5
  module DeprecationMessage
@@ -4,7 +4,7 @@ module Appsignal
4
4
  module Utils
5
5
  # @api private
6
6
  class HashSanitizer
7
- FILTERED = "[FILTERED]".freeze
7
+ FILTERED = "[FILTERED]"
8
8
 
9
9
  class << self
10
10
  def sanitize(value, filter_keys = [])
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Appsignal
2
4
  module Utils
3
5
  # Subclass of logger with method to only log a warning once
@@ -8,10 +10,10 @@ module Appsignal
8
10
  end
9
11
 
10
12
  def warn_once_then_debug(key, message)
11
- if !seen_keys.add?(key).nil?
12
- warn message
13
- else
13
+ if seen_keys.add?(key).nil?
14
14
  debug message
15
+ else
16
+ warn message
15
17
  end
16
18
  end
17
19
  end
@@ -30,7 +30,7 @@ module Appsignal
30
30
 
31
31
  def encode_utf8(value)
32
32
  value.encode(
33
- "utf-8".freeze,
33
+ "utf-8",
34
34
  :invalid => :replace,
35
35
  :undef => :replace
36
36
  )
@@ -4,7 +4,7 @@ module Appsignal
4
4
  module Utils
5
5
  # @api private
6
6
  class QueryParamsSanitizer
7
- REPLACEMENT_KEY = "?".freeze
7
+ REPLACEMENT_KEY = "?"
8
8
 
9
9
  module ClassMethods
10
10
  def sanitize(params, only_top_level = false, key_sanitizer = nil)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.4.0".freeze
4
+ VERSION = "3.4.1"
5
5
  end
data/lib/appsignal.rb CHANGED
@@ -99,13 +99,13 @@ module Appsignal
99
99
 
100
100
  @config ||= Config.new(
101
101
  Dir.pwd,
102
- ENV["APPSIGNAL_APP_ENV"] || ENV["RAILS_ENV"] || ENV["RACK_ENV"]
102
+ ENV["APPSIGNAL_APP_ENV"] || ENV["RAILS_ENV"] || ENV.fetch("RACK_ENV", nil)
103
103
  )
104
104
 
105
105
  if config.valid?
106
106
  logger.level = config.log_level
107
107
  if config.active?
108
- logger.info "Starting AppSignal #{Appsignal::VERSION} "\
108
+ logger.info "Starting AppSignal #{Appsignal::VERSION} " \
109
109
  "(#{$PROGRAM_NAME}, Ruby #{RUBY_VERSION}, #{RUBY_PLATFORM})"
110
110
  config.write_to_environment
111
111
  Appsignal::Extension.start
@@ -152,6 +152,7 @@ module Appsignal
152
152
 
153
153
  def forked
154
154
  return unless active?
155
+
155
156
  Appsignal.start_logger
156
157
  logger.debug("Forked process, resubscribing and restarting extension")
157
158
  Appsignal::Extension.start
@@ -186,7 +187,7 @@ module Appsignal
186
187
  def log_formatter(prefix = nil)
187
188
  pre = "#{prefix}: " if prefix
188
189
  proc do |severity, datetime, _progname, msg|
189
- "[#{datetime.strftime("%Y-%m-%dT%H:%M:%S")} (process) "\
190
+ "[#{datetime.strftime("%Y-%m-%dT%H:%M:%S")} (process) " \
190
191
  "##{Process.pid}][#{severity}] #{pre}#{msg}\n"
191
192
  end
192
193
  end
@@ -249,7 +250,7 @@ module Appsignal
249
250
  # @return [Boolean]
250
251
  # @since 0.2.7
251
252
  def active?
252
- config && config.active? && extension_loaded?
253
+ config&.active? && extension_loaded?
253
254
  end
254
255
 
255
256
  private
@@ -17,23 +17,21 @@ Puma::Plugin.create do # rubocop:disable Metrics/BlockLength
17
17
  plugin = AppsignalPumaPlugin.new
18
18
 
19
19
  loop do
20
- begin
21
- # Implement similar behavior to minutely probes.
22
- # Initial sleep to wait until the app is fully initalized.
23
- # Then loop every 60 seconds and collect the Puma stats as AppSignal
24
- # metrics.
25
- sleep sleep_time
26
-
27
- log_debug "AppSignal: Collecting Puma stats."
28
- stats = fetch_puma_stats
29
- if stats
30
- plugin.call(stats)
31
- else
32
- log_debug "AppSignal: No Puma stats to report."
33
- end
34
- rescue StandardError => error
35
- log_error "Error while processing metrics.", error
20
+ # Implement similar behavior to minutely probes.
21
+ # Initial sleep to wait until the app is fully initalized.
22
+ # Then loop every 60 seconds and collect the Puma stats as AppSignal
23
+ # metrics.
24
+ sleep sleep_time
25
+
26
+ log_debug "AppSignal: Collecting Puma stats."
27
+ stats = fetch_puma_stats
28
+ if stats
29
+ plugin.call(stats)
30
+ else
31
+ log_debug "AppSignal: No Puma stats to report."
36
32
  end
33
+ rescue StandardError => error
34
+ log_error "Error while processing metrics.", error
37
35
  end
38
36
  end
39
37
  end
@@ -119,7 +117,7 @@ class AppsignalPumaPlugin
119
117
  def fetch_hostname
120
118
  # Configure hostname as reported for the Puma metrics with the
121
119
  # APPSIGNAL_HOSTNAME environment variable.
122
- env_hostname = ENV["APPSIGNAL_HOSTNAME"]
120
+ env_hostname = ENV.fetch("APPSIGNAL_HOSTNAME", nil)
123
121
  return env_hostname if env_hostname
124
122
 
125
123
  # Auto detect hostname as fallback. May be inaccurate.
@@ -162,7 +160,7 @@ class AppsignalPumaPlugin
162
160
  socket = UDPSocket.new
163
161
  socket.send(data, 0, host, port)
164
162
  ensure
165
- socket && socket.close
163
+ socket&.close
166
164
  end
167
165
  end
168
166
  end
data/script/lint_git CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  set -eu
4
4
 
5
- LINTJE_VERSION="0.7.1"
5
+ LINTJE_VERSION="0.11.3"
6
6
 
7
7
  mkdir -p "$HOME/bin"
8
8
  cache_key=v1-lintje-$LINTJE_VERSION
@@ -148,7 +148,8 @@ if DependencyHelper.capistrano2_present?
148
148
  run
149
149
 
150
150
  expect(output).to include \
151
- "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
151
+ "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005," \
152
+ " user: batman",
152
153
  "AppSignal has been notified of this deploy!"
153
154
  end
154
155
 
@@ -175,7 +176,8 @@ if DependencyHelper.capistrano2_present?
175
176
 
176
177
  it "transmits the overriden deploy user" do
177
178
  expect(output).to include \
178
- "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: robin",
179
+ "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005," \
180
+ " user: robin",
179
181
  "AppSignal has been notified of this deploy!"
180
182
  end
181
183
  end
@@ -188,7 +190,8 @@ if DependencyHelper.capistrano2_present?
188
190
 
189
191
  it "does not transmit marker" do
190
192
  expect(output).to include \
191
- "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
193
+ "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005," \
194
+ " user: batman",
192
195
  "Something went wrong while trying to notify AppSignal:"
193
196
  expect(output).to_not include "AppSignal has been notified of this deploy!"
194
197
  end
@@ -160,7 +160,8 @@ if DependencyHelper.capistrano3_present?
160
160
  run
161
161
 
162
162
  expect(output).to include \
163
- "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
163
+ "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, " \
164
+ "user: batman",
164
165
  "AppSignal has been notified of this deploy!"
165
166
  end
166
167
 
@@ -187,7 +188,8 @@ if DependencyHelper.capistrano3_present?
187
188
 
188
189
  it "transmits the overriden deploy user" do
189
190
  expect(output).to include \
190
- "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: robin",
191
+ "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, " \
192
+ "user: robin",
191
193
  "AppSignal has been notified of this deploy!"
192
194
  end
193
195
  end
@@ -213,7 +215,8 @@ if DependencyHelper.capistrano3_present?
213
215
 
214
216
  it "does not transmit marker" do
215
217
  expect(output).to include \
216
- "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, user: batman",
218
+ "Notifying AppSignal of deploy with: revision: 503ce0923ed177a3ce000005, " \
219
+ "user: batman",
217
220
  "Something went wrong while trying to notify AppSignal:"
218
221
  expect(output).to_not include "AppSignal has been notified of this deploy!"
219
222
  end
@@ -46,9 +46,7 @@ describe Appsignal::CLI::Diagnose::Utils do
46
46
  let(:bytes_to_read) { 100 }
47
47
  subject { described_class.read_file_content(path, bytes_to_read) }
48
48
  before do
49
- File.open path, "w+" do |f|
50
- f.write file_contents
51
- end
49
+ File.write(path, file_contents)
52
50
  end
53
51
 
54
52
  context "when file is bigger than read size" do
@@ -2,7 +2,8 @@ require "bundler/cli"
2
2
  require "bundler/cli/common"
3
3
  require "appsignal/cli"
4
4
 
5
- describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_input, :color => false do
5
+ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_input,
6
+ :color => false do
6
7
  include CLIHelpers
7
8
 
8
9
  class DiagnosticsReportEndpoint
@@ -268,7 +269,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
268
269
  },
269
270
  "build" => {
270
271
  "time" => kind_of(String),
271
- "package_path" => File.expand_path("../../../../../", __FILE__),
272
+ "package_path" => File.expand_path("../../../..", __dir__),
272
273
  "architecture" => Appsignal::System.agent_architecture,
273
274
  "target" => Appsignal::System.agent_platform,
274
275
  "musl_override" => false,
@@ -319,7 +320,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
319
320
  before do
320
321
  allow(File).to receive(:read).and_call_original
321
322
  expect(File).to receive(:read)
322
- .with(File.expand_path("../../../../../ext/install.report", __FILE__))
323
+ .with(File.expand_path("../../../../ext/install.report", __dir__))
323
324
  .and_return(
324
325
  JSON.generate(
325
326
  "result" => {
@@ -359,7 +360,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
359
360
  before do
360
361
  allow(File).to receive(:read).and_call_original
361
362
  expect(File).to receive(:read)
362
- .with(File.expand_path("../../../../../ext/install.report", __FILE__))
363
+ .with(File.expand_path("../../../../ext/install.report", __dir__))
363
364
  .and_raise(error)
364
365
  end
365
366
 
@@ -389,7 +390,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
389
390
  before do
390
391
  allow(File).to receive(:read).and_call_original
391
392
  expect(File).to receive(:read)
392
- .with(File.expand_path("../../../../../ext/install.report", __FILE__))
393
+ .with(File.expand_path("../../../../ext/install.report", __dir__))
393
394
  .and_return(raw_report)
394
395
  end
395
396
 
@@ -839,7 +840,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
839
840
  let(:options) { { :environment => "development" } }
840
841
  before do
841
842
  ENV["APPSIGNAL_APP_ENV"] = "production"
842
- config.instance_variable_set(:@env, ENV["APPSIGNAL_APP_ENV"])
843
+ config.instance_variable_set(:@env, ENV.fetch("APPSIGNAL_APP_ENV", nil))
843
844
  stub_api_request(config, "auth").to_return(:status => 200)
844
845
  capture_diagnatics_report_request
845
846
  run
@@ -847,10 +848,10 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
847
848
 
848
849
  it "outputs a list of sources with their values" do
849
850
  expect(output).to include(
850
- %( environment: "production"\n) +
851
- %( Sources:\n) +
852
- %( initial: "development"\n) +
853
- %( env: "production"\n)
851
+ " environment: \"production\"\n" \
852
+ " Sources:\n" \
853
+ " initial: \"development\"\n" \
854
+ " env: \"production\"\n"
854
855
  )
855
856
  end
856
857
  end
@@ -882,7 +883,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
882
883
  context "when the source is multiple sources" do
883
884
  before do
884
885
  ENV["APPSIGNAL_APP_NAME"] = "MyApp"
885
- config[:name] = ENV["APPSIGNAL_APP_NAME"]
886
+ config[:name] = ENV.fetch("APPSIGNAL_APP_NAME", nil)
886
887
  stub_api_request(config, "auth").to_return(:status => 200)
887
888
  capture_diagnatics_report_request
888
889
  run
@@ -891,20 +892,20 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
891
892
  if DependencyHelper.rails_present?
892
893
  it "outputs a list of sources with their values" do
893
894
  expect(output).to include(
894
- %( name: "MyApp"\n) +
895
- %( Sources:\n) +
896
- %( initial: "MyApp"\n) +
897
- %( file: "TestApp"\n) +
898
- %( env: "MyApp"\n)
895
+ " name: \"MyApp\"\n" \
896
+ " Sources:\n" \
897
+ " initial: \"MyApp\"\n" \
898
+ " file: \"TestApp\"\n" \
899
+ " env: \"MyApp\"\n"
899
900
  )
900
901
  end
901
902
  else
902
903
  it "outputs a list of sources with their values" do
903
904
  expect(output).to include(
904
- %( name: "MyApp"\n) +
905
- %( Sources:\n) +
906
- %( file: "TestApp"\n) +
907
- %( env: "MyApp"\n)
905
+ " name: \"MyApp\"\n" \
906
+ " Sources:\n" \
907
+ " file: \"TestApp\"\n" \
908
+ " env: \"MyApp\"\n"
908
909
  )
909
910
  end
910
911
  end
@@ -928,7 +929,9 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
928
929
  "sources" => {
929
930
  "default" => hash_with_string_keys(Appsignal::Config::DEFAULT_CONFIG),
930
931
  "system" => {},
931
- "initial" => hash_with_string_keys(config.initial_config.merge(additional_initial_config)),
932
+ "initial" => hash_with_string_keys(
933
+ config.initial_config.merge(additional_initial_config)
934
+ ),
932
935
  "file" => hash_with_string_keys(config.file_config),
933
936
  "env" => {},
934
937
  "override" => { "send_session_data" => true }
@@ -1047,18 +1050,16 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
1047
1050
  it "outputs failure with status code" do
1048
1051
  expect(output).to include "Validation",
1049
1052
  "Validating Push API key: Failed to validate: status 500\n" +
1050
- %("Could not confirm authorization: 500")
1053
+ %("Could not confirm authorization: 500")
1051
1054
  end
1052
1055
 
1053
1056
  context "with color", :color => true do
1054
1057
  it "outputs error in color" do
1055
1058
  expect(output).to include "Validation",
1056
- "Validating Push API key: " +
1057
- colorize(
1058
- "Failed to validate: status 500\n" +
1059
- %("Could not confirm authorization: 500"),
1059
+ "Validating Push API key: #{colorize(
1060
+ %(Failed to validate: status 500\n"Could not confirm authorization: 500"),
1060
1061
  :red
1061
- )
1062
+ )}"
1062
1063
  end
1063
1064
  end
1064
1065
 
@@ -1280,7 +1281,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
1280
1281
  it "outputs ownership" do
1281
1282
  expect(output).to include \
1282
1283
  %(Root path\n Path: "#{root_path}"\n Writable?: true\n ) \
1283
- "Ownership?: true (file: #{process_user}:#{Process.uid}, "\
1284
+ "Ownership?: true (file: #{process_user}:#{Process.uid}, " \
1284
1285
  "process: #{process_user}:#{Process.uid})"
1285
1286
  end
1286
1287
 
@@ -1414,7 +1415,9 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
1414
1415
  let(:filename) { "appsignal.log" }
1415
1416
  before do
1416
1417
  ENV["APPSIGNAL_LOG"] = "stdout"
1417
- expect_any_instance_of(Appsignal::Config).to receive(:log_file_path).at_least(:once).and_return(file_path)
1418
+ expect_any_instance_of(Appsignal::Config).to receive(:log_file_path)
1419
+ .at_least(:once)
1420
+ .and_return(file_path)
1418
1421
  end
1419
1422
  end
1420
1423
 
@@ -1442,6 +1445,6 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
1442
1445
  end
1443
1446
 
1444
1447
  def hash_with_string_keys(hash)
1445
- Hash[hash.map { |key, value| [key.to_s, value] }]
1448
+ hash.transform_keys(&:to_s)
1446
1449
  end
1447
1450
  end