opentelemetry-metrics-api 0.8.0 → 0.9.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: '01447149549ce311507e50a73b1c25962ea229f9d30fee3878ca09b519e278ba'
4
+ data.tar.gz: c7cf8d92fd0a56ee620a0c465f10178dde5773652482ca02b607fd3db06d4884
5
5
  SHA512:
6
- metadata.gz: 74d6673bf1c5d7d0e84c997be486ba8d62f2082b60a60ecc5e53780ca67a29364caff82d93445ac85da0c7014e88ed77a7c477b282017ffa2ae88453265bdb30
7
- data.tar.gz: 4e77afb89660407b222599ad3aade9c4427687b7e5d825da5e50f9797119bbef2a0e60dbdfc911c9481bb5a2eb75350f5fabd1fabf7c1b2fb261ca36c92759c0
6
+ metadata.gz: fb53b43bcbce42330ba77fc382e398f6972cbe7b643d346bd6afe63fc7e354fac8f0874bb56858fea667e5015e21a5c8ac2dcb15cb67a34b0da847b2f7b5d9e0
7
+ data.tar.gz: 6ffc9da9c4603ded64ba39f805bc73f4bd37dea3044e306e97f6a217e2efca1823801331c07083b146b2dd1807f42a95142ef8966811df6aba7d8b6443064bae
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Release History: opentelemetry-metrics-api
2
2
 
3
+ ### v0.9.0 / 2026-10-05
4
+
5
+ * BREAKING CHANGE: Move the global meter provider behind an opt-in require (#2416)
6
+ * ADDED: Move the global meter provider behind an opt-in require (#2416)
7
+
3
8
  ### v0.8.0 / 2026-09-29
4
9
 
5
10
  * 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
@@ -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
@@ -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.9.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.9.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.9.0/file/CHANGELOG.md
61
+ source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/opentelemetry-metrics-api/v0.9.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.9.0
61
64
  rdoc_options: []
62
65
  require_paths:
63
66
  - lib