appsignal 3.9.3-java → 3.11.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +22 -19
  3. data/.rubocop.yml +1 -1
  4. data/CHANGELOG.md +180 -0
  5. data/Gemfile +1 -0
  6. data/README.md +0 -1
  7. data/Rakefile +1 -1
  8. data/benchmark.rake +99 -42
  9. data/build_matrix.yml +10 -12
  10. data/gemfiles/webmachine1.gemfile +5 -4
  11. data/lib/appsignal/cli/demo.rb +0 -1
  12. data/lib/appsignal/config.rb +57 -97
  13. data/lib/appsignal/demo.rb +15 -20
  14. data/lib/appsignal/environment.rb +6 -1
  15. data/lib/appsignal/event_formatter/rom/sql_formatter.rb +1 -0
  16. data/lib/appsignal/event_formatter.rb +3 -2
  17. data/lib/appsignal/helpers/instrumentation.rb +490 -16
  18. data/lib/appsignal/hooks/action_cable.rb +21 -16
  19. data/lib/appsignal/hooks/active_job.rb +15 -14
  20. data/lib/appsignal/hooks/delayed_job.rb +1 -1
  21. data/lib/appsignal/hooks/shoryuken.rb +3 -63
  22. data/lib/appsignal/integrations/action_cable.rb +5 -7
  23. data/lib/appsignal/integrations/active_support_notifications.rb +1 -0
  24. data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +36 -35
  25. data/lib/appsignal/integrations/data_mapper.rb +1 -0
  26. data/lib/appsignal/integrations/delayed_job_plugin.rb +27 -33
  27. data/lib/appsignal/integrations/dry_monitor.rb +1 -0
  28. data/lib/appsignal/integrations/excon.rb +1 -0
  29. data/lib/appsignal/integrations/http.rb +1 -0
  30. data/lib/appsignal/integrations/net_http.rb +1 -0
  31. data/lib/appsignal/integrations/object.rb +6 -0
  32. data/lib/appsignal/integrations/padrino.rb +21 -25
  33. data/lib/appsignal/integrations/que.rb +13 -20
  34. data/lib/appsignal/integrations/railtie.rb +1 -1
  35. data/lib/appsignal/integrations/rake.rb +45 -15
  36. data/lib/appsignal/integrations/redis.rb +1 -0
  37. data/lib/appsignal/integrations/redis_client.rb +1 -0
  38. data/lib/appsignal/integrations/resque.rb +2 -5
  39. data/lib/appsignal/integrations/shoryuken.rb +75 -0
  40. data/lib/appsignal/integrations/sidekiq.rb +7 -25
  41. data/lib/appsignal/integrations/unicorn.rb +1 -0
  42. data/lib/appsignal/integrations/webmachine.rb +12 -9
  43. data/lib/appsignal/logger.rb +7 -3
  44. data/lib/appsignal/probes/helpers.rb +1 -0
  45. data/lib/appsignal/probes/mri.rb +1 -0
  46. data/lib/appsignal/probes/sidekiq.rb +1 -0
  47. data/lib/appsignal/probes.rb +3 -0
  48. data/lib/appsignal/rack/abstract_middleware.rb +67 -24
  49. data/lib/appsignal/rack/body_wrapper.rb +143 -0
  50. data/lib/appsignal/rack/event_handler.rb +39 -8
  51. data/lib/appsignal/rack/generic_instrumentation.rb +6 -4
  52. data/lib/appsignal/rack/grape_middleware.rb +3 -2
  53. data/lib/appsignal/rack/hanami_middleware.rb +1 -1
  54. data/lib/appsignal/rack/instrumentation_middleware.rb +62 -0
  55. data/lib/appsignal/rack/rails_instrumentation.rb +1 -3
  56. data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -3
  57. data/lib/appsignal/rack/streaming_listener.rb +14 -59
  58. data/lib/appsignal/rack.rb +60 -0
  59. data/lib/appsignal/span.rb +1 -0
  60. data/lib/appsignal/transaction.rb +353 -104
  61. data/lib/appsignal/utils/data.rb +0 -1
  62. data/lib/appsignal/utils/hash_sanitizer.rb +0 -1
  63. data/lib/appsignal/utils/integration_logger.rb +0 -13
  64. data/lib/appsignal/utils/integration_memory_logger.rb +0 -13
  65. data/lib/appsignal/utils/json.rb +0 -1
  66. data/lib/appsignal/utils/query_params_sanitizer.rb +0 -1
  67. data/lib/appsignal/utils/stdout_and_logger_message.rb +0 -1
  68. data/lib/appsignal/utils.rb +6 -0
  69. data/lib/appsignal/version.rb +1 -1
  70. data/lib/appsignal.rb +9 -6
  71. data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
  72. data/spec/lib/appsignal/config_spec.rb +139 -43
  73. data/spec/lib/appsignal/hooks/action_cable_spec.rb +43 -74
  74. data/spec/lib/appsignal/hooks/activejob_spec.rb +9 -0
  75. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +2 -443
  76. data/spec/lib/appsignal/hooks/rake_spec.rb +100 -17
  77. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -171
  78. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +459 -0
  79. data/spec/lib/appsignal/integrations/padrino_spec.rb +181 -131
  80. data/spec/lib/appsignal/integrations/que_spec.rb +3 -4
  81. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +167 -0
  82. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +4 -4
  83. data/spec/lib/appsignal/integrations/sinatra_spec.rb +10 -2
  84. data/spec/lib/appsignal/integrations/webmachine_spec.rb +77 -17
  85. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +144 -11
  86. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +263 -0
  87. data/spec/lib/appsignal/rack/event_handler_spec.rb +81 -10
  88. data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +70 -17
  89. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +1 -1
  90. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +38 -0
  91. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +4 -2
  92. data/spec/lib/appsignal/rack/streaming_listener_spec.rb +43 -120
  93. data/spec/lib/appsignal/rack_spec.rb +63 -0
  94. data/spec/lib/appsignal/transaction_spec.rb +1675 -953
  95. data/spec/lib/appsignal/utils/integration_logger_spec.rb +12 -16
  96. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -10
  97. data/spec/lib/appsignal_spec.rb +517 -13
  98. data/spec/support/helpers/transaction_helpers.rb +44 -20
  99. data/spec/support/matchers/transaction.rb +15 -1
  100. data/spec/support/mocks/dummy_app.rb +1 -1
  101. data/spec/support/testing.rb +1 -1
  102. metadata +12 -4
  103. data/support/check_versions +0 -22
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- # @api private
6
5
  class Data
7
6
  class << self
8
7
  def generate(body)
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- # @api private
6
5
  class HashSanitizer
7
6
  FILTERED = "[FILTERED]"
8
7
  RECURSIVE = "[RECURSIVE VALUE]"
@@ -2,20 +2,7 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- # Subclass of logger with method to only log a warning once
6
- # prevents the local log from filling up with repeated messages.
7
5
  class IntegrationLogger < ::Logger
8
- def seen_keys
9
- @seen_keys ||= Set.new
10
- end
11
-
12
- def warn_once_then_debug(key, message)
13
- if seen_keys.add?(key).nil?
14
- debug message
15
- else
16
- warn message
17
- end
18
- end
19
6
  end
20
7
  end
21
8
  end
@@ -4,7 +4,6 @@ require "logger"
4
4
 
5
5
  module Appsignal
6
6
  module Utils
7
- # @api private
8
7
  class IntegrationMemoryLogger
9
8
  LEVELS = {
10
9
  Logger::DEBUG => :DEBUG,
@@ -35,18 +34,6 @@ module Appsignal
35
34
  add(:WARN, message)
36
35
  end
37
36
 
38
- def seen_keys
39
- @seen_keys ||= Set.new
40
- end
41
-
42
- def warn_once_then_debug(key, message)
43
- if seen_keys.add?(key).nil?
44
- debug message
45
- else
46
- warn message
47
- end
48
- end
49
-
50
37
  def error(message)
51
38
  add(:ERROR, message)
52
39
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- # @api private
6
5
  class JSON
7
6
  class << self
8
7
  def generate(body)
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- # @api private
6
5
  class QueryParamsSanitizer
7
6
  REPLACEMENT_KEY = "?"
8
7
 
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Appsignal
4
4
  module Utils
5
- # @api private
6
5
  module StdoutAndLoggerMessage
7
6
  def self.warning(message, logger = Appsignal.internal_logger)
8
7
  Kernel.warn "appsignal WARNING: #{message}"
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ module Appsignal
4
+ # @api private
5
+ module Utils
6
+ end
7
+ end
8
+
3
9
  require "appsignal/utils/integration_memory_logger"
4
10
  require "appsignal/utils/stdout_and_logger_message"
5
11
  require "appsignal/utils/data"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.9.3"
4
+ VERSION = "3.11.0"
5
5
  end
data/lib/appsignal.rb CHANGED
@@ -47,7 +47,7 @@ module Appsignal
47
47
  # @see Extension
48
48
  # @see extension_loaded?
49
49
  attr_accessor :extension_loaded
50
- # @!attribute [rw] logger
50
+ # @!attribute [rw] internal_logger
51
51
  # Accessor for the internal AppSignal logger.
52
52
  #
53
53
  # Not to be confused with our logging feature.
@@ -59,10 +59,8 @@ module Appsignal
59
59
  # {.start}) the contents of the "in memory logger" is written to the new
60
60
  # logger.
61
61
  #
62
- # @note some classes may have options to set custom loggers. Their
63
- # defaults are pointed to this attribute.
64
62
  # @api private
65
- # @return [Logger]
63
+ # @return [Utils::IntegrationLogger or Utils::IntegrationMemoryLogger]
66
64
  # @see start
67
65
  attr_writer :internal_logger
68
66
 
@@ -165,10 +163,12 @@ module Appsignal
165
163
  Appsignal::Extension.start
166
164
  end
167
165
 
166
+ # @api private
168
167
  def get_server_state(key)
169
168
  Appsignal::Extension.get_server_state(key)
170
169
  end
171
170
 
171
+ # @api private
172
172
  def in_memory_logger
173
173
  @in_memory_logger ||=
174
174
  Appsignal::Utils::IntegrationMemoryLogger.new.tap do |l|
@@ -176,6 +176,7 @@ module Appsignal
176
176
  end
177
177
  end
178
178
 
179
+ # @api private
179
180
  def internal_logger
180
181
  @internal_logger ||= in_memory_logger
181
182
  end
@@ -195,7 +196,7 @@ module Appsignal
195
196
  def start_logger
196
197
  callers = caller
197
198
  Appsignal::Utils::StdoutAndLoggerMessage.warning \
198
- "Callng 'Appsignal.start_logger' is deprecated. " \
199
+ "Calling 'Appsignal.start_logger' is deprecated. " \
199
200
  "The logger will be started when calling 'Appsignal.start'. " \
200
201
  "Remove the 'Appsignal.start_logger' call in the following file to " \
201
202
  "remove this message.\n#{callers.first}"
@@ -324,8 +325,10 @@ require "appsignal/hooks"
324
325
  require "appsignal/probes"
325
326
  require "appsignal/marker"
326
327
  require "appsignal/garbage_collection"
328
+ require "appsignal/rack"
329
+ require "appsignal/rack/body_wrapper"
327
330
  require "appsignal/rack/abstract_middleware"
328
- require "appsignal/rack/generic_instrumentation"
331
+ require "appsignal/rack/instrumentation_middleware"
329
332
  require "appsignal/rack/event_handler"
330
333
  require "appsignal/integrations/railtie" if defined?(::Rails)
331
334
  require "appsignal/transaction"
@@ -17,7 +17,7 @@ if DependencyHelper.capistrano2_present?
17
17
  c.dry_run = false
18
18
  end
19
19
  end
20
- before { Appsignal::Capistrano.tasks(capistrano_config) }
20
+ before { Appsignal::Integrations::Capistrano.tasks(capistrano_config) }
21
21
 
22
22
  def run
23
23
  capture_stdout(out_stream) do
@@ -1,19 +1,4 @@
1
1
  describe Appsignal::Config do
2
- describe "config keys" do
3
- it "all config keys have an environment variable version registered" do
4
- config = Appsignal::Config
5
- mapped_env_keys = config::ENV_TO_KEY_MAPPING.keys.sort
6
- configured_env_keys = (
7
- config::ENV_STRING_KEYS +
8
- config::ENV_BOOLEAN_KEYS +
9
- config::ENV_ARRAY_KEYS +
10
- config::ENV_FLOAT_KEYS
11
- ).sort
12
-
13
- expect(mapped_env_keys).to eql(configured_env_keys)
14
- end
15
- end
16
-
17
2
  describe "#initialize" do
18
3
  describe "environment" do
19
4
  context "when environment is nil" do
@@ -165,6 +150,7 @@ describe Appsignal::Config do
165
150
  :enable_statsd => true,
166
151
  :enable_nginx_metrics => false,
167
152
  :enable_rails_error_reporter => true,
153
+ :enable_rake_performance_instrumentation => false,
168
154
  :endpoint => "https://push.appsignal.com",
169
155
  :files_world_accessible => true,
170
156
  :filter_metadata => [],
@@ -415,49 +401,159 @@ describe Appsignal::Config do
415
401
  let(:working_directory_path) { File.join(tmp_dir, "test_working_directory_path") }
416
402
  let(:env_config) do
417
403
  {
418
- :running_in_container => true,
419
- :push_api_key => "aaa-bbb-ccc",
420
404
  :active => true,
405
+ :activejob_report_errors => "all",
421
406
  :bind_address => "0.0.0.0",
407
+ :ca_file_path => "/some/path",
422
408
  :cpu_count => 1.5,
423
- :name => "App name",
424
409
  :debug => true,
425
410
  :dns_servers => ["8.8.8.8", "8.8.4.4"],
426
- :ignore_actions => %w[action1 action2],
427
- :ignore_errors => %w[ExampleStandardError AnotherError],
411
+ :enable_allocation_tracking => false,
412
+ :enable_gvl_global_timer => false,
413
+ :enable_gvl_waiting_threads => false,
414
+ :enable_host_metrics => false,
415
+ :enable_minutely_probes => false,
416
+ :enable_nginx_metrics => false,
417
+ :enable_rails_error_reporter => false,
418
+ :enable_rake_performance_instrumentation => false,
419
+ :enable_statsd => false,
420
+ :endpoint => "https://test.appsignal.com",
421
+ :files_world_accessible => false,
422
+ :filter_metadata => ["key1", "key2"],
423
+ :filter_parameters => ["param1", "param2"],
424
+ :filter_session_data => ["session1", "session2"],
425
+ :host_role => "my host role",
426
+ :hostname => "my hostname",
427
+ :http_proxy => "some proxy",
428
+ :ignore_actions => ["action1", "action2"],
429
+ :ignore_errors => ["ExampleStandardError", "AnotherError"],
428
430
  :ignore_logs => ["^start$", "^Completed 2.* in .*ms (.*)"],
429
- :ignore_namespaces => %w[admin private_namespace],
431
+ :ignore_namespaces => ["admin", "private_namespace"],
432
+ :instrument_http_rb => false,
430
433
  :instrument_net_http => false,
431
434
  :instrument_redis => false,
432
435
  :instrument_sequel => false,
433
- :files_world_accessible => false,
434
- :request_headers => %w[accept accept-charset],
436
+ :log => "file",
437
+ :log_level => "debug",
438
+ :log_path => "/tmp/something",
439
+ :logging_endpoint => "https://appsignal-endpoint.net/test",
440
+ :name => "App name",
441
+ :push_api_key => "aaa-bbb-ccc",
442
+ :request_headers => ["accept", "accept-charset"],
435
443
  :revision => "v2.5.1",
444
+ :running_in_container => true,
436
445
  :send_environment_metadata => false,
446
+ :send_params => false,
447
+ :send_session_data => false,
448
+ :sidekiq_report_errors => "all",
449
+ :skip_session_data => false,
450
+ :statsd_port => "7890",
451
+ :transaction_debug_mode => false,
452
+ :working_dir_path => "/some/path",
437
453
  :working_directory_path => working_directory_path
438
454
  }
439
455
  end
456
+ let(:env_vars) do
457
+ {
458
+ # Strings
459
+ "APPSIGNAL_ACTIVEJOB_REPORT_ERRORS" => "all",
460
+ "APPSIGNAL_APP_NAME" => "App name",
461
+ "APPSIGNAL_BIND_ADDRESS" => "0.0.0.0",
462
+ "APPSIGNAL_CA_FILE_PATH" => "/some/path",
463
+ "APPSIGNAL_HOSTNAME" => "my hostname",
464
+ "APPSIGNAL_HOST_ROLE" => "my host role",
465
+ "APPSIGNAL_HTTP_PROXY" => "some proxy",
466
+ "APPSIGNAL_LOG" => "file",
467
+ "APPSIGNAL_LOGGING_ENDPOINT" => "https://appsignal-endpoint.net/test",
468
+ "APPSIGNAL_LOG_LEVEL" => "debug",
469
+ "APPSIGNAL_LOG_PATH" => "/tmp/something",
470
+ "APPSIGNAL_PUSH_API_ENDPOINT" => "https://test.appsignal.com",
471
+ "APPSIGNAL_PUSH_API_KEY" => "aaa-bbb-ccc",
472
+ "APPSIGNAL_SIDEKIQ_REPORT_ERRORS" => "all",
473
+ "APPSIGNAL_STATSD_PORT" => "7890",
474
+ "APPSIGNAL_WORKING_DIRECTORY_PATH" => working_directory_path,
475
+ "APPSIGNAL_WORKING_DIR_PATH" => "/some/path",
476
+ "APP_REVISION" => "v2.5.1",
477
+
478
+ # Booleans
479
+ "APPSIGNAL_ACTIVE" => "true",
480
+ "APPSIGNAL_DEBUG" => "true",
481
+ "APPSIGNAL_ENABLE_ALLOCATION_TRACKING" => "false",
482
+ "APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER" => "false",
483
+ "APPSIGNAL_ENABLE_GVL_WAITING_THREADS" => "false",
484
+ "APPSIGNAL_ENABLE_HOST_METRICS" => "false",
485
+ "APPSIGNAL_ENABLE_MINUTELY_PROBES" => "false",
486
+ "APPSIGNAL_ENABLE_NGINX_METRICS" => "false",
487
+ "APPSIGNAL_ENABLE_RAILS_ERROR_REPORTER" => "false",
488
+ "APPSIGNAL_ENABLE_RAKE_PERFORMANCE_INSTRUMENTATION" => "false",
489
+ "APPSIGNAL_ENABLE_STATSD" => "false",
490
+ "APPSIGNAL_FILES_WORLD_ACCESSIBLE" => "false",
491
+ "APPSIGNAL_INSTRUMENT_HTTP_RB" => "false",
492
+ "APPSIGNAL_INSTRUMENT_NET_HTTP" => "false",
493
+ "APPSIGNAL_INSTRUMENT_REDIS" => "false",
494
+ "APPSIGNAL_INSTRUMENT_SEQUEL" => "false",
495
+ "APPSIGNAL_RUNNING_IN_CONTAINER" => "true",
496
+ "APPSIGNAL_SEND_ENVIRONMENT_METADATA" => "false",
497
+ "APPSIGNAL_SEND_PARAMS" => "false",
498
+ "APPSIGNAL_SEND_SESSION_DATA" => "false",
499
+ "APPSIGNAL_SKIP_SESSION_DATA" => "false",
500
+ "APPSIGNAL_TRANSACTION_DEBUG_MODE" => "false",
501
+
502
+ # Arrays
503
+ "APPSIGNAL_DNS_SERVERS" => "8.8.8.8,8.8.4.4",
504
+ "APPSIGNAL_FILTER_METADATA" => "key1,key2",
505
+ "APPSIGNAL_FILTER_PARAMETERS" => "param1,param2",
506
+ "APPSIGNAL_FILTER_SESSION_DATA" => "session1,session2",
507
+ "APPSIGNAL_IGNORE_ACTIONS" => "action1,action2",
508
+ "APPSIGNAL_IGNORE_ERRORS" => "ExampleStandardError,AnotherError",
509
+ "APPSIGNAL_IGNORE_LOGS" => "^start$,^Completed 2.* in .*ms (.*)",
510
+ "APPSIGNAL_IGNORE_NAMESPACES" => "admin,private_namespace",
511
+ "APPSIGNAL_REQUEST_HEADERS" => "accept,accept-charset",
512
+
513
+ # Floats
514
+ "APPSIGNAL_CPU_COUNT" => "1.5"
515
+ }
516
+ end
440
517
  before do
441
- ENV["APPSIGNAL_RUNNING_IN_CONTAINER"] = "true"
442
- ENV["APPSIGNAL_PUSH_API_KEY"] = "aaa-bbb-ccc"
443
- ENV["APPSIGNAL_ACTIVE"] = "true"
444
- ENV["APPSIGNAL_APP_NAME"] = "App name"
445
- ENV["APPSIGNAL_BIND_ADDRESS"] = "0.0.0.0"
446
- ENV["APPSIGNAL_CPU_COUNT"] = "1.5"
447
- ENV["APPSIGNAL_DEBUG"] = "true"
448
- ENV["APPSIGNAL_DNS_SERVERS"] = "8.8.8.8,8.8.4.4"
449
- ENV["APPSIGNAL_IGNORE_ACTIONS"] = "action1,action2"
450
- ENV["APPSIGNAL_IGNORE_ERRORS"] = "ExampleStandardError,AnotherError"
451
- ENV["APPSIGNAL_IGNORE_LOGS"] = "^start$,^Completed 2.* in .*ms (.*)"
452
- ENV["APPSIGNAL_IGNORE_NAMESPACES"] = "admin,private_namespace"
453
- ENV["APPSIGNAL_INSTRUMENT_NET_HTTP"] = "false"
454
- ENV["APPSIGNAL_INSTRUMENT_REDIS"] = "false"
455
- ENV["APPSIGNAL_INSTRUMENT_SEQUEL"] = "false"
456
- ENV["APPSIGNAL_FILES_WORLD_ACCESSIBLE"] = "false"
457
- ENV["APPSIGNAL_REQUEST_HEADERS"] = "accept,accept-charset"
458
- ENV["APPSIGNAL_SEND_ENVIRONMENT_METADATA"] = "false"
459
- ENV["APPSIGNAL_WORKING_DIRECTORY_PATH"] = working_directory_path
460
- ENV["APP_REVISION"] = "v2.5.1"
518
+ env_vars.each do |key, value|
519
+ ENV[key] = value
520
+ end
521
+ end
522
+
523
+ it "reads all string env keys" do
524
+ config
525
+
526
+ Appsignal::Config::ENV_STRING_KEYS.each do |env_key, option|
527
+ ENV.fetch(env_key) { raise "Config env var '#{env_key}' is not set for this test" }
528
+ expect(config[option]).to eq(ENV.fetch(env_key, nil))
529
+ end
530
+ end
531
+
532
+ it "reads all boolean env keys" do
533
+ config
534
+
535
+ Appsignal::Config::ENV_BOOLEAN_KEYS.each do |env_key, option|
536
+ ENV.fetch(env_key) { raise "Config env var '#{env_key}' is not set for this test" }
537
+ expect(config[option]).to eq(ENV.fetch(env_key, nil) == "true")
538
+ end
539
+ end
540
+
541
+ it "reads all array env keys" do
542
+ config
543
+
544
+ Appsignal::Config::ENV_ARRAY_KEYS.each do |env_key, option|
545
+ ENV.fetch(env_key) { raise "Config env var '#{env_key}' is not set for this test" }
546
+ expect(config[option]).to eq(ENV.fetch(env_key, nil).split(","))
547
+ end
548
+ end
549
+
550
+ it "reads all float env keys" do
551
+ config
552
+
553
+ Appsignal::Config::ENV_FLOAT_KEYS.each do |env_key, option|
554
+ ENV.fetch(env_key) { raise "Config env var '#{env_key}' is not set for this test" }
555
+ expect(config[option]).to eq(ENV.fetch(env_key, nil).to_f)
556
+ end
461
557
  end
462
558
 
463
559
  it "overrides config with environment values" do