aws-xray-sdk 0.9.0
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 +7 -0
- data/lib/aws-xray-sdk.rb +10 -0
- data/lib/aws-xray-sdk/configuration.rb +158 -0
- data/lib/aws-xray-sdk/context/context.rb +26 -0
- data/lib/aws-xray-sdk/context/default_context.rb +81 -0
- data/lib/aws-xray-sdk/emitter/default_emitter.rb +53 -0
- data/lib/aws-xray-sdk/emitter/emitter.rb +24 -0
- data/lib/aws-xray-sdk/exceptions.rb +31 -0
- data/lib/aws-xray-sdk/facets/aws_sdk.rb +127 -0
- data/lib/aws-xray-sdk/facets/helper.rb +61 -0
- data/lib/aws-xray-sdk/facets/net_http.rb +61 -0
- data/lib/aws-xray-sdk/facets/rack.rb +87 -0
- data/lib/aws-xray-sdk/facets/rails/active_record.rb +66 -0
- data/lib/aws-xray-sdk/facets/rails/ex_middleware.rb +24 -0
- data/lib/aws-xray-sdk/facets/rails/railtie.rb +23 -0
- data/lib/aws-xray-sdk/facets/resources/aws_params_whitelist.rb +340 -0
- data/lib/aws-xray-sdk/facets/resources/aws_services_whitelist.rb +147 -0
- data/lib/aws-xray-sdk/logger.rb +19 -0
- data/lib/aws-xray-sdk/model/annotations.rb +97 -0
- data/lib/aws-xray-sdk/model/cause.rb +70 -0
- data/lib/aws-xray-sdk/model/dummy_entities.rb +72 -0
- data/lib/aws-xray-sdk/model/entity.rb +187 -0
- data/lib/aws-xray-sdk/model/metadata.rb +77 -0
- data/lib/aws-xray-sdk/model/segment.rb +63 -0
- data/lib/aws-xray-sdk/model/subsegment.rb +67 -0
- data/lib/aws-xray-sdk/model/trace_header.rb +54 -0
- data/lib/aws-xray-sdk/patcher.rb +21 -0
- data/lib/aws-xray-sdk/plugins/ec2.rb +39 -0
- data/lib/aws-xray-sdk/plugins/ecs.rb +23 -0
- data/lib/aws-xray-sdk/plugins/elastic_beanstalk.rb +25 -0
- data/lib/aws-xray-sdk/recorder.rb +209 -0
- data/lib/aws-xray-sdk/sampling/default_sampler.rb +105 -0
- data/lib/aws-xray-sdk/sampling/reservoir.rb +35 -0
- data/lib/aws-xray-sdk/sampling/sampler.rb +27 -0
- data/lib/aws-xray-sdk/sampling/sampling_rule.rb +57 -0
- data/lib/aws-xray-sdk/search_pattern.rb +82 -0
- data/lib/aws-xray-sdk/segment_naming/dynamic_naming.rb +26 -0
- data/lib/aws-xray-sdk/segment_naming/segment_naming.rb +10 -0
- data/lib/aws-xray-sdk/streaming/default_streamer.rb +53 -0
- data/lib/aws-xray-sdk/streaming/streamer.rb +17 -0
- data/lib/aws-xray-sdk/version.rb +3 -0
- metadata +224 -0
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'aws-xray-sdk/sampling/sampler'
|
2
|
+
require 'aws-xray-sdk/sampling/sampling_rule'
|
3
|
+
require 'aws-xray-sdk/exceptions'
|
4
|
+
|
5
|
+
module XRay
|
6
|
+
# The default sampler that uses internally defined
|
7
|
+
# sampling rule and reservoir models to decide sampling decision.
|
8
|
+
# It also uses the default sampling rule.
|
9
|
+
# An example definition:
|
10
|
+
# {
|
11
|
+
# version: 1,
|
12
|
+
# rules: [
|
13
|
+
# {
|
14
|
+
# description: 'Player moves.',
|
15
|
+
# service_name: '*',
|
16
|
+
# http_method: '*',
|
17
|
+
# url_path: '/api/move/*',
|
18
|
+
# fixed_target: 0,
|
19
|
+
# rate: 0.05
|
20
|
+
# }
|
21
|
+
# ],
|
22
|
+
# default: {
|
23
|
+
# fixed_target: 1,
|
24
|
+
# rate: 0.1
|
25
|
+
# }
|
26
|
+
# }
|
27
|
+
# This example defines one custom rule and a default rule.
|
28
|
+
# The custom rule applies a five-percent sampling rate with no minimum
|
29
|
+
# number of requests to trace for paths under /api/move/. The default
|
30
|
+
# rule traces the first request each second and 10 percent of additional requests.
|
31
|
+
# The SDK applies custom rules in the order in which they are defined.
|
32
|
+
# If a request matches multiple custom rules, the SDK applies only the first rule.
|
33
|
+
class DefaultSampler
|
34
|
+
include Sampler
|
35
|
+
DEFAULT_RULES = {
|
36
|
+
version: 1,
|
37
|
+
default: {
|
38
|
+
fixed_target: 1,
|
39
|
+
rate: 0.05
|
40
|
+
},
|
41
|
+
rules: []
|
42
|
+
}.freeze
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
load_sampling_rules(DEFAULT_RULES)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Return True if the sampler decide to sample based on input
|
49
|
+
# information and sampling rules. It will first check if any
|
50
|
+
# custom rule should be applied, if not it falls back to the
|
51
|
+
# default sampling rule.
|
52
|
+
# All arugments are extracted from incoming requests by
|
53
|
+
# X-Ray middleware to perform path based sampling.
|
54
|
+
def sample_request?(service_name:, url_path:, http_method:)
|
55
|
+
# directly fallback to non-path-based if all arguments are nil
|
56
|
+
return sample? unless service_name || url_path || http_method
|
57
|
+
@custom_rules ||= []
|
58
|
+
@custom_rules.each do |c|
|
59
|
+
return should_sample?(c) if c.applies?(target_name: service_name, target_path: url_path, target_method: http_method)
|
60
|
+
end
|
61
|
+
sample?
|
62
|
+
end
|
63
|
+
|
64
|
+
# Decides if should sample based on non-path-based rule.
|
65
|
+
# Currently only the default rule is not path-based.
|
66
|
+
def sample?
|
67
|
+
should_sample?(@default_rule)
|
68
|
+
end
|
69
|
+
|
70
|
+
# @param [Hash] v The sampling rules definition.
|
71
|
+
def sampling_rules=(v)
|
72
|
+
load_sampling_rules(v)
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [Array] An array of [SamplingRule]
|
76
|
+
def sampling_rules
|
77
|
+
all_rules = []
|
78
|
+
all_rules << @default_rule
|
79
|
+
all_rules << @custom_rules unless @custom_rules.empty?
|
80
|
+
all_rules
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def should_sample?(rule)
|
86
|
+
return true if rule.reservoir.take
|
87
|
+
Random.rand <= rule.rate
|
88
|
+
end
|
89
|
+
|
90
|
+
def load_sampling_rules(v)
|
91
|
+
version = v[:version]
|
92
|
+
if version != 1
|
93
|
+
raise InvalidSamplingConfigError, %('Sampling rule version #{version} is not supported.')
|
94
|
+
end
|
95
|
+
unless v[:default]
|
96
|
+
raise InvalidSamplingConfigError, 'A default rule must be provided.'
|
97
|
+
end
|
98
|
+
@default_rule = SamplingRule.new rule_definition: v[:default], default: true
|
99
|
+
@custom_rules = []
|
100
|
+
v[:rules].each do |d|
|
101
|
+
@custom_rules << SamplingRule.new(rule_definition: d)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module XRay
|
2
|
+
# Keeps track of the number of sampled segments within
|
3
|
+
# a single second. This class is implemented to be
|
4
|
+
# thread-safe to achieve accurate sampling.
|
5
|
+
class Reservoir
|
6
|
+
# @param [Integer] traces_per_sec The number of guranteed sampled
|
7
|
+
# segments per second.
|
8
|
+
def initialize(traces_per_sec: 0)
|
9
|
+
@traces_per_sec = traces_per_sec
|
10
|
+
@used_this_sec = 0
|
11
|
+
@this_sec = Time.now.to_i
|
12
|
+
@lock = Mutex.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns `true` if there are segments left within the
|
16
|
+
# current second, otherwise returns `false`.
|
17
|
+
def take
|
18
|
+
# nothing to provide if reserved is set to 0
|
19
|
+
return false if @traces_per_sec.zero?
|
20
|
+
@lock.synchronize do
|
21
|
+
now = Time.now.to_i
|
22
|
+
# refresh time frame
|
23
|
+
if now != @this_sec
|
24
|
+
@used_this_sec = 0
|
25
|
+
@this_sec = now
|
26
|
+
end
|
27
|
+
# return false if reserved item ran out
|
28
|
+
return false unless @used_this_sec < @traces_per_sec
|
29
|
+
# otherwise increment used counter and return true
|
30
|
+
@used_this_sec += 1
|
31
|
+
return true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module XRay
|
2
|
+
# The sampler interface that calculates if a segment
|
3
|
+
# should be sampled or not upon creation based on the
|
4
|
+
# sampling rules it holds. It doesn't respect sampling decision
|
5
|
+
# from upstream.
|
6
|
+
module Sampler
|
7
|
+
# Decides if a segment should be sampled for an incoming request.
|
8
|
+
# Used in case of middleware.
|
9
|
+
def sample_request?(service_name:, url_path:, http_method:)
|
10
|
+
raise 'Not implemented'
|
11
|
+
end
|
12
|
+
|
13
|
+
# Decides if a segment should be sampled merely based on internal
|
14
|
+
# sampling rules.
|
15
|
+
def sample?
|
16
|
+
raise 'Not implemented'
|
17
|
+
end
|
18
|
+
|
19
|
+
def sampling_rules=(v)
|
20
|
+
raise 'Not implemented'
|
21
|
+
end
|
22
|
+
|
23
|
+
def sampling_rules
|
24
|
+
raise 'Not implemented'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'aws-xray-sdk/exceptions'
|
2
|
+
require 'aws-xray-sdk/sampling/reservoir'
|
3
|
+
require 'aws-xray-sdk/search_pattern'
|
4
|
+
|
5
|
+
module XRay
|
6
|
+
# One SamplingRule object represents one rule defined from the rules hash definition.
|
7
|
+
# It can be either a custom rule or the default rule.
|
8
|
+
class SamplingRule
|
9
|
+
attr_reader :fixed_target, :rate, :service_name,
|
10
|
+
:method, :path, :reservoir, :default
|
11
|
+
|
12
|
+
# @param [Hash] rule_definition Hash that defines a single rule.
|
13
|
+
# @param default A boolean flag indicates if this rule is the default rule.
|
14
|
+
def initialize(rule_definition:, default: false)
|
15
|
+
@fixed_target = rule_definition[:fixed_target]
|
16
|
+
@rate = rule_definition[:rate]
|
17
|
+
|
18
|
+
@service_name = rule_definition[:service_name]
|
19
|
+
@method = rule_definition[:http_method]
|
20
|
+
@path = rule_definition[:url_path]
|
21
|
+
|
22
|
+
@default = default
|
23
|
+
validate
|
24
|
+
@reservoir = Reservoir.new traces_per_sec: @fixed_target
|
25
|
+
end
|
26
|
+
|
27
|
+
# Determines whether or not this sampling rule applies to
|
28
|
+
# the incoming request based on some of the request's parameters.
|
29
|
+
# Any None parameters provided will be considered an implicit match.
|
30
|
+
def applies?(target_name:, target_path:, target_method:)
|
31
|
+
name_match = !target_name || SearchPattern.wildcard_match?(pattern: @service_name, text: target_name)
|
32
|
+
path_match = !target_path || SearchPattern.wildcard_match?(pattern: @path, text: target_path)
|
33
|
+
method_match = !target_method || SearchPattern.wildcard_match?(pattern: @method, text: target_method)
|
34
|
+
name_match && path_match && method_match
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def validate
|
40
|
+
if @fixed_target < 0 || @rate < 0
|
41
|
+
raise InvalidSamplingConfigError, 'All rules must have non-negative values for fixed_target and rate.'
|
42
|
+
end
|
43
|
+
|
44
|
+
if @default
|
45
|
+
# validate default rule
|
46
|
+
if @service_name || @method || @path
|
47
|
+
raise InvalidSamplingConfigError, 'The default rule must not specify values for url_path, service_name, or http_method.'
|
48
|
+
end
|
49
|
+
else
|
50
|
+
# validate custom rule
|
51
|
+
unless @service_name && @method && @path
|
52
|
+
raise InvalidSamplingConfigError, 'All non-default rules must have values for url_path, service_name, and http_method.'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module XRay
|
2
|
+
# custom pattern matching for performance and the SDK use cases.
|
3
|
+
module SearchPattern
|
4
|
+
# Performs a case-insensitive wildcard match against two strings.
|
5
|
+
# This method works with pseduo-regex chars; specifically ? and * are supported.
|
6
|
+
# An asterisk (*) represents any combination of characters.
|
7
|
+
# A question mark (?) represents any single character.
|
8
|
+
# @param [String] pattern The regex-like pattern to be compared against.
|
9
|
+
# @param [String] text The string to compare against the pattern.
|
10
|
+
# @param case_insensitive A boolean flag. Default is true.
|
11
|
+
def self.wildcard_match?(pattern:, text:, case_insensitive: true)
|
12
|
+
return false unless pattern && text
|
13
|
+
pattern_len = pattern.length
|
14
|
+
text_len = text.length
|
15
|
+
return text_len.zero? if pattern_len.zero?
|
16
|
+
# Check the special case of a single * pattern, as it's common
|
17
|
+
return true if pattern == '*'
|
18
|
+
|
19
|
+
if case_insensitive
|
20
|
+
# do not mutate original input
|
21
|
+
pattern = pattern.downcase
|
22
|
+
text = text.downcase
|
23
|
+
end
|
24
|
+
# Infix globs are relatively rare, and the below search is expensive.
|
25
|
+
# Check for infix globs and, in their absence, do the simple thing.
|
26
|
+
if !pattern.include?('*') || pattern.index('*') == pattern_len - 1
|
27
|
+
return simple_wildcard_match? pattern: pattern, text: text
|
28
|
+
end
|
29
|
+
|
30
|
+
# The res[i] is used to record if there is a match between
|
31
|
+
# the first i chars in text and the first j chars in pattern.
|
32
|
+
# So will return res[textLength+1] in the end
|
33
|
+
# Loop from the beginning of the pattern
|
34
|
+
# case not '*': if text[i]==pattern[j] or pattern[j] is '?',
|
35
|
+
# and res[i] is true, set res[i+1] to true, otherwise false.
|
36
|
+
# case '*': since '*' can match any globing, as long as there is a true
|
37
|
+
# in res before i, all the res[i+1], res[i+2],...,res[textLength]
|
38
|
+
# could be true
|
39
|
+
res = Array.new(text_len + 1)
|
40
|
+
res[0] = true
|
41
|
+
(0...pattern_len).each do |j|
|
42
|
+
p = pattern[j]
|
43
|
+
if p != '*'
|
44
|
+
(text_len - 1).downto(0) do |i|
|
45
|
+
res[i + 1] = res[i] && (p == '?' || (p == text[i]))
|
46
|
+
end
|
47
|
+
else
|
48
|
+
i = 0
|
49
|
+
i += 1 while i <= text_len && !res[i]
|
50
|
+
(i..text_len + 1).each do |m|
|
51
|
+
res[m] = true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
res[0] = res[0] && (p == '*')
|
55
|
+
end
|
56
|
+
res[text_len]
|
57
|
+
end
|
58
|
+
|
59
|
+
private_class_method
|
60
|
+
|
61
|
+
def self.simple_wildcard_match?(pattern:, text:)
|
62
|
+
j = 0
|
63
|
+
pattern_len = pattern.length
|
64
|
+
text_len = text.length
|
65
|
+
(0...pattern_len).each do |i|
|
66
|
+
p = pattern[i]
|
67
|
+
# Presumption for this method is that globs only occur at end
|
68
|
+
return true if p == '*'
|
69
|
+
if p == '?'
|
70
|
+
# No character to match
|
71
|
+
return false if j == text_len
|
72
|
+
else
|
73
|
+
return false if j >= text_len || p != text[j]
|
74
|
+
end
|
75
|
+
j += 1
|
76
|
+
end
|
77
|
+
# Ate up all the pattern and didn't end at a glob, so a match
|
78
|
+
# will have consumed all the text
|
79
|
+
j == text_len
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'aws-xray-sdk/segment_naming/segment_naming'
|
2
|
+
require 'aws-xray-sdk/search_pattern'
|
3
|
+
|
4
|
+
module XRay
|
5
|
+
# Decides what name to use on a segment generated from an incoming request.
|
6
|
+
# This default naming takes the host name and compares it to a pre-defined pattern.
|
7
|
+
# If the host name matches that pattern, it returns the host name, otherwise
|
8
|
+
# it returns the fallback name. The host name usually comes from the incoming
|
9
|
+
# request's headers.
|
10
|
+
class DynamicNaming
|
11
|
+
include SegmentNaming
|
12
|
+
|
13
|
+
# @param [String] fallback The fallback name used when there is no match
|
14
|
+
# between host name and specified pattern.
|
15
|
+
def initialize(fallback:)
|
16
|
+
@fallback = fallback
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param [String] host The host name fetched from the incoming request's header.
|
20
|
+
def provide_name(host:)
|
21
|
+
# use fallback name when either the pattern or host name is unavailable.
|
22
|
+
return fallback unless pattern && !pattern.empty? && host && !host.empty?
|
23
|
+
SearchPattern.wildcard_match?(pattern: pattern, text: host) ? host : fallback
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'aws-xray-sdk/streaming/streamer'
|
2
|
+
require 'aws-xray-sdk/logger'
|
3
|
+
|
4
|
+
module XRay
|
5
|
+
# The default streamer use subsegment count as the threshold
|
6
|
+
# for performance reasons and it streams out subtrees
|
7
|
+
# where all the nodes in it are completed.
|
8
|
+
class DefaultStreamer
|
9
|
+
include Streamer
|
10
|
+
include Logging
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@stream_threshold = 50
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Segment] segment Check if the provided segment exceeds
|
17
|
+
# the threshold to stream.
|
18
|
+
def eligible?(segment:)
|
19
|
+
# only get subsegments to stream from sampled segments.
|
20
|
+
segment && segment.sampled && segment.subsegment_size >= stream_threshold
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param [Segment] root The target segment to stream subsegments from.
|
24
|
+
# @param [Emitter] emitter The emitter employed to send data to the daemon.
|
25
|
+
def stream_subsegments(root:, emitter:)
|
26
|
+
children = root.subsegments
|
27
|
+
children_ready = []
|
28
|
+
|
29
|
+
unless children.empty?
|
30
|
+
# Collect ready subtrees from root.
|
31
|
+
children.each do |child|
|
32
|
+
children_ready << child if stream_subsegments root: child, emitter: emitter
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# If this subtree is ready, go back to the root's parent
|
37
|
+
# to try to find a bigger subtree
|
38
|
+
return true if children_ready.length == children.length && root.closed?
|
39
|
+
# Otherwise this subtree has at least one non-ready node.
|
40
|
+
# Only stream its ready child subtrees.
|
41
|
+
children_ready.each do |child|
|
42
|
+
root.remove_subsegment subsegment: child
|
43
|
+
emitter.send_entity entity: child
|
44
|
+
end
|
45
|
+
# Return false so this node won't be added to its parent's ready children.
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Integer] The maximum number of subsegments a segment
|
50
|
+
# can hold before streaming.
|
51
|
+
attr_accessor :stream_threshold
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module XRay
|
2
|
+
# The interface used by the X-Ray recoder to get eligible subsegments
|
3
|
+
# to be streamed out from a given segment.
|
4
|
+
module Streamer
|
5
|
+
def eligible?(segment:)
|
6
|
+
raise 'Not implemented'
|
7
|
+
end
|
8
|
+
|
9
|
+
def subsegments_to_stream(segment:, emitter:, force: false)
|
10
|
+
raise 'Not implemented'
|
11
|
+
end
|
12
|
+
|
13
|
+
def stream_threshold=(v)
|
14
|
+
raise 'Not implemented'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,224 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aws-xray-sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Amazon Web Services
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oj
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aws-sdk-dynamodb
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aws-sdk-s3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '12.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '12.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rdiscount
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.2'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.2'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.15'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.15'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: webmock
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '3.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '3.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yard
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.9'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.9'
|
153
|
+
description: The AWS X-Ray SDK for Ruby enables Ruby developers to record and emit
|
154
|
+
information from within their applications to the AWS X-Ray service.
|
155
|
+
email: aws-xray-ruby@amazon.com
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- lib/aws-xray-sdk.rb
|
161
|
+
- lib/aws-xray-sdk/configuration.rb
|
162
|
+
- lib/aws-xray-sdk/context/context.rb
|
163
|
+
- lib/aws-xray-sdk/context/default_context.rb
|
164
|
+
- lib/aws-xray-sdk/emitter/default_emitter.rb
|
165
|
+
- lib/aws-xray-sdk/emitter/emitter.rb
|
166
|
+
- lib/aws-xray-sdk/exceptions.rb
|
167
|
+
- lib/aws-xray-sdk/facets/aws_sdk.rb
|
168
|
+
- lib/aws-xray-sdk/facets/helper.rb
|
169
|
+
- lib/aws-xray-sdk/facets/net_http.rb
|
170
|
+
- lib/aws-xray-sdk/facets/rack.rb
|
171
|
+
- lib/aws-xray-sdk/facets/rails/active_record.rb
|
172
|
+
- lib/aws-xray-sdk/facets/rails/ex_middleware.rb
|
173
|
+
- lib/aws-xray-sdk/facets/rails/railtie.rb
|
174
|
+
- lib/aws-xray-sdk/facets/resources/aws_params_whitelist.rb
|
175
|
+
- lib/aws-xray-sdk/facets/resources/aws_services_whitelist.rb
|
176
|
+
- lib/aws-xray-sdk/logger.rb
|
177
|
+
- lib/aws-xray-sdk/model/annotations.rb
|
178
|
+
- lib/aws-xray-sdk/model/cause.rb
|
179
|
+
- lib/aws-xray-sdk/model/dummy_entities.rb
|
180
|
+
- lib/aws-xray-sdk/model/entity.rb
|
181
|
+
- lib/aws-xray-sdk/model/metadata.rb
|
182
|
+
- lib/aws-xray-sdk/model/segment.rb
|
183
|
+
- lib/aws-xray-sdk/model/subsegment.rb
|
184
|
+
- lib/aws-xray-sdk/model/trace_header.rb
|
185
|
+
- lib/aws-xray-sdk/patcher.rb
|
186
|
+
- lib/aws-xray-sdk/plugins/ec2.rb
|
187
|
+
- lib/aws-xray-sdk/plugins/ecs.rb
|
188
|
+
- lib/aws-xray-sdk/plugins/elastic_beanstalk.rb
|
189
|
+
- lib/aws-xray-sdk/recorder.rb
|
190
|
+
- lib/aws-xray-sdk/sampling/default_sampler.rb
|
191
|
+
- lib/aws-xray-sdk/sampling/reservoir.rb
|
192
|
+
- lib/aws-xray-sdk/sampling/sampler.rb
|
193
|
+
- lib/aws-xray-sdk/sampling/sampling_rule.rb
|
194
|
+
- lib/aws-xray-sdk/search_pattern.rb
|
195
|
+
- lib/aws-xray-sdk/segment_naming/dynamic_naming.rb
|
196
|
+
- lib/aws-xray-sdk/segment_naming/segment_naming.rb
|
197
|
+
- lib/aws-xray-sdk/streaming/default_streamer.rb
|
198
|
+
- lib/aws-xray-sdk/streaming/streamer.rb
|
199
|
+
- lib/aws-xray-sdk/version.rb
|
200
|
+
homepage: https://github.com/aws/aws-xray-sdk-ruby
|
201
|
+
licenses:
|
202
|
+
- Apache-2.0
|
203
|
+
metadata: {}
|
204
|
+
post_install_message:
|
205
|
+
rdoc_options: []
|
206
|
+
require_paths:
|
207
|
+
- lib
|
208
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
209
|
+
requirements:
|
210
|
+
- - ">="
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: '0'
|
213
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - ">="
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '0'
|
218
|
+
requirements: []
|
219
|
+
rubyforge_project:
|
220
|
+
rubygems_version: 2.7.3
|
221
|
+
signing_key:
|
222
|
+
specification_version: 4
|
223
|
+
summary: AWS X-Ray SDK for Ruby
|
224
|
+
test_files: []
|