lightstep 0.9.3 → 0.9.6

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: 1e5efa372f2f58b87d7bf26d3e5719179999f9c2
4
- data.tar.gz: 224eaaf3e5b7862e1ec8c135ccf7c3025f61e7c9
3
+ metadata.gz: 7d70ce2d0c73411b078a2855f102fb267db8cbc1
4
+ data.tar.gz: 6db2ee7c8186a11a4e7ace242c43eea628f4221d
5
5
  SHA512:
6
- metadata.gz: 0ad636f2e47c99581df36d3773b0ecc7d7f4c395ed66743d782d0ddde4ccce1a5f1b081b1199213de6d99932181c4d88cd92f9387b5faacf8a9351c317ee6c3f
7
- data.tar.gz: fb223d0e73cb22cf64287399a3c8cf82351bae8df229f9846f90e94645058fc8d4c628d63d7fa62f41a77d681b7ece462682e4ef1ea119b96fdbef4244efd3c1
6
+ metadata.gz: 101ec7f4c34bcca170f4152cc57289eefb3d7963d23b1ab3ff1f7615e825542a0aa120a9ade836706444accbdadff95da7c0d2edb0e49067afafd09cca4f31bc
7
+ data.tar.gz: 7031358b6681e84a40e26d75cf4403dabdd0c74bc272bbae2aa1303c95164f1322ae669d3eb5f468800ffafe0552c87894413c4e2549a3517a7bf655d76c5aec
data/README.md CHANGED
@@ -45,9 +45,9 @@ The LightStep Tracer is threadsafe. For increased performance, you can add the
45
45
  `concurrent-ruby-ext` gem to your Gemfile. This will enable C extensions for
46
46
  concurrent operations.
47
47
 
48
- **The LightStep Tracer is not inherently Fork-safe**. When forking, you should
49
- `disable` the Tracer before forking, then `enable` it in the child Process
50
- and parent Process after forking. See the `fork_children` example for more.
48
+ The LightStep Tracer is also Fork-safe. When forking, the child process will
49
+ not inherit the unflushed spans of the parent, so they will only be flushed
50
+ once.
51
51
 
52
52
  ## Development
53
53
 
@@ -1,6 +1,5 @@
1
1
  # A simple, manual test ensuring that tracer instances still report after a
2
- # Process.fork. Currently this requires the tracer instance to be explicitly
3
- # disabled before the fork and reenabled afterward.
2
+ # Process.fork.
4
3
 
5
4
  require 'bundler/setup'
6
5
  require 'lightstep'
@@ -14,10 +13,7 @@ puts 'Starting...'
14
13
  (1..20).each do |k|
15
14
  puts "Explicit reset iteration #{k}..."
16
15
 
17
- # NOTE: the tracer is disabled and reenabled on either side of the fork
18
- LightStep.disable
19
16
  pid = Process.fork do
20
- LightStep.enable
21
17
  10.times do
22
18
  span = LightStep.start_span("my_forked_span-#{Process.pid}")
23
19
  sleep(0.0025 * rand(k))
@@ -25,9 +21,6 @@ puts 'Starting...'
25
21
  end
26
22
  end
27
23
 
28
- # Also renable the parent process' tracer
29
- LightStep.enable
30
-
31
24
  10.times do
32
25
  span = LightStep.start_span("my_process_span-#{Process.pid}")
33
26
  sleep(0.0025 * rand(k))
@@ -35,6 +28,8 @@ puts 'Starting...'
35
28
  end
36
29
 
37
30
  # Make sure redundant enable calls don't cause problems
31
+ # NOTE: disabling discards the buffer by default, so all spans
32
+ # get cleared here except the final toggle span
38
33
  10.times do
39
34
  LightStep.disable
40
35
  LightStep.enable
@@ -48,7 +43,7 @@ puts 'Starting...'
48
43
  end
49
44
 
50
45
  puts "Parent, pid #{Process.pid}, waiting on child pid #{pid}"
51
- Process.wait
46
+ Process.wait(pid)
52
47
  end
53
48
 
54
49
  puts 'Done!'
@@ -14,7 +14,7 @@ module LightStep
14
14
 
15
15
  # Configure the GlobalTracer
16
16
  # See {LightStep::Tracer#initialize}
17
- def configure(opts = nil)
17
+ def configure(**options)
18
18
  raise ConfigurationError, 'Already configured' if configured
19
19
  self.configured = true
20
20
  super
@@ -0,0 +1,166 @@
1
+ require 'concurrent/channel'
2
+
3
+ module LightStep
4
+ # Reporter builds up reports of spans and flushes them to a transport
5
+ class Reporter
6
+ attr_accessor :max_span_records
7
+
8
+ def initialize(max_span_records:, transport:, guid:, component_name:)
9
+ @max_span_records = max_span_records
10
+ @span_records = Concurrent::Array.new
11
+ @dropped_spans = Concurrent::AtomicFixnum.new
12
+ @dropped_span_logs = Concurrent::AtomicFixnum.new
13
+ @transport = transport
14
+
15
+ start_time = LightStep.micros(Time.now)
16
+ @guid = LightStep.guid
17
+ @report_start_time = start_time
18
+
19
+ @runtime = {
20
+ guid: guid,
21
+ start_micros: start_time,
22
+ group_name: component_name,
23
+ attrs: [
24
+ {Key: "lightstep.tracer_platform", Value: "ruby"},
25
+ {Key: "lightstep.tracer_version", Value: LightStep::VERSION},
26
+ {Key: "lightstep.tracer_platform_version", Value: RUBY_VERSION}
27
+ ]
28
+ }.freeze
29
+
30
+ reset_on_fork
31
+
32
+ at_exit do
33
+ @quit_signal << true
34
+ @thread.join
35
+ end
36
+ end
37
+
38
+ def add_span(span)
39
+ reset_on_fork
40
+
41
+ @span_records.push(span.to_h)
42
+ if @span_records.size > max_span_records
43
+ dropped = @span_records.shift
44
+ @dropped_spans.increment
45
+ @dropped_span_logs.increment(dropped[:log_records].size + dropped[:dropped_logs])
46
+ end
47
+
48
+ @span_signal << true
49
+ end
50
+
51
+ def clear
52
+ span_records = @span_records.slice!(0, @span_records.length)
53
+ @dropped_spans.increment(span_records.size)
54
+ @dropped_span_logs.increment(
55
+ span_records.reduce(0) {|memo, span|
56
+ memo + span[:log_records].size + span[:dropped_logs]
57
+ }
58
+ )
59
+ end
60
+
61
+ def flush
62
+ @flush_signal << true
63
+ ~@flush_response_signal
64
+ end
65
+
66
+ private
67
+ MIN_PERIOD_SECS = 1.5
68
+ MAX_PERIOD_SECS = 30.0
69
+
70
+ # When the process forks, reset the child. All data that was copied will be handled
71
+ # by the parent. Also, restart the thread since forking killed it
72
+ def reset_on_fork
73
+ if @pid != $$
74
+ @pid = $$
75
+ @span_signal = Concurrent::Channel.new(buffer: :dropping, capacity: 1)
76
+ @quit_signal = Concurrent::Channel.new(buffer: :dropping, capacity: 1)
77
+ @flush_signal = Concurrent::Channel.new
78
+ @flush_response_signal = Concurrent::Channel.new
79
+ @span_records.clear
80
+ @dropped_spans.value = 0
81
+ @dropped_span_logs.value = 0
82
+ report_spans
83
+ end
84
+ end
85
+
86
+ def perform_flush
87
+ reset_on_fork
88
+ return if @span_records.empty?
89
+
90
+ now = LightStep.micros(Time.now)
91
+
92
+ span_records = @span_records.slice!(0, @span_records.length)
93
+ dropped_spans = 0
94
+ @dropped_spans.update{|old| dropped_spans = old; 0 }
95
+
96
+ old_dropped_span_logs = 0
97
+ @dropped_span_logs.update{|old| old_dropped_span_logs = old; 0 }
98
+ dropped_logs = old_dropped_span_logs
99
+ dropped_logs = span_records.reduce(dropped_logs) do |memo, span|
100
+ memo += span.delete :dropped_logs
101
+ end
102
+
103
+ report_request = {
104
+ runtime: @runtime,
105
+ oldest_micros: @report_start_time,
106
+ youngest_micros: now,
107
+ span_records: span_records,
108
+ counters: [
109
+ {Name: "dropped_logs", Value: dropped_logs},
110
+ {Name: "dropped_spans", Value: dropped_spans},
111
+ ]
112
+ }
113
+
114
+ @report_start_time = now
115
+
116
+ begin
117
+ @transport.report(report_request)
118
+ rescue
119
+ # an error occurs, add the previous dropped logs to the logs
120
+ # that were going to get reported, as well as the previous dropped
121
+ # spans and spans that would have been recorded
122
+ @dropped_spans.increment(dropped_spans + span_records.length)
123
+ @dropped_span_logs.increment(old_dropped_span_logs)
124
+ end
125
+ end
126
+
127
+ def report_spans
128
+ @thread = Thread.new do
129
+ begin
130
+ loop do
131
+ min_reached = false
132
+ max_reached = false
133
+ min_timer = Concurrent::Channel.timer(MIN_PERIOD_SECS)
134
+ max_timer = Concurrent::Channel.timer(MAX_PERIOD_SECS)
135
+ loop do
136
+ Concurrent::Channel.select do |s|
137
+ s.take(@span_signal) do
138
+ # we'll check span count below
139
+ end
140
+ s.take(min_timer) do
141
+ min_reached = true
142
+ end
143
+ s.take(max_timer) do
144
+ max_reached = true
145
+ end
146
+ s.take(@quit_signal) do
147
+ perform_flush
148
+ Thread.exit
149
+ end
150
+ s.take(@flush_signal) do
151
+ perform_flush
152
+ @flush_response_signal << true
153
+ end
154
+ end
155
+ if max_reached || (min_reached && @span_records.size >= max_span_records / 2)
156
+ perform_flush
157
+ end
158
+ end
159
+ end
160
+ rescue => ex
161
+ # TODO: internally log the exception
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -2,6 +2,7 @@ require 'json'
2
2
  require 'concurrent'
3
3
 
4
4
  require 'lightstep/span'
5
+ require 'lightstep/reporter'
5
6
  require 'lightstep/transport/http_json'
6
7
  require 'lightstep/transport/nil'
7
8
  require 'lightstep/transport/callback'
@@ -11,16 +12,6 @@ module LightStep
11
12
  FORMAT_TEXT_MAP = 1
12
13
  FORMAT_BINARY = 2
13
14
 
14
- CARRIER_TRACER_STATE_PREFIX = 'ot-tracer-'.freeze
15
- CARRIER_BAGGAGE_PREFIX = 'ot-baggage-'.freeze
16
-
17
- DEFAULT_MAX_LOG_RECORDS = 1000
18
- MIN_MAX_LOG_RECORDS = 1
19
- DEFAULT_MAX_SPAN_RECORDS = 1000
20
- MIN_MAX_SPAN_RECORDS = 1
21
- DEFAULT_MIN_REPORTING_PERIOD_SECS = 1.5
22
- DEFAULT_MAX_REPORTING_PERIOD_SECS = 30.0
23
-
24
15
  class Error < LightStep::Error; end
25
16
  class ConfigurationError < LightStep::Tracer::Error; end
26
17
 
@@ -51,22 +42,7 @@ module LightStep
51
42
 
52
43
  def max_span_records=(max)
53
44
  @max_span_records = [MIN_MAX_SPAN_RECORDS, max].max
54
- end
55
-
56
- def min_flush_period_micros
57
- @min_flush_period_micros ||= DEFAULT_MIN_REPORTING_PERIOD_SECS * 1E6
58
- end
59
-
60
- def min_reporting_period_secs=(secs)
61
- @min_flush_period_micros = [DEFAULT_MIN_REPORTING_PERIOD_SECS, secs].max * 1E6
62
- end
63
-
64
- def max_flush_period_micros
65
- @max_flush_period_micros ||= DEFAULT_MAX_REPORTING_PERIOD_SECS * 1E6
66
- end
67
-
68
- def max_reporting_period_secs=(secs)
69
- @max_flush_period_micros = [DEFAULT_MAX_REPORTING_PERIOD_SECS, secs].min * 1E6
45
+ @reporter.max_span_records = @max_span_records
70
46
  end
71
47
 
72
48
  # TODO(ngauthier@gmail.com) inherit SpanContext from references
@@ -146,93 +122,50 @@ module LightStep
146
122
  # @param discard [Boolean] whether to discard queued data
147
123
  def disable(discard: true)
148
124
  @enabled = false
149
- @transport.clear if discard
150
- @transport.flush
125
+ @reporter.clear if discard
126
+ @reporter.flush
151
127
  end
152
128
 
153
129
  # Flush to the Transport
154
130
  def flush
155
- _flush_worker
131
+ return unless enabled?
132
+ @reporter.flush
156
133
  end
157
134
 
158
135
  # Internal use only.
159
136
  # @private
160
137
  def finish_span(span)
161
138
  return unless enabled?
162
- @span_records.push(span.to_h)
163
- if @span_records.size > max_span_records
164
- @span_records.shift
165
- @dropped_spans.increment
166
- @dropped_span_logs.increment(span.logs_count + span.dropped_logs_count)
167
- end
168
- flush_if_needed
139
+ @reporter.add_span(span)
169
140
  end
170
141
 
171
142
  protected
172
143
 
173
- def access_token=(token)
174
- if !access_token.nil?
175
- raise ConfigurationError, "access token cannot be changed"
176
- end
177
- @access_token = token
178
- end
179
-
180
144
  def configure(component_name:, access_token: nil, transport: nil)
181
145
  raise ConfigurationError, "component_name must be a string" unless String === component_name
182
146
  raise ConfigurationError, "component_name cannot be blank" if component_name.empty?
183
147
 
184
- @span_records = Concurrent::Array.new
185
- @dropped_spans = Concurrent::AtomicFixnum.new
186
- @dropped_span_logs = Concurrent::AtomicFixnum.new
187
-
188
- start_time = LightStep.micros(Time.now)
189
- @guid = LightStep.guid
190
- @report_start_time = start_time
191
- @last_flush_micros = start_time
148
+ transport = Transport::HTTPJSON.new(access_token: access_token) if !access_token.nil?
149
+ raise ConfigurationError, "you must provide an access token or a transport" if transport.nil?
150
+ raise ConfigurationError, "#{transport} is not a LightStep transport class" if !(LightStep::Transport::Base === transport)
192
151
 
193
- @runtime = {
152
+ @reporter = LightStep::Reporter.new(
153
+ max_span_records: max_span_records,
154
+ transport: transport,
194
155
  guid: guid,
195
- start_micros: start_time,
196
- group_name: component_name,
197
- attrs: [
198
- {Key: "lightstep.tracer_platform", Value: "ruby"},
199
- {Key: "lightstep.tracer_version", Value: LightStep::VERSION},
200
- {Key: "lightstep.tracer_platform_version", Value: RUBY_VERSION}
201
- ]
202
- }.freeze
203
-
204
- if !transport.nil?
205
- if !(LightStep::Transport::Base === transport)
206
- raise ConfigurationError, "transport is not a LightStep transport class: #{transport}"
207
- end
208
- @transport = transport
209
- else
210
- if access_token.nil?
211
- raise ConfigurationError, "you must provide an access token or a transport"
212
- end
213
- @transport = Transport::HTTPJSON.new(access_token: access_token)
214
- end
215
-
216
- # At exit, flush this objects data to the transport and close the transport
217
- # (which in turn will send the flushed data over the network).
218
- at_exit do
219
- flush
220
- @transport.close
221
- end
156
+ component_name: component_name
157
+ )
222
158
  end
223
159
 
224
- def flush_if_needed
225
- return unless enabled?
226
-
227
- delta = LightStep.micros(Time.now) - @last_flush_micros
228
- return if delta < min_flush_period_micros
160
+ private
229
161
 
230
- if delta > max_flush_period_micros || @span_records.size >= max_span_records / 2
231
- flush
232
- end
233
- end
162
+ CARRIER_TRACER_STATE_PREFIX = 'ot-tracer-'.freeze
163
+ CARRIER_BAGGAGE_PREFIX = 'ot-baggage-'.freeze
234
164
 
235
- private
165
+ DEFAULT_MAX_LOG_RECORDS = 1000
166
+ MIN_MAX_LOG_RECORDS = 1
167
+ DEFAULT_MAX_SPAN_RECORDS = 1000
168
+ MIN_MAX_SPAN_RECORDS = 1
236
169
 
237
170
  def inject_to_text_map(span, carrier)
238
171
  carrier[CARRIER_TRACER_STATE_PREFIX + 'spanid'] = span.guid
@@ -261,50 +194,5 @@ module LightStep
261
194
  end
262
195
  span
263
196
  end
264
-
265
- def _flush_worker
266
- return unless enabled?
267
- # The thrift configuration has not yet been set: allow logs and spans
268
- # to be buffered in this case, but flushes won't yet be possible.
269
- return if @runtime.nil?
270
- return if @span_records.empty?
271
-
272
- now = LightStep.micros(Time.now)
273
-
274
- span_records = @span_records.slice!(0, @span_records.length)
275
- dropped_spans = 0
276
- @dropped_spans.update{|old| dropped_spans = old; 0 }
277
-
278
- old_dropped_span_logs = 0
279
- @dropped_span_logs.update{|old| old_dropped_span_logs = old; 0 }
280
- dropped_logs = old_dropped_span_logs
281
- dropped_logs = span_records.reduce(dropped_logs) do |memo, span|
282
- memo += span.delete :dropped_logs
283
- end
284
-
285
- report_request = {
286
- runtime: @runtime,
287
- oldest_micros: @report_start_time,
288
- youngest_micros: now,
289
- span_records: span_records,
290
- counters: [
291
- {Name: "dropped_logs", Value: dropped_logs},
292
- {Name: "dropped_spans", Value: dropped_spans},
293
- ]
294
- }
295
-
296
- @last_flush_micros = now
297
- @report_start_time = now
298
-
299
- begin
300
- @transport.report(report_request)
301
- rescue LightStep::Transport::HTTPJSON::QueueFullError
302
- # If the queue is full, add the previous dropped logs to the logs
303
- # that were going to get reported, as well as the previous dropped
304
- # spans and spans that would have been recorded
305
- @dropped_spans.increment(dropped_spans + span_records.length)
306
- @dropped_span_logs.increment(old_dropped_span_logs)
307
- end
308
- end
309
197
  end
310
198
  end
@@ -8,15 +8,6 @@ module LightStep
8
8
  def report(_report)
9
9
  nil
10
10
  end
11
-
12
- def close
13
- end
14
-
15
- def clear
16
- end
17
-
18
- def flush
19
- end
20
11
  end
21
12
  end
22
13
  end
@@ -11,15 +11,6 @@ module LightStep
11
11
  @callback.call(report)
12
12
  nil
13
13
  end
14
-
15
- def close
16
- end
17
-
18
- def clear
19
- end
20
-
21
- def flush
22
- end
23
14
  end
24
15
  end
25
16
  end
@@ -13,18 +13,15 @@ module LightStep
13
13
  class HTTPJSON < Base
14
14
  LIGHTSTEP_HOST = "collector.lightstep.com"
15
15
  LIGHTSTEP_PORT = 443
16
- QUEUE_SIZE = 16
17
16
 
18
17
  ENCRYPTION_TLS = 'tls'
19
18
  ENCRYPTION_NONE = 'none'
20
19
 
21
- class QueueFullError < LightStep::Error; end
22
-
23
20
  # Initialize the transport
24
21
  # @param host [String] host of the domain to the endpoind to push data
25
22
  # @param port [Numeric] port on which to connect
26
23
  # @param verbose [Numeric] verbosity level. Right now 0-3 are supported
27
- # @param secure [Boolean]
24
+ # @param encryption [ENCRYPTION_TLS, ENCRYPTION_NONE] kind of encryption to use
28
25
  # @param access_token [String] access token for LightStep server
29
26
  # @return [HTTPJSON]
30
27
  def initialize(host: LIGHTSTEP_HOST, port: LIGHTSTEP_PORT, verbose: 0, encryption: ENCRYPTION_TLS, access_token:)
@@ -36,75 +33,24 @@ module LightStep
36
33
  raise ConfigurationError, "access_token must be a string" unless String === access_token
37
34
  raise ConfigurationError, "access_token cannot be blank" if access_token.empty?
38
35
  @access_token = access_token
39
-
40
- start_queue
41
36
  end
42
37
 
43
38
  # Queue a report for sending
44
39
  def report(report)
45
40
  p report if @verbose >= 3
46
- # TODO(ngauthier@gmail.com): the queue could be full here if we're
47
- # lagging, which would cause this to block!
48
- @queue.push({
49
- host: @host,
50
- port: @port,
51
- encryption: @encryption,
52
- access_token: @access_token,
53
- content: report,
54
- verbose: @verbose
55
- }, true)
56
- nil
57
- rescue ThreadError
58
- raise QueueFullError
59
- end
60
-
61
- # Flush the current queue
62
- def flush
63
- close
64
- start_queue
65
- end
66
-
67
- # Clear the current queue, deleting pending items
68
- def clear
69
- @queue.clear
70
- end
71
41
 
72
- # Close the transport. No further data can be sent!
73
- def close
74
- @queue.close
75
- @thread.join
76
- end
77
-
78
- private
79
-
80
- def start_queue
81
- @queue = SizedQueue.new(QUEUE_SIZE)
82
- @thread = start_thread(@queue)
83
- end
84
-
85
- # TODO(ngauthier@gmail.com) abort on exception?
86
- def start_thread(queue)
87
- Thread.new do
88
- while item = queue.pop
89
- post_report(item)
90
- end
91
- end
92
- end
93
-
94
- def post_report(params)
95
- https = Net::HTTP.new(params[:host], params[:port])
96
- https.use_ssl = params[:encryption] == ENCRYPTION_TLS
42
+ https = Net::HTTP.new(@host, @port)
43
+ https.use_ssl = @encryption == ENCRYPTION_TLS
97
44
  req = Net::HTTP::Post.new('/api/v0/reports')
98
- req['LightStep-Access-Token'] = params[:access_token]
45
+ req['LightStep-Access-Token'] = @access_token
99
46
  req['Content-Type'] = 'application/json'
100
47
  req['Connection'] = 'keep-alive'
101
- req.body = params[:content].to_json
48
+ req.body = report.to_json
102
49
  res = https.request(req)
103
50
 
104
- puts res.to_s if params[:verbose] >= 3
51
+ puts res.to_s if @verbose >= 3
105
52
 
106
- # TODO(ngauthier@gmail.com): log unknown commands
107
- # TODO(ngauthier@gmail.com): log errors from server
53
+ nil
108
54
  end
109
55
  end
110
56
  end
@@ -1,3 +1,3 @@
1
1
  module LightStep
2
- VERSION = '0.9.3'.freeze
2
+ VERSION = '0.9.6'.freeze
3
3
  end
data/lightstep.gemspec CHANGED
@@ -16,9 +16,10 @@ Gem::Specification.new do |spec|
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.require_paths = ['lib']
18
18
 
19
- spec.add_dependency 'concurrent-ruby', '~> 1.0.0'
20
- spec.add_development_dependency 'rake', '~> 11.3.0'
21
- spec.add_development_dependency 'rack', '~> 2.0.0'
19
+ spec.add_dependency 'concurrent-ruby', '~> 1.0'
20
+ spec.add_dependency 'concurrent-ruby-edge', '= 0.2.2'
21
+ spec.add_development_dependency 'rake', '~> 11.3'
22
+ spec.add_development_dependency 'rack', '~> 2.0'
22
23
  spec.add_development_dependency 'rspec', '~> 3.0'
23
24
  spec.add_development_dependency 'bump', '~> 0.5'
24
25
  spec.add_development_dependency 'simplecov', '~> 0.12.0'
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.3
4
+ version: 0.9.6
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-02 00:00:00.000000000 Z
11
+ date: 2016-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -16,42 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby-edge
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.2
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: 11.3.0
47
+ version: '11.3'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: 11.3.0
54
+ version: '11.3'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rack
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: 2.0.0
61
+ version: '2.0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: 2.0.0
68
+ version: '2.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -132,6 +146,7 @@ files:
132
146
  - examples/rack/hello.rb
133
147
  - lib/lightstep.rb
134
148
  - lib/lightstep/global_tracer.rb
149
+ - lib/lightstep/reporter.rb
135
150
  - lib/lightstep/span.rb
136
151
  - lib/lightstep/tracer.rb
137
152
  - lib/lightstep/transport/base.rb