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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +108 -0
- data/Rakefile +195 -4
- data/appsignal.gemspec +8 -0
- data/build_matrix.yml +12 -0
- data/ext/appsignal_extension.c +14 -0
- data/lib/appsignal/backends.rb +55 -0
- data/lib/appsignal/cli/diagnose.rb +2 -10
- data/lib/appsignal/config.rb +377 -13
- data/lib/appsignal/demo.rb +12 -10
- data/lib/appsignal/event_formatter/action_view/render_formatter.rb +34 -22
- data/lib/appsignal/event_formatter/active_job/perform_formatter.rb +35 -0
- data/lib/appsignal/event_formatter/active_record/sql_formatter.rb +19 -0
- data/lib/appsignal/event_formatter/elastic_search/search_formatter.rb +27 -0
- data/lib/appsignal/event_formatter/recorded_elsewhere.rb +17 -0
- data/lib/appsignal/event_formatter/rom/sql_formatter.rb +24 -0
- data/lib/appsignal/event_formatter/sequel/sql_formatter.rb +5 -0
- data/lib/appsignal/event_formatter/view_component/render_formatter.rb +21 -10
- data/lib/appsignal/event_formatter.rb +78 -0
- data/lib/appsignal/extension.rb +4 -0
- data/lib/appsignal/helpers/instrumentation.rb +324 -20
- data/lib/appsignal/helpers/metrics.rb +3 -24
- data/lib/appsignal/hooks/action_cable.rb +26 -8
- data/lib/appsignal/hooks/active_job.rb +184 -47
- data/lib/appsignal/hooks/at_exit.rb +4 -1
- data/lib/appsignal/hooks/excon.rb +20 -0
- data/lib/appsignal/hooks/faraday.rb +16 -0
- data/lib/appsignal/hooks/http.rb +5 -0
- data/lib/appsignal/hooks/resque.rb +1 -1
- data/lib/appsignal/hooks/sequel.rb +32 -2
- data/lib/appsignal/hooks/shoryuken.rb +3 -3
- data/lib/appsignal/hooks/sidekiq.rb +1 -1
- data/lib/appsignal/integrations/action_cable.rb +5 -2
- data/lib/appsignal/integrations/active_support_notifications.rb +59 -19
- data/lib/appsignal/integrations/data_mapper.rb +14 -2
- data/lib/appsignal/integrations/delayed_job_plugin.rb +81 -8
- data/lib/appsignal/integrations/dry_monitor.rb +39 -15
- data/lib/appsignal/integrations/excon/appsignal_middleware.rb +21 -0
- data/lib/appsignal/integrations/excon.rb +52 -15
- data/lib/appsignal/integrations/faraday.rb +47 -12
- data/lib/appsignal/integrations/http.rb +43 -1
- data/lib/appsignal/integrations/mongo_ruby_driver.rb +73 -4
- data/lib/appsignal/integrations/net_http.rb +31 -2
- data/lib/appsignal/integrations/puma.rb +4 -1
- data/lib/appsignal/integrations/que.rb +256 -37
- data/lib/appsignal/integrations/railtie.rb +4 -1
- data/lib/appsignal/integrations/rake.rb +9 -3
- data/lib/appsignal/integrations/redis.rb +22 -1
- data/lib/appsignal/integrations/redis_client.rb +22 -1
- data/lib/appsignal/integrations/resque.rb +81 -11
- data/lib/appsignal/integrations/shoryuken.rb +159 -12
- data/lib/appsignal/integrations/sidekiq.rb +94 -16
- data/lib/appsignal/integrations/webmachine.rb +56 -5
- data/lib/appsignal/loaders/padrino.rb +2 -1
- data/lib/appsignal/logger/extension_backend.rb +24 -0
- data/lib/appsignal/logger/opentelemetry_backend.rb +66 -0
- data/lib/appsignal/logger.rb +13 -9
- data/lib/appsignal/metrics/extension_backend.rb +47 -0
- data/lib/appsignal/metrics/opentelemetry_backend.rb +89 -0
- data/lib/appsignal/opentelemetry/attributes.rb +31 -0
- data/lib/appsignal/opentelemetry/dependencies.rb +35 -0
- data/lib/appsignal/opentelemetry/error_type.rb +37 -0
- data/lib/appsignal/opentelemetry/http_client_request.rb +83 -0
- data/lib/appsignal/opentelemetry/http_method.rb +59 -0
- data/lib/appsignal/opentelemetry/http_response.rb +30 -0
- data/lib/appsignal/opentelemetry/http_server_request.rb +79 -0
- data/lib/appsignal/opentelemetry/messaging.rb +82 -0
- data/lib/appsignal/opentelemetry/proxied_exporter.rb +83 -0
- data/lib/appsignal/opentelemetry/rendering.rb +29 -0
- data/lib/appsignal/opentelemetry/sql_db_system.rb +89 -0
- data/lib/appsignal/opentelemetry.rb +495 -0
- data/lib/appsignal/rack/abstract_middleware.rb +66 -4
- data/lib/appsignal/rack/body_wrapper.rb +18 -5
- data/lib/appsignal/rack/event_handler.rb +44 -4
- data/lib/appsignal/rack/grape_middleware.rb +1 -0
- data/lib/appsignal/rack/hanami_middleware.rb +2 -1
- data/lib/appsignal/rack/instrumentation_middleware.rb +1 -0
- data/lib/appsignal/rack/rails_instrumentation.rb +1 -0
- data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -0
- data/lib/appsignal/rack.rb +68 -12
- data/lib/appsignal/sample_data.rb +4 -0
- data/lib/appsignal/transaction/base_backend.rb +128 -0
- data/lib/appsignal/transaction/extension_backend.rb +229 -0
- data/lib/appsignal/transaction/opentelemetry_backend.rb +847 -0
- data/lib/appsignal/transaction.rb +714 -164
- data/lib/appsignal/utils/request_headers.rb +78 -0
- data/lib/appsignal/utils/stdout_and_logger_message.rb +9 -0
- data/lib/appsignal/utils.rb +1 -0
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +10 -0
- data/sig/appsignal.rbi +630 -37
- data/sig/appsignal.rbs +582 -27
- 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
|
data/lib/appsignal/utils.rb
CHANGED
|
@@ -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"
|
data/lib/appsignal/version.rb
CHANGED
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
|