lightstep 0.10.9 → 0.11.1
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 +1 -1
- data/benchmark/bench.rb +1 -1
- data/example.rb +1 -1
- data/examples/fork_children/main.rb +25 -25
- data/examples/rack/inject_extract.rb +3 -2
- data/lib/lightstep/span.rb +15 -7
- data/lib/lightstep/tracer.rb +39 -58
- data/lib/lightstep/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: 60cb500c09adc67c7075714882a6ee426c12296c
|
4
|
+
data.tar.gz: bf1fa6efd5ad979bbc14801653b5a4b9f628fe11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99870437ee219e8388040f86a924aa76906762e5be9495808ffce81bcd48b0e53ab9ca01f7d7063c88b8ee768d76a883771888dd3cb66e0f9eaffbcf84ac76ce
|
7
|
+
data.tar.gz: 9505d03f36ca6da2caaa1d5610d5510193c5308d769dfe919f1a9d9ed99abf20e3405a0c18af89010d5725800de38af795186a81a3dc35278bfdac2ccc82523a
|
data/README.md
CHANGED
@@ -33,7 +33,7 @@ Or install it yourself as:
|
|
33
33
|
|
34
34
|
# Create a child span (and add some artificial delays to illustrate the timing)
|
35
35
|
sleep(0.1)
|
36
|
-
child = LightStep.start_span('my_child', child_of: span)
|
36
|
+
child = LightStep.start_span('my_child', child_of: span.span_context)
|
37
37
|
sleep(0.2)
|
38
38
|
child.finish
|
39
39
|
sleep(0.1)
|
data/benchmark/bench.rb
CHANGED
@@ -53,7 +53,7 @@ Benchmark.bm(32) do |x|
|
|
53
53
|
span = tracer.start_span('my_span')
|
54
54
|
for i in 0..10_000
|
55
55
|
carrier = {}
|
56
|
-
tracer.inject(span, LightStep::Tracer::FORMAT_TEXT_MAP, carrier)
|
56
|
+
tracer.inject(span.span_context, LightStep::Tracer::FORMAT_TEXT_MAP, carrier)
|
57
57
|
end
|
58
58
|
span.finish
|
59
59
|
end
|
data/example.rb
CHANGED
@@ -20,7 +20,7 @@ end
|
|
20
20
|
thread2 = Thread.new do
|
21
21
|
current = 1
|
22
22
|
for i in 1..16
|
23
|
-
child = LightStep.start_span('my_child', child_of: span)
|
23
|
+
child = LightStep.start_span('my_child', child_of: span.span_context)
|
24
24
|
sleep(0.1)
|
25
25
|
current *= 2
|
26
26
|
child.log(event: "2^#{i}", result: current)
|
@@ -13,14 +13,14 @@ puts 'Starting...'
|
|
13
13
|
(1..20).each do |k|
|
14
14
|
puts "Explicit reset iteration #{k}..."
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
pid = Process.fork do
|
17
|
+
10.times do
|
18
|
+
span = LightStep.start_span("my_forked_span-#{Process.pid}")
|
19
|
+
sleep(0.0025 * rand(k))
|
20
|
+
span.finish
|
21
|
+
end
|
22
|
+
LightStep.flush
|
23
|
+
end
|
24
24
|
|
25
25
|
3.times do
|
26
26
|
span = LightStep.start_span("my_process_span-#{Process.pid}")
|
@@ -30,23 +30,23 @@ puts 'Starting...'
|
|
30
30
|
span.finish
|
31
31
|
end
|
32
32
|
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
33
|
+
# Make sure redundant enable calls don't cause problems
|
34
|
+
# NOTE: disabling discards the buffer by default, so all spans
|
35
|
+
# get cleared here except the final toggle span
|
36
|
+
10.times do
|
37
|
+
LightStep.disable
|
38
|
+
LightStep.enable
|
39
|
+
LightStep.disable
|
40
|
+
LightStep.disable
|
41
|
+
LightStep.enable
|
42
|
+
LightStep.enable
|
43
|
+
span = LightStep.start_span("my_toggle_span-#{Process.pid}")
|
44
|
+
sleep(0.0025 * rand(k))
|
45
|
+
span.finish
|
46
|
+
end
|
47
|
+
|
48
|
+
puts "Parent, pid #{Process.pid}, waiting on child pid #{pid}"
|
49
|
+
Process.wait(pid)
|
50
50
|
end
|
51
51
|
|
52
52
|
puts 'Done!'
|
@@ -19,7 +19,7 @@ class Router
|
|
19
19
|
|
20
20
|
client = Net::HTTP.new("localhost", "9002")
|
21
21
|
req = Net::HTTP::Post.new("/")
|
22
|
-
@tracer.inject(span, LightStep::Tracer::FORMAT_RACK, req)
|
22
|
+
@tracer.inject(span.span_context, LightStep::Tracer::FORMAT_RACK, req)
|
23
23
|
res = client.request(req)
|
24
24
|
|
25
25
|
span.log(event: "application_response", response: res.to_s)
|
@@ -36,7 +36,8 @@ class App
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def call(env)
|
39
|
-
|
39
|
+
wire_ctx = @tracer.extract(LightStep::Tracer::FORMAT_RACK, env)
|
40
|
+
span = @tracer.start_span("app_call", child_of: wire_ctx)
|
40
41
|
puts "child #{span.to_h[:trace_guid]}"
|
41
42
|
span.log(event: "application", env: env)
|
42
43
|
sleep 0.05
|
data/lib/lightstep/span.rb
CHANGED
@@ -17,20 +17,22 @@ module LightStep
|
|
17
17
|
#
|
18
18
|
# @param tracer [Tracer] the tracer that created this span
|
19
19
|
# @param operation_name [String] the operation name of this span. If it's
|
20
|
-
#
|
21
|
-
# @param
|
22
|
-
# @param trace_guid [String] the guid of this span's trace
|
20
|
+
# not a String it will be encoded with to_s.
|
21
|
+
# @param child_of [SpanContext] the parent SpanContext (per child_of)
|
23
22
|
# @param start_micros [Numeric] start time of the span in microseconds
|
24
|
-
# @
|
23
|
+
# @param tags [Hash] initial key:value tags (per set_tag) for the Span
|
24
|
+
# @param max_log_records [Numeric] maximum allowable number of log records
|
25
|
+
# for the Span
|
26
|
+
# @return [Span] a started Span
|
25
27
|
def initialize(
|
26
28
|
tracer:,
|
27
29
|
operation_name:,
|
28
|
-
|
29
|
-
trace_id:,
|
30
|
+
child_of: nil,
|
30
31
|
start_micros:,
|
31
32
|
tags: nil,
|
32
33
|
max_log_records:
|
33
34
|
)
|
35
|
+
child_of = child_of.span_context if (Span === child_of)
|
34
36
|
@tags = Concurrent::Hash.new
|
35
37
|
@tags.update(tags) unless tags.nil?
|
36
38
|
@log_records = Concurrent::Array.new
|
@@ -40,8 +42,14 @@ module LightStep
|
|
40
42
|
@tracer = tracer
|
41
43
|
self.operation_name = operation_name.to_s
|
42
44
|
self.start_micros = start_micros
|
45
|
+
|
46
|
+
trace_id = (SpanContext === child_of ? child_of.trace_id : LightStep.guid)
|
43
47
|
@span_context = SpanContext.new(id: LightStep.guid, trace_id: trace_id)
|
44
|
-
|
48
|
+
|
49
|
+
if SpanContext === child_of
|
50
|
+
set_baggage(child_of.baggage)
|
51
|
+
set_tag(:parent_span_guid, child_of.id)
|
52
|
+
end
|
45
53
|
end
|
46
54
|
|
47
55
|
# Set a tag value on this span
|
data/lib/lightstep/tracer.rb
CHANGED
@@ -53,72 +53,60 @@ module LightStep
|
|
53
53
|
@reporter.period = seconds
|
54
54
|
end
|
55
55
|
|
56
|
-
# TODO(
|
56
|
+
# TODO(bhs): Support FollowsFrom and multiple references
|
57
57
|
|
58
58
|
# Starts a new span.
|
59
|
-
#
|
60
|
-
# @param
|
59
|
+
#
|
60
|
+
# @param operation_name [String] The operation name for the Span
|
61
|
+
# @param child_of [SpanContext] SpanContext that acts as a parent to
|
62
|
+
# the newly-started Span. If a Span instance is provided, its
|
63
|
+
# .span_context is automatically substituted.
|
61
64
|
# @param start_time [Time] When the Span started, if not now
|
62
|
-
# @param tags [Hash]
|
65
|
+
# @param tags [Hash] Tags to assign to the Span at start time
|
63
66
|
# @return [Span]
|
64
67
|
def start_span(operation_name, child_of: nil, start_time: nil, tags: nil)
|
65
|
-
|
66
|
-
trace_id = nil
|
67
|
-
if Span === child_of
|
68
|
-
child_of_id = child_of.span_context.id
|
69
|
-
trace_id = child_of.span_context.trace_id
|
70
|
-
else
|
71
|
-
trace_id = LightStep.guid
|
72
|
-
end
|
73
|
-
|
74
|
-
span = Span.new(
|
68
|
+
Span.new(
|
75
69
|
tracer: self,
|
76
70
|
operation_name: operation_name,
|
77
|
-
|
78
|
-
trace_id: trace_id,
|
71
|
+
child_of: child_of,
|
79
72
|
start_micros: start_time.nil? ? LightStep.micros(Time.now) : LightStep.micros(start_time),
|
80
73
|
tags: tags,
|
81
|
-
max_log_records: max_log_records
|
74
|
+
max_log_records: max_log_records,
|
82
75
|
)
|
83
|
-
|
84
|
-
if Span === child_of
|
85
|
-
span.set_baggage(child_of.span_context.baggage)
|
86
|
-
end
|
87
|
-
|
88
|
-
span
|
89
76
|
end
|
90
77
|
|
91
|
-
# Inject a
|
92
|
-
#
|
78
|
+
# Inject a SpanContext into the given carrier
|
79
|
+
#
|
80
|
+
# @param spancontext [SpanContext]
|
93
81
|
# @param format [LightStep::Tracer::FORMAT_TEXT_MAP, LightStep::Tracer::FORMAT_BINARY]
|
94
82
|
# @param carrier [Hash]
|
95
|
-
def inject(
|
83
|
+
def inject(span_context, format, carrier)
|
84
|
+
child_of = child_of.span_context if (Span === child_of)
|
96
85
|
case format
|
97
86
|
when LightStep::Tracer::FORMAT_TEXT_MAP
|
98
|
-
inject_to_text_map(
|
87
|
+
inject_to_text_map(span_context, carrier)
|
99
88
|
when LightStep::Tracer::FORMAT_BINARY
|
100
89
|
warn 'Binary inject format not yet implemented'
|
101
90
|
when LightStep::Tracer::FORMAT_RACK
|
102
|
-
inject_to_rack(
|
91
|
+
inject_to_rack(span_context, carrier)
|
103
92
|
else
|
104
93
|
warn 'Unknown inject format'
|
105
94
|
end
|
106
95
|
end
|
107
96
|
|
108
|
-
# Extract a
|
109
|
-
# @param operation_name [String]
|
97
|
+
# Extract a SpanContext from a carrier
|
110
98
|
# @param format [LightStep::Tracer::FORMAT_TEXT_MAP, LightStep::Tracer::FORMAT_BINARY]
|
111
99
|
# @param carrier [Hash]
|
112
|
-
# @return [
|
113
|
-
def extract(
|
100
|
+
# @return [SpanContext] the extracted SpanContext or nil if none could be found
|
101
|
+
def extract(format, carrier)
|
114
102
|
case format
|
115
103
|
when LightStep::Tracer::FORMAT_TEXT_MAP
|
116
|
-
extract_from_text_map(
|
104
|
+
extract_from_text_map(carrier)
|
117
105
|
when LightStep::Tracer::FORMAT_BINARY
|
118
106
|
warn 'Binary join format not yet implemented'
|
119
107
|
nil
|
120
108
|
when LightStep::Tracer::FORMAT_RACK
|
121
|
-
extract_from_rack(
|
109
|
+
extract_from_rack(carrier)
|
122
110
|
else
|
123
111
|
warn 'Unknown join format'
|
124
112
|
nil
|
@@ -192,32 +180,23 @@ module LightStep
|
|
192
180
|
DEFAULT_MAX_SPAN_RECORDS = 1000
|
193
181
|
MIN_MAX_SPAN_RECORDS = 1
|
194
182
|
|
195
|
-
def inject_to_text_map(
|
196
|
-
carrier[CARRIER_SPAN_ID] =
|
197
|
-
carrier[CARRIER_TRACE_ID] =
|
183
|
+
def inject_to_text_map(span_context, carrier)
|
184
|
+
carrier[CARRIER_SPAN_ID] = span_context.id
|
185
|
+
carrier[CARRIER_TRACE_ID] = span_context.trace_id unless span_context.trace_id.nil?
|
198
186
|
carrier[CARRIER_SAMPLED] = 'true'
|
199
187
|
|
200
|
-
|
188
|
+
span_context.baggage.each do |key, value|
|
201
189
|
carrier[CARRIER_BAGGAGE_PREFIX + key] = value
|
202
190
|
end
|
203
191
|
end
|
204
192
|
|
205
|
-
def extract_from_text_map(
|
193
|
+
def extract_from_text_map(carrier)
|
206
194
|
# If the carrier does not have both the span_id and trace_id key
|
207
195
|
# skip the processing and just return a normal span
|
208
196
|
if !carrier.has_key?(CARRIER_SPAN_ID) || !carrier.has_key?(CARRIER_TRACE_ID)
|
209
|
-
return
|
197
|
+
return nil
|
210
198
|
end
|
211
199
|
|
212
|
-
span = Span.new(
|
213
|
-
tracer: self,
|
214
|
-
operation_name: operation_name,
|
215
|
-
start_micros: LightStep.micros(Time.now),
|
216
|
-
child_of_id: carrier[CARRIER_SPAN_ID],
|
217
|
-
trace_id: carrier[CARRIER_TRACE_ID],
|
218
|
-
max_log_records: max_log_records
|
219
|
-
)
|
220
|
-
|
221
200
|
baggage = carrier.reduce({}) do |baggage, tuple|
|
222
201
|
key, value = tuple
|
223
202
|
if key.start_with?(CARRIER_BAGGAGE_PREFIX)
|
@@ -226,17 +205,19 @@ module LightStep
|
|
226
205
|
end
|
227
206
|
baggage
|
228
207
|
end
|
229
|
-
|
230
|
-
|
231
|
-
|
208
|
+
SpanContext.new(
|
209
|
+
id: carrier[CARRIER_SPAN_ID],
|
210
|
+
trace_id: carrier[CARRIER_TRACE_ID],
|
211
|
+
baggage: baggage,
|
212
|
+
)
|
232
213
|
end
|
233
214
|
|
234
|
-
def inject_to_rack(
|
235
|
-
carrier[CARRIER_SPAN_ID] =
|
236
|
-
carrier[CARRIER_TRACE_ID] =
|
215
|
+
def inject_to_rack(span_context, carrier)
|
216
|
+
carrier[CARRIER_SPAN_ID] = span_context.id
|
217
|
+
carrier[CARRIER_TRACE_ID] = span_context.trace_id unless span_context.trace_id.nil?
|
237
218
|
carrier[CARRIER_SAMPLED] = 'true'
|
238
219
|
|
239
|
-
|
220
|
+
span_context.baggage.each do |key, value|
|
240
221
|
if key =~ /[^A-Za-z0-9\-_]/
|
241
222
|
# TODO: log the error internally
|
242
223
|
next
|
@@ -245,8 +226,8 @@ module LightStep
|
|
245
226
|
end
|
246
227
|
end
|
247
228
|
|
248
|
-
def extract_from_rack(
|
249
|
-
extract_from_text_map(
|
229
|
+
def extract_from_rack(env)
|
230
|
+
extract_from_text_map(env.reduce({}){|memo, tuple|
|
250
231
|
raw_header, value = tuple
|
251
232
|
header = raw_header.gsub(/^HTTP_/, '').gsub("_", "-").downcase
|
252
233
|
|
data/lib/lightstep/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lightstep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bcronin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|