appsignal 4.10.4-java → 5.0.0-java

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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +108 -0
  3. data/Rakefile +195 -4
  4. data/appsignal.gemspec +8 -0
  5. data/build_matrix.yml +12 -0
  6. data/ext/appsignal_extension.c +14 -0
  7. data/lib/appsignal/backends.rb +55 -0
  8. data/lib/appsignal/cli/diagnose.rb +2 -10
  9. data/lib/appsignal/config.rb +377 -13
  10. data/lib/appsignal/demo.rb +12 -10
  11. data/lib/appsignal/event_formatter/action_view/render_formatter.rb +34 -22
  12. data/lib/appsignal/event_formatter/active_job/perform_formatter.rb +35 -0
  13. data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +19 -0
  14. data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +27 -0
  15. data/lib/appsignal/event_formatter/recorded_elsewhere.rb +17 -0
  16. data/lib/appsignal/event_formatter/rom/sql_formatter.rb +24 -0
  17. data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +5 -0
  18. data/lib/appsignal/event_formatter/view_component/render_formatter.rb +21 -10
  19. data/lib/appsignal/event_formatter.rb +78 -0
  20. data/lib/appsignal/extension.rb +4 -0
  21. data/lib/appsignal/helpers/instrumentation.rb +324 -20
  22. data/lib/appsignal/helpers/metrics.rb +3 -24
  23. data/lib/appsignal/hooks/action_cable.rb +26 -8
  24. data/lib/appsignal/hooks/active_job.rb +184 -47
  25. data/lib/appsignal/hooks/at_exit.rb +4 -1
  26. data/lib/appsignal/hooks/excon.rb +20 -0
  27. data/lib/appsignal/hooks/faraday.rb +16 -0
  28. data/lib/appsignal/hooks/http.rb +5 -0
  29. data/lib/appsignal/hooks/resque.rb +1 -1
  30. data/lib/appsignal/hooks/sequel.rb +32 -2
  31. data/lib/appsignal/hooks/shoryuken.rb +3 -3
  32. data/lib/appsignal/hooks/sidekiq.rb +1 -1
  33. data/lib/appsignal/integrations/action_cable.rb +5 -2
  34. data/lib/appsignal/integrations/active_support_notifications.rb +59 -19
  35. data/lib/appsignal/integrations/data_mapper.rb +14 -2
  36. data/lib/appsignal/integrations/delayed_job_plugin.rb +81 -8
  37. data/lib/appsignal/integrations/dry_monitor.rb +39 -15
  38. data/lib/appsignal/integrations/excon/appsignal_middleware.rb +21 -0
  39. data/lib/appsignal/integrations/excon.rb +52 -15
  40. data/lib/appsignal/integrations/faraday.rb +47 -12
  41. data/lib/appsignal/integrations/http.rb +43 -1
  42. data/lib/appsignal/integrations/mongo_ruby_driver.rb +73 -4
  43. data/lib/appsignal/integrations/net_http.rb +31 -2
  44. data/lib/appsignal/integrations/puma.rb +4 -1
  45. data/lib/appsignal/integrations/que.rb +256 -37
  46. data/lib/appsignal/integrations/railtie.rb +4 -1
  47. data/lib/appsignal/integrations/rake.rb +9 -3
  48. data/lib/appsignal/integrations/redis.rb +22 -1
  49. data/lib/appsignal/integrations/redis_client.rb +22 -1
  50. data/lib/appsignal/integrations/resque.rb +81 -11
  51. data/lib/appsignal/integrations/shoryuken.rb +159 -12
  52. data/lib/appsignal/integrations/sidekiq.rb +94 -16
  53. data/lib/appsignal/integrations/webmachine.rb +56 -5
  54. data/lib/appsignal/loaders/padrino.rb +2 -1
  55. data/lib/appsignal/logger/extension_backend.rb +24 -0
  56. data/lib/appsignal/logger/opentelemetry_backend.rb +66 -0
  57. data/lib/appsignal/logger.rb +13 -9
  58. data/lib/appsignal/metrics/extension_backend.rb +47 -0
  59. data/lib/appsignal/metrics/opentelemetry_backend.rb +89 -0
  60. data/lib/appsignal/opentelemetry/attributes.rb +31 -0
  61. data/lib/appsignal/opentelemetry/dependencies.rb +35 -0
  62. data/lib/appsignal/opentelemetry/error_type.rb +37 -0
  63. data/lib/appsignal/opentelemetry/http_client_request.rb +83 -0
  64. data/lib/appsignal/opentelemetry/http_method.rb +59 -0
  65. data/lib/appsignal/opentelemetry/http_response.rb +30 -0
  66. data/lib/appsignal/opentelemetry/http_server_request.rb +79 -0
  67. data/lib/appsignal/opentelemetry/messaging.rb +82 -0
  68. data/lib/appsignal/opentelemetry/proxied_exporter.rb +83 -0
  69. data/lib/appsignal/opentelemetry/rendering.rb +29 -0
  70. data/lib/appsignal/opentelemetry/sql_db_system.rb +89 -0
  71. data/lib/appsignal/opentelemetry.rb +495 -0
  72. data/lib/appsignal/rack/abstract_middleware.rb +66 -4
  73. data/lib/appsignal/rack/body_wrapper.rb +18 -5
  74. data/lib/appsignal/rack/event_handler.rb +44 -4
  75. data/lib/appsignal/rack/grape_middleware.rb +1 -0
  76. data/lib/appsignal/rack/hanami_middleware.rb +2 -1
  77. data/lib/appsignal/rack/instrumentation_middleware.rb +1 -0
  78. data/lib/appsignal/rack/rails_instrumentation.rb +1 -0
  79. data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -0
  80. data/lib/appsignal/rack.rb +68 -12
  81. data/lib/appsignal/sample_data.rb +4 -0
  82. data/lib/appsignal/transaction/base_backend.rb +128 -0
  83. data/lib/appsignal/transaction/extension_backend.rb +229 -0
  84. data/lib/appsignal/transaction/opentelemetry_backend.rb +847 -0
  85. data/lib/appsignal/transaction.rb +714 -164
  86. data/lib/appsignal/utils/request_headers.rb +78 -0
  87. data/lib/appsignal/utils/stdout_and_logger_message.rb +9 -0
  88. data/lib/appsignal/utils.rb +1 -0
  89. data/lib/appsignal/version.rb +1 -1
  90. data/lib/appsignal.rb +10 -0
  91. data/sig/appsignal.rbi +630 -37
  92. data/sig/appsignal.rbs +582 -27
  93. metadata +25 -1
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ module Utils
5
+ class RequestHeaders
6
+ # The only two request headers Rack passes without the `HTTP_` prefix,
7
+ # because CGI reserves the prefixed spelling of them.
8
+ UNPREFIXED_HEADER_KEYS = %w[CONTENT_LENGTH CONTENT_TYPE].freeze
9
+
10
+ # `HTTP_VERSION` is a CGI variable holding the same value as
11
+ # `SERVER_PROTOCOL`, not a header.
12
+ NON_HEADER_KEYS = %w[HTTP_VERSION].freeze
13
+
14
+ # The environment keys the instrumentation already describes with a semantic
15
+ # convention attribute, read from the request itself.
16
+ TRANSLATED_ENV_KEYS = %w[
17
+ PATH_INFO REQUEST_METHOD REQUEST_PATH SERVER_NAME SERVER_PORT
18
+ SERVER_PROTOCOL
19
+ ].freeze
20
+
21
+ HTTP_PREFIX = "HTTP_"
22
+
23
+ class << self
24
+ def split(env)
25
+ return [{}, env] unless env.is_a?(Hash)
26
+
27
+ headers = {}
28
+ environment = {}
29
+
30
+ env.each do |key, value|
31
+ name = header_name(key)
32
+ if name
33
+ headers[name] = value
34
+ else
35
+ environment[key] = value
36
+ end
37
+ end
38
+
39
+ [headers, environment]
40
+ end
41
+
42
+ def split_lazily(&block)
43
+ split = nil
44
+ splitter = lambda { split ||= split(block.call) }
45
+
46
+ [lambda { splitter.call.first }, lambda { splitter.call.last }]
47
+ end
48
+
49
+ def header_name(env_key)
50
+ env_key = env_key.to_s
51
+ return if NON_HEADER_KEYS.include?(env_key)
52
+
53
+ if env_key.start_with?(HTTP_PREFIX)
54
+ normalize(env_key.delete_prefix(HTTP_PREFIX))
55
+ elsif UNPREFIXED_HEADER_KEYS.include?(env_key)
56
+ normalize(env_key)
57
+ end
58
+ end
59
+
60
+ # A key does not always make the round trip as itself, because two Rack keys
61
+ # can name the same header: a server that sets both `CONTENT_LENGTH` and
62
+ # `HTTP_CONTENT_LENGTH` gets the second one back as the first.
63
+ def rack_name(header)
64
+ env_key = header.to_s.upcase.tr("-", "_")
65
+ return env_key if UNPREFIXED_HEADER_KEYS.include?(env_key)
66
+
67
+ "#{HTTP_PREFIX}#{env_key}"
68
+ end
69
+
70
+ # Several OpenTelemetry SDKs write header attribute names with underscores,
71
+ # where the semantic conventions the collector compares against use dashes.
72
+ def normalize(name)
73
+ name.to_s.downcase.tr("_", "-")
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -8,9 +8,18 @@ module Appsignal
8
8
  logger.warn message
9
9
  end
10
10
 
11
+ def self.error(message, logger = Appsignal.internal_logger)
12
+ Kernel.warn "appsignal ERROR: #{message}"
13
+ logger.error message
14
+ end
15
+
11
16
  def stdout_and_logger_warning(message, logger = Appsignal.internal_logger)
12
17
  Appsignal::Utils::StdoutAndLoggerMessage.warning(message, logger)
13
18
  end
19
+
20
+ def stdout_and_logger_error(message, logger = Appsignal.internal_logger)
21
+ Appsignal::Utils::StdoutAndLoggerMessage.error(message, logger)
22
+ end
14
23
  end
15
24
  end
16
25
  end
@@ -10,6 +10,7 @@ require "appsignal/utils/integration_memory_logger"
10
10
  require "appsignal/utils/stdout_and_logger_message"
11
11
  require "appsignal/utils/data"
12
12
  require "appsignal/utils/sample_data_sanitizer"
13
+ require "appsignal/utils/request_headers"
13
14
  require "appsignal/utils/integration_logger"
14
15
  require "appsignal/utils/json"
15
16
  require "appsignal/utils/ndjson"
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Appsignal
4
4
  # @return [String]
5
- VERSION = "4.10.4"
5
+ VERSION = "5.0.0"
6
6
  end
data/lib/appsignal.rb CHANGED
@@ -2,12 +2,15 @@
2
2
 
3
3
  require "json"
4
4
  require "securerandom"
5
+ require "set"
5
6
  require "stringio"
6
7
 
7
8
  require "appsignal/logger"
8
9
  require "appsignal/utils/stdout_and_logger_message"
9
10
  require "appsignal/helpers/instrumentation"
10
11
  require "appsignal/helpers/metrics"
12
+ require "appsignal/backends"
13
+ require "appsignal/opentelemetry"
11
14
 
12
15
  # AppSignal for Ruby gem's main module.
13
16
  #
@@ -143,6 +146,8 @@ module Appsignal
143
146
  Appsignal::Hooks.load_hooks
144
147
  Appsignal::Loaders.start
145
148
 
149
+ Appsignal::OpenTelemetry.configure(config) if config.collector_mode_configured?
150
+
146
151
  if config[:enable_allocation_tracking] && !Appsignal::System.jruby?
147
152
  Appsignal::Extension.install_allocation_event_hook
148
153
  Appsignal::Environment.report_enabled("allocation_tracking")
@@ -241,6 +246,10 @@ module Appsignal
241
246
  # @return [void]
242
247
  # @since 1.0.0
243
248
  def stop(called_by = nil)
249
+ # Wrapped in `Thread.new ... .join` so this is safe to call from a
250
+ # `Signal.trap` block: `Mutex#synchronize` (used by
251
+ # `CheckIn::Scheduler`) is unsafe in trap handlers, and running on a
252
+ # separate thread sidesteps that restriction. See PR #1295.
244
253
  Thread.new do
245
254
  if called_by
246
255
  internal_logger.info("Stopping AppSignal (#{called_by})")
@@ -250,6 +259,7 @@ module Appsignal
250
259
  Appsignal::Extension.stop
251
260
  Appsignal::Probes.stop
252
261
  Appsignal::CheckIn.stop
262
+ Appsignal::OpenTelemetry.shutdown
253
263
  end.join
254
264
  nil
255
265
  end