zipkin-tracer 0.45.0 → 0.46.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 +3 -0
- data/README.md +32 -0
- data/lib/zipkin-tracer/hostname_resolver.rb +8 -7
- data/lib/zipkin-tracer/sqs/adapter.rb +4 -0
- data/lib/zipkin-tracer/sqs/zipkin-tracer.rb +57 -0
- data/lib/zipkin-tracer/trace.rb +2 -2
- data/lib/zipkin-tracer/version.rb +1 -1
- data/lib/zipkin-tracer/zipkin_sender_base.rb +5 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: facfab4311d80aff894d2c5dec5253ef122ee5206328d875e41d2174373d060e
|
4
|
+
data.tar.gz: eb036ff2009dc9b70933881c12a93cead129127679bbdf9c538e6df067dc04c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f99f5a59fdfd10c968fb99779aa0c7a97a559b45a36a787c886cac40845964e5cb98a5048313094ecab328d420ed3b01936cd66e1929389fef2e5eed1401b44
|
7
|
+
data.tar.gz: 5edb8af0059d1486a1105cf325ec21ce548f795f0a5078b67e8846d0cda23d05db2ab83075a27d1f6f46b173c10bd324af0683e26bc7ea5bd0695424e13880ba
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -81,6 +81,38 @@ end
|
|
81
81
|
|
82
82
|
By default workers aren't traced. You can specify the workers that you want to trace with traceable_workers config option. If you want all your workers to be traced pass [:all] to traceable_workers option (traceable_workers: [:all]).
|
83
83
|
|
84
|
+
### Tracing Amazon SQS messages
|
85
|
+
|
86
|
+
Amazon SQS tracing can be turned on by requiring [zipkin-tracer/sqs/adapter](lib/zipkin-tracer/sqs/adapter.rb):
|
87
|
+
```ruby
|
88
|
+
require 'zipkin-tracer/sqs/adapter'
|
89
|
+
```
|
90
|
+
|
91
|
+
This SQS adapter overrides the `send_message` and `send_message_batch` methods to add trace data as message attributes and to generate a producer span when the methods are called. Since all SQS messages are affected, it is not recommended to use this feature with the [SQS sender](lib/zipkin-tracer/zipkin_sqs_sender.rb).
|
92
|
+
|
93
|
+
When receiving messages, you need to pass the `message_attribute_names: ['All']` option to retrive message attributes:
|
94
|
+
```ruby
|
95
|
+
resp = sqs.receive_message(
|
96
|
+
queue_url: queue_url,
|
97
|
+
message_attribute_names: ['All']
|
98
|
+
)
|
99
|
+
```
|
100
|
+
|
101
|
+
Then you can utilize the [TraceWrapper](#tracewrapper) class to generate a consumer span:
|
102
|
+
```ruby
|
103
|
+
msg = resp.messages.first
|
104
|
+
trace_context = msg.message_attributes.each_with_object({}) { |(key, value), hsh| hsh[key.to_sym] = value.string_value }
|
105
|
+
|
106
|
+
TraceWrapper.wrap_in_custom_span(config, 'receive_message',
|
107
|
+
span_kind: Trace::Span::Kind::CONSUMER,
|
108
|
+
trace_context: trace_context
|
109
|
+
) do |span|
|
110
|
+
span.remote_endpoint = Trace::Endpoint.remote_endpoint(nil, 'amazon-sqs')
|
111
|
+
span.record_tag('queue.url', queue_url)
|
112
|
+
:
|
113
|
+
end
|
114
|
+
```
|
115
|
+
|
84
116
|
### Local tracing
|
85
117
|
|
86
118
|
`ZipkinTracer::TraceClient` provides an API to record local traces in your application.
|
@@ -11,15 +11,17 @@ module ZipkinTracer
|
|
11
11
|
|
12
12
|
each_endpoint(spans) do |endpoint|
|
13
13
|
hostname = endpoint.ipv4
|
14
|
-
unless
|
15
|
-
|
16
|
-
|
14
|
+
next unless hostname
|
15
|
+
next if resolved_ip_address?(hostname.to_s)
|
16
|
+
|
17
|
+
endpoint.ipv4 = resolved_hosts[hostname]
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
21
|
private
|
22
|
+
|
21
23
|
LOCALHOST = '127.0.0.1'.freeze
|
22
|
-
LOCALHOST_I32 = 0x7f000001
|
24
|
+
LOCALHOST_I32 = 0x7f000001
|
23
25
|
MAX_I32 = ((2 ** 31) - 1)
|
24
26
|
MASK = (2 ** 32) - 1
|
25
27
|
IP_FIELD = 3
|
@@ -49,10 +51,9 @@ module ZipkinTracer
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def resolve(hosts, ip_format)
|
52
|
-
hosts.
|
54
|
+
hosts.each_with_object({}) do |host, host_map|
|
53
55
|
hostname = host.ipv4 # This field has been temporarly used to store the hostname.
|
54
|
-
host_map[hostname]
|
55
|
-
host_map
|
56
|
+
host_map[hostname] = host_to_format(hostname, ip_format) if hostname
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module ZipkinTracer
|
2
|
+
# This module is designed to prepend to the SQS client to add trace data as message attributes.
|
3
|
+
# https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-sqs/lib/aws-sdk-sqs/client.rb
|
4
|
+
module SqsHandler
|
5
|
+
def send_message(params = {}, options = {})
|
6
|
+
zipkin_sqs_trace_wrapper(params, __method__) { |params_with_trace| super(params_with_trace, options) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_message_batch(params = {}, options = {})
|
10
|
+
zipkin_sqs_trace_wrapper(params, __method__) { |params_with_trace| super(params_with_trace, options) }
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
ZIPKIN_KEYS = %i[trace_id parent_id span_id sampled].freeze
|
16
|
+
ZIPKIN_REMOTE_ENDPOINT_SQS = Trace::Endpoint.remote_endpoint(nil, 'amazon-sqs')
|
17
|
+
|
18
|
+
def zipkin_sqs_trace_wrapper(params, method_name)
|
19
|
+
trace_id = TraceGenerator.new.next_trace_id
|
20
|
+
zipkin_set_message_attributes(params, method_name, trace_id)
|
21
|
+
|
22
|
+
TraceContainer.with_trace_id(trace_id) do
|
23
|
+
if Trace.tracer && trace_id.sampled?
|
24
|
+
Trace.tracer.with_new_span(trace_id, method_name) do |span|
|
25
|
+
span.kind = Trace::Span::Kind::PRODUCER
|
26
|
+
span.remote_endpoint = ZIPKIN_REMOTE_ENDPOINT_SQS
|
27
|
+
span.record_tag('queue.url', params[:queue_url])
|
28
|
+
yield(params)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
yield(params)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def zipkin_set_message_attributes(params, method_name, trace_id)
|
37
|
+
attributes = zipkin_message_attributes(trace_id)
|
38
|
+
case method_name
|
39
|
+
when :send_message
|
40
|
+
params[:message_attributes] = attributes.merge(params[:message_attributes] || {})
|
41
|
+
when :send_message_batch
|
42
|
+
params[:entries].each do |entry|
|
43
|
+
entry[:message_attributes] = attributes.merge(entry[:message_attributes] || {})
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def zipkin_message_attributes(trace_id)
|
49
|
+
ZIPKIN_KEYS.each_with_object({}) do |zipkin_key, message_attributes|
|
50
|
+
zipkin_value = trace_id.send(zipkin_key)
|
51
|
+
next unless zipkin_value
|
52
|
+
|
53
|
+
message_attributes[zipkin_key] = { string_value: zipkin_value.to_s, data_type: 'String' }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/zipkin-tracer/trace.rb
CHANGED
@@ -277,8 +277,8 @@ module Trace
|
|
277
277
|
end
|
278
278
|
|
279
279
|
def self.remote_endpoint(url, remote_service_name)
|
280
|
-
service_name = remote_service_name || url
|
281
|
-
Endpoint.new(url
|
280
|
+
service_name = remote_service_name || url&.host&.split('.')&.first || UNKNOWN_URL # default to url-derived service name
|
281
|
+
Endpoint.new(url&.host, url&.port, service_name)
|
282
282
|
end
|
283
283
|
|
284
284
|
def to_h
|
@@ -7,8 +7,7 @@ module Trace
|
|
7
7
|
# Senders dealing with zipkin should inherit from this class and implement the
|
8
8
|
# flush! method which actually sends the information
|
9
9
|
class ZipkinSenderBase
|
10
|
-
|
11
|
-
def initialize(options={})
|
10
|
+
def initialize(options = {})
|
12
11
|
@options = options
|
13
12
|
reset
|
14
13
|
end
|
@@ -40,7 +39,10 @@ module Trace
|
|
40
39
|
|
41
40
|
def skip_flush?(span)
|
42
41
|
return true if span.kind == Trace::Span::Kind::CLIENT && span.has_parent_span?
|
43
|
-
|
42
|
+
|
43
|
+
if span.kind == Trace::Span::Kind::PRODUCER
|
44
|
+
return true if spans.any? { |s| s.kind == Trace::Span::Kind::SERVER || s.kind == Trace::Span::Kind::CONSUMER }
|
45
|
+
end
|
44
46
|
end
|
45
47
|
|
46
48
|
def flush!
|
@@ -62,6 +64,5 @@ module Trace
|
|
62
64
|
def reset
|
63
65
|
Thread.current[THREAD_KEY] = []
|
64
66
|
end
|
65
|
-
|
66
67
|
end
|
67
68
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zipkin-tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.46.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franklin Hu
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2020-05-
|
17
|
+
date: 2020-05-29 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: faraday
|
@@ -241,6 +241,8 @@ files:
|
|
241
241
|
- lib/zipkin-tracer/rack/zipkin-tracer.rb
|
242
242
|
- lib/zipkin-tracer/rack/zipkin_env.rb
|
243
243
|
- lib/zipkin-tracer/sidekiq/middleware.rb
|
244
|
+
- lib/zipkin-tracer/sqs/adapter.rb
|
245
|
+
- lib/zipkin-tracer/sqs/zipkin-tracer.rb
|
244
246
|
- lib/zipkin-tracer/trace.rb
|
245
247
|
- lib/zipkin-tracer/trace_client.rb
|
246
248
|
- lib/zipkin-tracer/trace_container.rb
|