opentelemetry-metrics-sdk 0.13.0 → 0.14.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: ab86f13e4c2f144a3c7e0016427f84cd3b441e73ea7a1763b87ce0d65cdfe09a
4
- data.tar.gz: 0a6108e36f68f835015d2788dfda936fe32dd9dece37c89f9544cc2954598a89
3
+ metadata.gz: 35222d1da9eadba8252b7110b20a504a5e5b339c7ecc50403b3d6056f6b2c282
4
+ data.tar.gz: 23732ae05bea5b79aa6678f636e429d5958a35b96cf7dbd54846212db33d6727
5
5
  SHA512:
6
- metadata.gz: 63c87d0216721b418f168d92e419006c3b552a0eb1dd2de9b804f773a7928c14505eac77691ef92782ab69a7d457c916cb162a89098eee9fa382f8ac3e27526d
7
- data.tar.gz: fe4b4ad19c93bdb896d66d54c65a3500eb7e1237af6d1c992b64129ad050fe93351bb7a6e1812035db123fc81795ccb29be479c48593c0f2f45402cbac60d490
6
+ metadata.gz: 81abb739ad7ee5191f98d3577a2a7f65323dbb567ba137def5a0f35cf3937caf61f442e6ef3b8320d5cc2c0e6083c02a1f32e58d955d09461df1742f5df0e967
7
+ data.tar.gz: 83031636bdddd8317ca29fc8cf21f7bd17ca2f37cc06e16faba61b82d5286ea8e1c218de32461beb647ce8fd6a49928a0f73f26f26e0e219f19276214a744a5b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Release History: opentelemetry-metrics-sdk
2
2
 
3
+ ### v0.14.0 / 2026-05-12
4
+
5
+ * BREAKING CHANGE: Use trace_based exemplar filter by default (#2112)
6
+ * ADDED: Use trace_based exemplar filter by default (#2112)
7
+ * ADDED: Add git tag to source URI in gemspec (#2101)
8
+ * FIXED: Return false if it is noop_exemplar_reservoir (#2104)
9
+
10
+ ### v0.13.1 / 2026-04-15
11
+
12
+ * FIXED: Move the metrics-sdk requires to support "require 'opentelemetry/sdk/metrics'" (#1956)
13
+
3
14
  ### v0.13.0 / 2026-04-07
4
15
 
5
16
  * ADDED: Min Ruby Version 3.3 (#2070)
data/README.md CHANGED
@@ -37,10 +37,13 @@ At this time, you should be able to:
37
37
  * `ConsoleMetricPullExporter`
38
38
  * `InMemoryMetricPullExporter` (for testing)
39
39
  * Export metrics on a schedule using `PeriodicMetricReader` with any compatible push exporter (e.g. OTLP via `opentelemetry-exporter-otlp-metrics`)
40
+ * Attach exemplars to metric data points for trace correlation:
41
+ * `AlwaysOnExemplarFilter` — every measurement is eligible
42
+ * `AlwaysOffExemplarFilter` — no exemplars collected
43
+ * `TraceBasedExemplarFilter` — only measurements inside a sampled trace (default)
40
44
 
41
45
  We do not yet have support for:
42
46
 
43
- * Metrics Exemplars
44
47
  * `schema_url` in view configuration
45
48
 
46
49
  These lists are incomplete and are intended to give a broad description of what's available.
@@ -271,6 +274,67 @@ counter.add(1, attributes: { 'service' => 'web' })
271
274
  OpenTelemetry.meter_provider.shutdown
272
275
  ```
273
276
 
277
+ ### Exemplars
278
+
279
+ Exemplars attach individual raw measurements — along with the trace context active at the time of the measurement — to an exported metric data point. This lets you jump from a metric spike directly to the trace that caused it.
280
+
281
+ By default, exemplars use `TraceBasedExemplarFilter`, which records measurements only when they occur inside a sampled trace.
282
+
283
+ #### Enable via environment variable
284
+
285
+ ```bash
286
+ # Eligible only when the measurement occurs inside a sampled trace (recommended)
287
+ export OTEL_METRICS_EXEMPLAR_FILTER=trace_based
288
+
289
+ # Eligible for every measurement regardless of trace context
290
+ export OTEL_METRICS_EXEMPLAR_FILTER=always_on
291
+
292
+ # Disabled
293
+ export OTEL_METRICS_EXEMPLAR_FILTER=always_off
294
+ ```
295
+
296
+ #### Enable programmatically
297
+
298
+ ```ruby
299
+ require 'opentelemetry/sdk'
300
+ require 'opentelemetry-metrics-sdk'
301
+
302
+ ENV['OTEL_METRICS_EXPORTER'] = 'none'
303
+ OpenTelemetry::SDK.configure
304
+
305
+ exporter = OpenTelemetry::SDK::Metrics::Export::ConsoleMetricPullExporter.new
306
+ OpenTelemetry.meter_provider.add_metric_reader(exporter)
307
+
308
+ # Enable exemplar, by default using trace_based
309
+ OpenTelemetry.meter_provider.enable_exemplar_filter
310
+ ```
311
+
312
+ #### AlwaysOn Exemplars and Customized Exemplars
313
+
314
+ ```ruby
315
+ # Use AlwaysOn Exemplars
316
+ OpenTelemetry.meter_provider.enable_exemplar_filter(
317
+ exemplar_filter: OpenTelemetry::SDK::Metrics::Exemplar::AlwaysOnExemplarFilter
318
+ )
319
+
320
+ # Customized Exemplars
321
+ class CustomExemplarFilter < OpenTelemetry::SDK::Metrics::Exemplar::ExemplarFilter
322
+ def self.should_sample?(value, timestamp, attributes, context)
323
+ # customized logic to determine should sample
324
+ end
325
+ end
326
+
327
+ OpenTelemetry.meter_provider.enable_exemplar_filter(
328
+ exemplar_filter: CustomExemplarFilter
329
+ )
330
+ ```
331
+
332
+ #### Disabling exemplars
333
+
334
+ ```ruby
335
+ OpenTelemetry.meter_provider.disable_exemplar_filter
336
+ ```
337
+
274
338
  ### Using InMemoryMetricPullExporter for testing
275
339
 
276
340
  ```ruby
@@ -32,6 +32,18 @@ module OpenTelemetry
32
32
  def collect(attributes: nil, aggregation_temporality: :delta)
33
33
  raise NotImplementedError, "#{self.class} must implement #collect"
34
34
  end
35
+
36
+ # Called after dup to reset internal state before reuse for a new attribute set.
37
+ # Subclasses that hold mutable per-attribute state must override this.
38
+ def reset; end
39
+
40
+ # Returns true if this reservoir never stores exemplars.
41
+ # Used to skip the exemplar filter and timestamp lookups entirely.
42
+ #
43
+ # @return [Boolean]
44
+ def noop?
45
+ false
46
+ end
35
47
  end
36
48
  end
37
49
  end
@@ -15,6 +15,10 @@ module OpenTelemetry
15
15
  def collect(attributes: nil, aggregation_temporality: :delta)
16
16
  []
17
17
  end
18
+
19
+ def noop?
20
+ true
21
+ end
18
22
  end
19
23
  end
20
24
  end
@@ -130,19 +130,17 @@ module OpenTelemetry
130
130
  end
131
131
  alias register_asynchronous_instrument register_synchronous_instrument
132
132
 
133
- # spec: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/configuration/sdk-environment-variables.md#exemplar
134
- # this is one way to turn on the exemplar (exemplar should be turned off by default)
135
133
  def exemplar_filter_setup
136
134
  case ENV['OTEL_METRICS_EXEMPLAR_FILTER']
137
135
  when 'always_on'
138
136
  @exemplar_filter = Exemplar::AlwaysOnExemplarFilter
139
- when 'trace_based'
137
+ when nil, '', 'trace_based'
140
138
  @exemplar_filter = Exemplar::TraceBasedExemplarFilter
141
139
  when 'always_off'
142
140
  @exemplar_filter = Exemplar::AlwaysOffExemplarFilter
143
141
  else
144
- OpenTelemetry.logger.warn("OTEL_METRICS_EXEMPLAR_FILTER #{ENV['OTEL_METRICS_EXEMPLAR_FILTER']} is not part of the provided exemplar filters. Exemplar is off.")
145
- @exemplar_filter = Exemplar::AlwaysOffExemplarFilter
142
+ OpenTelemetry.logger.warn("OTEL_METRICS_EXEMPLAR_FILTER #{ENV['OTEL_METRICS_EXEMPLAR_FILTER']} is not part of the provided exemplar filters. Using trace_based.")
143
+ @exemplar_filter = Exemplar::TraceBasedExemplarFilter
146
144
  end
147
145
  end
148
146
 
@@ -120,6 +120,8 @@ module OpenTelemetry
120
120
  end
121
121
 
122
122
  def should_offer_exemplar?(value, attributes)
123
+ return false if @exemplar_reservoir&.noop?
124
+
123
125
  context = OpenTelemetry::Context.current
124
126
  time = OpenTelemetry::Common::Utilities.time_in_nanoseconds
125
127
  @exemplar_filter&.should_sample?(value, time, attributes, context)
@@ -8,7 +8,7 @@ module OpenTelemetry
8
8
  module SDK
9
9
  module Metrics
10
10
  # Current OpenTelemetry metrics sdk version
11
- VERSION = '0.13.0'
11
+ VERSION = '0.14.0'
12
12
  end
13
13
  end
14
14
  end
@@ -4,6 +4,9 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
+ require 'opentelemetry/sdk'
8
+ require 'opentelemetry-metrics-api'
9
+
7
10
  module OpenTelemetry
8
11
  module SDK
9
12
  # The Metrics module contains the OpenTelemetry metrics reference
@@ -13,6 +16,7 @@ module OpenTelemetry
13
16
  end
14
17
  end
15
18
 
19
+ require 'opentelemetry/sdk/metrics/version'
16
20
  require 'opentelemetry/sdk/metrics/exemplar'
17
21
  require 'opentelemetry/sdk/metrics/aggregation'
18
22
  require 'opentelemetry/sdk/metrics/configurator_patch'
@@ -4,6 +4,4 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
- require 'opentelemetry/sdk'
8
- require 'opentelemetry-metrics-api'
9
7
  require 'opentelemetry/sdk/metrics'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-metrics-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
@@ -51,20 +51,6 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '1.2'
54
- - !ruby/object:Gem::Dependency
55
- name: benchmark-ipsa
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: 0.2.0
61
- type: :development
62
- prerelease: false
63
- version_requirements: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: 0.2.0
68
54
  - !ruby/object:Gem::Dependency
69
55
  name: minitest
70
56
  requirement: !ruby/object:Gem::Requirement
@@ -233,10 +219,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
233
219
  licenses:
234
220
  - Apache-2.0
235
221
  metadata:
236
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-sdk/v0.13.0/file.CHANGELOG.html
237
- source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/metrics_sdk
222
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-sdk/v0.14.0/file.CHANGELOG.html
223
+ source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/opentelemetry-metrics-sdk/v0.14.0/metrics_sdk
238
224
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
239
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-sdk/v0.13.0
225
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-sdk/v0.14.0
240
226
  rdoc_options: []
241
227
  require_paths:
242
228
  - lib