opentelemetry-api 0.14.0 → 1.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -0
  3. data/README.md +2 -2
  4. data/lib/opentelemetry.rb +21 -28
  5. data/lib/opentelemetry/baggage.rb +95 -2
  6. data/lib/opentelemetry/baggage/builder.rb +30 -4
  7. data/lib/opentelemetry/baggage/entry.rb +20 -0
  8. data/lib/opentelemetry/baggage/propagation.rb +9 -18
  9. data/lib/opentelemetry/baggage/propagation/text_map_propagator.rb +110 -0
  10. data/lib/opentelemetry/context.rb +48 -33
  11. data/lib/opentelemetry/context/propagation.rb +35 -5
  12. data/lib/opentelemetry/context/propagation/composite_text_map_propagator.rb +105 -0
  13. data/lib/opentelemetry/context/propagation/noop_text_map_propagator.rb +51 -0
  14. data/lib/opentelemetry/context/propagation/rack_env_getter.rb +3 -1
  15. data/lib/opentelemetry/context/propagation/{propagator.rb → text_map_propagator.rb} +23 -16
  16. data/lib/opentelemetry/internal.rb +17 -0
  17. data/lib/opentelemetry/internal/proxy_tracer.rb +38 -0
  18. data/lib/opentelemetry/internal/proxy_tracer_provider.rb +59 -0
  19. data/lib/opentelemetry/trace.rb +10 -0
  20. data/lib/opentelemetry/trace/propagation/trace_context.rb +7 -18
  21. data/lib/opentelemetry/trace/propagation/trace_context/text_map_propagator.rb +73 -0
  22. data/lib/opentelemetry/trace/span.rb +20 -0
  23. data/lib/opentelemetry/trace/status.rb +34 -5
  24. data/lib/opentelemetry/trace/tracer.rb +8 -9
  25. data/lib/opentelemetry/version.rb +1 -1
  26. metadata +16 -25
  27. data/lib/opentelemetry/baggage/manager.rb +0 -41
  28. data/lib/opentelemetry/baggage/propagation/text_map_extractor.rb +0 -57
  29. data/lib/opentelemetry/baggage/propagation/text_map_injector.rb +0 -52
  30. data/lib/opentelemetry/context/propagation/composite_propagator.rb +0 -72
  31. data/lib/opentelemetry/context/propagation/noop_extractor.rb +0 -26
  32. data/lib/opentelemetry/context/propagation/noop_injector.rb +0 -26
  33. data/lib/opentelemetry/instrumentation.rb +0 -15
  34. data/lib/opentelemetry/instrumentation/base.rb +0 -245
  35. data/lib/opentelemetry/instrumentation/registry.rb +0 -86
  36. data/lib/opentelemetry/metrics.rb +0 -16
  37. data/lib/opentelemetry/metrics/handles.rb +0 -44
  38. data/lib/opentelemetry/metrics/instruments.rb +0 -105
  39. data/lib/opentelemetry/metrics/meter.rb +0 -72
  40. data/lib/opentelemetry/metrics/meter_provider.rb +0 -22
  41. data/lib/opentelemetry/trace/propagation/trace_context/text_map_extractor.rb +0 -52
  42. data/lib/opentelemetry/trace/propagation/trace_context/text_map_injector.rb +0 -49
  43. data/lib/opentelemetry/trace/util/http_to_status.rb +0 -28
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ require 'opentelemetry/internal/proxy_tracer'
8
+ require 'opentelemetry/internal/proxy_tracer_provider'
9
+
10
+ module OpenTelemetry
11
+ # @api private
12
+ #
13
+ # The Internal module provides API internal functionality that is not a part of the
14
+ # public API.
15
+ module Internal
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Internal
9
+ # @api private
10
+ #
11
+ # {ProxyTracer} is an implementation of {OpenTelemetry::Trace::Tracer}. It is returned from
12
+ # the ProxyTracerProvider until a delegate tracer provider is installed. After the delegate
13
+ # tracer provider is installed, the ProxyTracer will delegate to the corresponding "real"
14
+ # tracer.
15
+ class ProxyTracer < Trace::Tracer
16
+ attr_writer :delegate
17
+
18
+ # Returns a new {ProxyTracer} instance.
19
+ #
20
+ # @return [ProxyTracer]
21
+ def initialize
22
+ @delegate = nil
23
+ end
24
+
25
+ def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
26
+ return @delegate.start_root_span(name, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind) unless @delegate.nil?
27
+
28
+ super
29
+ end
30
+
31
+ def start_span(name, with_parent: nil, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
32
+ return @delegate.start_span(name, with_parent: with_parent, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind) unless @delegate.nil?
33
+
34
+ super
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Internal
9
+ # @api private
10
+ #
11
+ # {ProxyTracerProvider} is an implementation of {OpenTelemetry::Trace::TracerProvider}.
12
+ # It is the default global tracer provider returned by OpenTelemetry.tracer_provider.
13
+ # It delegates to a "real" TracerProvider after the global tracer provider is registered.
14
+ # It returns {ProxyTracer} instances until the delegate is installed.
15
+ class ProxyTracerProvider < Trace::TracerProvider
16
+ Key = Struct.new(:name, :version)
17
+ private_constant(:Key)
18
+
19
+ # Returns a new {ProxyTracerProvider} instance.
20
+ #
21
+ # @return [ProxyTracerProvider]
22
+ def initialize
23
+ @mutex = Mutex.new
24
+ @registry = {}
25
+ @delegate = nil
26
+ end
27
+
28
+ # Set the delegate tracer provider. If this is called more than once, a warning will
29
+ # be logged and superfluous calls will be ignored.
30
+ #
31
+ # @param [TracerProvider] provider The tracer provider to delegate to
32
+ def delegate=(provider)
33
+ unless @delegate.nil?
34
+ OpenTelemetry.logger.warn 'Attempt to reset delegate in ProxyTracerProvider ignored.'
35
+ return
36
+ end
37
+
38
+ @mutex.synchronize do
39
+ @delegate = provider
40
+ @registry.each { |key, tracer| tracer.delegate = provider.tracer(key.name, key.version) }
41
+ end
42
+ end
43
+
44
+ # Returns a {Tracer} instance.
45
+ #
46
+ # @param [optional String] name Instrumentation package name
47
+ # @param [optional String] version Instrumentation package version
48
+ #
49
+ # @return [Tracer]
50
+ def tracer(name = nil, version = nil)
51
+ @mutex.synchronize do
52
+ return @delegate.tracer(name, version) unless @delegate.nil?
53
+
54
+ @registry[Key.new(name, version)] ||= ProxyTracer.new
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -81,6 +81,16 @@ module OpenTelemetry
81
81
  def with_span(span)
82
82
  Context.with_value(CURRENT_SPAN_KEY, span) { |c, s| yield s, c }
83
83
  end
84
+
85
+ # Wraps a SpanContext with an object implementing the Span interface. This is done in order
86
+ # to expose a SpanContext as a Span in operations such as in-process Span propagation.
87
+ #
88
+ # @param [SpanContext] span_context SpanContext to be wrapped
89
+ #
90
+ # @return [Span]
91
+ def non_recording_span(span_context)
92
+ Span.new(span_context: span_context)
93
+ end
84
94
  end
85
95
  end
86
96
 
@@ -5,8 +5,7 @@
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
7
  require 'opentelemetry/trace/propagation/trace_context/trace_parent'
8
- require 'opentelemetry/trace/propagation/trace_context/text_map_extractor'
9
- require 'opentelemetry/trace/propagation/trace_context/text_map_injector'
8
+ require 'opentelemetry/trace/propagation/trace_context/text_map_propagator'
10
9
 
11
10
  module OpenTelemetry
12
11
  module Trace
@@ -15,24 +14,14 @@ module OpenTelemetry
15
14
  # for context propagation in the W3C Trace Context format.
16
15
  module TraceContext
17
16
  extend self
18
- TRACEPARENT_KEY = 'traceparent'
19
- TRACESTATE_KEY = 'tracestate'
20
- TEXT_MAP_EXTRACTOR = TextMapExtractor.new
21
- TEXT_MAP_INJECTOR = TextMapInjector.new
17
+ TEXT_MAP_PROPAGATOR = TextMapPropagator.new
22
18
 
23
- private_constant :TRACEPARENT_KEY, :TRACESTATE_KEY,
24
- :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR
19
+ private_constant :TEXT_MAP_PROPAGATOR
25
20
 
26
- # Returns an extractor that extracts context using the W3C Trace Context
27
- # format
28
- def text_map_extractor
29
- TEXT_MAP_EXTRACTOR
30
- end
31
-
32
- # Returns an injector that injects context using the W3C Trace Context
33
- # format
34
- def text_map_injector
35
- TEXT_MAP_INJECTOR
21
+ # Returns a text map propagator that propagates context using the
22
+ # W3C Trace Context format.
23
+ def text_map_propagator
24
+ TEXT_MAP_PROPAGATOR
36
25
  end
37
26
  end
38
27
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Trace
9
+ module Propagation
10
+ module TraceContext
11
+ # Propagates trace context using the W3C Trace Context format
12
+ class TextMapPropagator
13
+ TRACEPARENT_KEY = 'traceparent'
14
+ TRACESTATE_KEY = 'tracestate'
15
+ FIELDS = [TRACEPARENT_KEY, TRACESTATE_KEY].freeze
16
+
17
+ private_constant :TRACEPARENT_KEY, :TRACESTATE_KEY, :FIELDS
18
+
19
+ # Inject trace context into the supplied carrier.
20
+ #
21
+ # @param [Carrier] carrier The mutable carrier to inject trace context into
22
+ # @param [Context] context The context to read trace context from
23
+ # @param [optional Setter] setter If the optional setter is provided, it
24
+ # will be used to write context into the carrier, otherwise the default
25
+ # text map setter will be used.
26
+ def inject(carrier, context: Context.current, setter: Context::Propagation.text_map_setter)
27
+ span_context = Trace.current_span(context).context
28
+ return unless span_context.valid?
29
+
30
+ setter.set(carrier, TRACEPARENT_KEY, TraceParent.from_span_context(span_context).to_s)
31
+ setter.set(carrier, TRACESTATE_KEY, span_context.tracestate.to_s) unless span_context.tracestate.empty?
32
+ nil
33
+ end
34
+
35
+ # Extract trace context from the supplied carrier.
36
+ # If extraction fails, the original context will be returned
37
+ #
38
+ # @param [Carrier] carrier The carrier to get the header from
39
+ # @param [optional Context] context Context to be updated with the trace context
40
+ # extracted from the carrier. Defaults to +Context.current+.
41
+ # @param [optional Getter] getter If the optional getter is provided, it
42
+ # will be used to read the header from the carrier, otherwise the default
43
+ # text map getter will be used.
44
+ #
45
+ # @return [Context] context updated with extracted baggage, or the original context
46
+ # if extraction fails
47
+ def extract(carrier, context: Context.current, getter: Context::Propagation.text_map_getter)
48
+ tp = TraceParent.from_string(getter.get(carrier, TRACEPARENT_KEY))
49
+ tracestate = Tracestate.from_string(getter.get(carrier, TRACESTATE_KEY))
50
+
51
+ span_context = Trace::SpanContext.new(trace_id: tp.trace_id,
52
+ span_id: tp.span_id,
53
+ trace_flags: tp.flags,
54
+ tracestate: tracestate,
55
+ remote: true)
56
+ span = OpenTelemetry::Trace.non_recording_span(span_context)
57
+ OpenTelemetry::Trace.context_with_span(span)
58
+ rescue OpenTelemetry::Error
59
+ context
60
+ end
61
+
62
+ # Returns the predefined propagation fields. If your carrier is reused, you
63
+ # should delete the fields returned by this method before calling +inject+.
64
+ #
65
+ # @return [Array<String>] a list of fields that will be used by this propagator.
66
+ def fields
67
+ FIELDS
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -51,6 +51,9 @@ module OpenTelemetry
51
51
  #
52
52
  # @param [String] key
53
53
  # @param [String, Boolean, Numeric, Array<String, Numeric, Boolean>] value
54
+ # Values must be non-nil and (array of) string, boolean or numeric type.
55
+ # Array values must not contain nil elements and all elements must be of
56
+ # the same basic type (string, numeric, boolean).
54
57
  #
55
58
  # @return [self] returns itself
56
59
  def set_attribute(key, value)
@@ -58,6 +61,23 @@ module OpenTelemetry
58
61
  end
59
62
  alias []= set_attribute
60
63
 
64
+ # Add attributes
65
+ #
66
+ # Note that the OpenTelemetry project
67
+ # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-semantic-conventions.md
68
+ # documents} certain "standard attributes" that have prescribed semantic
69
+ # meanings.
70
+ #
71
+ # @param [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
72
+ # Values must be non-nil and (array of) string, boolean or numeric type.
73
+ # Array values must not contain nil elements and all elements must be of
74
+ # the same basic type (string, numeric, boolean).
75
+ #
76
+ # @return [self] returns itself
77
+ def add_attributes(attributes)
78
+ self
79
+ end
80
+
61
81
  # Add an event to a {Span}.
62
82
  #
63
83
  # Example:
@@ -4,15 +4,41 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
- require 'opentelemetry/trace/util/http_to_status'
8
-
9
7
  module OpenTelemetry
10
8
  module Trace
11
9
  # Status represents the status of a finished {Span}. It is composed of a
12
10
  # status code in conjunction with an optional descriptive message.
13
11
  class Status
14
- # Convenience utility, not in API spec:
15
- extend Util::HttpToStatus
12
+ class << self
13
+ private :new # rubocop:disable Style/AccessModifierDeclarations
14
+
15
+ # Returns a newly created {Status} with code == UNSET and an optional
16
+ # description.
17
+ #
18
+ # @param [String] description
19
+ # @return [Status]
20
+ def unset(description = '')
21
+ new(UNSET, description: description)
22
+ end
23
+
24
+ # Returns a newly created {Status} with code == OK and an optional
25
+ # description.
26
+ #
27
+ # @param [String] description
28
+ # @return [Status]
29
+ def ok(description = '')
30
+ new(OK, description: description)
31
+ end
32
+
33
+ # Returns a newly created {Status} with code == ERROR and an optional
34
+ # description.
35
+ #
36
+ # @param [String] description
37
+ # @return [Status]
38
+ def error(description = '')
39
+ new(ERROR, description: description)
40
+ end
41
+ end
16
42
 
17
43
  # Retrieve the status code of this Status.
18
44
  #
@@ -24,7 +50,10 @@ module OpenTelemetry
24
50
  # @return [String]
25
51
  attr_reader :description
26
52
 
27
- # Initialize a Status.
53
+ # @api private
54
+ # The constructor is private and only for use internally by the class.
55
+ # Users should use the {unset}, {error}, or {ok} factory methods to
56
+ # obtain a {Status} instance.
28
57
  #
29
58
  # @param [Integer] code One of the status codes below
30
59
  # @param [String] description
@@ -23,21 +23,20 @@ module OpenTelemetry
23
23
  # span and reraised.
24
24
  # @yield [span, context] yields the newly created span and a context containing the
25
25
  # span to the block.
26
- def in_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil, with_parent: nil)
26
+ def in_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
27
27
  span = nil
28
- span = start_span(name, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind, with_parent: with_parent)
28
+ span = start_span(name, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind)
29
29
  Trace.with_span(span) { |s, c| yield s, c }
30
30
  rescue Exception => e # rubocop:disable Lint/RescueException
31
31
  span&.record_exception(e)
32
- span&.status = Status.new(Status::ERROR,
33
- description: "Unhandled exception of type: #{e.class}")
32
+ span&.status = Status.error("Unhandled exception of type: #{e.class}")
34
33
  raise e
35
34
  ensure
36
35
  span&.finish
37
36
  end
38
37
 
39
38
  def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
40
- Span.new
39
+ Span::INVALID
41
40
  end
42
41
 
43
42
  # Used when a caller wants to manage the activation/deactivation and lifecycle of
@@ -49,12 +48,12 @@ module OpenTelemetry
49
48
  #
50
49
  # @return [Span]
51
50
  def start_span(name, with_parent: nil, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
52
- span_context = OpenTelemetry::Trace.current_span(with_parent).context
51
+ span = OpenTelemetry::Trace.current_span(with_parent)
53
52
 
54
- if span_context.valid?
55
- Span.new(span_context: span_context)
53
+ if span.context.valid?
54
+ span
56
55
  else
57
- Span.new
56
+ Span::INVALID
58
57
  end
59
58
  end
60
59
  end
@@ -6,5 +6,5 @@
6
6
 
7
7
  module OpenTelemetry
8
8
  ## Current OpenTelemetry version
9
- VERSION = '0.14.0'
9
+ VERSION = '1.0.0.rc2'
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 1.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-03 00:00:00.000000000 Z
11
+ date: 2021-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ipsa
@@ -151,36 +151,28 @@ files:
151
151
  - lib/opentelemetry.rb
152
152
  - lib/opentelemetry/baggage.rb
153
153
  - lib/opentelemetry/baggage/builder.rb
154
- - lib/opentelemetry/baggage/manager.rb
154
+ - lib/opentelemetry/baggage/entry.rb
155
155
  - lib/opentelemetry/baggage/propagation.rb
156
156
  - lib/opentelemetry/baggage/propagation/context_keys.rb
157
- - lib/opentelemetry/baggage/propagation/text_map_extractor.rb
158
- - lib/opentelemetry/baggage/propagation/text_map_injector.rb
157
+ - lib/opentelemetry/baggage/propagation/text_map_propagator.rb
159
158
  - lib/opentelemetry/context.rb
160
159
  - lib/opentelemetry/context/key.rb
161
160
  - lib/opentelemetry/context/propagation.rb
162
- - lib/opentelemetry/context/propagation/composite_propagator.rb
163
- - lib/opentelemetry/context/propagation/noop_extractor.rb
164
- - lib/opentelemetry/context/propagation/noop_injector.rb
165
- - lib/opentelemetry/context/propagation/propagator.rb
161
+ - lib/opentelemetry/context/propagation/composite_text_map_propagator.rb
162
+ - lib/opentelemetry/context/propagation/noop_text_map_propagator.rb
166
163
  - lib/opentelemetry/context/propagation/rack_env_getter.rb
167
164
  - lib/opentelemetry/context/propagation/text_map_getter.rb
165
+ - lib/opentelemetry/context/propagation/text_map_propagator.rb
168
166
  - lib/opentelemetry/context/propagation/text_map_setter.rb
169
167
  - lib/opentelemetry/error.rb
170
- - lib/opentelemetry/instrumentation.rb
171
- - lib/opentelemetry/instrumentation/base.rb
172
- - lib/opentelemetry/instrumentation/registry.rb
173
- - lib/opentelemetry/metrics.rb
174
- - lib/opentelemetry/metrics/handles.rb
175
- - lib/opentelemetry/metrics/instruments.rb
176
- - lib/opentelemetry/metrics/meter.rb
177
- - lib/opentelemetry/metrics/meter_provider.rb
168
+ - lib/opentelemetry/internal.rb
169
+ - lib/opentelemetry/internal/proxy_tracer.rb
170
+ - lib/opentelemetry/internal/proxy_tracer_provider.rb
178
171
  - lib/opentelemetry/trace.rb
179
172
  - lib/opentelemetry/trace/link.rb
180
173
  - lib/opentelemetry/trace/propagation.rb
181
174
  - lib/opentelemetry/trace/propagation/trace_context.rb
182
- - lib/opentelemetry/trace/propagation/trace_context/text_map_extractor.rb
183
- - lib/opentelemetry/trace/propagation/trace_context/text_map_injector.rb
175
+ - lib/opentelemetry/trace/propagation/trace_context/text_map_propagator.rb
184
176
  - lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb
185
177
  - lib/opentelemetry/trace/span.rb
186
178
  - lib/opentelemetry/trace/span_context.rb
@@ -190,16 +182,15 @@ files:
190
182
  - lib/opentelemetry/trace/tracer.rb
191
183
  - lib/opentelemetry/trace/tracer_provider.rb
192
184
  - lib/opentelemetry/trace/tracestate.rb
193
- - lib/opentelemetry/trace/util/http_to_status.rb
194
185
  - lib/opentelemetry/version.rb
195
186
  homepage: https://github.com/open-telemetry/opentelemetry-ruby
196
187
  licenses:
197
188
  - Apache-2.0
198
189
  metadata:
199
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-api/v0.14.0/file.CHANGELOG.html
190
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-api/v1.0.0.rc2/file.CHANGELOG.html
200
191
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/api
201
192
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
202
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-api/v0.14.0
193
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-api/v1.0.0.rc2
203
194
  post_install_message:
204
195
  rdoc_options: []
205
196
  require_paths:
@@ -211,11 +202,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
211
202
  version: 2.5.0
212
203
  required_rubygems_version: !ruby/object:Gem::Requirement
213
204
  requirements:
214
- - - ">="
205
+ - - ">"
215
206
  - !ruby/object:Gem::Version
216
- version: '0'
207
+ version: 1.3.1
217
208
  requirements: []
218
- rubygems_version: 3.1.4
209
+ rubygems_version: 3.1.6
219
210
  signing_key:
220
211
  specification_version: 4
221
212
  summary: A stats collection and distributed tracing framework