opentelemetry-metrics-api 0.1.0 → 0.2.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: e083b923d5961c60a77e23cec51451171a627cdebaad0aad91c64dedb6f940e4
4
- data.tar.gz: 7ec8d56f0f9fcc2db01d173d755351f7d3365632070861ac1d5f920613f7c77e
3
+ metadata.gz: aee00375b1af8d663e0b22a4a28301bd0c57539cfee2285cca68892225d33478
4
+ data.tar.gz: ab779b3f63f322226096b7e1cd81914943cc4b4f71bc39560e9c07638294b5d4
5
5
  SHA512:
6
- metadata.gz: 1fe0235ce6aa725df40a48324dfedc6ccc4735bc250b90909964d6bc8d9af0c5c5586fbb174871ba292b2dac78f6971f7881dc6016d55dc5029dc7c0f8b74268
7
- data.tar.gz: 6c7460fb94836f0754b9b7ba6f64a807f6477c4715518ae803db9b89da8618b549f140422f6e9749c33ac505c616419356b10fc091bc560e00654a4d6905e40c
6
+ metadata.gz: fc11b02c19b8b58e531b0eb725bd3d143d70a3d760ed0aefa43186be948f1017fac4318f66a9d9ac8a567f5943e4d7d35123fd13cf65d755b224a8e3fda3724d
7
+ data.tar.gz: 7740bb55aa66982a5b7c7545964692a1d9e7d24b6b1251d9ecdad9c3478347b19585bac87510ec107206251406c1f12f558fec2e33a0b029bf8cfec5891c7667
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Release History: opentelemetry-metrics-api
2
2
 
3
+ ### v0.2.0 / 2025-01-08
4
+
5
+ * ADDED: Add synchronous gauge
6
+ * DOCS: Add documentation for Metrics API instruments
7
+
8
+ ### v0.1.1 / 2024-10-22
9
+
10
+ * FIXED: Refactor instrument validation
11
+
3
12
  ### v0.1.0 / 2024-07-31
4
13
 
5
14
  Initial release.
data/README.md CHANGED
@@ -12,7 +12,11 @@ OpenTelemetry provides a single set of APIs, libraries, agents, and collector se
12
12
 
13
13
  The `opentelemetry-metrics-api` gem defines the core OpenTelemetry interfaces in the form of abstract classes and no-op implementations. That is, it defines interfaces and data types sufficient for a library or application to code against to produce telemetry data, but does not actually collect, analyze, or export the data.
14
14
 
15
- To collect and analyze telemetry data, _applications_ should also install a concrete implementation of the API, such as the `opentelemetry-metrics-sdk` gem. However, _libraries_ that produce telemetry data should depend only on `opentelemetry-metrics-api`, deferring the choise of concrete implementation to the application developer.
15
+ To collect and analyze telemetry data, _applications_ should also
16
+ install a concrete implementation of the API, such as the
17
+ `opentelemetry-metrics-sdk` gem. However, _libraries_ that produce
18
+ telemetry data should depend only on `opentelemetry-metrics-api`,
19
+ deferring the choice of concrete implementation to the application developer.
16
20
 
17
21
  This code is still under development and is not a complete implementation of the Metrics API. Until the code becomes stable, Metrics API functionality will live outside the `opentelemetry-api` library.
18
22
 
@@ -20,7 +24,7 @@ This code is still under development and is not a complete implementation of the
20
24
 
21
25
  Install the gem using:
22
26
 
23
- ```
27
+ ```sh
24
28
  gem install opentelemetry-metrics-api
25
29
  ```
26
30
 
@@ -19,7 +19,7 @@ module OpenTelemetry
19
19
 
20
20
  def upgrade_with(meter)
21
21
  @delegate = case @kind
22
- when :counter, :histogram, :up_down_counter
22
+ when :counter, :histogram, :up_down_counter, :gauge
23
23
  meter.send("create_#{@kind}", @name, unit: @unit, description: @desc)
24
24
  when :observable_counter, :observable_gauge, :observable_up_down_counter
25
25
  meter.send("create_#{@kind}", @name, unit: @unit, description: @desc, callback: @callback)
@@ -45,6 +45,7 @@ module OpenTelemetry
45
45
  case kind
46
46
  when :counter then @delegate.create_counter(name, unit: unit, description: description)
47
47
  when :histogram then @delegate.create_histogram(name, unit: unit, description: description)
48
+ when :gauge then @delegate.create_gauge(name, unit: unit, description: description)
48
49
  when :up_down_counter then @delegate.create_up_down_counter(name, unit: unit, description: description)
49
50
  when :observable_counter then @delegate.create_observable_counter(name, unit: unit, description: description, callback: callback)
50
51
  when :observable_gauge then @delegate.create_observable_gauge(name, unit: unit, description: description, callback: callback)
@@ -16,7 +16,7 @@ module OpenTelemetry
16
16
  # Values must be non-nil and (array of) string, boolean or numeric type.
17
17
  # Array values must not contain nil elements and all elements must be of
18
18
  # the same basic type (string, numeric, boolean).
19
- def add(increment, attributes: nil); end
19
+ def add(increment, attributes: {}); end
20
20
  end
21
21
  end
22
22
  end
@@ -0,0 +1,23 @@
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 Metrics
9
+ module Instrument
10
+ # No-op implementation of Gauge.
11
+ class Gauge
12
+ # Record the current value for the Gauge
13
+ #
14
+ # @param [Numeric] amount The current absolute value.
15
+ # @param [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
16
+ # Values must be non-nil and (array of) string, boolean or numeric type.
17
+ # Array values must not contain nil elements and all elements must be of
18
+ # the same basic type (string, numeric, boolean).
19
+ def record(amount, attributes: {}); end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -16,7 +16,7 @@ module OpenTelemetry
16
16
  # Values must be non-nil and (array of) string, boolean or numeric type.
17
17
  # Array values must not contain nil elements and all elements must be of
18
18
  # the same basic type (string, numeric, boolean).
19
- def record(amount, attributes: nil); end
19
+ def record(amount, attributes: {}); end
20
20
  end
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module OpenTelemetry
16
16
  # Values must be non-nil and (array of) string, boolean or numeric type.
17
17
  # Array values must not contain nil elements and all elements must be of
18
18
  # the same basic type (string, numeric, boolean).
19
- def add(amount, attributes: nil); end
19
+ def add(amount, attributes: {}); end
20
20
  end
21
21
  end
22
22
  end
@@ -6,6 +6,7 @@
6
6
 
7
7
  require 'opentelemetry/metrics/instrument/counter'
8
8
  require 'opentelemetry/metrics/instrument/histogram'
9
+ require 'opentelemetry/metrics/instrument/gauge'
9
10
  require 'opentelemetry/metrics/instrument/observable_counter'
10
11
  require 'opentelemetry/metrics/instrument/observable_gauge'
11
12
  require 'opentelemetry/metrics/instrument/observable_up_down_counter'
@@ -11,13 +11,14 @@ module OpenTelemetry
11
11
  COUNTER = Instrument::Counter.new
12
12
  OBSERVABLE_COUNTER = Instrument::ObservableCounter.new
13
13
  HISTOGRAM = Instrument::Histogram.new
14
+ GAUGE = Instrument::Gauge.new
14
15
  OBSERVABLE_GAUGE = Instrument::ObservableGauge.new
15
16
  UP_DOWN_COUNTER = Instrument::UpDownCounter.new
16
17
  OBSERVABLE_UP_DOWN_COUNTER = Instrument::ObservableUpDownCounter.new
17
18
 
18
19
  NAME_REGEX = /\A[a-zA-Z][-.\w]{0,62}\z/
19
20
 
20
- private_constant(:COUNTER, :OBSERVABLE_COUNTER, :HISTOGRAM, :OBSERVABLE_GAUGE, :UP_DOWN_COUNTER, :OBSERVABLE_UP_DOWN_COUNTER)
21
+ private_constant(:COUNTER, :OBSERVABLE_COUNTER, :HISTOGRAM, :GAUGE, :OBSERVABLE_GAUGE, :UP_DOWN_COUNTER, :OBSERVABLE_UP_DOWN_COUNTER)
21
22
 
22
23
  DuplicateInstrumentError = Class.new(OpenTelemetry::Error)
23
24
  InstrumentNameError = Class.new(OpenTelemetry::Error)
@@ -29,26 +30,141 @@ module OpenTelemetry
29
30
  @instrument_registry = {}
30
31
  end
31
32
 
33
+ # {https://opentelemetry.io/docs/specs/otel/metrics/api/#counter Counter} is a synchronous Instrument which supports non-negative increments.
34
+ #
35
+ # With this api call:
36
+ #
37
+ # exception_counter = meter.create_counter("exceptions",
38
+ # description: "number of exceptions caught",
39
+ # unit: 's')
40
+ #
41
+ # @param name [String] the name of the counter
42
+ # @param unit [optional String] an optional string provided by user.
43
+ # @param description [optional String] an optional free-form text provided by user.
44
+ #
45
+ # @return [nil] after creation of counter, it will be stored in instrument_registry
32
46
  def create_counter(name, unit: nil, description: nil)
33
47
  create_instrument(:counter, name, unit, description, nil) { COUNTER }
34
48
  end
35
49
 
50
+ # Histogram is a synchronous Instrument which can be used to report arbitrary values that are likely
51
+ # to be statistically meaningful. It is intended for statistics such as histograms,
52
+ # summaries, and percentiles.
53
+ #
54
+ # With this api call:
55
+ #
56
+ # http_server_duration = meter.create_histogram("http.server.duration",
57
+ # description: "measures the duration of the inbound HTTP request",
58
+ # unit: "s")
59
+ #
60
+ # @param name [String] the name of the histogram
61
+ # @param unit [optional String] an optional string provided by user.
62
+ # @param description [optional String] an optional free-form text provided by user.
63
+ #
64
+ # @return [nil] after creation of histogram, it will be stored in instrument_registry
36
65
  def create_histogram(name, unit: nil, description: nil)
37
66
  create_instrument(:histogram, name, unit, description, nil) { HISTOGRAM }
38
67
  end
39
68
 
69
+ # Gauge is an synchronous Instrument which reports non-additive value(s)
70
+ #
71
+ # With this api call:
72
+ #
73
+ # meter.create_gauge("cpu.frequency",
74
+ # description: "the real-time CPU clock speed",
75
+ # unit: "ms")
76
+ #
77
+ #
78
+ # @param name [String] the name of the gauge.
79
+ # @param unit [optional String] an optional string provided by user.
80
+ # @param description [optional String] an optional free-form text provided by user.
81
+ #
82
+ # @return [nil] after creation of gauge, it will be stored in instrument_registry
83
+ def create_gauge(name, unit: nil, description: nil)
84
+ create_instrument(:gauge, name, unit, description, nil) { GAUGE }
85
+ end
86
+
87
+ # UpDownCounter is a synchronous Instrument which supports increments and decrements.
88
+ #
89
+ # With this api call:
90
+ #
91
+ # items_counter = meter.create_up_down_counter("store.inventory",
92
+ # description: "the number of the items available",
93
+ # unit: "s")
94
+ #
95
+ # @param name [String] the name of the up_down_counter
96
+ # @param unit [optional String] an optional string provided by user.
97
+ # @param description [optional String] an optional free-form text provided by user.
98
+ #
99
+ # @return [nil] after creation of up_down_counter, it will be stored in instrument_registry
40
100
  def create_up_down_counter(name, unit: nil, description: nil)
41
101
  create_instrument(:up_down_counter, name, unit, description, nil) { UP_DOWN_COUNTER }
42
102
  end
43
103
 
104
+ # ObservableCounter is an asynchronous Instrument which reports monotonically
105
+ # increasing value(s) when the instrument is being observed.
106
+ #
107
+ # With this api call:
108
+ #
109
+ # pf_callback = -> { # collect metrics here }
110
+ # meter.create_observable_counter("PF",
111
+ # pf_callback,
112
+ # description: "process page faults",
113
+ # unit: 'ms')
114
+ #
115
+ #
116
+ # @param name [String] the name of the observable_counter
117
+ # @param callback [Proc] the callback function that used to collect metrics
118
+ # @param unit [optional String] an optional string provided by user.
119
+ # @param description [optional String] an optional free-form text provided by user.
120
+ #
121
+ # @return [nil] after creation of observable_counter, it will be stored in instrument_registry
44
122
  def create_observable_counter(name, callback:, unit: nil, description: nil)
45
123
  create_instrument(:observable_counter, name, unit, description, callback) { OBSERVABLE_COUNTER }
46
124
  end
47
125
 
126
+ # ObservableGauge is an asynchronous Instrument which reports non-additive value(s)
127
+ # (e.g. the room temperature - it makes no sense to report the temperature value
128
+ # from multiple rooms and sum them up) when the instrument is being observed.
129
+ #
130
+ # With this api call:
131
+ #
132
+ # pf_callback = -> { # collect metrics here }
133
+ # meter.create_observable_counter("cpu.frequency",
134
+ # pf_callback,
135
+ # description: "the real-time CPU clock speed",
136
+ # unit: 'ms')
137
+ #
138
+ #
139
+ # @param name [String] the name of the observable_gauge
140
+ # @param callback [Proc] the callback function that used to collect metrics
141
+ # @param unit [optional String] an optional string provided by user.
142
+ # @param description [optional String] an optional free-form text provided by user.
143
+ #
144
+ # @return [nil] after creation of observable_gauge, it will be stored in instrument_registry
48
145
  def create_observable_gauge(name, callback:, unit: nil, description: nil)
49
146
  create_instrument(:observable_gauge, name, unit, description, callback) { OBSERVABLE_GAUGE }
50
147
  end
51
148
 
149
+ # ObservableUpDownCounter is an asynchronous Instrument which reports additive value(s)
150
+ # (e.g. the process heap size - it makes sense to report the heap size from multiple processes
151
+ # and sum them up, so we get the total heap usage) when the instrument is being observed.
152
+ #
153
+ # With this api call:
154
+ #
155
+ # pf_callback = -> { # collect metrics here }
156
+ # meter.create_observable_up_down_counter("process.workingset",
157
+ # pf_callback,
158
+ # description: "process working set",
159
+ # unit: 'KB')
160
+ #
161
+ #
162
+ # @param name [String] the name of the observable_up_down_counter
163
+ # @param callback [Proc] the callback function that used to collect metrics
164
+ # @param unit [optional String] an optional string provided by user.
165
+ # @param description [optional String] an optional free-form text provided by user.
166
+ #
167
+ # @return [nil] after creation of observable_up_down_counter, it will be stored in instrument_registry
52
168
  def create_observable_up_down_counter(name, callback:, unit: nil, description: nil)
53
169
  create_instrument(:observable_up_down_counter, name, unit, description, callback) { OBSERVABLE_UP_DOWN_COUNTER }
54
170
  end
@@ -56,23 +172,12 @@ module OpenTelemetry
56
172
  private
57
173
 
58
174
  def create_instrument(kind, name, unit, description, callback)
59
- raise InstrumentNameError if name.nil?
60
- raise InstrumentNameError if name.empty?
61
- raise InstrumentNameError unless NAME_REGEX.match?(name)
62
- raise InstrumentUnitError if unit && (!unit.ascii_only? || unit.size > 63)
63
- raise InstrumentDescriptionError if description && (description.size > 1023 || !utf8mb3_encoding?(description.dup))
64
-
65
175
  @mutex.synchronize do
66
176
  OpenTelemetry.logger.warn("duplicate instrument registration occurred for instrument #{name}") if @instrument_registry.include? name
67
177
 
68
178
  @instrument_registry[name] = yield
69
179
  end
70
180
  end
71
-
72
- def utf8mb3_encoding?(string)
73
- string.force_encoding('UTF-8').valid_encoding? &&
74
- string.each_char { |c| return false if c.bytesize >= 4 }
75
- end
76
181
  end
77
182
  end
78
183
  end
@@ -7,6 +7,6 @@
7
7
  module OpenTelemetry
8
8
  module Metrics
9
9
  ## Current OpenTelemetry metrics version
10
- VERSION = '0.1.0'
10
+ VERSION = '0.2.0'
11
11
  end
12
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-metrics-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-31 00:00:00.000000000 Z
11
+ date: 2025-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 1.51.0
117
+ version: '1.65'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 1.51.0
124
+ version: '1.65'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: simplecov
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -164,7 +164,7 @@ dependencies:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: 0.1.6
167
- description:
167
+ description:
168
168
  email:
169
169
  - cncf-opentelemetry-contributors@lists.cncf.io
170
170
  executables: []
@@ -182,6 +182,7 @@ files:
182
182
  - lib/opentelemetry/metrics.rb
183
183
  - lib/opentelemetry/metrics/instrument.rb
184
184
  - lib/opentelemetry/metrics/instrument/counter.rb
185
+ - lib/opentelemetry/metrics/instrument/gauge.rb
185
186
  - lib/opentelemetry/metrics/instrument/histogram.rb
186
187
  - lib/opentelemetry/metrics/instrument/observable_counter.rb
187
188
  - lib/opentelemetry/metrics/instrument/observable_gauge.rb
@@ -195,11 +196,11 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
195
196
  licenses:
196
197
  - Apache-2.0
197
198
  metadata:
198
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-api/v0.1.0/file.CHANGELOG.html
199
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-api/v0.2.0/file.CHANGELOG.html
199
200
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/metrics_api
200
201
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
201
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-api/v0.1.0
202
- post_install_message:
202
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-metrics-api/v0.2.0
203
+ post_install_message:
203
204
  rdoc_options: []
204
205
  require_paths:
205
206
  - lib
@@ -215,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
216
  version: '0'
216
217
  requirements: []
217
218
  rubygems_version: 3.2.33
218
- signing_key:
219
+ signing_key:
219
220
  specification_version: 4
220
221
  summary: A stats collection and distributed tracing framework
221
222
  test_files: []