lightstep 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d77e4a3fbc58434184011abfd31e4c323af79615
4
- data.tar.gz: 4cd3e0df3b6f019633e6c2f581a42122cdba81cb
3
+ metadata.gz: a02601ce2a4492bb33a7fd9efee072355800c67b
4
+ data.tar.gz: 9ac1d7f5f660d442382c7c76875a719502b4d94e
5
5
  SHA512:
6
- metadata.gz: da86124b4d723ee69d538cae3139c4ddf3d3dbe08918122d52638e75000eb98e56b125383c555db2033d64cb9dd2daa39f2ec80b45dc43f00703294488cee1b7
7
- data.tar.gz: 2bc31803d7967cf329764aace93653f851a53b88fd4801a3852f71dafdc5a114d71b3d1a1d28f250aa67aee24a96dc277a3e05e5895737e264afe84296e38423
6
+ metadata.gz: b0143c3a49f63d4b92a6d7df08eb719bc2702e69663b8a240954aa252869d88071d1f99da25764eba8c187d621b042e2c32f5ce187ae259c2db29f74be2f6833
7
+ data.tar.gz: 6ff5a25034f87dd93fe18c40df50bfb9b2036af6a00da19dcfd9b95177c575dfc05a352a350d7145e5c299a69b40fc257f5b38b7188064089d82083bd5014b5c
data/Makefile CHANGED
@@ -7,6 +7,7 @@ test:
7
7
  bundle exec rake spec
8
8
  ruby example.rb
9
9
  ruby examples/fork_children/main.rb
10
+ ruby examples/rack/inject_extract.rb
10
11
 
11
12
  benchmark:
12
13
  ruby benchmark/bench.rb
data/benchmark.rb ADDED
@@ -0,0 +1,140 @@
1
+ require 'json'
2
+ require 'lightstep'
3
+ require 'net/http'
4
+ require 'pp'
5
+ require 'uri'
6
+
7
+ $base_url = "http://localhost:8000"
8
+
9
+ $test_tracer = LightStep::Tracer.new(
10
+ component_name: 'lightstep/ruby/example',
11
+ transport: LightStep::Transport::HTTPJSON.new(
12
+ host: 'localhost',
13
+ port: 8000,
14
+ encryption: LightStep::Transport::HTTPJSON::ENCRYPTION_NONE,
15
+ access_token: 'none'
16
+ )
17
+ )
18
+ $noop_tracer = LightStep::Tracer.new(
19
+ component_name: 'ruby',
20
+ transport: LightStep::Transport::Nil.new
21
+ )
22
+
23
+ $prime_work = 982451653
24
+ $logs_memory = ""
25
+ $logs_size_max = (1 << 20)
26
+ $nanos_per_second = 1e9
27
+
28
+ def prepare_logs()
29
+ (0..$logs_size_max-1).each do |x|
30
+ $logs_memory << ("A".ord + x%26).chr
31
+ end
32
+ end
33
+
34
+ prepare_logs()
35
+
36
+ def do_work(n)
37
+ x = $prime_work
38
+ while n != 0 do
39
+ x *= $prime_work
40
+ x %= 4294967296
41
+ n -= 1
42
+ end
43
+ return x
44
+ end
45
+
46
+ def test_body(tracer, control)
47
+ repeat = control['Repeat']
48
+ sleepnano = control['Sleep']
49
+ sleepival = control['SleepInterval']
50
+ work = control['Work']
51
+ logn = control['NumLogs']
52
+ logsz = control['BytesPerLog']
53
+ sleep_debt = 0 # Accumulated nanoseconds
54
+ sleeps = 0
55
+ answer = 0
56
+
57
+ (1..repeat).each do
58
+ span = tracer.start_span('span/test')
59
+ (1..logn).each do
60
+ span.log_event("testlog", $logs_memory[0..logsz])
61
+ end
62
+ answer += do_work(work)
63
+ span.finish()
64
+ sleep_debt += sleepnano
65
+ if sleep_debt <= sleepival
66
+ next
67
+ end
68
+ before = Time.now.to_f
69
+ sleep(sleep_debt / $nanos_per_second)
70
+ elapsed_secs = Time.now.to_f - before
71
+ elapsed = (elapsed_secs * $nanos_per_second).round
72
+ sleeps += elapsed_secs
73
+ sleep_debt -= elapsed
74
+ end
75
+ return sleeps, answer
76
+ end
77
+
78
+ def loop()
79
+ while true do
80
+ uri = URI.parse($base_url + '/control')
81
+ resp = Net::HTTP.get(uri)
82
+ control = JSON.parse(resp)
83
+
84
+ concurrent = control['Concurrent']
85
+ trace = control['Trace']
86
+
87
+ if control['Exit']
88
+ exit(0)
89
+ end
90
+
91
+ tracer = nil
92
+ if trace
93
+ tracer = $test_tracer
94
+ else
95
+ tracer = $noop_tracer
96
+ end
97
+
98
+ before = Time.now.to_f
99
+
100
+ # Note: Concurrency test not implemented
101
+ sleeps, answer = test_body(tracer, control)
102
+
103
+ after = Time.now.to_f
104
+ flush_dur = 0.0
105
+
106
+ if trace
107
+ tracer.flush()
108
+ flush_dur = Time.now.to_f - after
109
+ end
110
+
111
+ elapsed = after - before
112
+
113
+ path = sprintf('/result?timing=%f&flush=%f&s=%f&a=%s', elapsed, flush_dur, sleeps, answer)
114
+
115
+ uri = URI.parse($base_url + path)
116
+ resp = Net::HTTP.get(uri)
117
+ end
118
+ end
119
+
120
+ def backtrace_for_all_threads(signame)
121
+ File.open("/tmp/ruby_backtrace_#{Process.pid}.txt","a") do |f|
122
+ f.puts "--- got signal #{signame}, dump backtrace for all threads at #{Time.now}"
123
+ if Thread.current.respond_to?(:backtrace)
124
+ Thread.list.each do |t|
125
+ f.puts t.inspect
126
+ PP.pp(t.backtrace.delete_if {|frame| frame =~ /^#{File.expand_path(__FILE__)}/},
127
+ f) # remove frames resulting from calling this method
128
+ end
129
+ else
130
+ PP.pp(caller.delete_if {|frame| frame =~ /^#{File.expand_path(__FILE__)}/},
131
+ f) # remove frames resulting from calling this method
132
+ end
133
+ end
134
+ end
135
+
136
+ Signal.trap(29) do
137
+ backtrace_for_all_threads("INFO")
138
+ end
139
+
140
+ loop()
data/example.rb CHANGED
@@ -31,4 +31,4 @@ end
31
31
  span.finish
32
32
  LightStep.flush
33
33
  puts 'Done!'
34
- puts "https://app.lightstep.com/#{access_token}/trace?span_guid=#{span.guid}&at_micros=#{span.start_micros}"
34
+ puts "https://app.lightstep.com/#{access_token}/trace?span_guid=#{span.span_context.id}&at_micros=#{span.start_micros}"
@@ -0,0 +1,66 @@
1
+ require 'bundler/setup'
2
+ require 'lightstep'
3
+
4
+ require 'rack'
5
+ require 'rack/server'
6
+
7
+ $token = '{your_access_token}'
8
+ $request_id = 'abc123'
9
+
10
+ class Router
11
+ def initialize
12
+ @tracer = LightStep::Tracer.new(component_name: 'router', access_token: $token)
13
+ end
14
+
15
+ def call(env)
16
+ span = @tracer.start_span("router_call").set_baggage_item("request-id", $request_id)
17
+ span.log(event: "router_request", env: env)
18
+ puts "parent #{span.span_context.trace_id}"
19
+
20
+ client = Net::HTTP.new("localhost", "9002")
21
+ req = Net::HTTP::Post.new("/")
22
+ @tracer.inject(span, LightStep::Tracer::FORMAT_RACK, req)
23
+ res = client.request(req)
24
+
25
+ span.log(event: "application_response", response: res.to_s)
26
+ span.finish
27
+ @tracer.flush
28
+ puts "----> https://app.lightstep.com/#{$token}/trace?span_guid=#{span.span_context.id}&at_micros=#{span.start_micros} <----"
29
+ [200, {}, [res.body]]
30
+ end
31
+ end
32
+
33
+ class App
34
+ def initialize
35
+ @tracer = LightStep::Tracer.new(component_name: 'app', access_token: $token)
36
+ end
37
+
38
+ def call(env)
39
+ span = @tracer.extract("app_call", LightStep::Tracer::FORMAT_RACK, env)
40
+ puts "child #{span.to_h[:trace_guid]}"
41
+ span.log(event: "application", env: env)
42
+ sleep 0.05
43
+ span.finish
44
+ @tracer.flush
45
+ [200, {}, ["application"]]
46
+ end
47
+ end
48
+
49
+ router_thread = Thread.new do
50
+ Thread.abort_on_exception = true
51
+ Rack::Server.start(app: Router.new, Port: 9001)
52
+ end
53
+
54
+ app_thread = Thread.new do
55
+ Thread.abort_on_exception = true
56
+ Rack::Server.start(app: App.new, Port: 9002)
57
+ end
58
+
59
+ loop do
60
+ begin
61
+ p Net::HTTP.get(URI("http://localhost:9001/"))
62
+ break
63
+ rescue Errno::ECONNREFUSED
64
+ sleep 0.05
65
+ end
66
+ end
@@ -1,3 +1,5 @@
1
+ require 'lightstep/version'
2
+
1
3
  module LightStep
2
4
  # Reporter builds up reports of spans and flushes them to a transport
3
5
  class Reporter
@@ -5,7 +7,7 @@ module LightStep
5
7
  attr_accessor :max_span_records
6
8
  attr_accessor :period
7
9
 
8
- def initialize(max_span_records:, transport:, guid:, component_name:)
10
+ def initialize(max_span_records:, transport:, guid:, component_name:, tags: {})
9
11
  @max_span_records = max_span_records
10
12
  @span_records = Concurrent::Array.new
11
13
  @dropped_spans = Concurrent::AtomicFixnum.new
@@ -24,7 +26,7 @@ module LightStep
24
26
  {Key: "lightstep.tracer_platform", Value: "ruby"},
25
27
  {Key: "lightstep.tracer_version", Value: LightStep::VERSION},
26
28
  {Key: "lightstep.tracer_platform_version", Value: RUBY_VERSION}
27
- ]
29
+ ] + tags.map{|k,v| {Key: k.to_s, Value: v.to_s}}
28
30
  }.freeze
29
31
 
30
32
  reset_on_fork
@@ -1,4 +1,5 @@
1
1
  require 'concurrent'
2
+ require 'lightstep/span_context'
2
3
 
3
4
  module LightStep
4
5
  # Span represents an OpenTracer Span
@@ -10,7 +11,7 @@ module LightStep
10
11
 
11
12
  # Internal use only
12
13
  # @private
13
- attr_reader :guid, :trace_guid, :start_micros, :end_micros, :baggage, :tags, :operation_name
14
+ attr_reader :start_micros, :end_micros, :baggage, :tags, :operation_name, :span_context
14
15
 
15
16
  # Creates a new {Span}
16
17
  #
@@ -23,38 +24,31 @@ module LightStep
23
24
  def initialize(
24
25
  tracer:,
25
26
  operation_name:,
26
- child_of_guid: nil,
27
- trace_guid:,
27
+ child_of_id: nil,
28
+ trace_id:,
28
29
  start_micros:,
29
30
  tags: nil,
30
31
  max_log_records:
31
32
  )
32
33
  @tags = Concurrent::Hash.new
33
34
  @tags.update(tags) unless tags.nil?
34
- @baggage = Concurrent::Hash.new
35
35
  @log_records = Concurrent::Array.new
36
36
  @dropped_logs = Concurrent::AtomicFixnum.new
37
37
  @max_log_records = max_log_records
38
38
 
39
39
  @tracer = tracer
40
- @guid = LightStep.guid
41
40
  self.operation_name = operation_name
42
41
  self.start_micros = start_micros
43
- self.trace_guid = trace_guid
44
- set_tag(:parent_span_guid, child_of_guid) if !child_of_guid.nil?
42
+ @span_context = SpanContext.new(id: LightStep.guid, trace_id: trace_id)
43
+ set_tag(:parent_span_guid, child_of_id) if !child_of_id.nil?
45
44
  end
46
45
 
47
46
  # Set a tag value on this span
48
47
  # @param key [String] the key of the tag
49
- # @param value [String, Numeric, Boolean] the value of the tag. If it's not
50
- # a String, Numeric, or Boolean it will be encoded with to_s
48
+ # @param value [String] the value of the tag. If it's not a String
49
+ # it will be encoded with to_s
51
50
  def set_tag(key, value)
52
- case value
53
- when String, Fixnum, TrueClass, FalseClass
54
- tags[key] = value
55
- else
56
- tags[key] = value.to_s
57
- end
51
+ tags[key] = value.to_s
58
52
  self
59
53
  end
60
54
 
@@ -65,15 +59,29 @@ module LightStep
65
59
  # @param key [String] the key of the baggage item
66
60
  # @param value [String] the value of the baggage item
67
61
  def set_baggage_item(key, value)
68
- baggage[key] = value
62
+ @span_context = SpanContext.new(
63
+ id: span_context.id,
64
+ trace_id: span_context.trace_id,
65
+ baggage: span_context.baggage.merge({key => value})
66
+ )
69
67
  self
70
68
  end
71
69
 
70
+ # Set all baggage at once. This will reset the baggage to the given param.
71
+ # @param baggage [Hash] new baggage for the span
72
+ def set_baggage(baggage = {})
73
+ @span_context = SpanContext.new(
74
+ id: span_context.id,
75
+ trace_id: span_context.trace_id,
76
+ baggage: baggage
77
+ )
78
+ end
79
+
72
80
  # Get a baggage item
73
81
  # @param key [String] the key of the baggage item
74
82
  # @return Value of the baggage item
75
83
  def get_baggage_item(key)
76
- baggage[key]
84
+ span_context.baggage[key]
77
85
  end
78
86
 
79
87
  # Add a log entry to this span
@@ -117,8 +125,8 @@ module LightStep
117
125
  def to_h
118
126
  {
119
127
  runtime_guid: tracer.guid,
120
- span_guid: guid,
121
- trace_guid: trace_guid,
128
+ span_guid: span_context.id,
129
+ trace_guid: span_context.trace_id,
122
130
  span_name: operation_name,
123
131
  attributes: tags.map {|key, value|
124
132
  {Key: key.to_s, Value: value}
@@ -146,6 +154,6 @@ module LightStep
146
154
  private
147
155
 
148
156
  attr_reader :tracer, :dropped_logs, :log_records
149
- attr_writer :guid, :trace_guid, :start_micros, :end_micros
157
+ attr_writer :start_micros, :end_micros
150
158
  end
151
159
  end
@@ -0,0 +1,12 @@
1
+ module LightStep
2
+ # SpanContext holds the data for a span that gets inherited to child spans
3
+ class SpanContext
4
+ attr_reader :id, :trace_id, :baggage
5
+
6
+ def initialize(id:, trace_id:, baggage: {})
7
+ @id = id.freeze
8
+ @trace_id = trace_id.freeze
9
+ @baggage = baggage.freeze
10
+ end
11
+ end
12
+ end
@@ -11,6 +11,7 @@ module LightStep
11
11
  class Tracer
12
12
  FORMAT_TEXT_MAP = 1
13
13
  FORMAT_BINARY = 2
14
+ FORMAT_RACK = 3
14
15
 
15
16
  class Error < LightStep::Error; end
16
17
  class ConfigurationError < LightStep::Tracer::Error; end
@@ -22,10 +23,11 @@ module LightStep
22
23
  # @param component_name [String] Component name to use for the tracer
23
24
  # @param access_token [String] The project access token when pushing to LightStep
24
25
  # @param transport [LightStep::Transport] How the data should be transported
26
+ # @param tags [Hash] Tracer-level tags
25
27
  # @return LightStep::Tracer
26
28
  # @raise LightStep::ConfigurationError if the group name or access token is not a valid string.
27
- def initialize(component_name:, access_token: nil, transport: nil)
28
- configure(component_name: component_name, access_token: access_token, transport: transport)
29
+ def initialize(component_name:, access_token: nil, transport: nil, tags: {})
30
+ configure(component_name: component_name, access_token: access_token, transport: transport, tags: tags)
29
31
  end
30
32
 
31
33
  def max_log_records
@@ -60,36 +62,44 @@ module LightStep
60
62
  # @param tags [Hash] tags for the span
61
63
  # @return [Span]
62
64
  def start_span(operation_name, child_of: nil, start_time: nil, tags: nil)
63
- child_of_guid = nil
64
- trace_guid = nil
65
+ child_of_id = nil
66
+ trace_id = nil
65
67
  if Span === child_of
66
- child_of_guid = child_of.guid
67
- trace_guid = child_of.trace_guid
68
+ child_of_id = child_of.span_context.id
69
+ trace_id = child_of.span_context.trace_id
68
70
  else
69
- trace_guid = LightStep.guid
71
+ trace_id = LightStep.guid
70
72
  end
71
73
 
72
- Span.new(
74
+ span = Span.new(
73
75
  tracer: self,
74
76
  operation_name: operation_name,
75
- child_of_guid: child_of_guid,
76
- trace_guid: trace_guid,
77
+ child_of_id: child_of_id,
78
+ trace_id: trace_id,
77
79
  start_micros: start_time.nil? ? LightStep.micros(Time.now) : LightStep.micros(start_time),
78
80
  tags: tags,
79
81
  max_log_records: max_log_records
80
82
  )
83
+
84
+ if Span === child_of
85
+ span.set_baggage(child_of.baggage)
86
+ end
87
+
88
+ span
81
89
  end
82
90
 
83
91
  # Inject a span into the given carrier
84
92
  # @param span [Span]
85
93
  # @param format [LightStep::Tracer::FORMAT_TEXT_MAP, LightStep::Tracer::FORMAT_BINARY]
86
- # @param carrier [Hash-like]
94
+ # @param carrier [Hash]
87
95
  def inject(span, format, carrier)
88
96
  case format
89
97
  when LightStep::Tracer::FORMAT_TEXT_MAP
90
98
  inject_to_text_map(span, carrier)
91
99
  when LightStep::Tracer::FORMAT_BINARY
92
100
  warn 'Binary inject format not yet implemented'
101
+ when LightStep::Tracer::FORMAT_RACK
102
+ inject_to_rack(span, carrier)
93
103
  else
94
104
  warn 'Unknown inject format'
95
105
  end
@@ -98,7 +108,7 @@ module LightStep
98
108
  # Extract a span from a carrier
99
109
  # @param operation_name [String]
100
110
  # @param format [LightStep::Tracer::FORMAT_TEXT_MAP, LightStep::Tracer::FORMAT_BINARY]
101
- # @param carrier [Hash-like]
111
+ # @param carrier [Hash]
102
112
  # @return [Span]
103
113
  def extract(operation_name, format, carrier)
104
114
  case format
@@ -107,6 +117,8 @@ module LightStep
107
117
  when LightStep::Tracer::FORMAT_BINARY
108
118
  warn 'Binary join format not yet implemented'
109
119
  nil
120
+ when LightStep::Tracer::FORMAT_RACK
121
+ extract_from_rack(operation_name, carrier)
110
122
  else
111
123
  warn 'Unknown join format'
112
124
  nil
@@ -147,7 +159,7 @@ module LightStep
147
159
 
148
160
  protected
149
161
 
150
- def configure(component_name:, access_token: nil, transport: nil)
162
+ def configure(component_name:, access_token: nil, transport: nil, tags: {})
151
163
  raise ConfigurationError, "component_name must be a string" unless String === component_name
152
164
  raise ConfigurationError, "component_name cannot be blank" if component_name.empty?
153
165
 
@@ -161,7 +173,8 @@ module LightStep
161
173
  max_span_records: max_span_records,
162
174
  transport: transport,
163
175
  guid: guid,
164
- component_name: component_name
176
+ component_name: component_name,
177
+ tags: tags
165
178
  )
166
179
  end
167
180
 
@@ -176,11 +189,11 @@ module LightStep
176
189
  MIN_MAX_SPAN_RECORDS = 1
177
190
 
178
191
  def inject_to_text_map(span, carrier)
179
- carrier[CARRIER_TRACER_STATE_PREFIX + 'spanid'] = span.guid
180
- carrier[CARRIER_TRACER_STATE_PREFIX + 'traceid'] = span.trace_guid unless span.trace_guid.nil?
192
+ carrier[CARRIER_TRACER_STATE_PREFIX + 'spanid'] = span.span_context.id
193
+ carrier[CARRIER_TRACER_STATE_PREFIX + 'traceid'] = span.span_context.trace_id unless span.span_context.trace_id.nil?
181
194
  carrier[CARRIER_TRACER_STATE_PREFIX + 'sampled'] = 'true'
182
195
 
183
- span.baggage.each do |key, value|
196
+ span.span_context.baggage.each do |key, value|
184
197
  carrier[CARRIER_BAGGAGE_PREFIX + key] = value
185
198
  end
186
199
  end
@@ -190,17 +203,46 @@ module LightStep
190
203
  tracer: self,
191
204
  operation_name: operation_name,
192
205
  start_micros: LightStep.micros(Time.now),
193
- child_of_guid: carrier[CARRIER_TRACER_STATE_PREFIX + 'spanid'],
194
- trace_guid: carrier[CARRIER_TRACER_STATE_PREFIX + 'traceid'],
206
+ child_of_id: carrier[CARRIER_TRACER_STATE_PREFIX + 'spanid'],
207
+ trace_id: carrier[CARRIER_TRACER_STATE_PREFIX + 'traceid'],
195
208
  max_log_records: max_log_records
196
209
  )
197
210
 
198
- carrier.each do |key, value|
199
- next unless key.start_with?(CARRIER_BAGGAGE_PREFIX)
200
- plain_key = key.to_s[CARRIER_BAGGAGE_PREFIX.length..key.to_s.length]
201
- span.set_baggage_item(plain_key, value)
211
+ baggage = carrier.reduce({}) do |baggage, tuple|
212
+ key, value = tuple
213
+ if key.start_with?(CARRIER_BAGGAGE_PREFIX)
214
+ plain_key = key.to_s[CARRIER_BAGGAGE_PREFIX.length..key.to_s.length]
215
+ baggage[plain_key] = value
216
+ end
217
+ baggage
202
218
  end
219
+ span.set_baggage(baggage)
220
+
203
221
  span
204
222
  end
223
+
224
+ def inject_to_rack(span, carrier)
225
+ carrier[CARRIER_TRACER_STATE_PREFIX + 'spanid'] = span.span_context.id
226
+ carrier[CARRIER_TRACER_STATE_PREFIX + 'traceid'] = span.span_context.trace_id unless span.span_context.trace_id.nil?
227
+ carrier[CARRIER_TRACER_STATE_PREFIX + 'sampled'] = 'true'
228
+
229
+ span.span_context.baggage.each do |key, value|
230
+ if key =~ /[^A-Za-z0-9\-_]/
231
+ # TODO: log the error internally
232
+ next
233
+ end
234
+ carrier[CARRIER_BAGGAGE_PREFIX + key] = value
235
+ end
236
+ end
237
+
238
+ def extract_from_rack(operation_name, env)
239
+ extract_from_text_map(operation_name, env.reduce({}){|memo, tuple|
240
+ raw_header, value = tuple
241
+ header = raw_header.gsub(/^HTTP_/, '').gsub("_", "-").downcase
242
+
243
+ memo[header] = value if header.start_with?(CARRIER_TRACER_STATE_PREFIX, CARRIER_BAGGAGE_PREFIX)
244
+ memo
245
+ })
246
+ end
205
247
  end
206
248
  end
@@ -1,3 +1,3 @@
1
1
  module LightStep
2
- VERSION = '0.9.9'.freeze
2
+ VERSION = '0.9.10'.freeze
3
3
  end
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.9.9
4
+ version: 0.9.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - bcronin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-04 00:00:00.000000000 Z
11
+ date: 2016-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -122,6 +122,7 @@ files:
122
122
  - Makefile
123
123
  - README.md
124
124
  - Rakefile
125
+ - benchmark.rb
125
126
  - benchmark/bench.rb
126
127
  - benchmark/threading/thread_test.rb
127
128
  - bin/console
@@ -130,10 +131,12 @@ files:
130
131
  - example.rb
131
132
  - examples/fork_children/main.rb
132
133
  - examples/rack/hello.rb
134
+ - examples/rack/inject_extract.rb
133
135
  - lib/lightstep.rb
134
136
  - lib/lightstep/global_tracer.rb
135
137
  - lib/lightstep/reporter.rb
136
138
  - lib/lightstep/span.rb
139
+ - lib/lightstep/span_context.rb
137
140
  - lib/lightstep/tracer.rb
138
141
  - lib/lightstep/transport/base.rb
139
142
  - lib/lightstep/transport/callback.rb
@@ -162,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
165
  version: '0'
163
166
  requirements: []
164
167
  rubyforge_project:
165
- rubygems_version: 2.5.1
168
+ rubygems_version: 2.5.2
166
169
  signing_key:
167
170
  specification_version: 4
168
171
  summary: LightStep OpenTracing Ruby bindings