epsagon 0.0.29 → 0.0.30
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/lib/epsagon.rb +25 -11
- data/lib/epsagon_constants.rb +1 -1
- data/lib/instrumentation/aws_sdk_plugin.rb +5 -5
- data/lib/instrumentation/epsagon_faraday_middleware.rb +2 -2
- data/lib/instrumentation/epsagon_resque_job.rb +2 -2
- data/lib/instrumentation/net_http.rb +2 -2
- data/lib/util.rb +24 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8ebb5eb2134eb62b3b83fa8cbb48b9c535cf528999c55ad1b58ed161b63cd97
|
4
|
+
data.tar.gz: 1e5ac5ea5ef2d6a3ba156b89061cca64bab22b90ce27b37e128a9b62c2633526
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34adf61a4771b2e61f916a79f3e038a1b23235214d13ec9771c33e3a1be34edc843c735f2ca2fd6d1a84fc895e9ffd7f6ec4b7674b1ace141b39f193e0d7b7b0
|
7
|
+
data.tar.gz: 289999c6c4d93c3521598fc0ac30eefd29f83e46f74079d1133b50d4a459c6f8e397f6fa1cf151492308d6089b9bfda9f9ed4279aab29c0e1de787aba26e4361
|
data/lib/epsagon.rb
CHANGED
@@ -26,8 +26,7 @@ Bundler.require
|
|
26
26
|
module Epsagon
|
27
27
|
DEFAULT_BACKEND = 'opentelemetry.tc.epsagon.com:443/traces'
|
28
28
|
DEFAULT_IGNORE_DOMAINS = ['newrelic.com'].freeze
|
29
|
-
MUTABLE_CONF_KEYS = Set.new([:metadata_only, :max_attribute_size, :ignore_domains])
|
30
|
-
|
29
|
+
MUTABLE_CONF_KEYS = Set.new([:metadata_only, :max_attribute_size, :ignore_domains, :ignored_keys])
|
31
30
|
|
32
31
|
@@epsagon_config = nil
|
33
32
|
|
@@ -43,16 +42,16 @@ module Epsagon
|
|
43
42
|
def validate(config)
|
44
43
|
Util.validate_value(config, :metadata_only, 'Must be a boolean') {|v| !!v == v}
|
45
44
|
Util.validate_value(config, :debug, 'Must be a boolean') {|v| !!v == v}
|
46
|
-
Util.validate_value(config, :token, 'Must be a valid Epsagon token') {|v| v.is_a? String
|
47
|
-
Util.validate_value(config, :app_name, 'Must be a String') {|v| v.is_a? String}
|
45
|
+
Util.validate_value(config, :token, 'Must be a valid Epsagon token') {|v| (v.is_a? String) && (v.size > 10) }
|
46
|
+
Util.validate_value(config, :app_name, 'Must be a String') {|v| (v.is_a? String) && (v.size > 0) }
|
48
47
|
Util.validate_value(config, :max_attribute_size, 'Must be an Integer') {|v| v.is_a? Integer}
|
49
48
|
Util.validate_value(config, :ignore_domains, 'Must be iterable') {|v| v.respond_to?(:each)}
|
50
|
-
Util.validate_value(config, :
|
49
|
+
Util.validate_value(config, :ignored_keys, 'Must be iterable') {|v| v.respond_to?(:each)}
|
51
50
|
end
|
52
51
|
|
53
52
|
def set_config(**args)
|
54
53
|
unless args.keys.all? {|a| MUTABLE_CONF_KEYS.include?(a)}
|
55
|
-
raise ArgumentError("only #{MUTABLE_CONF_KEYS.to_a} are mutable after `Epsagon.init`")
|
54
|
+
raise ArgumentError.new("only #{MUTABLE_CONF_KEYS.to_a} are mutable after `Epsagon.init`")
|
56
55
|
end
|
57
56
|
Epsagon.init unless @@initialized
|
58
57
|
new_conf = get_config.merge(args)
|
@@ -60,6 +59,14 @@ module Epsagon
|
|
60
59
|
@@epsagon_config = new_conf
|
61
60
|
end
|
62
61
|
|
62
|
+
def add_ignored_key(key)
|
63
|
+
get_config[:ignored_keys].push(key).uniq
|
64
|
+
end
|
65
|
+
|
66
|
+
def remove_ignored_key(key)
|
67
|
+
get_config[:ignored_keys].delete(key)
|
68
|
+
end
|
69
|
+
|
63
70
|
def get_config
|
64
71
|
@@epsagon_config ||= {
|
65
72
|
metadata_only: ENV['EPSAGON_METADATA']&.to_s&.downcase != 'false',
|
@@ -68,7 +75,8 @@ module Epsagon
|
|
68
75
|
app_name: ENV['EPSAGON_APP_NAME'] || '',
|
69
76
|
max_attribute_size: ENV['EPSAGON_MAX_ATTRIBUTE_SIZE'] || 5000,
|
70
77
|
backend: ENV['EPSAGON_BACKEND'] || DEFAULT_BACKEND,
|
71
|
-
ignore_domains: ENV['EPSAGON_IGNORE_DOMAINS'] || DEFAULT_IGNORE_DOMAINS
|
78
|
+
ignore_domains: ENV['EPSAGON_IGNORE_DOMAINS']&.split(',') || DEFAULT_IGNORE_DOMAINS,
|
79
|
+
ignored_keys: ENV['EPSAGON_IGNORED_KEYS']&.split(',') || []
|
72
80
|
}
|
73
81
|
end
|
74
82
|
|
@@ -135,10 +143,15 @@ module SpanExtension
|
|
135
143
|
|
136
144
|
BLANKS = [nil, [], '']
|
137
145
|
|
146
|
+
def set_mapping_attribute(key, value)
|
147
|
+
value = Util.prepare_attr(key, value, Epsagon.get_config[:max_attribute_size], Epsagon.get_config[:ignored_keys])
|
148
|
+
set_attribute(key, value) if value
|
149
|
+
end
|
150
|
+
|
138
151
|
def set_attribute(key, value)
|
139
152
|
unless BLANKS.include?(value)
|
140
|
-
value = Util.
|
141
|
-
super(key, value)
|
153
|
+
value = Util.prepare_attr(key, value, Epsagon.get_config[:max_attribute_size], Epsagon.get_config[:ignored_keys])
|
154
|
+
super(key, value) if value
|
142
155
|
end
|
143
156
|
end
|
144
157
|
|
@@ -146,8 +159,9 @@ module SpanExtension
|
|
146
159
|
super(*args)
|
147
160
|
if @attributes
|
148
161
|
@attributes = Hash[@attributes.select {|k,v| not BLANKS.include? v}.map { |k,v|
|
149
|
-
|
150
|
-
|
162
|
+
v = Util.prepare_attr(k, v, Epsagon.get_config[:max_attribute_size], Epsagon.get_config[:ignored_keys])
|
163
|
+
[k, v] if v
|
164
|
+
}.compact]
|
151
165
|
end
|
152
166
|
end
|
153
167
|
end
|
data/lib/epsagon_constants.rb
CHANGED
@@ -59,10 +59,10 @@ class EpsagonAwsHandler < Seahorse::Client::Handler
|
|
59
59
|
'message_body' => m[:message_body],
|
60
60
|
}
|
61
61
|
end
|
62
|
-
attributes['aws.sqs.record'] =
|
62
|
+
attributes['aws.sqs.record'] = messages_attributes if messages_attributes
|
63
63
|
end
|
64
64
|
attributes['aws.sqs.record.message_body'] = context.params[:message_body]
|
65
|
-
attributes['aws.sqs.record.message_attributes'] =
|
65
|
+
attributes['aws.sqs.record.message_attributes'] = context.params[:message_attributes] if context.params[:message_attributes]
|
66
66
|
end
|
67
67
|
elsif attributes['aws.service'] == 'sns'
|
68
68
|
topic_arn = context.params[:topic_arn]
|
@@ -71,7 +71,7 @@ class EpsagonAwsHandler < Seahorse::Client::Handler
|
|
71
71
|
unless config[:epsagon][:metadata_only]
|
72
72
|
attributes['aws.sns.subject'] = context.params[:subject]
|
73
73
|
attributes['aws.sns.message'] = context.params[:message]
|
74
|
-
attributes['aws.sns.message_attributes'] =
|
74
|
+
attributes['aws.sns.message_attributes'] = context.params[:message_attributes] if context.params[:message_attributes]
|
75
75
|
end
|
76
76
|
end
|
77
77
|
tracer.in_span(span_name, kind: span_kind, attributes: attributes) do |span|
|
@@ -105,7 +105,7 @@ class EpsagonAwsHandler < Seahorse::Client::Handler
|
|
105
105
|
end
|
106
106
|
record
|
107
107
|
end
|
108
|
-
span.
|
108
|
+
span.set_mapping_attribute('aws.sqs.record', messages_attributes) if messages_attributes
|
109
109
|
end
|
110
110
|
if context.operation.name == 'ReceiveMessage'
|
111
111
|
messages_attributes = result.messages.map do |m|
|
@@ -123,7 +123,7 @@ class EpsagonAwsHandler < Seahorse::Client::Handler
|
|
123
123
|
end
|
124
124
|
record
|
125
125
|
end
|
126
|
-
span.
|
126
|
+
span.set_mapping_attribute('aws.sqs.record', messages_attributes) if messages_attributes
|
127
127
|
end
|
128
128
|
elsif attributes['aws.service'] == 'sns'
|
129
129
|
span.set_attribute('aws.sns.message_id', result.message_id) if context.operation.name == 'Publish'
|
@@ -38,7 +38,7 @@ class EpsagonFaradayMiddleware < ::Faraday::Middleware
|
|
38
38
|
attributes.merge!(Util.epsagon_query_attributes(env.url.query))
|
39
39
|
attributes.merge!({
|
40
40
|
'http.request.path_params' => path_params,
|
41
|
-
'http.request.headers' => env.request_headers
|
41
|
+
'http.request.headers' => Hash[env.request_headers],
|
42
42
|
'http.request.body' => env.body,
|
43
43
|
'http.request.headers.User-Agent' => env.request_headers['User-Agent']
|
44
44
|
})
|
@@ -67,7 +67,7 @@ class EpsagonFaradayMiddleware < ::Faraday::Middleware
|
|
67
67
|
span.set_attribute('http.status_code', response.status)
|
68
68
|
|
69
69
|
unless config[:epsagon][:metadata_only]
|
70
|
-
span.set_attribute('http.response.headers', response.headers
|
70
|
+
span.set_attribute('http.response.headers', Hash[env.response.headers])
|
71
71
|
span.set_attribute('http.response.body', response.body)
|
72
72
|
end
|
73
73
|
span.status = OpenTelemetry::Trace::Status.http_to_status(
|
@@ -28,7 +28,7 @@ module EpsagonResqueModule
|
|
28
28
|
}
|
29
29
|
unless epsagon_conf[:metadata_only]
|
30
30
|
attributes.merge!({
|
31
|
-
'messaging.resque.args' =>
|
31
|
+
'messaging.resque.args' => item
|
32
32
|
})
|
33
33
|
end
|
34
34
|
|
@@ -80,7 +80,7 @@ module EpsagonResqueJob
|
|
80
80
|
|
81
81
|
unless epsagon_conf[:metadata_only]
|
82
82
|
attributes.merge!({
|
83
|
-
'messaging.resque.args' =>
|
83
|
+
'messaging.resque.args' => args
|
84
84
|
})
|
85
85
|
end
|
86
86
|
tracer.in_span(
|
@@ -34,7 +34,7 @@ module EpsagonNetHTTPExtension
|
|
34
34
|
attributes.merge!({
|
35
35
|
'http.request.path_params' => path_params,
|
36
36
|
'http.request.body' => body,
|
37
|
-
'http.request.headers' => headers
|
37
|
+
'http.request.headers' => Hash[headers],
|
38
38
|
'http.request.headers.User-Agent' => headers['user-agent']
|
39
39
|
})
|
40
40
|
attributes.merge!(Util.epsagon_query_attributes(query))
|
@@ -62,7 +62,7 @@ module EpsagonNetHTTPExtension
|
|
62
62
|
|
63
63
|
span.set_attribute('http.status_code', status_code)
|
64
64
|
unless config[:epsagon][:metadata_only]
|
65
|
-
span.set_attribute('http.response.headers', Hash[response.each_header.to_a]
|
65
|
+
span.set_attribute('http.response.headers', Hash[response.each_header.to_a])
|
66
66
|
span.set_attribute('http.response.body', response.body)
|
67
67
|
end
|
68
68
|
span.status = OpenTelemetry::Trace::Status.http_to_status(
|
data/lib/util.rb
CHANGED
@@ -16,6 +16,30 @@ module Util
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
|
20
|
+
def self.remove_key_recursive(h, key)
|
21
|
+
dot_idx = key.index('.')
|
22
|
+
if not dot_idx.nil?
|
23
|
+
next_hash = h[key[0..dot_idx - 1]]
|
24
|
+
self.remove_key_recursive(next_hash, key[dot_idx + 1..-1]) if next_hash
|
25
|
+
else
|
26
|
+
h.delete(key)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.prepare_attr(key, value, max_size, excluded_keys)
|
31
|
+
return nil if excluded_keys.include? key
|
32
|
+
return self.trim_attr(value, max_size) unless value.instance_of? Hash
|
33
|
+
value = value.dup
|
34
|
+
excluded_keys.each do |ekey|
|
35
|
+
if ekey.start_with? (key + '.')
|
36
|
+
rest_of_key = ekey[key.size + 1..-1]
|
37
|
+
self.remove_key_recursive(value, rest_of_key)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
return self.trim_attr(JSON.dump(value), max_size)
|
41
|
+
end
|
42
|
+
|
19
43
|
def self.trim_attr(value, max_size)
|
20
44
|
if value.instance_of? Array then
|
21
45
|
current_size = 2
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epsagon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Epsagon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opentelemetry-api
|