opentelemetry-sdk 0.5.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -2
  3. data/CHANGELOG.md +54 -0
  4. data/README.md +1 -1
  5. data/lib/opentelemetry/sdk.rb +2 -1
  6. data/lib/opentelemetry/sdk/baggage.rb +16 -0
  7. data/lib/opentelemetry/sdk/{correlation_context → baggage}/builder.rb +5 -5
  8. data/lib/opentelemetry/sdk/{correlation_context → baggage}/manager.rb +37 -27
  9. data/lib/opentelemetry/sdk/configurator.rb +41 -20
  10. data/lib/opentelemetry/sdk/resources/constants.rb +0 -4
  11. data/lib/opentelemetry/sdk/resources/resource.rb +33 -22
  12. data/lib/opentelemetry/sdk/trace.rb +1 -0
  13. data/lib/opentelemetry/sdk/trace/config/trace_config.rb +3 -3
  14. data/lib/opentelemetry/sdk/trace/event.rb +48 -0
  15. data/lib/opentelemetry/sdk/trace/export.rb +9 -4
  16. data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +84 -36
  17. data/lib/opentelemetry/sdk/trace/export/console_span_exporter.rb +5 -8
  18. data/lib/opentelemetry/sdk/trace/export/in_memory_span_exporter.rb +8 -2
  19. data/lib/opentelemetry/sdk/trace/export/multi_span_exporter.rb +17 -16
  20. data/lib/opentelemetry/sdk/trace/export/noop_span_exporter.rb +6 -2
  21. data/lib/opentelemetry/sdk/trace/export/simple_span_processor.rb +22 -4
  22. data/lib/opentelemetry/sdk/trace/multi_span_processor.rb +30 -6
  23. data/lib/opentelemetry/sdk/trace/noop_span_processor.rb +17 -3
  24. data/lib/opentelemetry/sdk/trace/samplers.rb +51 -43
  25. data/lib/opentelemetry/sdk/trace/samplers/decision.rb +3 -3
  26. data/lib/opentelemetry/sdk/trace/samplers/parent_based.rb +54 -0
  27. data/lib/opentelemetry/sdk/trace/samplers/result.rb +3 -3
  28. data/lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb +45 -0
  29. data/lib/opentelemetry/sdk/trace/span.rb +30 -36
  30. data/lib/opentelemetry/sdk/trace/span_data.rb +16 -3
  31. data/lib/opentelemetry/sdk/trace/tracer.rb +13 -11
  32. data/lib/opentelemetry/sdk/trace/tracer_provider.rb +4 -2
  33. data/lib/opentelemetry/sdk/version.rb +1 -1
  34. metadata +30 -11
  35. data/lib/opentelemetry/sdk/correlation_context.rb +0 -16
  36. data/lib/opentelemetry/sdk/trace/samplers/parent_or_else.rb +0 -43
  37. data/lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1929c4e29a936b51b4f2eca8ec7b4e2f7a597e43e72039e6e963aa72cd00f65f
4
- data.tar.gz: cbf9a0ade97c3dab0a8005cf84729ab8d549c6f0768ea9446d8a71585d676d4f
3
+ metadata.gz: 92bb8c4a7792c37eb367fc10a3093b3fe27339592bc8689cdac308f21ba8ffa7
4
+ data.tar.gz: 2a0b6df150bbf2cb0987d1d4e5aa29fb37323bb740786ee2171e3ae037ff60ac
5
5
  SHA512:
6
- metadata.gz: de2f88ace625de9e494a6800291462330c58d12e0ecac2e8a7a184a8c34382557639aea59eea3dbf16a603355c604446e00cd2b9fe8f2ad3cb009f21c68186cb
7
- data.tar.gz: 42342b8cee795fd241a650b2abae0b8f3f4f73a202605bdcce6ec861de5fe53325fc3e273fe8c06e386df4b42a76ab3d0667990a502f31a0636de733f62b2aef
6
+ metadata.gz: 59acf74f4d8cd4d4b1b7206690b6b0ddff389e98a76d151eb3cc08b97168af5c876a67a537123d81f2a3c7e65e3d52aea07f502bff02b7f8736863c8d299587e
7
+ data.tar.gz: b99ebe6b214387d35d530d01d154f017cb5ae9ea11f6922773c12d1b2fa2807a1051d5d3f021816ad6970d152794ccb1b2e9af37c46b5fde768d4c8574d8833b
data/.yardopts CHANGED
@@ -1,9 +1,9 @@
1
1
  --no-private
2
2
  --title=OpenTelemetry SDK
3
3
  --markup=markdown
4
- --main=OVERVIEW.md
4
+ --main=README.md
5
5
  ./lib/opentelemetry/sdk/**/*.rb
6
6
  ./lib/opentelemetry/sdk.rb
7
7
  -
8
- OVERVIEW.md
8
+ README.md
9
9
  CHANGELOG.md
@@ -1 +1,55 @@
1
1
  # Release History: opentelemetry-sdk
2
+
3
+ ### v0.9.0 / 2020-11-27
4
+
5
+ * BREAKING CHANGE: Pass full Context to samplers
6
+ * BREAKING CHANGE: Add timeout for force_flush and shutdown
7
+
8
+ * ADDED: Add OTEL_RUBY_BSP_START_THREAD_ON_BOOT env var
9
+ * ADDED: Add timeout for force_flush and shutdown
10
+ * FIXED: Signal at batch_size
11
+ * FIXED: SDK Span.recording? after finish
12
+ * FIXED: Pass full Context to samplers
13
+ * DOCS: Add documentation on usage scenarios for span processors
14
+
15
+ ### v0.8.0 / 2020-10-27
16
+
17
+ * BREAKING CHANGE: Move context/span methods to Trace module
18
+ * BREAKING CHANGE: Remove 'canonical' from status codes
19
+ * BREAKING CHANGE: Assorted SpanContext fixes
20
+
21
+ * FIXED: Move context/span methods to Trace module
22
+ * FIXED: Remove 'canonical' from status codes
23
+ * FIXED: Assorted SpanContext fixes
24
+
25
+ ### v0.7.0 / 2020-10-07
26
+
27
+ * ADDED: Add service_name setter to configurator
28
+ * ADDED: Add service_version setter to configurator
29
+ * FIXED: Fork safety for batch processor
30
+ * FIXED: Don't generate a span ID unnecessarily
31
+ * DOCS: Fix Configurator#add_span_processor
32
+ * DOCS: Standardize toplevel docs structure and readme
33
+
34
+ ### v0.6.0 / 2020-09-10
35
+
36
+ * BREAKING CHANGE: Rename Resource labels to attributes
37
+ * BREAKING CHANGE: Export resource from Span/SpanData instead of library_resource
38
+ * BREAKING CHANGE: Rename CorrelationContext to Baggage
39
+ * BREAKING CHANGE: Rename Text* to TextMap* (propagators, injectors, extractors)
40
+ * BREAKING CHANGE: Rename span.record_error to span.record_exception
41
+ * BREAKING CHANGE: Update samplers to match spec
42
+ * BREAKING CHANGE: Remove support for lazy event creation
43
+
44
+ * ADDED: Add OTLP exporter
45
+ * ADDED: Add support for OTEL_LOG_LEVEL env var
46
+ * FIXED: Rename Resource labels to attributes
47
+ * ADDED: Environment variable resource detection
48
+ * ADDED: BatchSpanProcessor environment variable support
49
+ * FIXED: Remove semver prefix
50
+ * FIXED: Docs for array valued attributes
51
+ * ADDED: Add hex_trace_id and hex_span_id helpers to SpanData
52
+ * FIXED: Fix ProbabilitySampler
53
+ * ADDED: Implement GetCorrelations
54
+ * FIXED: Change default Sampler to ParentOrElse(AlwaysOn)
55
+ * FIXED: Fix probability sampler
data/README.md CHANGED
@@ -41,7 +41,7 @@ tracer.in_span('foo') do |span|
41
41
  # set an attribute
42
42
  span.set_attribute('platform', 'osx')
43
43
  # add an event
44
- span.add_event(name: 'event in bar')
44
+ span.add_event('event in bar')
45
45
  # create bar as child of foo
46
46
  tracer.in_span('bar') do |child_span|
47
47
  # inspect the span
@@ -5,6 +5,7 @@
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
7
  require 'opentelemetry'
8
+ require 'opentelemetry/common'
8
9
 
9
10
  # OpenTelemetry is an open source observability framework, providing a
10
11
  # general-purpose API, SDK, and related tools required for the instrumentation
@@ -61,7 +62,7 @@ module OpenTelemetry
61
62
  end
62
63
 
63
64
  require 'opentelemetry/sdk/configurator'
64
- require 'opentelemetry/sdk/correlation_context'
65
+ require 'opentelemetry/sdk/baggage'
65
66
  require 'opentelemetry/sdk/internal'
66
67
  require 'opentelemetry/sdk/instrumentation_library'
67
68
  require 'opentelemetry/sdk/resources'
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2019 OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ require 'opentelemetry/sdk/baggage/builder'
8
+ require 'opentelemetry/sdk/baggage/manager'
9
+
10
+ module OpenTelemetry
11
+ module SDK
12
+ # Contains operational implementations of the Baggage::Manager
13
+ module Baggage
14
+ end
15
+ end
16
+ end
@@ -6,8 +6,8 @@
6
6
 
7
7
  module OpenTelemetry
8
8
  module SDK
9
- module CorrelationContext
10
- # SDK implementation of CorrelationContext::Builder
9
+ module Baggage
10
+ # SDK implementation of Baggage::Builder
11
11
  class Builder
12
12
  attr_reader :entries
13
13
 
@@ -15,7 +15,7 @@ module OpenTelemetry
15
15
  @entries = entries
16
16
  end
17
17
 
18
- # Set key-value in the to-be-created correlation context
18
+ # Set key-value in the to-be-created baggage
19
19
  #
20
20
  # @param [String] key The key to store this value under
21
21
  # @param [String] value String value to be stored under key
@@ -23,14 +23,14 @@ module OpenTelemetry
23
23
  @entries[key] = value.to_s
24
24
  end
25
25
 
26
- # Removes key from the to-be-created correlation context
26
+ # Removes key from the to-be-created baggage
27
27
  #
28
28
  # @param [String] key The key to remove
29
29
  def remove_value(key)
30
30
  @entries.delete(key)
31
31
  end
32
32
 
33
- # Clears all correlations from the to-be-created correlation context
33
+ # Clears all baggage from the to-be-created baggage
34
34
  def clear
35
35
  @entries.clear
36
36
  end
@@ -6,38 +6,38 @@
6
6
 
7
7
  module OpenTelemetry
8
8
  module SDK
9
- module CorrelationContext
10
- # Manages correlation context
9
+ module Baggage
10
+ # Manages baggage
11
11
  class Manager
12
- CORRELATION_CONTEXT_KEY = OpenTelemetry::CorrelationContext::Propagation::ContextKeys.correlation_context_key
13
- EMPTY_CORRELATION_CONTEXT = {}.freeze
14
- private_constant(:CORRELATION_CONTEXT_KEY, :EMPTY_CORRELATION_CONTEXT)
12
+ BAGGAGE_KEY = OpenTelemetry::Baggage::Propagation::ContextKeys.baggage_key
13
+ EMPTY_BAGGAGE = {}.freeze
14
+ private_constant(:BAGGAGE_KEY, :EMPTY_BAGGAGE)
15
15
 
16
- # Used to chain modifications to correlation context. The result is a
17
- # context with an updated correlation context. If only a single
18
- # modification is being made to correlation context, use the other
16
+ # Used to chain modifications to baggage. The result is a
17
+ # context with an updated baggage. If only a single
18
+ # modification is being made to baggage, use the other
19
19
  # methods on +Manager+, if multiple modifications are being made, use
20
20
  # this one.
21
21
  #
22
22
  # @param [optional Context] context The context to update with with new
23
- # modified correlation context. Defaults to +Context.current+
23
+ # modified baggage. Defaults to +Context.current+
24
24
  # @return [Context]
25
25
  def build_context(context: Context.current)
26
- builder = Builder.new(correlations_for(context).dup)
26
+ builder = Builder.new(baggage_for(context).dup)
27
27
  yield builder
28
- context.set_value(CORRELATION_CONTEXT_KEY, builder.entries)
28
+ context.set_value(BAGGAGE_KEY, builder.entries)
29
29
  end
30
30
 
31
- # Returns a new context with empty correlations
31
+ # Returns a new context with empty baggage
32
32
  #
33
- # @param [optional Context] context Context to clear correlations from. Defaults
33
+ # @param [optional Context] context Context to clear baggage from. Defaults
34
34
  # to +Context.current+
35
35
  # @return [Context]
36
36
  def clear(context: Context.current)
37
- context.set_value(CORRELATION_CONTEXT_KEY, EMPTY_CORRELATION_CONTEXT)
37
+ context.set_value(BAGGAGE_KEY, EMPTY_BAGGAGE)
38
38
  end
39
39
 
40
- # Returns the corresponding correlation value (or nil) for key
40
+ # Returns the corresponding baggage value (or nil) for key
41
41
  #
42
42
  # @param [String] key The lookup key
43
43
  # @param [optional Context] context The context from which to retrieve
@@ -45,7 +45,17 @@ module OpenTelemetry
45
45
  # Defaults to +Context.current+
46
46
  # @return [String]
47
47
  def value(key, context: Context.current)
48
- correlations_for(context)[key]
48
+ baggage_for(context)[key]
49
+ end
50
+
51
+ # Returns the baggage
52
+ #
53
+ # @param [optional Context] context The context from which to retrieve
54
+ # the baggage.
55
+ # Defaults to +Context.current+
56
+ # @return [Hash]
57
+ def values(context: Context.current)
58
+ baggage_for(context).dup.freeze
49
59
  end
50
60
 
51
61
  # Returns a new context with new key-value pair
@@ -56,30 +66,30 @@ module OpenTelemetry
56
66
  # value. Defaults to +Context.current+
57
67
  # @return [Context]
58
68
  def set_value(key, value, context: Context.current)
59
- new_correlations = correlations_for(context).dup
60
- new_correlations[key] = value
61
- context.set_value(CORRELATION_CONTEXT_KEY, new_correlations)
69
+ new_baggage = baggage_for(context).dup
70
+ new_baggage[key] = value
71
+ context.set_value(BAGGAGE_KEY, new_baggage)
62
72
  end
63
73
 
64
74
  # Returns a new context with value at key removed
65
75
  #
66
76
  # @param [String] key The key to remove
67
- # @param [optional Context] context The context to remove correlation
77
+ # @param [optional Context] context The context to remove baggage
68
78
  # from. Defaults to +Context.current+
69
79
  # @return [Context]
70
80
  def remove_value(key, context: Context.current)
71
- correlations = correlations_for(context)
72
- return context unless correlations.key?(key)
81
+ baggage = baggage_for(context)
82
+ return context unless baggage.key?(key)
73
83
 
74
- new_correlations = correlations.dup
75
- new_correlations.delete(key)
76
- context.set_value(CORRELATION_CONTEXT_KEY, new_correlations)
84
+ new_baggage = baggage.dup
85
+ new_baggage.delete(key)
86
+ context.set_value(BAGGAGE_KEY, new_baggage)
77
87
  end
78
88
 
79
89
  private
80
90
 
81
- def correlations_for(context)
82
- context.value(CORRELATION_CONTEXT_KEY) || EMPTY_CORRELATION_CONTEXT
91
+ def baggage_for(context)
92
+ context.value(BAGGAGE_KEY) || EMPTY_BAGGAGE
83
93
  end
84
94
  end
85
95
  end
@@ -15,32 +15,53 @@ module OpenTelemetry
15
15
 
16
16
  private_constant :USE_MODE_UNSPECIFIED, :USE_MODE_ONE, :USE_MODE_ALL
17
17
 
18
- attr_writer :logger, :http_extractors, :http_injectors, :text_extractors,
19
- :text_injectors
18
+ attr_writer :logger, :http_extractors, :http_injectors, :text_map_extractors,
19
+ :text_map_injectors
20
20
 
21
21
  def initialize
22
22
  @instrumentation_names = []
23
23
  @instrumentation_config_map = {}
24
24
  @http_extractors = nil
25
25
  @http_injectors = nil
26
- @text_extractors = nil
27
- @text_injectors = nil
26
+ @text_map_extractors = nil
27
+ @text_map_injectors = nil
28
28
  @span_processors = []
29
29
  @use_mode = USE_MODE_UNSPECIFIED
30
30
  @resource = Resources::Resource.telemetry_sdk
31
31
  end
32
32
 
33
33
  def logger
34
- @logger ||= Logger.new(STDOUT)
34
+ @logger ||= OpenTelemetry.logger
35
35
  end
36
36
 
37
37
  # Accepts a resource object that is merged with the default telemetry sdk
38
38
  # resource. The use of this method is optional, and is provided as means
39
- # to add additional resource information.
39
+ # to include additional resource information.
40
+ # If a resource key collision occurs the passed in resource takes priority.
40
41
  #
41
42
  # @param [Resource] new_resource The resource to be merged
42
43
  def resource=(new_resource)
43
- @resource = @resource.merge(new_resource)
44
+ @resource = new_resource.merge(@resource)
45
+ end
46
+
47
+ # Accepts a string that is merged in as the service.name resource attribute.
48
+ # The most recent assigned value will be used in the event of repeated
49
+ # calls to this setter.
50
+ # @param [String] service_name The value to be used as the service name
51
+ def service_name=(service_name)
52
+ @resource = OpenTelemetry::SDK::Resources::Resource.create(
53
+ OpenTelemetry::SDK::Resources::Constants::SERVICE_RESOURCE[:name] => service_name
54
+ ).merge(@resource)
55
+ end
56
+
57
+ # Accepts a string that is merged in as the service.version resource attribute.
58
+ # The most recent assigned value will be used in the event of repeated
59
+ # calls to this setter.
60
+ # @param [String] service_version The value to be used as the service version
61
+ def service_version=(service_version)
62
+ @resource = OpenTelemetry::SDK::Resources::Resource.create(
63
+ OpenTelemetry::SDK::Resources::Constants::SERVICE_RESOURCE[:version] => service_version
64
+ ).merge(@resource)
44
65
  end
45
66
 
46
67
  # Install an instrumentation with specificied optional +config+.
@@ -72,8 +93,8 @@ module OpenTelemetry
72
93
 
73
94
  # Add a span processor to the export pipeline
74
95
  #
75
- # @param [#on_start, #on_finish, #shutdown] span_processor A span_processor
76
- # that satisfies the duck type #on_start, #on_finish, #shutdown. See
96
+ # @param [#on_start, #on_finish, #shutdown, #force_flush] span_processor A span_processor
97
+ # that satisfies the duck type #on_start, #on_finish, #shutdown, #force_flush. See
77
98
  # {SimpleSpanProcessor} for an example.
78
99
  def add_span_processor(span_processor)
79
100
  @span_processors << span_processor
@@ -89,7 +110,7 @@ module OpenTelemetry
89
110
  # - install instrumentation
90
111
  def configure
91
112
  OpenTelemetry.logger = logger
92
- OpenTelemetry.correlations = CorrelationContext::Manager.new
113
+ OpenTelemetry.baggage = Baggage::Manager.new
93
114
  configure_propagation
94
115
  configure_span_processors
95
116
  OpenTelemetry.tracer_provider = tracer_provider
@@ -130,8 +151,8 @@ module OpenTelemetry
130
151
  def configure_propagation
131
152
  OpenTelemetry.propagation.http = create_propagator(@http_injectors || default_http_injectors,
132
153
  @http_extractors || default_http_extractors)
133
- OpenTelemetry.propagation.text = create_propagator(@text_injectors || default_text_injectors,
134
- @text_extractors || default_text_extractors)
154
+ OpenTelemetry.propagation.text = create_propagator(@text_map_injectors || default_text_map_injectors,
155
+ @text_map_extractors || default_text_map_extractors)
135
156
  end
136
157
 
137
158
  def create_propagator(injectors, extractors)
@@ -143,27 +164,27 @@ module OpenTelemetry
143
164
  end
144
165
 
145
166
  def default_http_injectors
146
- default_text_injectors
167
+ default_text_map_injectors
147
168
  end
148
169
 
149
170
  def default_http_extractors
150
171
  [
151
172
  OpenTelemetry::Trace::Propagation::TraceContext.rack_extractor,
152
- OpenTelemetry::CorrelationContext::Propagation.rack_extractor
173
+ OpenTelemetry::Baggage::Propagation.rack_extractor
153
174
  ]
154
175
  end
155
176
 
156
- def default_text_injectors
177
+ def default_text_map_injectors
157
178
  [
158
- OpenTelemetry::Trace::Propagation::TraceContext.text_injector,
159
- OpenTelemetry::CorrelationContext::Propagation.text_injector
179
+ OpenTelemetry::Trace::Propagation::TraceContext.text_map_injector,
180
+ OpenTelemetry::Baggage::Propagation.text_map_injector
160
181
  ]
161
182
  end
162
183
 
163
- def default_text_extractors
184
+ def default_text_map_extractors
164
185
  [
165
- OpenTelemetry::Trace::Propagation::TraceContext.text_extractor,
166
- OpenTelemetry::CorrelationContext::Propagation.text_extractor
186
+ OpenTelemetry::Trace::Propagation::TraceContext.text_map_extractor,
187
+ OpenTelemetry::Baggage::Propagation.text_map_extractor
167
188
  ]
168
189
  end
169
190
  end
@@ -79,10 +79,6 @@ module OpenTelemetry
79
79
 
80
80
  # Attributes defining a computing instance (e.g. host).
81
81
  HOST_RESOURCE = {
82
- # Hostname of the host. It contains what the hostname command returns on the
83
- # host machine.
84
- hostname: 'host.hostname',
85
-
86
82
  # Unique host id. For Cloud this must be the instance_id assigned by the
87
83
  # cloud provider
88
84
  id: 'host.id',
@@ -13,29 +13,40 @@ module OpenTelemetry
13
13
  class << self
14
14
  private :new # rubocop:disable Style/AccessModifierDeclarations
15
15
 
16
- # Returns a newly created {Resource} with the specified labels
16
+ # Returns a newly created {Resource} with the specified attributes
17
17
  #
18
- # @param [Hash{String => String, Numeric, Boolean} labels Hash of key-value pairs to be used
19
- # as labels for this resource
20
- # @raise [ArgumentError] If label keys and values are not strings
18
+ # @param [Hash{String => String, Numeric, Boolean} attributes Hash of key-value pairs to be used
19
+ # as attributes for this resource
20
+ # @raise [ArgumentError] If attribute keys and values are not strings
21
21
  # @return [Resource]
22
- def create(labels = {})
23
- frozen_labels = labels.each_with_object({}) do |(k, v), memo|
24
- raise ArgumentError, 'label keys must be strings' unless k.is_a?(String)
25
- raise ArgumentError, 'label values must be strings, integers, floats, or booleans' unless Internal.valid_value?(v)
22
+ def create(attributes = {})
23
+ frozen_attributes = attributes.each_with_object({}) do |(k, v), memo|
24
+ raise ArgumentError, 'attribute keys must be strings' unless k.is_a?(String)
25
+ raise ArgumentError, 'attribute values must be strings, integers, floats, or booleans' unless Internal.valid_value?(v)
26
26
 
27
27
  memo[-k] = v.freeze
28
28
  end.freeze
29
29
 
30
- new(frozen_labels)
30
+ new(frozen_attributes)
31
31
  end
32
32
 
33
33
  def telemetry_sdk
34
- create(
34
+ resource_attributes = {
35
35
  Constants::TELEMETRY_SDK_RESOURCE[:name] => 'opentelemetry',
36
36
  Constants::TELEMETRY_SDK_RESOURCE[:language] => 'ruby',
37
- Constants::TELEMETRY_SDK_RESOURCE[:version] => "semver:#{OpenTelemetry::SDK::VERSION}"
38
- )
37
+ Constants::TELEMETRY_SDK_RESOURCE[:version] => OpenTelemetry::SDK::VERSION
38
+ }
39
+
40
+ resource_pairs = ENV['OTEL_RESOURCE_ATTRIBUTES']
41
+ return create(resource_attributes) unless resource_pairs.is_a?(String)
42
+
43
+ resource_pairs.split(',').each do |pair|
44
+ key, value = pair.split('=')
45
+ resource_attributes[key] = value
46
+ end
47
+
48
+ resource_attributes.delete_if { |_key, value| value.nil? || value.empty? }
49
+ create(resource_attributes)
39
50
  end
40
51
  end
41
52
 
@@ -44,18 +55,18 @@ module OpenTelemetry
44
55
  # Users should use the {create} factory method to obtain a {Resource}
45
56
  # instance.
46
57
  #
47
- # @param [Hash<String, String>] frozen_labels Frozen-hash of frozen-string
48
- # key-value pairs to be used as labels for this resource
58
+ # @param [Hash<String, String>] frozen_attributes Frozen-hash of frozen-string
59
+ # key-value pairs to be used as attributes for this resource
49
60
  # @return [Resource]
50
- def initialize(frozen_labels)
51
- @labels = frozen_labels
61
+ def initialize(frozen_attributes)
62
+ @attributes = frozen_attributes
52
63
  end
53
64
 
54
- # Returns an enumerator for labels of this {Resource}
65
+ # Returns an enumerator for attributes of this {Resource}
55
66
  #
56
67
  # @return [Enumerator]
57
- def label_enumerator
58
- @label_enumerator ||= labels.to_enum
68
+ def attribute_enumerator
69
+ @attribute_enumerator ||= attributes.to_enum
59
70
  end
60
71
 
61
72
  # Returns a new, merged {Resource} by merging the current {Resource} with
@@ -68,16 +79,16 @@ module OpenTelemetry
68
79
  def merge(other)
69
80
  return self unless other.is_a?(Resource)
70
81
 
71
- merged_labels = labels.merge(other.labels) do |_, old_v, new_v|
82
+ merged_attributes = attributes.merge(other.attributes) do |_, old_v, new_v|
72
83
  old_v.empty? ? new_v : old_v
73
84
  end
74
85
 
75
- self.class.send(:new, merged_labels.freeze)
86
+ self.class.send(:new, merged_attributes.freeze)
76
87
  end
77
88
 
78
89
  protected
79
90
 
80
- attr_reader :labels
91
+ attr_reader :attributes
81
92
  end
82
93
  end
83
94
  end