lightstep 0.15.0 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3dd55736997047494f81d964b3af41ae7d46df3d
4
- data.tar.gz: 2cb5bd4f73f16d8a7ec05347f73574c660b57bde
2
+ SHA256:
3
+ metadata.gz: 5e9f8988ff2ee9b867440d0fee9aa30357df0aed33e5daa92c48e338ad386624
4
+ data.tar.gz: dea73009fd576d64f80efac982533e8b1291bb8c45cf580430f36bd188eac60f
5
5
  SHA512:
6
- metadata.gz: 3cd1f14fc114101da63e675f0e5e5e3317b09ded56822d2a65bafafd1666ab44205c5e1759287ce6887bd8e48ea6b62547aff747e57c62d86da4fd3feb9bb002
7
- data.tar.gz: cd21715f9042383212e30701971ce48bae5954427786ad57adfecabecf1d27795b46a33877e2adfa179736f985278a9f39d827b93f870921d9ee36d6b62f27a1
6
+ metadata.gz: be197fd10bfd6fc23bbc41e1016749ce7bac73149e57830a83ffc81a4bbed964e4dcdbb326cfde1dd2e75335e9ece218e77749536c5cb7ec6f246762013266aa
7
+ data.tar.gz: 84d6dcbfbddb2b3fe7bfc4c88bbd43435ca8a50ae818b07752a7961dfa173d492f80ff0b4c0e95e1460cd32a3385a6a41288af0f5e13ce35df838ba3bca6c4fd
@@ -1,31 +1,32 @@
1
1
  version: 2
2
2
 
3
3
  jobs:
4
- test:
4
+ test-ruby-24:
5
+ docker:
6
+ - image: circleci/ruby:2.4-stretch
7
+ steps:
8
+ - checkout
9
+ - run: gem install --no-document bundler && bundle install --jobs=3 --retry=3
10
+ - run: bundle exec rake
11
+ test-ruby-25:
5
12
  docker:
6
- - image: circleci/ruby:2
13
+ - image: circleci/ruby:2.5-stretch
7
14
  steps:
8
15
  - checkout
9
- - restore_cache:
10
- keys:
11
- - gem-cache-v2-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
12
- - gem-cache-v2-{{ .Branch }}-
13
- - gem-cache-v2-
14
- - run:
15
- name: "set up environment"
16
- command: |
17
- echo 'export BUNDLE_PATH="$HOME/project/.bundler_cache"' >> $BASH_ENV
18
- source $BASH_ENV
19
- - run: bundle
20
- - save_cache:
21
- paths:
22
- - ~/project/.bundler_cache
23
- key: gem-cache-v2-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
24
- - run: make test
16
+ - run: gem install --no-document bundler && bundle install --jobs=3 --retry=3
17
+ - run: bundle exec rake
18
+ test-ruby-26:
19
+ docker:
20
+ - image: circleci/ruby:2.6-stretch
21
+ steps:
22
+ - checkout
23
+ - run: gem install --no-document bundler && bundle install --jobs=3 --retry=3
24
+ - run: bundle exec rake
25
25
 
26
26
  workflows:
27
27
  version: 2
28
28
  test:
29
29
  jobs:
30
- - test
31
-
30
+ - test-ruby-24
31
+ - test-ruby-25
32
+ - test-ruby-26
@@ -4,7 +4,15 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## v0.15.1
8
+ ### Fixed
9
+ - The tracer now supports B3 context propagation. Propagation can be set by using the `propagator` keyword argument to `LightStep.configure`. Valid values are `:lightstep` (default), and `:b3`.
10
+ - The tracer now closes the active scope or finishes the active span even if an error is raised from the yielded code.
11
+
12
+ ### Unreleased
13
+ - In-progress B3 support
14
+
15
+ ## v0.15.0
8
16
  ### Added
9
17
  - A Changelog
10
18
  - Now supports Span#log_kv
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lightstep (0.15.0)
4
+ lightstep (0.15.1)
5
5
  concurrent-ruby (~> 1.0)
6
6
  opentracing (~> 0.5.0)
7
7
 
@@ -0,0 +1,24 @@
1
+ #frozen_string_literal: true
2
+
3
+ require 'lightstep/propagation/lightstep_propagator'
4
+ require 'lightstep/propagation/b3_propagator'
5
+
6
+ module LightStep
7
+ module Propagation
8
+ PROPAGATOR_MAP = {
9
+ lightstep: LightStepPropagator
10
+ }
11
+
12
+ class << self
13
+ # Constructs a propagator instance from the given propagator name. If the
14
+ # name is unknown returns the LightStepPropagator as a default
15
+ #
16
+ # @param [Symbol, String] propagator_name
17
+ # @return [Propagator]
18
+ def [](propagator_name)
19
+ klass = PROPAGATOR_MAP[propagator_name.to_sym] || LightStepPropagator
20
+ klass.new
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ #frozen_string_literal: true
2
+
3
+ module LightStep
4
+ module Propagation
5
+ class B3Propagator < LightStepPropagator
6
+ CARRIER_TRACER_STATE_PREFIX = 'x-b3-'
7
+ CARRIER_SPAN_ID = 'x-b3-spanid'
8
+ CARRIER_TRACE_ID = 'x-b3-traceid'
9
+ CARRIER_SAMPLED = 'x-b3-sampled'
10
+
11
+ private
12
+
13
+ def trace_id_from_ctx(ctx)
14
+ ctx.trace_id16
15
+ end
16
+
17
+ def sampled_flag_from_ctx(ctx)
18
+ ctx.sampled? ? '1' : '0'
19
+ end
20
+
21
+ def sampled_flag_from_carrier(carrier)
22
+ carrier[self.class::CARRIER_SAMPLED] == '1' ? true : false
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,127 @@
1
+ #frozen_string_literal: true
2
+
3
+ module LightStep
4
+ module Propagation
5
+ class LightStepPropagator
6
+ CARRIER_TRACER_STATE_PREFIX = 'ot-tracer-'
7
+ CARRIER_SPAN_ID = 'ot-tracer-spanid'
8
+ CARRIER_TRACE_ID = 'ot-tracer-traceid'
9
+ CARRIER_SAMPLED = 'ot-tracer-sampled'
10
+ CARRIER_BAGGAGE_PREFIX = 'ot-baggage-'
11
+
12
+ # Inject a SpanContext into the given carrier
13
+ #
14
+ # @param spancontext [SpanContext]
15
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY]
16
+ # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
17
+ def inject(span_context, format, carrier)
18
+ case format
19
+ when OpenTracing::FORMAT_TEXT_MAP
20
+ inject_to_text_map(span_context, carrier)
21
+ when OpenTracing::FORMAT_BINARY
22
+ warn 'Binary inject format not yet implemented'
23
+ when OpenTracing::FORMAT_RACK
24
+ inject_to_rack(span_context, carrier)
25
+ else
26
+ warn 'Unknown inject format'
27
+ end
28
+ end
29
+
30
+ # Extract a SpanContext from a carrier
31
+ # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
32
+ # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
33
+ # @return [SpanContext] the extracted SpanContext or nil if none could be found
34
+ def extract(format, carrier)
35
+ case format
36
+ when OpenTracing::FORMAT_TEXT_MAP
37
+ extract_from_text_map(carrier)
38
+ when OpenTracing::FORMAT_BINARY
39
+ warn 'Binary join format not yet implemented'
40
+ nil
41
+ when OpenTracing::FORMAT_RACK
42
+ extract_from_rack(carrier)
43
+ else
44
+ warn 'Unknown join format'
45
+ nil
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def inject_to_text_map(span_context, carrier)
52
+ if trace_id = trace_id_from_ctx(span_context)
53
+ carrier[self.class::CARRIER_TRACE_ID] = trace_id
54
+ end
55
+ carrier[self.class::CARRIER_SPAN_ID] = span_context.id
56
+ carrier[self.class::CARRIER_SAMPLED] = sampled_flag_from_ctx(span_context)
57
+
58
+ span_context.baggage.each do |key, value|
59
+ carrier[self.class::CARRIER_BAGGAGE_PREFIX + key] = value
60
+ end
61
+ end
62
+
63
+ def extract_from_text_map(carrier)
64
+ # If the carrier does not have both the span_id and trace_id key
65
+ # skip the processing and just return a normal span
66
+ if !carrier.has_key?(self.class::CARRIER_SPAN_ID) || !carrier.has_key?(self.class::CARRIER_TRACE_ID)
67
+ return nil
68
+ end
69
+
70
+ baggage = carrier.reduce({}) do |baggage, (key, value)|
71
+ if key.start_with?(self.class::CARRIER_BAGGAGE_PREFIX)
72
+ plain_key = key.to_s[self.class::CARRIER_BAGGAGE_PREFIX.length..key.to_s.length]
73
+ baggage[plain_key] = value
74
+ end
75
+ baggage
76
+ end
77
+
78
+ SpanContext.new(
79
+ id: carrier[self.class::CARRIER_SPAN_ID],
80
+ trace_id: carrier[self.class::CARRIER_TRACE_ID],
81
+ sampled: sampled_flag_from_carrier(carrier),
82
+ baggage: baggage,
83
+ )
84
+ end
85
+
86
+ def inject_to_rack(span_context, carrier)
87
+ if trace_id = trace_id_from_ctx(span_context)
88
+ carrier[self.class::CARRIER_TRACE_ID] = trace_id
89
+ end
90
+ carrier[self.class::CARRIER_SPAN_ID] = span_context.id
91
+ carrier[self.class::CARRIER_SAMPLED] = sampled_flag_from_ctx(span_context)
92
+
93
+ span_context.baggage.each do |key, value|
94
+ if key =~ /[^A-Za-z0-9\-_]/
95
+ # TODO: log the error internally
96
+ next
97
+ end
98
+ carrier[self.class::CARRIER_BAGGAGE_PREFIX + key] = value
99
+ end
100
+ end
101
+
102
+ def extract_from_rack(env)
103
+ extract_from_text_map(env.reduce({}){|memo, (raw_header, value)|
104
+ header = raw_header.to_s.gsub(/^HTTP_/, '')
105
+ header.tr!('_', '-')
106
+ header.downcase!
107
+
108
+ memo[header] = value if header.start_with?(self.class::CARRIER_TRACER_STATE_PREFIX,
109
+ self.class::CARRIER_BAGGAGE_PREFIX)
110
+ memo
111
+ })
112
+ end
113
+
114
+ def trace_id_from_ctx(ctx)
115
+ ctx.trace_id
116
+ end
117
+
118
+ def sampled_flag_from_ctx(_)
119
+ 'true'
120
+ end
121
+
122
+ def sampled_flag_from_carrier(_)
123
+ true
124
+ end
125
+ end
126
+ end
127
+ end
@@ -56,7 +56,7 @@ module LightStep
56
56
  ref = ref.context if (Span === ref)
57
57
 
58
58
  if SpanContext === ref
59
- @context = SpanContext.new(id: LightStep.guid, trace_id: ref.trace_id)
59
+ @context = SpanContext.new(id: LightStep.guid, trace_id: ref.trace_id, sampled: ref.sampled?)
60
60
  set_baggage(ref.baggage)
61
61
  set_tag(:parent_span_guid, ref.id)
62
62
  else
@@ -83,6 +83,7 @@ module LightStep
83
83
  @context = SpanContext.new(
84
84
  id: context.id,
85
85
  trace_id: context.trace_id,
86
+ sampled: context.sampled?,
86
87
  baggage: context.baggage.merge({key => value})
87
88
  )
88
89
  self
@@ -94,6 +95,7 @@ module LightStep
94
95
  @context = SpanContext.new(
95
96
  id: context.id,
96
97
  trace_id: context.trace_id,
98
+ sampled: context.sampled?,
97
99
  baggage: baggage
98
100
  )
99
101
  end
@@ -1,12 +1,31 @@
1
+ #frozen_string_literal: true
2
+
1
3
  module LightStep
2
4
  # SpanContext holds the data for a span that gets inherited to child spans
3
5
  class SpanContext
4
- attr_reader :id, :trace_id, :baggage
6
+ attr_reader :id, :trace_id, :trace_id16, :sampled, :baggage
7
+ alias_method :sampled?, :sampled
8
+
9
+ ZERO_PADDING = '0' * 16
5
10
 
6
- def initialize(id:, trace_id:, baggage: {})
11
+ def initialize(id:, trace_id:, sampled: true, baggage: {})
7
12
  @id = id.freeze
8
- @trace_id = trace_id.freeze
13
+ @trace_id16 = pad_id(trace_id).freeze
14
+ @trace_id = truncate_id(trace_id).freeze
15
+ @sampled = sampled
9
16
  @baggage = baggage.freeze
10
17
  end
18
+
19
+ private
20
+
21
+ def truncate_id(id)
22
+ return id unless id && id.size == 32
23
+ id[0...16]
24
+ end
25
+
26
+ def pad_id(id)
27
+ return id unless id && id.size == 16
28
+ "#{id}#{ZERO_PADDING}"
29
+ end
11
30
  end
12
31
  end
@@ -5,6 +5,7 @@ require 'opentracing'
5
5
 
6
6
  require 'lightstep/span'
7
7
  require 'lightstep/reporter'
8
+ require 'lightstep/propagation'
8
9
  require 'lightstep/transport/http_json'
9
10
  require 'lightstep/transport/nil'
10
11
  require 'lightstep/transport/callback'
@@ -14,6 +15,11 @@ module LightStep
14
15
  class Error < LightStep::Error; end
15
16
  class ConfigurationError < LightStep::Tracer::Error; end
16
17
 
18
+ DEFAULT_MAX_LOG_RECORDS = 1000
19
+ MIN_MAX_LOG_RECORDS = 1
20
+ DEFAULT_MAX_SPAN_RECORDS = 1000
21
+ MIN_MAX_SPAN_RECORDS = 1
22
+
17
23
  attr_reader :access_token, :guid
18
24
 
19
25
  # Initialize a new tracer. Either an access_token or a transport must be
@@ -22,10 +28,20 @@ module LightStep
22
28
  # @param access_token [String] The project access token when pushing to LightStep
23
29
  # @param transport [LightStep::Transport] How the data should be transported
24
30
  # @param tags [Hash] Tracer-level tags
31
+ # @param propagator [Propagator] :lightstep is the only supported option
32
+ # to use
25
33
  # @return LightStep::Tracer
26
34
  # @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, tags: {})
28
- configure(component_name: component_name, access_token: access_token, transport: transport, tags: tags)
35
+ def initialize(component_name:,
36
+ access_token: nil,
37
+ transport: nil,
38
+ tags: {},
39
+ propagator: :lightstep)
40
+ configure(component_name: component_name,
41
+ access_token: access_token,
42
+ transport: transport,
43
+ tags: tags,
44
+ propagator: propagator)
29
45
  end
30
46
 
31
47
  def max_log_records
@@ -111,7 +127,9 @@ module LightStep
111
127
 
112
128
  scope_manager.activate(span: span, finish_on_close: finish_on_close).tap do |scope|
113
129
  if block_given?
114
- return yield(scope).tap do
130
+ begin
131
+ return yield scope
132
+ ensure
115
133
  scope.close
116
134
  end
117
135
  end
@@ -165,29 +183,23 @@ module LightStep
165
183
 
166
184
  Span.new(span_options).tap do |span|
167
185
  if block_given?
168
- return yield(span).tap do
186
+ begin
187
+ return yield span
188
+ ensure
169
189
  span.finish
170
190
  end
171
191
  end
172
192
  end
173
193
  end
174
194
 
195
+
175
196
  # Inject a SpanContext into the given carrier
176
197
  #
177
198
  # @param spancontext [SpanContext]
178
199
  # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY]
179
200
  # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
180
201
  def inject(span_context, format, carrier)
181
- case format
182
- when OpenTracing::FORMAT_TEXT_MAP
183
- inject_to_text_map(span_context, carrier)
184
- when OpenTracing::FORMAT_BINARY
185
- warn 'Binary inject format not yet implemented'
186
- when OpenTracing::FORMAT_RACK
187
- inject_to_rack(span_context, carrier)
188
- else
189
- warn 'Unknown inject format'
190
- end
202
+ @propagator.inject(span_context, format, carrier)
191
203
  end
192
204
 
193
205
  # Extract a SpanContext from a carrier
@@ -195,18 +207,7 @@ module LightStep
195
207
  # @param carrier [Carrier] A carrier object of the type dictated by the specified `format`
196
208
  # @return [SpanContext] the extracted SpanContext or nil if none could be found
197
209
  def extract(format, carrier)
198
- case format
199
- when OpenTracing::FORMAT_TEXT_MAP
200
- extract_from_text_map(carrier)
201
- when OpenTracing::FORMAT_BINARY
202
- warn 'Binary join format not yet implemented'
203
- nil
204
- when OpenTracing::FORMAT_RACK
205
- extract_from_rack(carrier)
206
- else
207
- warn 'Unknown join format'
208
- nil
209
- end
210
+ @propagator.extract(format, carrier)
210
211
  end
211
212
 
212
213
  # @return true if the tracer is enabled
@@ -243,7 +244,11 @@ module LightStep
243
244
 
244
245
  protected
245
246
 
246
- def configure(component_name:, access_token: nil, transport: nil, tags: {})
247
+ def configure(component_name:,
248
+ access_token: nil,
249
+ transport: nil, tags: {},
250
+ propagator: :lightstep)
251
+
247
252
  raise ConfigurationError, "component_name must be a string" unless component_name.is_a?(String)
248
253
  raise ConfigurationError, "component_name cannot be blank" if component_name.empty?
249
254
 
@@ -254,6 +259,8 @@ module LightStep
254
259
  raise ConfigurationError, "you must provide an access token or a transport" if transport.nil?
255
260
  raise ConfigurationError, "#{transport} is not a LightStep transport class" if !(LightStep::Transport::Base === transport)
256
261
 
262
+ @propagator = Propagation[propagator]
263
+
257
264
  @guid = LightStep.guid
258
265
 
259
266
  @reporter = LightStep::Reporter.new(
@@ -264,75 +271,5 @@ module LightStep
264
271
  tags: tags
265
272
  )
266
273
  end
267
-
268
- private
269
-
270
- CARRIER_TRACER_STATE_PREFIX = 'ot-tracer-'.freeze
271
- CARRIER_BAGGAGE_PREFIX = 'ot-baggage-'.freeze
272
-
273
- CARRIER_SPAN_ID = (CARRIER_TRACER_STATE_PREFIX + 'spanid').freeze
274
- CARRIER_TRACE_ID = (CARRIER_TRACER_STATE_PREFIX + 'traceid').freeze
275
- CARRIER_SAMPLED = (CARRIER_TRACER_STATE_PREFIX + 'sampled').freeze
276
-
277
- DEFAULT_MAX_LOG_RECORDS = 1000
278
- MIN_MAX_LOG_RECORDS = 1
279
- DEFAULT_MAX_SPAN_RECORDS = 1000
280
- MIN_MAX_SPAN_RECORDS = 1
281
-
282
- def inject_to_text_map(span_context, carrier)
283
- carrier[CARRIER_SPAN_ID] = span_context.id
284
- carrier[CARRIER_TRACE_ID] = span_context.trace_id unless span_context.trace_id.nil?
285
- carrier[CARRIER_SAMPLED] = 'true'
286
-
287
- span_context.baggage.each do |key, value|
288
- carrier[CARRIER_BAGGAGE_PREFIX + key] = value
289
- end
290
- end
291
-
292
- def extract_from_text_map(carrier)
293
- # If the carrier does not have both the span_id and trace_id key
294
- # skip the processing and just return a normal span
295
- if !carrier.has_key?(CARRIER_SPAN_ID) || !carrier.has_key?(CARRIER_TRACE_ID)
296
- return nil
297
- end
298
-
299
- baggage = carrier.reduce({}) do |baggage, tuple|
300
- key, value = tuple
301
- if key.start_with?(CARRIER_BAGGAGE_PREFIX)
302
- plain_key = key.to_s[CARRIER_BAGGAGE_PREFIX.length..key.to_s.length]
303
- baggage[plain_key] = value
304
- end
305
- baggage
306
- end
307
- SpanContext.new(
308
- id: carrier[CARRIER_SPAN_ID],
309
- trace_id: carrier[CARRIER_TRACE_ID],
310
- baggage: baggage,
311
- )
312
- end
313
-
314
- def inject_to_rack(span_context, carrier)
315
- carrier[CARRIER_SPAN_ID] = span_context.id
316
- carrier[CARRIER_TRACE_ID] = span_context.trace_id unless span_context.trace_id.nil?
317
- carrier[CARRIER_SAMPLED] = 'true'
318
-
319
- span_context.baggage.each do |key, value|
320
- if key =~ /[^A-Za-z0-9\-_]/
321
- # TODO: log the error internally
322
- next
323
- end
324
- carrier[CARRIER_BAGGAGE_PREFIX + key] = value
325
- end
326
- end
327
-
328
- def extract_from_rack(env)
329
- extract_from_text_map(env.reduce({}){|memo, tuple|
330
- raw_header, value = tuple
331
- header = raw_header.to_s.gsub(/^HTTP_/, '').tr('_', '-').downcase
332
-
333
- memo[header] = value if header.start_with?(CARRIER_TRACER_STATE_PREFIX, CARRIER_BAGGAGE_PREFIX)
334
- memo
335
- })
336
- end
337
274
  end
338
275
  end
@@ -1,3 +1,3 @@
1
1
  module LightStep
2
- VERSION = '0.15.0'.freeze
2
+ VERSION = '0.15.1'.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.15.0
4
+ version: 0.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - lightstep
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-04 00:00:00.000000000 Z
11
+ date: 2019-11-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -145,13 +145,15 @@ files:
145
145
  - benchmark/threading/thread_test.rb
146
146
  - bin/console
147
147
  - bin/setup
148
- - circle.yml
149
148
  - example.rb
150
149
  - examples/fork_children/main.rb
151
150
  - examples/rack/hello.rb
152
151
  - examples/rack/inject_extract.rb
153
152
  - lib/lightstep.rb
154
153
  - lib/lightstep/global_tracer.rb
154
+ - lib/lightstep/propagation.rb
155
+ - lib/lightstep/propagation/b3_propagator.rb
156
+ - lib/lightstep/propagation/lightstep_propagator.rb
155
157
  - lib/lightstep/reporter.rb
156
158
  - lib/lightstep/scope.rb
157
159
  - lib/lightstep/scope_manager.rb
@@ -185,8 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
187
  - !ruby/object:Gem::Version
186
188
  version: '0'
187
189
  requirements: []
188
- rubyforge_project:
189
- rubygems_version: 2.5.2.3
190
+ rubygems_version: 3.0.3
190
191
  signing_key:
191
192
  specification_version: 4
192
193
  summary: LightStep OpenTracing Ruby bindings
data/circle.yml DELETED
@@ -1,3 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.2.3