atatus 1.7.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile +49 -13
- data/LICENSE +1 -1
- data/atatus.gemspec +3 -3
- data/lib/atatus/agent.rb +10 -7
- data/lib/atatus/central_config.rb +19 -8
- data/lib/atatus/collector/layer.rb +1 -1
- data/lib/atatus/{sql_summarizer.rb → config/log_level_map.rb} +22 -28
- data/lib/atatus/config/options.rb +2 -1
- data/lib/atatus/config/regexp_list.rb +1 -1
- data/lib/atatus/config/round_float.rb +31 -0
- data/lib/atatus/config/server_info.rb +50 -0
- data/lib/atatus/config/wildcard_pattern_list.rb +3 -1
- data/lib/atatus/config.rb +92 -71
- data/lib/atatus/context/request/socket.rb +1 -2
- data/lib/atatus/context/response.rb +1 -3
- data/lib/atatus/context.rb +3 -10
- data/lib/atatus/context_builder.rb +3 -3
- data/lib/atatus/error.rb +2 -1
- data/lib/atatus/error_builder.rb +1 -1
- data/lib/atatus/fields.rb +98 -0
- data/lib/atatus/graphql.rb +2 -0
- data/lib/atatus/grpc.rb +5 -7
- data/lib/atatus/instrumenter.rb +29 -25
- data/lib/atatus/metadata/cloud_info.rb +156 -0
- data/lib/atatus/metadata/service_info.rb +3 -3
- data/lib/atatus/metadata/system_info/container_info.rb +20 -8
- data/lib/atatus/metadata/system_info.rb +20 -5
- data/lib/atatus/metadata.rb +3 -1
- data/lib/atatus/metrics/cpu_mem_set.rb +10 -38
- data/lib/atatus/metrics/jvm_set.rb +88 -0
- data/lib/atatus/metrics/metric.rb +2 -0
- data/lib/atatus/metrics.rb +33 -16
- data/lib/atatus/middleware.rb +8 -3
- data/lib/atatus/naively_hashable.rb +1 -0
- data/lib/atatus/normalizers/rails/active_record.rb +25 -7
- data/lib/atatus/normalizers.rb +2 -2
- data/lib/atatus/opentracing.rb +5 -3
- data/lib/atatus/rails.rb +1 -1
- data/lib/atatus/span/context/db.rb +1 -1
- data/lib/atatus/span/context/destination.rb +58 -32
- data/lib/atatus/span/context/http.rb +2 -0
- data/lib/atatus/span/context/links.rb +32 -0
- data/lib/atatus/{sql.rb → span/context/message.rb} +16 -12
- data/lib/atatus/span/context/service.rb +55 -0
- data/lib/atatus/span/context.rb +28 -3
- data/lib/atatus/span.rb +35 -5
- data/lib/atatus/span_helpers.rb +12 -23
- data/lib/atatus/spies/action_dispatch.rb +10 -13
- data/lib/atatus/spies/azure_storage_table.rb +148 -0
- data/lib/atatus/spies/delayed_job.rb +19 -13
- data/lib/atatus/spies/dynamo_db.rb +56 -15
- data/lib/atatus/spies/elasticsearch.rb +54 -39
- data/lib/atatus/spies/faraday.rb +92 -58
- data/lib/atatus/spies/http.rb +33 -37
- data/lib/atatus/spies/json.rb +5 -9
- data/lib/atatus/spies/mongo.rb +26 -19
- data/lib/atatus/spies/net_http.rb +53 -51
- data/lib/atatus/spies/racecar.rb +77 -0
- data/lib/atatus/spies/rake.rb +27 -27
- data/lib/atatus/spies/redis.rb +11 -12
- data/lib/atatus/spies/resque.rb +18 -23
- data/lib/atatus/spies/s3.rb +132 -0
- data/lib/atatus/spies/sequel.rb +11 -2
- data/lib/atatus/spies/shoryuken.rb +4 -6
- data/lib/atatus/spies/sidekiq.rb +23 -31
- data/lib/atatus/spies/sinatra.rb +20 -28
- data/lib/atatus/spies/sneakers.rb +2 -0
- data/lib/atatus/spies/sns.rb +126 -0
- data/lib/atatus/spies/sqs.rb +231 -0
- data/lib/atatus/spies/sucker_punch.rb +20 -22
- data/lib/atatus/spies/tilt.rb +10 -13
- data/lib/atatus/spies.rb +20 -0
- data/lib/atatus/sql/signature.rb +4 -2
- data/lib/atatus/sql/tokenizer.rb +23 -7
- data/lib/atatus/stacktrace/frame.rb +1 -0
- data/lib/atatus/stacktrace_builder.rb +12 -16
- data/lib/atatus/subscriber.rb +1 -0
- data/lib/atatus/trace_context/traceparent.rb +5 -8
- data/lib/atatus/trace_context/tracestate.rb +16 -14
- data/lib/atatus/trace_context.rb +6 -16
- data/lib/atatus/transaction.rb +17 -4
- data/lib/atatus/transport/base.rb +1 -3
- data/lib/atatus/transport/connection/http.rb +11 -3
- data/lib/atatus/transport/connection/proxy_pipe.rb +1 -2
- data/lib/atatus/transport/connection.rb +3 -2
- data/lib/atatus/transport/filters/hash_sanitizer.rb +16 -34
- data/lib/atatus/transport/filters/secrets_filter.rb +35 -12
- data/lib/atatus/transport/serializers/context_serializer.rb +1 -2
- data/lib/atatus/transport/serializers/metadata_serializer.rb +54 -8
- data/lib/atatus/transport/serializers/metricset_serializer.rb +2 -2
- data/lib/atatus/transport/serializers/span_serializer.rb +55 -9
- data/lib/atatus/transport/serializers/transaction_serializer.rb +1 -0
- data/lib/atatus/transport/serializers.rb +9 -6
- data/lib/atatus/transport/user_agent.rb +16 -9
- data/lib/atatus/transport/worker.rb +2 -1
- data/lib/atatus/util/deep_dup.rb +65 -0
- data/lib/atatus/util/precision_validator.rb +46 -0
- data/lib/atatus/util.rb +2 -0
- data/lib/atatus/version.rb +1 -1
- data/lib/atatus.rb +32 -5
- metadata +40 -11
data/lib/atatus/opentracing.rb
CHANGED
@@ -123,13 +123,15 @@ module Atatus
|
|
123
123
|
end
|
124
124
|
|
125
125
|
attr_accessor :trace_context
|
126
|
+
|
126
127
|
def_delegators :trace_context, :trace_id, :id, :parent_id
|
127
128
|
|
128
129
|
def self.from_header(header)
|
129
130
|
return unless header
|
130
131
|
|
131
|
-
trace_context =
|
132
|
-
|
132
|
+
trace_context = TraceContext.new(
|
133
|
+
traceparent: TraceContext::Traceparent.parse(header)
|
134
|
+
)
|
133
135
|
|
134
136
|
trace_context.traceparent.id = trace_context.parent_id
|
135
137
|
trace_context.traceparent.parent_id = nil
|
@@ -345,7 +347,7 @@ module Atatus
|
|
345
347
|
context = context_from_child_of(child_of) ||
|
346
348
|
context_from_references(references) ||
|
347
349
|
context_from_active_scope(ignore_active_scope)
|
348
|
-
return context.child if context
|
350
|
+
return context.child if context.respond_to?(:child)
|
349
351
|
|
350
352
|
context
|
351
353
|
end
|
data/lib/atatus/rails.rb
CHANGED
@@ -51,7 +51,7 @@ module Atatus
|
|
51
51
|
rescue StandardError => e
|
52
52
|
if config.disable_start_message?
|
53
53
|
config.logger.error format('Failed to start: %s', e.message)
|
54
|
-
config.logger.
|
54
|
+
config.logger.debug "Backtrace:\n" + e.backtrace.join("\n")
|
55
55
|
else
|
56
56
|
puts format('Failed to start: %s', e.message)
|
57
57
|
puts "Backtrace:\n" + e.backtrace.join("\n")
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# KIND, either express or implied. See the License for the
|
15
15
|
# specific language governing permissions and limitations
|
16
16
|
# under the License.
|
17
|
-
|
17
|
+
#
|
18
18
|
# frozen_string_literal: true
|
19
19
|
|
20
20
|
module Atatus
|
@@ -22,47 +22,53 @@ module Atatus
|
|
22
22
|
class Context
|
23
23
|
# @api private
|
24
24
|
class Destination
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
25
|
+
include Fields
|
26
|
+
|
27
|
+
field :address
|
28
|
+
field :port
|
29
|
+
field :service
|
30
|
+
field :cloud
|
31
|
+
|
32
|
+
# @api private
|
33
|
+
class Service
|
34
|
+
include Fields
|
35
|
+
|
36
|
+
field :name, default: ''
|
37
|
+
field :type, default: ''
|
38
|
+
field :resource
|
39
|
+
end
|
40
|
+
|
41
|
+
# @api private
|
42
|
+
class Cloud
|
43
|
+
include Fields
|
44
|
+
|
45
|
+
field :region
|
37
46
|
end
|
38
47
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
)
|
48
|
+
def initialize(service: nil, cloud: nil, **attrs)
|
49
|
+
super(**attrs)
|
50
|
+
|
51
|
+
self.service = build_service(service)
|
52
|
+
self.cloud = build_cloud(cloud)
|
53
|
+
end
|
46
54
|
|
47
|
-
def self.from_uri(uri_or_str, type:
|
55
|
+
def self.from_uri(uri_or_str, type: nil, **attrs)
|
48
56
|
uri = normalize(uri_or_str)
|
49
57
|
|
58
|
+
service =
|
59
|
+
case type
|
60
|
+
when 'http' then http_service(uri)
|
61
|
+
else nil
|
62
|
+
end
|
63
|
+
|
50
64
|
new(
|
51
|
-
name: only_scheme_and_host(uri),
|
52
|
-
resource: "#{uri.host}:#{uri.port}",
|
53
|
-
type: type,
|
54
65
|
address: uri.hostname,
|
55
|
-
port:
|
66
|
+
port: uri.port,
|
67
|
+
service: service,
|
68
|
+
**attrs
|
56
69
|
)
|
57
70
|
end
|
58
71
|
|
59
|
-
def self.only_scheme_and_host(uri_or_str)
|
60
|
-
uri = normalize(uri_or_str)
|
61
|
-
uri.path = ''
|
62
|
-
uri.password = uri.query = uri.fragment = nil
|
63
|
-
uri.to_s
|
64
|
-
end
|
65
|
-
|
66
72
|
class << self
|
67
73
|
private
|
68
74
|
|
@@ -70,6 +76,26 @@ module Atatus
|
|
70
76
|
return uri_or_str.dup if uri_or_str.is_a?(URI)
|
71
77
|
URI(uri_or_str)
|
72
78
|
end
|
79
|
+
|
80
|
+
def http_service(uri)
|
81
|
+
Service.new(resource: "#{uri.host}:#{uri.port}")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def build_cloud(cloud = nil)
|
88
|
+
return Cloud.new unless cloud
|
89
|
+
return cloud if cloud.is_a?(Cloud)
|
90
|
+
|
91
|
+
Cloud.new(**cloud)
|
92
|
+
end
|
93
|
+
|
94
|
+
def build_service(service = nil)
|
95
|
+
return Service.new unless service
|
96
|
+
return service if service.is_a?(Service)
|
97
|
+
|
98
|
+
Service.new(**service)
|
73
99
|
end
|
74
100
|
end
|
75
101
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Licensed to Elasticsearch B.V. under one or more contributor
|
2
|
+
# license agreements. See the NOTICE file distributed with
|
3
|
+
# this work for additional information regarding copyright
|
4
|
+
# ownership. Elasticsearch B.V. licenses this file to you under
|
5
|
+
# the Apache License, Version 2.0 (the "License"); you may
|
6
|
+
# not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
# frozen_string_literal: true
|
19
|
+
|
20
|
+
module Atatus
|
21
|
+
class Span
|
22
|
+
class Context
|
23
|
+
# @api private
|
24
|
+
class Links < Array
|
25
|
+
# @api private
|
26
|
+
class Link < Struct.new(:trace_id, :span_id)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -18,19 +18,23 @@
|
|
18
18
|
# frozen_string_literal: true
|
19
19
|
|
20
20
|
module Atatus
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
require 'atatus/sql/signature'
|
32
|
-
Sql::Signature::Summarizer.new
|
21
|
+
class Span
|
22
|
+
class Context
|
23
|
+
# @api private
|
24
|
+
class Message
|
25
|
+
def initialize(
|
26
|
+
queue_name: nil,
|
27
|
+
age_ms: nil
|
28
|
+
)
|
29
|
+
@queue_name = queue_name
|
30
|
+
@age_ms = age_ms
|
33
31
|
end
|
32
|
+
|
33
|
+
attr_reader(
|
34
|
+
:queue_name,
|
35
|
+
:age_ms
|
36
|
+
)
|
37
|
+
end
|
34
38
|
end
|
35
39
|
end
|
36
40
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Licensed to Elasticsearch B.V. under one or more contributor
|
2
|
+
# license agreements. See the NOTICE file distributed with
|
3
|
+
# this work for additional information regarding copyright
|
4
|
+
# ownership. Elasticsearch B.V. licenses this file to you under
|
5
|
+
# the Apache License, Version 2.0 (the "License"); you may
|
6
|
+
# not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
# frozen_string_literal: true
|
19
|
+
|
20
|
+
module Atatus
|
21
|
+
class Span
|
22
|
+
class Context
|
23
|
+
# @api private
|
24
|
+
class Service
|
25
|
+
include Fields
|
26
|
+
|
27
|
+
field :target
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
class Target
|
31
|
+
include Fields
|
32
|
+
|
33
|
+
field :name, default: ''
|
34
|
+
field :type, default: ''
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(target: nil, **attrs)
|
38
|
+
super(**attrs)
|
39
|
+
|
40
|
+
self.target = build_target(target)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def build_target(target = nil)
|
46
|
+
return Target.new unless target
|
47
|
+
return target if target.is_a?(Target)
|
48
|
+
|
49
|
+
Target.new(**target)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
data/lib/atatus/span/context.rb
CHANGED
@@ -26,7 +26,10 @@ module Atatus
|
|
26
26
|
destination: nil,
|
27
27
|
http: nil,
|
28
28
|
labels: {},
|
29
|
-
sync: nil
|
29
|
+
sync: nil,
|
30
|
+
message: nil,
|
31
|
+
service: nil,
|
32
|
+
links: nil
|
30
33
|
)
|
31
34
|
@sync = sync
|
32
35
|
@db = db && Db.new(**db)
|
@@ -36,16 +39,34 @@ module Atatus
|
|
36
39
|
when Destination then destination
|
37
40
|
when Hash then Destination.new(**destination)
|
38
41
|
end
|
42
|
+
@message =
|
43
|
+
case message
|
44
|
+
when Message then message
|
45
|
+
when Hash then Message.new(**message)
|
46
|
+
end
|
39
47
|
@labels = labels
|
48
|
+
@service =
|
49
|
+
case service
|
50
|
+
when Service then service
|
51
|
+
when Hash then Service.new(**service)
|
52
|
+
end
|
53
|
+
@links =
|
54
|
+
case links
|
55
|
+
when Links then links
|
56
|
+
when Array then Links.new(links)
|
57
|
+
end
|
40
58
|
end
|
41
59
|
|
42
60
|
attr_reader(
|
43
61
|
:db,
|
44
|
-
:destination,
|
45
62
|
:http,
|
46
63
|
:labels,
|
47
|
-
:sync
|
64
|
+
:sync,
|
65
|
+
:message,
|
66
|
+
:links
|
48
67
|
)
|
68
|
+
|
69
|
+
attr_accessor :destination, :service
|
49
70
|
end
|
50
71
|
end
|
51
72
|
end
|
@@ -53,3 +74,7 @@ end
|
|
53
74
|
require 'atatus/span/context/db'
|
54
75
|
require 'atatus/span/context/http'
|
55
76
|
require 'atatus/span/context/destination'
|
77
|
+
require 'atatus/span/context/message'
|
78
|
+
require 'atatus/span/context/service'
|
79
|
+
require 'atatus/span/context/links'
|
80
|
+
|
data/lib/atatus/span.rb
CHANGED
@@ -25,8 +25,18 @@ module Atatus
|
|
25
25
|
extend Forwardable
|
26
26
|
include ChildDurations::Methods
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
# @api private
|
29
|
+
class Outcome
|
30
|
+
FAILURE = "failure"
|
31
|
+
SUCCESS = "success"
|
32
|
+
UNKNOWN = "unknown"
|
33
|
+
|
34
|
+
def self.from_http_status(code)
|
35
|
+
code.to_i >= 400 ? FAILURE : SUCCESS
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
DEFAULT_TYPE = 'custom'
|
30
40
|
|
31
41
|
# rubocop:disable Metrics/ParameterLists
|
32
42
|
def initialize(
|
@@ -40,7 +50,7 @@ module Atatus
|
|
40
50
|
context: nil,
|
41
51
|
stacktrace_builder: nil,
|
42
52
|
sync: nil,
|
43
|
-
|
53
|
+
exit_span: false
|
44
54
|
)
|
45
55
|
@name = name
|
46
56
|
|
@@ -48,7 +58,7 @@ module Atatus
|
|
48
58
|
@type, @subtype, @action = type.split('.')
|
49
59
|
else
|
50
60
|
@type = type || DEFAULT_TYPE
|
51
|
-
@subtype = subtype
|
61
|
+
@subtype = subtype
|
52
62
|
@action = action
|
53
63
|
end
|
54
64
|
|
@@ -60,6 +70,8 @@ module Atatus
|
|
60
70
|
|
61
71
|
@context = context || Span::Context.new(sync: sync)
|
62
72
|
@stacktrace_builder = stacktrace_builder
|
73
|
+
|
74
|
+
@exit_span = exit_span
|
63
75
|
end
|
64
76
|
# rubocop:enable Metrics/ParameterLists
|
65
77
|
|
@@ -67,8 +79,10 @@ module Atatus
|
|
67
79
|
|
68
80
|
attr_accessor(
|
69
81
|
:action,
|
82
|
+
:exit_span,
|
70
83
|
:name,
|
71
84
|
:original_backtrace,
|
85
|
+
:outcome,
|
72
86
|
:subtype,
|
73
87
|
:trace_context,
|
74
88
|
:type
|
@@ -85,6 +99,8 @@ module Atatus
|
|
85
99
|
:transaction_id
|
86
100
|
)
|
87
101
|
|
102
|
+
alias :exit_span? :exit_span
|
103
|
+
|
88
104
|
# life cycle
|
89
105
|
|
90
106
|
def start(clock_start = Util.monotonic_micros)
|
@@ -98,6 +114,7 @@ module Atatus
|
|
98
114
|
@duration ||= (clock_end - @clock_start)
|
99
115
|
@parent.child_stopped
|
100
116
|
@self_time = @duration - child_durations.duration
|
117
|
+
|
101
118
|
self
|
102
119
|
end
|
103
120
|
|
@@ -123,12 +140,25 @@ module Atatus
|
|
123
140
|
started? && !stopped?
|
124
141
|
end
|
125
142
|
|
126
|
-
|
143
|
+
def set_destination(address: nil, port: nil, service: nil, cloud: nil)
|
144
|
+
context.destination = Span::Context::Destination.new(
|
145
|
+
address: address,
|
146
|
+
port: port,
|
147
|
+
service: service,
|
148
|
+
cloud: cloud
|
149
|
+
)
|
150
|
+
context.service = Span::Context::Service.new(
|
151
|
+
target: Span::Context::Service::Target.new(name: context.destination.service.name, type: context.destination.service.type )
|
152
|
+
)
|
153
|
+
end
|
127
154
|
|
128
155
|
def inspect
|
129
156
|
"<Atatus::Span id:#{trace_context&.id}" \
|
130
157
|
" name:#{name.inspect}" \
|
131
158
|
" type:#{type.inspect}" \
|
159
|
+
" subtype:#{subtype.inspect}" \
|
160
|
+
" action:#{action.inspect}" \
|
161
|
+
" exit_span:#{exit_span.inspect}" \
|
132
162
|
'>'
|
133
163
|
end
|
134
164
|
|
data/lib/atatus/span_helpers.rb
CHANGED
@@ -22,42 +22,31 @@ module Atatus
|
|
22
22
|
module SpanHelpers
|
23
23
|
# @api private
|
24
24
|
module ClassMethods
|
25
|
-
def span_class_method(method, name = nil, type = nil,
|
26
|
-
__span_method_on(singleton_class, method, name, type,
|
25
|
+
def span_class_method(method, name = nil, type = nil, **kwargs)
|
26
|
+
__span_method_on(singleton_class, method, name, type, **kwargs)
|
27
27
|
end
|
28
28
|
|
29
|
-
def span_method(method, name = nil, type = nil,
|
30
|
-
__span_method_on(self, method, name, type,
|
31
|
-
end
|
32
|
-
|
33
|
-
def instrument_class_method(method, name = nil, type = nil, subtype = nil)
|
34
|
-
__span_method_on(singleton_class, method, name, type, subtype)
|
35
|
-
end
|
36
|
-
|
37
|
-
def instrument_method(method, name = nil, type = nil, subtype = nil)
|
38
|
-
__span_method_on(self, method, name, type, subtype)
|
29
|
+
def span_method(method, name = nil, type = nil, **kwargs)
|
30
|
+
__span_method_on(self, method, name, type, **kwargs)
|
39
31
|
end
|
40
32
|
|
41
33
|
private
|
42
34
|
|
43
|
-
def __span_method_on(klass, method, name = nil, type = nil,
|
35
|
+
def __span_method_on(klass, method, name = nil, type = nil, **kwargs)
|
44
36
|
name ||= method.to_s
|
45
37
|
type ||= Span::DEFAULT_TYPE
|
46
|
-
subtype ||= Span::DEFAULT_SUBTYPE
|
47
|
-
|
48
|
-
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
49
|
-
alias :"__without_apm_#{method}" :"#{method}"
|
50
38
|
|
51
|
-
|
39
|
+
klass.prepend(Module.new do
|
40
|
+
ruby2_keywords(define_method(method) do |*args, &block|
|
52
41
|
unless Atatus.current_transaction
|
53
|
-
return
|
42
|
+
return super(*args, &block)
|
54
43
|
end
|
55
44
|
|
56
|
-
Atatus.with_span
|
57
|
-
|
45
|
+
Atatus.with_span name.to_s, type.to_s, **kwargs do
|
46
|
+
super(*args, &block)
|
58
47
|
end
|
59
|
-
end
|
60
|
-
|
48
|
+
end)
|
49
|
+
end)
|
61
50
|
end
|
62
51
|
end
|
63
52
|
|
@@ -22,22 +22,19 @@ module Atatus
|
|
22
22
|
module Spies
|
23
23
|
# @api private
|
24
24
|
class ActionDispatchSpy
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def render_exception(env, exception)
|
32
|
-
context = Atatus.build_context(rack_env: env, for_type: :error)
|
33
|
-
Atatus.report(exception, context: context, handled: false)
|
34
|
-
|
35
|
-
render_exception_without_apm env, exception
|
36
|
-
end
|
37
|
-
end
|
25
|
+
# @api private
|
26
|
+
module Ext
|
27
|
+
def render_exception(env, exception)
|
28
|
+
context = Atatus.build_context(rack_env: env, for_type: :error)
|
29
|
+
Atatus.report(exception, context: context, handled: false)
|
38
30
|
|
31
|
+
super(env, exception)
|
39
32
|
end
|
40
33
|
end
|
34
|
+
|
35
|
+
def install
|
36
|
+
::ActionDispatch::ShowExceptions.prepend(Ext)
|
37
|
+
end
|
41
38
|
end
|
42
39
|
|
43
40
|
register(
|