atatus 1.6.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile +49 -13
- data/LICENSE +1 -1
- data/atatus.gemspec +3 -3
- data/lib/atatus/agent.rb +18 -7
- data/lib/atatus/central_config.rb +19 -8
- data/lib/atatus/collector/base.rb +113 -1
- data/lib/atatus/collector/builder.rb +8 -0
- data/lib/atatus/collector/layer.rb +1 -1
- data/lib/atatus/collector/transport.rb +23 -2
- 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 +94 -70
- data/lib/atatus/context/company.rb +38 -0
- data/lib/atatus/context/request/socket.rb +1 -2
- data/lib/atatus/context/response.rb +1 -3
- data/lib/atatus/context.rb +4 -8
- 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 +38 -24
- 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 +32 -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 +50 -40
- 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 +25 -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 +48 -5
- metadata +41 -11
data/lib/atatus/metrics.rb
CHANGED
@@ -28,42 +28,35 @@ module Atatus
|
|
28
28
|
@platform ||= Gem::Platform.local.os.to_sym
|
29
29
|
end
|
30
30
|
|
31
|
+
def self.os
|
32
|
+
@os ||= RbConfig::CONFIG.fetch('host_os', 'unknown').to_sym
|
33
|
+
end
|
34
|
+
|
31
35
|
# @api private
|
32
36
|
class Registry
|
33
37
|
include Logging
|
34
38
|
|
35
|
-
TIMEOUT_INTERVAL = 5 # seconds
|
36
|
-
|
37
39
|
def initialize(config, &block)
|
38
40
|
@config = config
|
39
41
|
@callback = block
|
42
|
+
@sets = nil
|
40
43
|
end
|
41
44
|
|
42
45
|
attr_reader :config, :sets, :callback
|
46
|
+
|
43
47
|
def start
|
44
48
|
unless config.collect_metrics?
|
45
49
|
debug 'Skipping metrics'
|
46
50
|
return
|
47
51
|
end
|
48
52
|
|
49
|
-
|
53
|
+
define_sets
|
50
54
|
|
51
|
-
|
52
|
-
# and start again.
|
53
|
-
@sets ||= {
|
54
|
-
system: CpuMemSet,
|
55
|
-
# vm: VMSet,
|
56
|
-
breakdown: BreakdownSet,
|
57
|
-
transaction: TransactionSet
|
58
|
-
}.each_with_object({}) do |(key, kls), sets|
|
59
|
-
debug "Adding metrics collector '#{kls}'"
|
60
|
-
sets[key] = kls.new(config)
|
61
|
-
end
|
55
|
+
debug 'Starting metrics'
|
62
56
|
|
63
57
|
@timer_task = Concurrent::TimerTask.execute(
|
64
58
|
run_now: true,
|
65
|
-
execution_interval: config.metrics_interval
|
66
|
-
timeout_interval: TIMEOUT_INTERVAL
|
59
|
+
execution_interval: config.metrics_interval
|
67
60
|
) do
|
68
61
|
begin
|
69
62
|
debug 'Collecting metrics'
|
@@ -124,6 +117,28 @@ module Atatus
|
|
124
117
|
arr.concat(samples)
|
125
118
|
end
|
126
119
|
end
|
120
|
+
|
121
|
+
def define_sets
|
122
|
+
# Only set the @sets once, in case we stop
|
123
|
+
# and start again.
|
124
|
+
return unless @sets.nil?
|
125
|
+
|
126
|
+
sets = {
|
127
|
+
system: CpuMemSet,
|
128
|
+
vm: VMSet,
|
129
|
+
breakdown: BreakdownSet,
|
130
|
+
transaction: TransactionSet
|
131
|
+
}
|
132
|
+
if defined?(JVMSet)
|
133
|
+
debug "Enabling JVM metrics collection"
|
134
|
+
sets[:jvm] = JVMSet
|
135
|
+
end
|
136
|
+
|
137
|
+
@sets = sets.each_with_object({}) do |(key, kls), _sets_|
|
138
|
+
debug "Adding metrics collector '#{kls}'"
|
139
|
+
_sets_[key] = kls.new(config)
|
140
|
+
end
|
141
|
+
end
|
127
142
|
end
|
128
143
|
end
|
129
144
|
end
|
@@ -135,6 +150,7 @@ require 'atatus/metrics/set'
|
|
135
150
|
|
136
151
|
require 'atatus/metrics/cpu_mem_set'
|
137
152
|
require 'atatus/metrics/vm_set'
|
153
|
+
require 'atatus/metrics/jvm_set' if defined?(JRUBY_VERSION)
|
138
154
|
require 'atatus/metrics/span_scoped_set'
|
139
155
|
require 'atatus/metrics/transaction_set'
|
140
156
|
require 'atatus/metrics/breakdown_set'
|
data/lib/atatus/middleware.rb
CHANGED
@@ -41,9 +41,14 @@ module Atatus
|
|
41
41
|
Atatus.report(e, context: context, handled: false)
|
42
42
|
raise
|
43
43
|
ensure
|
44
|
-
if
|
45
|
-
|
46
|
-
|
44
|
+
if transaction
|
45
|
+
if resp
|
46
|
+
status, headers, _body = resp
|
47
|
+
transaction.add_response(status, headers: headers.dup)
|
48
|
+
transaction&.outcome = Transaction::Outcome.from_http_status(status)
|
49
|
+
else
|
50
|
+
transaction&.outcome = Transaction::Outcome::FAILURE
|
51
|
+
end
|
47
52
|
end
|
48
53
|
|
49
54
|
Atatus.end_transaction http_result(status)
|
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
# frozen_string_literal: true
|
19
19
|
|
20
|
-
require 'atatus/sql'
|
20
|
+
require 'atatus/sql/signature'
|
21
21
|
|
22
22
|
module Atatus
|
23
23
|
module Normalizers
|
@@ -34,7 +34,7 @@ module Atatus
|
|
34
34
|
def initialize(*args)
|
35
35
|
super
|
36
36
|
|
37
|
-
@summarizer = Sql.
|
37
|
+
@summarizer = Sql::Signature::Summarizer.new
|
38
38
|
|
39
39
|
@adapters = {}
|
40
40
|
end
|
@@ -48,7 +48,7 @@ module Atatus
|
|
48
48
|
context =
|
49
49
|
Span::Context.new(
|
50
50
|
db: { statement: payload[:sql], type: 'sql' },
|
51
|
-
destination: { name: subtype, resource: subtype, type: TYPE }
|
51
|
+
destination: { service: { name: subtype, resource: subtype, type: TYPE } }
|
52
52
|
)
|
53
53
|
|
54
54
|
[name, TYPE, subtype, ACTION, context]
|
@@ -57,10 +57,21 @@ module Atatus
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def subtype_for(payload)
|
60
|
-
|
61
|
-
payload[:connection]
|
62
|
-
|
63
|
-
|
60
|
+
if payload[:connection]
|
61
|
+
return cached_adapter_name(payload[:connection].adapter_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
if can_attempt_connection_id_lookup?(payload)
|
65
|
+
begin
|
66
|
+
loaded_object = ObjectSpace._id2ref(payload[:connection_id])
|
67
|
+
if loaded_object.respond_to?(:adapter_name)
|
68
|
+
return cached_adapter_name(loaded_object.adapter_name)
|
69
|
+
end
|
70
|
+
rescue RangeError # if connection object has somehow been garbage collected
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
cached_adapter_name(::ActiveRecord::Base.connection_config[:adapter])
|
64
75
|
end
|
65
76
|
|
66
77
|
def summarize(sql)
|
@@ -69,11 +80,18 @@ module Atatus
|
|
69
80
|
|
70
81
|
def cached_adapter_name(adapter_name)
|
71
82
|
return UNKNOWN if adapter_name.nil? || adapter_name.empty?
|
83
|
+
|
72
84
|
@adapters[adapter_name] ||
|
73
85
|
(@adapters[adapter_name] = adapter_name.downcase)
|
74
86
|
rescue StandardError
|
75
87
|
nil
|
76
88
|
end
|
89
|
+
|
90
|
+
def can_attempt_connection_id_lookup?(payload)
|
91
|
+
RUBY_ENGINE == "ruby" &&
|
92
|
+
payload[:connection_id] &&
|
93
|
+
ObjectSpace.respond_to?(:_id2ref)
|
94
|
+
end
|
77
95
|
end
|
78
96
|
end
|
79
97
|
end
|
data/lib/atatus/normalizers.rb
CHANGED
@@ -39,8 +39,8 @@ module Atatus # :nodoc:
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.build(config)
|
42
|
-
normalizers = @registered.
|
43
|
-
|
42
|
+
normalizers = @registered.transform_values do |klass|
|
43
|
+
klass.new(config)
|
44
44
|
end
|
45
45
|
|
46
46
|
Collection.new(normalizers)
|
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
|
|