aws-xray 0.11.0 → 0.12.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 +4 -4
- data/README.md +11 -1
- data/lib/aws/xray.rb +0 -2
- data/lib/aws/xray/client.rb +14 -14
- data/lib/aws/xray/context.rb +59 -29
- data/lib/aws/xray/sub_segment.rb +2 -2
- data/lib/aws/xray/trace.rb +5 -3
- data/lib/aws/xray/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ecfbca12fbd25e263e57ef71b541a24e305fd51
|
4
|
+
data.tar.gz: 693d7427b8e08fb09c7ef44c6fce33feab3cfb21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '081c37ab015b24bdbdd4c2e1b150c0bfd8b6f039cab16dfb15f93ba5549cc47fe12a49e39e01cbe87f19f9a168956d1368e87ec85ded71f5aa2927eba3477ee4'
|
7
|
+
data.tar.gz: 20c0d925ebb6d9ecbf81a8f0b73d9a07587f2f4661174586892f44e170665b372a2730871f673ecfeb11d2d06acd5e78d178cf3ad329b3337a3da27ea7ff61d9
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ AWS X-Ray is a ditributed tracing system. See more detail about AWS X-Ray at [of
|
|
10
10
|
## Features
|
11
11
|
- Rack middleware.
|
12
12
|
- Faraday middleware.
|
13
|
-
- Propagatin support
|
13
|
+
- Propagatin support in both single and multi thread environment.
|
14
14
|
- Tracing HTTP request/response.
|
15
15
|
- Tracing errors.
|
16
16
|
- Annotation and metadata support.
|
@@ -88,6 +88,16 @@ Aws::Xray.trace(name: 'my-app-batch') do |seg|
|
|
88
88
|
end
|
89
89
|
```
|
90
90
|
|
91
|
+
### Multi threaded environment
|
92
|
+
Tracing context is thread local. To pass current tracing context, copy current tracing context:
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
Thread.new(Aws::Xray::Context.current.copy) do |context|
|
96
|
+
Aws::Xray::Context.set_current(context)
|
97
|
+
# Do something
|
98
|
+
end
|
99
|
+
```
|
100
|
+
|
91
101
|
## Configurations
|
92
102
|
### X-Ray agent location
|
93
103
|
aws-xray does not send any trace data dby efault. Set `AWS_XRAY_LOCATION` environment variable like `AWS_XRAY_LOCATION=localhost:2000`
|
data/lib/aws/xray.rb
CHANGED
data/lib/aws/xray/client.rb
CHANGED
@@ -2,28 +2,28 @@ require 'socket'
|
|
2
2
|
|
3
3
|
module Aws
|
4
4
|
module Xray
|
5
|
+
# Own the responsibility of holding destination address and sending
|
6
|
+
# segments.
|
5
7
|
class Client
|
6
|
-
# sock is for test
|
7
|
-
#
|
8
|
-
# XXX: keep options for implmenting copying later.
|
8
|
+
# sock is for test.
|
9
9
|
def initialize(host: nil, port: nil, sock: nil)
|
10
|
-
@host, @port = host, port
|
11
|
-
@sock = sock
|
10
|
+
@host, @port = host.freeze, port.freeze
|
11
|
+
@sock = sock
|
12
|
+
freeze
|
12
13
|
end
|
13
14
|
|
15
|
+
# When UDPSocket#send can not send all bytes, just give up it.
|
14
16
|
# @param [Aws::Xray::Segment] segment
|
15
17
|
def send_segment(segment)
|
16
|
-
segment.finish
|
17
18
|
payload = %!{"format": "json", "version": 1}\n#{segment.to_json}\n!
|
18
|
-
|
19
|
-
# TODO: retry
|
20
|
-
if payload.size != len
|
21
|
-
$stderr.puts("Can not send all bytes: #{len} sent")
|
22
|
-
end
|
23
|
-
end
|
19
|
+
sock = @sock || UDPSocket.new
|
24
20
|
|
25
|
-
|
26
|
-
|
21
|
+
begin
|
22
|
+
len = sock.send(payload, 0, @host, @port)
|
23
|
+
$stderr.puts("Can not send all bytes: #{len} sent") if payload.size != len
|
24
|
+
ensure
|
25
|
+
sock.close
|
26
|
+
end
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/aws/xray/context.rb
CHANGED
@@ -4,31 +4,40 @@ require 'aws/xray/sub_segment'
|
|
4
4
|
module Aws
|
5
5
|
module Xray
|
6
6
|
class Context
|
7
|
-
|
8
|
-
|
7
|
+
VAR_NAME = :_aws_xray_context_
|
8
|
+
|
9
|
+
class BaseError < ::StandardError; end
|
10
|
+
|
11
|
+
class NotSetError < BaseError
|
12
|
+
def initialize
|
13
|
+
super('Context is not set for this thread')
|
14
|
+
end
|
15
|
+
end
|
9
16
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
17
|
+
class SegmentDidNotStartError < BaseError
|
18
|
+
def initialize
|
19
|
+
super('Segment did not start yet')
|
14
20
|
end
|
21
|
+
end
|
15
22
|
|
23
|
+
class << self
|
16
24
|
# @return [Aws::Xray::Context]
|
17
25
|
def current
|
18
26
|
Thread.current.thread_variable_get(VAR_NAME) || raise(NotSetError)
|
19
27
|
end
|
20
28
|
|
29
|
+
# @param [Aws::Xray::Context] context
|
30
|
+
def set_current(context)
|
31
|
+
Thread.current.thread_variable_set(VAR_NAME, context)
|
32
|
+
end
|
33
|
+
|
21
34
|
# @return [Boolean]
|
22
35
|
def started?
|
23
36
|
!!Thread.current.thread_variable_get(VAR_NAME)
|
24
37
|
end
|
25
38
|
|
26
39
|
# @param [String] name logical name of this tracing context.
|
27
|
-
# @param [Aws::Xray::Client] client
|
28
|
-
# socket inside client can live longer than this context. For example
|
29
|
-
# the life-cycle of context is HTTP request based but the socket can
|
30
|
-
# live over HTTP requests cycle, it is opened when application starts
|
31
|
-
# then is closed when application exits.
|
40
|
+
# @param [Aws::Xray::Client] client
|
32
41
|
# @param [Aws::Xray::Trace] trace newly generated trace or created with
|
33
42
|
# HTTP request header.
|
34
43
|
# @yield [Aws::Xray::Context] newly created context.
|
@@ -52,11 +61,23 @@ module Aws
|
|
52
61
|
|
53
62
|
attr_reader :name
|
54
63
|
|
55
|
-
|
56
|
-
|
64
|
+
# client and trace are frozen by default.
|
65
|
+
def initialize(name, client, trace, base_segment_id = nil)
|
66
|
+
@name = name.freeze
|
57
67
|
@client = client
|
58
68
|
@trace = trace
|
59
|
-
@
|
69
|
+
@base_segment_id = base_segment_id
|
70
|
+
end
|
71
|
+
|
72
|
+
# Curretly context object is thread safe, so copying is not necessary,
|
73
|
+
# but in case we need this, offer copy interface for multi threaded
|
74
|
+
# environment.
|
75
|
+
#
|
76
|
+
# client and trace should be imutable and thread-safe.
|
77
|
+
#
|
78
|
+
# See README for example.
|
79
|
+
def copy
|
80
|
+
self.class.new(@name, @client, @trace, @base_segment_id)
|
60
81
|
end
|
61
82
|
|
62
83
|
# Rescue standard errors and record the error to the segment.
|
@@ -65,13 +86,18 @@ module Aws
|
|
65
86
|
# @yield [Aws::Xray::Segment]
|
66
87
|
# @return [Object] A value which given block returns.
|
67
88
|
def base_trace
|
68
|
-
|
69
|
-
@
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
89
|
+
base_segment = Segment.build(@name, @trace)
|
90
|
+
@base_segment_id = base_segment.id.freeze
|
91
|
+
|
92
|
+
begin
|
93
|
+
yield base_segment
|
94
|
+
rescue => e
|
95
|
+
base_segment.set_error(fault: true, e: e)
|
96
|
+
raise e
|
97
|
+
ensure
|
98
|
+
base_segment.finish
|
99
|
+
@client.send_segment(base_segment)
|
100
|
+
end
|
75
101
|
end
|
76
102
|
|
77
103
|
# Rescue standard errors and record the error to the sub segment.
|
@@ -82,14 +108,18 @@ module Aws
|
|
82
108
|
# @yield [Aws::Xray::SubSegment]
|
83
109
|
# @return [Object] A value which given block returns.
|
84
110
|
def child_trace(remote:, name:)
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
111
|
+
raise SegmentDidNotStartError unless @base_segment_id
|
112
|
+
sub = SubSegment.build(@trace, @base_segment_id, remote: remote, name: name)
|
113
|
+
|
114
|
+
begin
|
115
|
+
yield sub
|
116
|
+
rescue => e
|
117
|
+
sub.set_error(fault: true, e: e)
|
118
|
+
raise e
|
119
|
+
ensure
|
120
|
+
sub.finish
|
121
|
+
@client.send_segment(sub)
|
122
|
+
end
|
93
123
|
end
|
94
124
|
end
|
95
125
|
end
|
data/lib/aws/xray/sub_segment.rb
CHANGED
@@ -5,8 +5,8 @@ module Aws
|
|
5
5
|
# http://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html
|
6
6
|
class SubSegment < Segment
|
7
7
|
# @param [Boolean] remote
|
8
|
-
def self.build(trace,
|
9
|
-
new(name: name, trace: trace, parent_id:
|
8
|
+
def self.build(trace, parent_id, remote:, name:)
|
9
|
+
new(name: name, trace: trace, parent_id: parent_id, remote: remote)
|
10
10
|
end
|
11
11
|
|
12
12
|
TYPE_NAME = 'subsegment'.freeze
|
data/lib/aws/xray/trace.rb
CHANGED
@@ -3,6 +3,7 @@ require 'securerandom'
|
|
3
3
|
|
4
4
|
module Aws
|
5
5
|
module Xray
|
6
|
+
# Imutable
|
6
7
|
class Trace
|
7
8
|
class << self
|
8
9
|
def generate(now = Time.now)
|
@@ -25,9 +26,10 @@ module Aws
|
|
25
26
|
attr_reader :root, :parent
|
26
27
|
|
27
28
|
def initialize(root:, sampled: true, parent: nil)
|
28
|
-
@root = root
|
29
|
+
@root = root.freeze
|
29
30
|
@sampled = sampled
|
30
|
-
@parent = parent
|
31
|
+
@parent = parent.freeze
|
32
|
+
freeze
|
31
33
|
end
|
32
34
|
|
33
35
|
def to_header_value
|
@@ -46,7 +48,7 @@ module Aws
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def copy(parent:)
|
49
|
-
self.class.new(root: @root, sampled: @sampled, parent: parent)
|
51
|
+
self.class.new(root: @root.dup, sampled: @sampled, parent: parent.freeze)
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
data/lib/aws/xray/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-xray
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taiki Ono
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|