opentelemetry-metrics-api 0.8.0 → 0.10.0

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
2
  SHA256:
3
- metadata.gz: bdddbd715c197f54333fb8d8938d5342e9c6040048de12aa58e97416110f21b1
4
- data.tar.gz: 8a70192047000b96d310c481e8fea2346f1af280400c49726856cb2d5df1eeb8
3
+ metadata.gz: '035779447efea7942cbd75c69833e5bf98e405c79feb87fee1bbc95c33b25446'
4
+ data.tar.gz: 5de788278de6a22c06316ea2af2c36d2ea4c7eb071dc6c7c207c31729ac77ec0
5
5
  SHA512:
6
- metadata.gz: 74d6673bf1c5d7d0e84c997be486ba8d62f2082b60a60ecc5e53780ca67a29364caff82d93445ac85da0c7014e88ed77a7c477b282017ffa2ae88453265bdb30
7
- data.tar.gz: 4e77afb89660407b222599ad3aade9c4427687b7e5d825da5e50f9797119bbef2a0e60dbdfc911c9481bb5a2eb75350f5fabd1fabf7c1b2fb261ca36c92759c0
6
+ metadata.gz: cdc4348854acf2433a651c6199232d15cd64fb705bdde5254cdf7ee535a574a35621a7aae15814d2e39abbe7b7e468ed99718c5f05350a54d28934eb59e96582
7
+ data.tar.gz: 12cb89591164ccedc1e6a730b0c89f8bd8f84d9851bb06d86931eb9b840973b4e7747227e08d39613b325612d44d6b5974d2e29fcc242bfb180de3513a57aee2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Release History: opentelemetry-metrics-api
2
2
 
3
+ ### v0.10.0 / 2026-10-13
4
+
5
+ * ADDED: Fix duplicate instrument registration warning (#2417)
6
+
7
+ ### v0.9.0 / 2026-10-05
8
+
9
+ * BREAKING CHANGE: Move the global meter provider behind an opt-in require (#2416)
10
+ * ADDED: Move the global meter provider behind an opt-in require (#2416)
11
+
3
12
  ### v0.8.0 / 2026-09-29
4
13
 
5
14
  * BREAKING CHANGE: Update api for spec compliance (#2309)
data/README.md CHANGED
@@ -22,18 +22,24 @@ This code is still under development and is not a complete implementation of the
22
22
 
23
23
  ## How do I get started?
24
24
 
25
- Install the gem using:
25
+ Install the gems using:
26
26
 
27
27
  ```sh
28
- gem install opentelemetry-metrics-api
28
+ gem install opentelemetry-sdk
29
+ gem install opentelemetry-metrics-sdk
29
30
  ```
30
31
 
31
- Or, if you use [bundler][bundler-home], include `opentelemetry-metrics-api` in your `Gemfile`.
32
+ Or, if you use [bundler][bundler-home], include `opentelemetry-sdk` and `opentelemetry-metrics-sdk` in your `Gemfile`. The SDK depends on `opentelemetry-metrics-api`.
32
33
 
33
- Then, use the OpenTelemetry interfaces to produces traces and other telemetry data. Following is a basic example.
34
+ Requiring `opentelemetry-metrics-sdk` defines the global `OpenTelemetry.meter_provider` accessor. Requiring `opentelemetry-metrics-api` on its own does not. See [Upgrading to 0.9.0](#upgrading-to-090).
35
+
36
+ Then, use the OpenTelemetry interfaces to produce metrics and other telemetry data. Following is a basic example.
34
37
 
35
38
  ```ruby
36
- require 'opentelemetry-metrics-api'
39
+ require 'opentelemetry/sdk'
40
+ require 'opentelemetry-metrics-sdk'
41
+
42
+ OpenTelemetry::SDK.configure
37
43
 
38
44
  # Obtain the current default meter provider
39
45
  provider = OpenTelemetry.meter_provider
@@ -50,6 +56,20 @@ histogram.record(123, attributes: {'foo' => 'bar'})
50
56
 
51
57
  For additional examples, see the [examples on github][examples-github].
52
58
 
59
+ ## Upgrading to 0.9.0
60
+
61
+ The Metrics API is experimental. To keep it off the public `OpenTelemetry` module until it stabilizes, `opentelemetry-metrics-api` 0.9.0 no longer defines `OpenTelemetry.meter_provider` or `OpenTelemetry.meter_provider=`. `opentelemetry-metrics-sdk` 0.20.0 and later define both when required.
62
+
63
+ - **Applications using `opentelemetry-metrics-sdk`:** Upgrade the SDK to 0.20.0 or later. No code changes are needed.
64
+ - **Code that requires only `opentelemetry-metrics-api`:** Calling `OpenTelemetry.meter_provider` raises `NoMethodError`. Require `opentelemetry-metrics-sdk`, or `opentelemetry/metrics/global` to define the accessors without the SDK.
65
+ - **Applications on `opentelemetry-metrics-sdk` 0.19.0 or earlier:** These versions allow `opentelemetry-metrics-api` 0.9.0, so bundler can pair them. A compatibility shim in the API keeps them working and logs this warning:
66
+
67
+ ```text
68
+ opentelemetry-metrics-sdk 0.19.0 and earlier register the global meter provider through a compatibility shim in opentelemetry-metrics-api. Upgrade to opentelemetry-metrics-sdk 0.20.0 or later.
69
+ ```
70
+
71
+ The shim will be removed in a future release ([#2414][2414]). Upgrade the SDK to clear the warning.
72
+
53
73
  ## How can I get involved?
54
74
 
55
75
  The `opentelemetry-metrics-api` gem source is [on github][repo-github], along with related gems including `opentelemetry-metrics-sdk`.
@@ -76,3 +96,4 @@ The `opentelemetry-api` gem is distributed under the Apache 2.0 license. See [LI
76
96
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
77
97
  [discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
78
98
  [1662]: https://github.com/open-telemetry/opentelemetry-ruby/issues/1662
99
+ [2414]: https://github.com/open-telemetry/opentelemetry-ruby/issues/2414
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ # @api private
9
+ module Internal
10
+ @meter_provider = ProxyMeterProvider.new
11
+ @meter_provider_mutex = Mutex.new
12
+
13
+ class << self
14
+ # Registers the process-wide meter provider that instrumentation reads
15
+ # from. The public +OpenTelemetry.meter_provider+ accessor, defined in
16
+ # +opentelemetry/metrics/global+, delegates here.
17
+ #
18
+ # @param [MeterProvider] provider A meter provider to register as the
19
+ # global instance.
20
+ def meter_provider=(provider)
21
+ @meter_provider_mutex.synchronize do
22
+ if @meter_provider.instance_of?(ProxyMeterProvider)
23
+ OpenTelemetry.logger.debug("Upgrading default proxy meter provider to #{provider.class}")
24
+ @meter_provider.delegate = provider
25
+ end
26
+ @meter_provider = provider
27
+ end
28
+ end
29
+
30
+ # @return [Object, Metrics::MeterProvider] registered meter provider or a
31
+ # default no-op implementation of the meter provider.
32
+ def meter_provider
33
+ @meter_provider_mutex.synchronize { @meter_provider }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -19,6 +19,9 @@ module OpenTelemetry
19
19
  def initialize
20
20
  super
21
21
  @delegate = nil
22
+ # Every placeholder created before the delegate is set, including repeated and
23
+ # conflicting registrations of the same name, so that each one gets upgraded.
24
+ @proxy_instruments = []
22
25
  end
23
26
 
24
27
  # Set the delegate Meter. If this is called more than once, a warning will
@@ -29,7 +32,8 @@ module OpenTelemetry
29
32
  @mutex.synchronize do
30
33
  if @delegate.nil?
31
34
  @delegate = meter
32
- @instrument_registry.each_value { |instrument| instrument.upgrade_with(meter) }
35
+ @proxy_instruments.each { |instrument| instrument.upgrade_with(meter) }
36
+ @proxy_instruments.clear
33
37
  else
34
38
  OpenTelemetry.logger.warn 'Attempt to reset delegate in ProxyMeter ignored.'
35
39
  end
@@ -38,9 +42,15 @@ module OpenTelemetry
38
42
 
39
43
  private
40
44
 
45
+ # Does not call `super`: the base registry keys instruments by name, so a repeated
46
+ # registration would replace an earlier placeholder that then never gets upgraded.
41
47
  def create_instrument(kind, name, unit, description, callback, exemplar_filter, exemplar_reservoir, advisory)
42
- super do
43
- next ProxyInstrument.new(kind, name, unit, description, callback, exemplar_filter, exemplar_reservoir, advisory) if @delegate.nil?
48
+ @mutex.synchronize do
49
+ if @delegate.nil?
50
+ instrument = ProxyInstrument.new(kind, name, unit, description, callback, exemplar_filter, exemplar_reservoir, advisory)
51
+ @proxy_instruments << instrument
52
+ next instrument
53
+ end
44
54
 
45
55
  case kind
46
56
  when :counter then @delegate.create_counter(name, unit: unit, description: description, exemplar_filter: exemplar_filter, exemplar_reservoir: exemplar_reservoir, advisory: advisory)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ require 'opentelemetry-metrics-api'
8
+
9
+ # Defines the top-level accessors for the global meter provider. The Metrics
10
+ # API is unstable, so requiring +opentelemetry-metrics-api+ does not define
11
+ # these. Requiring +opentelemetry-metrics-sdk+ does.
12
+ #
13
+ # These are delegators. The provider itself lives in
14
+ # {OpenTelemetry::Internal}, so this file can be required at any point,
15
+ # before or after the SDK is configured.
16
+ module OpenTelemetry
17
+ # Register the global meter provider.
18
+ #
19
+ # @param [MeterProvider] provider A meter provider to register as the
20
+ # global instance.
21
+ def meter_provider=(provider)
22
+ Internal.meter_provider = provider
23
+ end
24
+
25
+ # @return [Object, Metrics::MeterProvider] registered meter provider or a
26
+ # default no-op implementation of the meter provider.
27
+ def meter_provider
28
+ Internal.meter_provider
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ # Installs the top-level meter provider accessors on behalf of metrics SDKs
8
+ # released before those accessors moved out of this gem. Those versions assign
9
+ # and read +OpenTelemetry.meter_provider+ while configuring and after forking,
10
+ # and have no way to require +opentelemetry/metrics/global+ themselves.
11
+ #
12
+ # Such an SDK is always loaded by the time it reaches for the accessor, so the
13
+ # check cannot happen at require time. It happens on the miss instead.
14
+ #
15
+ # Removal is tracked in #2414.
16
+ module OpenTelemetry
17
+ module Metrics
18
+ # Detects a metrics SDK that predates {OpenTelemetry::Metrics::Global} and
19
+ # installs the accessors it expects. With no SDK loaded, +super+ raises
20
+ # NoMethodError, which is what a caller holding only the API is meant to
21
+ # get.
22
+ #
23
+ # @api private
24
+ module LegacyGlobalCompat
25
+ ACCESSORS = %i[meter_provider meter_provider=].freeze
26
+
27
+ WARNING = 'opentelemetry-metrics-sdk 0.19.0 and earlier register the global meter ' \
28
+ 'provider through a compatibility shim in opentelemetry-metrics-api. ' \
29
+ 'Upgrade to opentelemetry-metrics-sdk 0.20.0 or later.'
30
+
31
+ # Keyed on MeterProvider rather than the SDK's Metrics namespace, which
32
+ # another gem could plausibly define without the SDK being present.
33
+ def self.handles?(name)
34
+ ACCESSORS.include?(name) && defined?(OpenTelemetry::SDK::Metrics::MeterProvider)
35
+ end
36
+
37
+ private
38
+
39
+ def method_missing(name, *, &)
40
+ return super unless LegacyGlobalCompat.handles?(name)
41
+
42
+ require 'opentelemetry/metrics/global'
43
+ return super unless singleton_class.method_defined?(name)
44
+
45
+ OpenTelemetry.logger.warn(WARNING)
46
+ public_send(name, *, &)
47
+ end
48
+
49
+ def respond_to_missing?(name, include_private = false)
50
+ LegacyGlobalCompat.handles?(name) || super
51
+ end
52
+ end
53
+ end
54
+
55
+ singleton_class.prepend(Metrics::LegacyGlobalCompat)
56
+ end
@@ -304,8 +304,6 @@ module OpenTelemetry
304
304
 
305
305
  def create_instrument(kind, name, unit, description, callback, exemplar_filter, exemplar_reservoir, advisory)
306
306
  @mutex.synchronize do
307
- OpenTelemetry.logger.warn("duplicate instrument registration occurred for instrument #{name}") if @instrument_registry.include? name
308
-
309
307
  @instrument_registry[name] = yield
310
308
  end
311
309
  end
@@ -7,6 +7,6 @@
7
7
  module OpenTelemetry
8
8
  module Metrics
9
9
  ## Current OpenTelemetry metrics version
10
- VERSION = '0.8.0'
10
+ VERSION = '0.10.0'
11
11
  end
12
12
  end
@@ -10,32 +10,12 @@ require 'opentelemetry/metrics/version'
10
10
  require 'opentelemetry/internal/proxy_instrument'
11
11
  require 'opentelemetry/internal/proxy_meter_provider'
12
12
  require 'opentelemetry/internal/proxy_meter'
13
+ require 'opentelemetry/internal/global_meter_provider'
14
+ require 'opentelemetry/metrics/legacy_global_compat'
13
15
 
14
16
  # OpenTelemetry is an open source observability framework, providing a
15
17
  # general-purpose API, SDK, and related tools required for the instrumentation
16
18
  # of cloud-native software, frameworks, and libraries.
17
19
  #
18
- # The OpenTelemetry module provides global accessors for telemetry objects.
19
- module OpenTelemetry
20
- @meter_provider = Internal::ProxyMeterProvider.new
21
-
22
- # Register the global meter provider.
23
- #
24
- # @param [MeterProvider] provider A meter provider to register as the
25
- # global instance.
26
- def meter_provider=(provider)
27
- @mutex.synchronize do
28
- if @meter_provider.instance_of? Internal::ProxyMeterProvider
29
- logger.debug("Upgrading default proxy meter provider to #{provider.class}")
30
- @meter_provider.delegate = provider
31
- end
32
- @meter_provider = provider
33
- end
34
- end
35
-
36
- # @return [Object, Metrics::MeterProvider] registered meter provider or a
37
- # default no-op implementation of the meter provider.
38
- def meter_provider
39
- @mutex.synchronize { @meter_provider }
40
- end
41
- end
20
+ # Requiring this gem makes the Metrics API available to instrumentation through
21
+ # {OpenTelemetry::Internal.meter_provider}.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-metrics-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
@@ -34,10 +34,12 @@ files:
34
34
  - LICENSE
35
35
  - README.md
36
36
  - lib/opentelemetry-metrics-api.rb
37
+ - lib/opentelemetry/internal/global_meter_provider.rb
37
38
  - lib/opentelemetry/internal/proxy_instrument.rb
38
39
  - lib/opentelemetry/internal/proxy_meter.rb
39
40
  - lib/opentelemetry/internal/proxy_meter_provider.rb
40
41
  - lib/opentelemetry/metrics.rb
42
+ - lib/opentelemetry/metrics/global.rb
41
43
  - lib/opentelemetry/metrics/instrument.rb
42
44
  - lib/opentelemetry/metrics/instrument/counter.rb
43
45
  - lib/opentelemetry/metrics/instrument/gauge.rb
@@ -46,6 +48,7 @@ files:
46
48
  - lib/opentelemetry/metrics/instrument/observable_gauge.rb
47
49
  - lib/opentelemetry/metrics/instrument/observable_up_down_counter.rb
48
50
  - lib/opentelemetry/metrics/instrument/up_down_counter.rb
51
+ - lib/opentelemetry/metrics/legacy_global_compat.rb
49
52
  - lib/opentelemetry/metrics/measurement.rb
50
53
  - lib/opentelemetry/metrics/meter.rb
51
54
  - lib/opentelemetry/metrics/meter_provider.rb
@@ -54,10 +57,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
54
57
  licenses:
55
58
  - Apache-2.0
56
59
  metadata:
57
- changelog_uri: https://rubydoc.info/gems/opentelemetry-metrics-api/0.8.0/file/CHANGELOG.md
58
- source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/opentelemetry-metrics-api/v0.8.0/metrics_api
60
+ changelog_uri: https://rubydoc.info/gems/opentelemetry-metrics-api/0.10.0/file/CHANGELOG.md
61
+ source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/opentelemetry-metrics-api/v0.10.0/metrics_api
59
62
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
60
- documentation_uri: https://rubydoc.info/gems/opentelemetry-metrics-api/0.8.0
63
+ documentation_uri: https://rubydoc.info/gems/opentelemetry-metrics-api/0.10.0
61
64
  rdoc_options: []
62
65
  require_paths:
63
66
  - lib