aws-xray 0.19.0 → 0.20.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e6c60e80dd24f95f4ba376e17d0dfc54d3fafe1
4
- data.tar.gz: 9caf21ace8870af635fde50847dcab42ec1354f8
3
+ metadata.gz: 7791521140cd959a8955511da8c84bc1adcbc3a4
4
+ data.tar.gz: dad29f16af29cc23eb0f5e156d7a58e8a4fd8154
5
5
  SHA512:
6
- metadata.gz: e7d452cb872b1d0b35db19e3cc0c0ca7ae71bfea3f9254bb4780cc47d2393abaa5c4d6d335cdc1fcfa1297fcfb91e582c35b58b84b3c581125ee5d49d72dbc0c
7
- data.tar.gz: 3c67908acd4f9124766718c0613f6d114eb38e842c79b5aee68e0fa65c1f5d9956a5130e09adbbebb40854330ee3c54079fd4b7a46a11f3be28717edb12fade3
6
+ metadata.gz: d7b21c857fc027e6aa601cf7de7179771e04d8e5d412feda876ebffec9a38c97f4082381272b7ed77795554f512adf1ef9eb1338345662d088631e8d28c0f5aa
7
+ data.tar.gz: 75b452f39bd6d993b86d2bb3c25b26a3ae7e6bf1590dcfe58d5a2b2b825a8b0eb02099f7d50c4892bd2fdc4c111cb24e2f9b7d2e11a63491a3092036fb60be39
@@ -26,8 +26,7 @@ module Aws
26
26
  # @param [String] name a logical name of this tracing context.
27
27
  def self.trace(name: nil)
28
28
  name = name || config.name || raise(MissingNameError)
29
- client = Client.new(Aws::Xray.config.client_options)
30
- Context.with_new_context(name, client, Trace.generate) do
29
+ Context.with_new_context(name, Trace.generate) do
31
30
  Context.current.base_trace do |seg|
32
31
  yield seg
33
32
  end
@@ -5,58 +5,51 @@ module Aws
5
5
  # Own the responsibility of holding destination address and sending
6
6
  # segments.
7
7
  class Client
8
- # sock is for test.
9
- def initialize(host: nil, port: nil, sock: nil)
10
- @host, @port = host, port
11
- @sock = sock
12
- end
13
-
14
- def copy
15
- self.class.new(host: @host ? @host.dup : nil, port: @port, sock: @sock)
16
- end
8
+ class << self
9
+ # @param [Aws::Xray::Segment] segment
10
+ def send_segment(segment)
11
+ Aws::Xray.config.logger.debug("#{Thread.current}: Client.send_segment started")
12
+ payload = %!{"format": "json", "version": 1}\n#{segment.to_json}\n!
17
13
 
18
- # When UDPSocket#send can not send all bytes, just give up it.
19
- # @param [Aws::Xray::Segment] segment
20
- def send_segment(segment)
21
- Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_segment started")
22
- payload = %!{"format": "json", "version": 1}\n#{segment.to_json}\n!
23
-
24
- begin
25
- if @sock # test env or not aws-xray is not enabled
26
- send_payload(payload)
27
- Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_segment called #send_payload in the same thread")
28
- else # production env
29
- Worker.post(payload, self.copy)
30
- Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_segment posted a job to worker")
31
- end
32
- rescue QueueIsFullError => e
33
14
  begin
34
- Aws::Xray.config.segment_sending_error_handler.call(e, payload, host: @host, port: @port)
35
- rescue Exception => e
36
- $stderr.puts("Error handler `#{Aws::Xray.config.segment_sending_error_handler}` raised an error: #{e}\n#{e.backtrace.join("\n")}")
15
+ if Aws::Xray.config.client_options[:sock] # test env or not aws-xray is not enabled
16
+ send_payload(payload)
17
+ Aws::Xray.config.logger.debug("#{Thread.current}: Client.send_segment called #send_payload in the same thread")
18
+ else # production env
19
+ Worker.post(payload)
20
+ Aws::Xray.config.logger.debug("#{Thread.current}: Client.send_segment posted a job to worker")
21
+ end
22
+ rescue QueueIsFullError => e
23
+ begin
24
+ host, port = Aws::Xray.config.client_options[:host], Aws::Xray.config.client_options[:port]
25
+ Aws::Xray.config.segment_sending_error_handler.call(e, payload, host: host, port: port)
26
+ rescue Exception => e
27
+ $stderr.puts("Error handler `#{Aws::Xray.config.segment_sending_error_handler}` raised an error: #{e}\n#{e.backtrace.join("\n")}")
28
+ end
37
29
  end
38
30
  end
39
- end
40
31
 
41
- # Will be called in other threads.
42
- # @param [String] payload
43
- def send_payload(payload)
44
- Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_payload")
45
- sock = @sock || UDPSocket.new
32
+ # Will be called in other threads.
33
+ # @param [String] payload
34
+ def send_payload(payload)
35
+ Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_payload")
36
+ sock = Aws::Xray.config.client_options[:sock] || UDPSocket.new
37
+ host, port = Aws::Xray.config.client_options[:host], Aws::Xray.config.client_options[:port]
46
38
 
47
- begin
48
- len = sock.send(payload, Socket::MSG_DONTWAIT, @host, @port)
49
- raise CanNotSendAllByteError.new(payload.size, len) if payload.size != len
50
- Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_payload successfully sent payload, len=#{len}")
51
- len
52
- rescue SystemCallError, SocketError, CanNotSendAllByteError => e
53
39
  begin
54
- Aws::Xray.config.segment_sending_error_handler.call(e, payload, host: @host, port: @port)
55
- rescue Exception => e
56
- $stderr.puts("Error handler `#{Aws::Xray.config.segment_sending_error_handler}` raised an error: #{e}\n#{e.backtrace.join("\n")}")
40
+ len = sock.send(payload, Socket::MSG_DONTWAIT, host, port)
41
+ raise CanNotSendAllByteError.new(payload.size, len) if payload.size != len
42
+ Aws::Xray.config.logger.debug("#{Thread.current}: Client#send_payload successfully sent payload, len=#{len}")
43
+ len
44
+ rescue SystemCallError, SocketError, CanNotSendAllByteError => e
45
+ begin
46
+ Aws::Xray.config.segment_sending_error_handler.call(e, payload, host: host, port: port)
47
+ rescue Exception => e
48
+ $stderr.puts("Error handler `#{Aws::Xray.config.segment_sending_error_handler}` raised an error: #{e}\n#{e.backtrace.join("\n")}")
49
+ end
50
+ ensure
51
+ sock.close
57
52
  end
58
- ensure
59
- sock.close
60
53
  end
61
54
  end
62
55
  end
@@ -7,21 +7,22 @@ module Aws
7
7
  module Xray
8
8
  # thread-unsafe, suppose to be used only in initialization phase.
9
9
  class Configuration
10
- def initialize
11
- @logger = ::Logger.new($stdout).tap {|l| l.level = Logger::INFO }
12
- end
10
+ # Freeze to force users to set default annotation with writer method.
11
+ DEFAULT_ANNOTATION = {
12
+ hostname: Socket.gethostname,
13
+ }.freeze
13
14
 
14
- # @return [String] name Logical service name for this application.
15
- def name
16
- @name ||= ENV['AWS_XRAY_NAME']
17
- end
18
- attr_writer :name
15
+ DEFAULT_METADATA = {
16
+ tracing_sdk: {
17
+ name: 'aws-xray',
18
+ version: Aws::Xray::VERSION,
19
+ }
20
+ }.freeze
19
21
 
20
- # @return [Hash] client_options For xray-agent client.
21
- # - host: e.g. '127.0.0.1'
22
- # - port: e.g. 2000
23
- def client_options
24
- @client_options ||=
22
+ def initialize
23
+ @logger = ::Logger.new($stdout).tap {|l| l.level = Logger::INFO }
24
+ @name = ENV['AWS_XRAY_NAME']
25
+ @client_options =
25
26
  begin
26
27
  option = (ENV['AWS_XRAY_LOCATION'] || '').split(':')
27
28
  host = option[0]
@@ -32,60 +33,54 @@ module Aws
32
33
  { sock: NullSocket.new }
33
34
  end
34
35
  end
36
+ @excluded_paths = (ENV['AWS_XRAY_EXCLUDED_PATHS'] || '').split(',')
37
+ @version = VersionDetector.new.call
38
+ @default_annotation = DEFAULT_ANNOTATION
39
+ @default_metadata = DEFAULT_METADATA
40
+ @segment_sending_error_handler = DefaultErrorHandler.new($stderr)
41
+ @worker = Aws::Xray::Worker::Configuration.new
42
+ @sampling_rate = Float(ENV['AWS_XRAY_SAMPLING_RATE'] || 0.001)
35
43
  end
36
- attr_writer :client_options
37
44
 
45
+ # @param [String] name Logical service name for this application.
46
+ # @return [String]
47
+ attr_accessor :name
48
+
49
+ # @param [Hash] client_options For xray-agent client.
50
+ # - host: e.g. '127.0.0.1'
51
+ # - port: e.g. 2000
52
+ # @return [Hash]
53
+ attr_accessor :client_options
54
+
55
+ # @param [Array<String>] excluded_paths
38
56
  # @return [Array<String>]
39
- def excluded_paths
40
- @excluded_paths ||= (ENV['AWS_XRAY_EXCLUDED_PATHS'] || '').split(',')
41
- end
42
- attr_writer :excluded_paths
57
+ attr_accessor :excluded_paths
43
58
 
44
59
  # @return [String]
45
- def version
46
- @version ||= VersionDetector.new.call
47
- end
60
+ attr_reader :version
48
61
  # @param [String,Proc] version A String or callable object which returns application version.
49
62
  # Default version detection tries to solve with `app_root/REVISION` file.
50
63
  def version=(v)
51
64
  @version = v.respond_to?(:call) ? v.call : v
52
65
  end
53
66
 
54
- DEFAULT_ANNOTATION = {
55
- hostname: Socket.gethostname,
56
- }.freeze
57
- # @return [Hash] default annotation with key-value format.
58
- def default_annotation
59
- @default_annotation ||= DEFAULT_ANNOTATION
60
- end
61
- # @param [Hash] h default annotation Hash.
67
+ # @return [Hash]
68
+ attr_reader :default_annotation
69
+ # @param [Hash] annotation annotation with key-value format. keys and
70
+ # values are automatically normalized according to X-Ray's format spec.
62
71
  def default_annotation=(annotation)
63
72
  @default_annotation = AnnotationNormalizer.call(annotation)
64
73
  end
65
74
 
66
- DEFAULT_METADATA = {
67
- tracing_sdk: {
68
- name: 'aws-xray',
69
- version: Aws::Xray::VERSION,
70
- }
71
- }.freeze
72
- # @return [Hash] Default metadata.
73
- def default_metadata
74
- @default_metadata ||= DEFAULT_METADATA
75
- end
76
- # @param [Hash] metadata Default metadata.
77
- attr_writer :default_metadata
75
+ # @param [Hash] default_metadatametadata Default metadata.
76
+ # @return [Hash]
77
+ attr_accessor :default_metadata
78
78
 
79
- def segment_sending_error_handler
80
- @segment_sending_error_handler ||= DefaultErrorHandler.new($stderr)
81
- end
82
79
  # @param [Proc] segment_sending_error_handler Callable object
83
- attr_writer :segment_sending_error_handler
80
+ attr_accessor :segment_sending_error_handler
84
81
 
85
82
  # @return [Aws::Xray::Worker::Configuration]
86
- def worker
87
- @worker ||= Aws::Xray::Worker::Configuration.new
88
- end
83
+ attr_reader :worker
89
84
  # Set given configuration and reset workers according to the given
90
85
  # configuration.
91
86
  # @param [Aws::Xray::Worker::Configuration] conf
@@ -96,12 +91,9 @@ module Aws
96
91
  end
97
92
 
98
93
  # Default is 0.1%.
99
- # @return [Float]
100
- def sampling_rate
101
- @sampling_rate ||= Float(ENV['AWS_XRAY_SAMPLING_RATE'] || 0.001)
102
- end
103
94
  # @param [Float] sampling_rate
104
- attr_writer :sampling_rate
95
+ # @return [Float]
96
+ attr_accessor :sampling_rate
105
97
 
106
98
  # @param [Logger] logger
107
99
  # @return [Logger]
@@ -1,5 +1,5 @@
1
1
  require 'aws/xray/segment'
2
- require 'aws/xray/sub_segment'
2
+ require 'aws/xray/subsegment'
3
3
 
4
4
  module Aws
5
5
  module Xray
@@ -26,12 +26,11 @@ module Aws
26
26
  end
27
27
 
28
28
  # @param [String] name logical name of this tracing context.
29
- # @param [Aws::Xray::Client] client
30
29
  # @param [Aws::Xray::Trace] trace newly generated trace or created with
31
30
  # HTTP request header.
32
31
  # @yield [Aws::Xray::Context] newly created context.
33
- def with_new_context(name, client, trace)
34
- build_current(name, client, trace)
32
+ def with_new_context(name, trace)
33
+ build_current(name, trace)
35
34
  yield
36
35
  ensure
37
36
  remove_current
@@ -39,8 +38,8 @@ module Aws
39
38
 
40
39
  private
41
40
 
42
- def build_current(name, client, trace)
43
- Thread.current.thread_variable_set(VAR_NAME, Context.new(name, client, trace))
41
+ def build_current(name, trace)
42
+ Thread.current.thread_variable_set(VAR_NAME, Context.new(name, trace))
44
43
  end
45
44
 
46
45
  def remove_current
@@ -50,26 +49,24 @@ module Aws
50
49
 
51
50
  attr_reader :name
52
51
 
53
- # client and trace are frozen by default.
54
- def initialize(name, client, trace, base_segment_id = nil)
52
+ def initialize(name, trace, base_segment_id = nil)
55
53
  raise 'name is required' unless name
56
54
  @name = name
57
- @client = client
58
55
  @trace = trace
59
56
  @base_segment_id = base_segment_id
60
57
  @disabled_ids = []
61
- @sub_segment_name = nil
58
+ @subsegment_name = nil
62
59
  end
63
60
 
64
61
  # Curretly context object is thread safe, so copying is not necessary,
65
62
  # but in case we need this, offer copy interface for multi threaded
66
63
  # environment.
67
64
  #
68
- # client and trace should be imutable and thread-safe.
65
+ # Trace should be imutable and thread-safe.
69
66
  #
70
67
  # See README for example.
71
68
  def copy
72
- self.class.new(@name.dup, @client.copy, @trace.copy, @base_segment_id ? @base_segment_id.dup : nil)
69
+ self.class.new(@name.dup, @trace.copy, @base_segment_id ? @base_segment_id.dup : nil)
73
70
  end
74
71
 
75
72
  # Rescue all exceptions and record the exception to the segment.
@@ -88,17 +85,17 @@ module Aws
88
85
  raise e
89
86
  ensure
90
87
  base_segment.finish
91
- @client.send_segment(base_segment) if @trace.sampled?
88
+ Client.send_segment(base_segment) if @trace.sampled?
92
89
  end
93
90
  end
94
91
 
95
92
  # @param [Boolean] remote
96
93
  # @param [String] name Arbitrary name of the sub segment. e.g. "funccall_f".
97
- # @yield [Aws::Xray::SubSegment]
94
+ # @yield [Aws::Xray::Subsegment]
98
95
  # @return [Object] A value which given block returns.
99
96
  def child_trace(remote:, name:)
100
97
  raise SegmentDidNotStartError unless @base_segment_id
101
- sub = SubSegment.build(@trace, @base_segment_id, remote: remote, name: overwrite_name(name))
98
+ sub = Subsegment.build(@trace, @base_segment_id, remote: remote, name: overwrite_name(name))
102
99
 
103
100
  begin
104
101
  yield sub
@@ -107,7 +104,7 @@ module Aws
107
104
  raise e
108
105
  ensure
109
106
  sub.finish
110
- @client.send_segment(sub) if @trace.sampled?
107
+ Client.send_segment(sub) if @trace.sampled?
111
108
  end
112
109
  end
113
110
 
@@ -135,22 +132,22 @@ module Aws
135
132
  #
136
133
  # @param [String] name
137
134
  def overwrite(name:)
138
- @sub_segment_name = name.to_s
135
+ @subsegment_name = name.to_s
139
136
 
140
137
  begin
141
138
  yield
142
139
  ensure
143
- @sub_segment_name = nil
140
+ @subsegment_name = nil
144
141
  end
145
142
  end
146
143
 
147
144
  private
148
145
 
149
146
  def overwrite_name(name)
150
- return name unless @sub_segment_name
147
+ return name unless @subsegment_name
151
148
 
152
- name = @sub_segment_name
153
- @sub_segment_name = nil
149
+ name = @subsegment_name
150
+ @subsegment_name = nil
154
151
  name
155
152
  end
156
153
  end
@@ -4,15 +4,10 @@ module Aws
4
4
  TRACE_ENV = 'HTTP_X_AMZN_TRACE_ID'.freeze
5
5
  ORIGINAL_TRACE_ENV = 'HTTP_X_AMZN_TRACE_ID_ORIGINAL'.freeze
6
6
 
7
- # @param [Hash] client_options For xray-agent client.
8
- # - host: e.g. '127.0.0.1'
9
- # - port: e.g. 2000
10
- # - sock: test purpose.
11
7
  # @param [Array<String,Regexp>] excluded_paths for health-check endpoints etc...
12
- def initialize(app, client_options: {}, excluded_paths: [])
8
+ def initialize(app, excluded_paths: [])
13
9
  @app = app
14
10
  @name = Aws::Xray.config.name || raise(MissingNameError)
15
- @client = Client.new(Aws::Xray.config.client_options.merge(client_options))
16
11
  @excluded_paths = excluded_paths + Aws::Xray.config.excluded_paths
17
12
  end
18
13
 
@@ -31,7 +26,7 @@ module Aws
31
26
  env[ORIGINAL_TRACE_ENV] = env[TRACE_ENV] if env[TRACE_ENV] # just for the record
32
27
  env[TRACE_ENV] = trace.to_header_value
33
28
 
34
- Context.with_new_context(@name, @client, trace) do
29
+ Context.with_new_context(@name, trace) do
35
30
  Context.current.base_trace do |seg|
36
31
  seg.set_http_request(Request.build_from_rack_env(env))
37
32
  status, headers, body = @app.call(env)
@@ -108,7 +108,7 @@ module Aws
108
108
  end
109
109
  if @http_request
110
110
  request_hash = @http_request.to_h
111
- # traced is SubSegment only
111
+ # traced is Subsegment only
112
112
  request_hash.delete(:traced)
113
113
  h[:http] = { request: request_hash }
114
114
  end
@@ -3,7 +3,7 @@ require 'aws/xray/segment'
3
3
  module Aws
4
4
  module Xray
5
5
  # http://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html
6
- class SubSegment < Segment
6
+ class Subsegment < Segment
7
7
  # @param [Boolean] remote
8
8
  def self.build(trace, parent_id, remote:, name:)
9
9
  new(name: name, trace: trace, parent_id: parent_id, remote: remote)
@@ -1,5 +1,5 @@
1
1
  module Aws
2
2
  module Xray
3
- VERSION = '0.19.0'
3
+ VERSION = '0.20.0'
4
4
  end
5
5
  end
@@ -10,19 +10,16 @@ module Aws
10
10
  end
11
11
  end
12
12
 
13
- class Item < Struct.new(:payload, :client)
14
- end
15
-
16
13
  @post_lock = ::Mutex.new
17
14
  @pid = $$
18
15
  class << self
19
16
  # @param [String] payload to send
20
17
  # @param [Aws::Xray::Client] client
21
- def post(payload, client)
18
+ def post(payload)
22
19
  Aws::Xray.config.logger.debug("#{Thread.current}: Worker.post received a job")
23
20
  @post_lock.synchronize do
24
21
  refresh_if_forked
25
- @queue.push(Item.new(payload, client.copy))
22
+ @queue.push(payload)
26
23
  end
27
24
  Aws::Xray.config.logger.debug("#{Thread.current}: Worker.post pushed a job")
28
25
  rescue ThreadError => e
@@ -54,10 +51,10 @@ module Aws
54
51
  th = Thread.new(@queue) do |queue|
55
52
  loop do
56
53
  Aws::Xray.config.logger.debug("#{Thread.current}: Worker#run waits a job")
57
- item = queue.pop
54
+ payload = queue.pop
58
55
  Aws::Xray.config.logger.debug("#{Thread.current}: Worker#run received a job")
59
- if item.is_a?(Item)
60
- item.client.send_payload(item.payload)
56
+ if payload
57
+ Client.send_payload(payload.to_s)
61
58
  Aws::Xray.config.logger.debug("#{Thread.current}: Worker#run sent a payload")
62
59
  else
63
60
  Aws::Xray.config.logger.debug("#{Thread.current}: Worker#run received invalid item, ignored it")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-xray
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taiki Ono
@@ -196,7 +196,7 @@ files:
196
196
  - lib/aws/xray/response.rb
197
197
  - lib/aws/xray/segment.rb
198
198
  - lib/aws/xray/sockets.rb
199
- - lib/aws/xray/sub_segment.rb
199
+ - lib/aws/xray/subsegment.rb
200
200
  - lib/aws/xray/trace.rb
201
201
  - lib/aws/xray/version.rb
202
202
  - lib/aws/xray/version_detector.rb