Skip to content

Commit 96943b2

Browse files
Remove monotonic and absolute metrics intrument options (open-telemetry#410)
Following opentelemetry-specification/430.
1 parent 72862c9 commit 96943b2

File tree

3 files changed

+13
-88
lines changed

3 files changed

+13
-88
lines changed

opentelemetry-api/src/opentelemetry/metrics/__init__.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,7 @@ def set(self, value: ValueT, label_set: LabelSet) -> None:
208208
class Measure(Metric):
209209
"""A measure type metric that represent raw stats that are recorded.
210210
211-
Measure metrics represent raw statistics that are recorded. By
212-
default, measure metrics can accept both positive and negatives.
213-
Negative inputs will be discarded when monotonic is True.
211+
Measure metrics represent raw statistics that are recorded.
214212
"""
215213

216214
def get_handle(self, label_set: LabelSet) -> "MeasureHandle":
@@ -268,8 +266,6 @@ def create_metric(
268266
metric_type: Type[MetricT],
269267
label_keys: Sequence[str] = (),
270268
enabled: bool = True,
271-
monotonic: bool = False,
272-
absolute: bool = True,
273269
) -> "Metric":
274270
"""Creates a ``metric_kind`` metric with type ``value_type``.
275271
@@ -281,10 +277,6 @@ def create_metric(
281277
metric_type: The type of metric being created.
282278
label_keys: The keys for the labels with dynamic values.
283279
enabled: Whether to report the metric by default.
284-
monotonic: Configure a counter or gauge that accepts only
285-
monotonic/non-monotonic updates.
286-
absolute: Configure a measure that does or does not accept negative
287-
updates.
288280
Returns: A new ``metric_type`` metric with values of ``value_type``.
289281
"""
290282

@@ -318,8 +310,6 @@ def create_metric(
318310
metric_type: Type[MetricT],
319311
label_keys: Sequence[str] = (),
320312
enabled: bool = True,
321-
monotonic: bool = False,
322-
absolute: bool = True,
323313
) -> "Metric":
324314
# pylint: disable=no-self-use
325315
return DefaultMetric()

opentelemetry-sdk/src/opentelemetry/sdk/metrics/__init__.py

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,6 @@ class BaseHandle:
5555
Args:
5656
value_type: The type of values this handle holds (int, float).
5757
enabled: True if the originating instrument is enabled.
58-
monotonic: Indicates acceptance of only monotonic/non-monotonic values
59-
for updating counter and gauge handles.
60-
absolute: Indicates acceptance of negative updates to measure handles.
6158
aggregator: The aggregator for this handle. Will handle aggregation
6259
upon updates and checkpointing of values for exporting.
6360
"""
@@ -66,14 +63,10 @@ def __init__(
6663
self,
6764
value_type: Type[metrics_api.ValueT],
6865
enabled: bool,
69-
monotonic: bool,
70-
absolute: bool,
7166
aggregator: Aggregator,
7267
):
7368
self.value_type = value_type
7469
self.enabled = enabled
75-
self.monotonic = monotonic
76-
self.absolute = absolute
7770
self.aggregator = aggregator
7871
self.last_update_timestamp = time_ns()
7972

@@ -103,29 +96,20 @@ class CounterHandle(metrics_api.CounterHandle, BaseHandle):
10396
def add(self, value: metrics_api.ValueT) -> None:
10497
"""See `opentelemetry.metrics.CounterHandle.add`."""
10598
if self._validate_update(value):
106-
if self.monotonic and value < 0:
107-
logger.warning("Monotonic counter cannot descend.")
108-
return
10999
self.update(value)
110100

111101

112102
class GaugeHandle(metrics_api.GaugeHandle, BaseHandle):
113103
def set(self, value: metrics_api.ValueT) -> None:
114104
"""See `opentelemetry.metrics.GaugeHandle.set`."""
115105
if self._validate_update(value):
116-
if self.monotonic and value < self.aggregator.current:
117-
logger.warning("Monotonic gauge cannot descend.")
118-
return
119106
self.update(value)
120107

121108

122109
class MeasureHandle(metrics_api.MeasureHandle, BaseHandle):
123110
def record(self, value: metrics_api.ValueT) -> None:
124111
"""See `opentelemetry.metrics.MeasureHandle.record`."""
125112
if self._validate_update(value):
126-
if self.absolute and value < 0:
127-
logger.warning("Absolute measure cannot accept negatives.")
128-
return
129113
self.update(value)
130114

131115

@@ -149,8 +133,6 @@ def __init__(
149133
meter: "Meter",
150134
label_keys: Sequence[str] = (),
151135
enabled: bool = True,
152-
monotonic: bool = False,
153-
absolute: bool = True,
154136
):
155137
self.name = name
156138
self.description = description
@@ -159,8 +141,6 @@ def __init__(
159141
self.meter = meter
160142
self.label_keys = label_keys
161143
self.enabled = enabled
162-
self.monotonic = monotonic
163-
self.absolute = absolute
164144
self.handles = {}
165145

166146
def get_handle(self, label_set: LabelSet) -> BaseHandle:
@@ -170,8 +150,6 @@ def get_handle(self, label_set: LabelSet) -> BaseHandle:
170150
handle = self.HANDLE_TYPE(
171151
self.value_type,
172152
self.enabled,
173-
self.monotonic,
174-
self.absolute,
175153
# Aggregator will be created based off type of metric
176154
self.meter.batcher.aggregator_for(self.__class__),
177155
)
@@ -188,10 +166,6 @@ def __repr__(self):
188166

189167
class Counter(Metric, metrics_api.Counter):
190168
"""See `opentelemetry.metrics.Counter`.
191-
192-
By default, counter values can only go up (monotonic). Negative inputs
193-
will be rejected for monotonic counter metrics. Counter metrics that have a
194-
monotonic option set to False allows negative inputs.
195169
"""
196170

197171
HANDLE_TYPE = CounterHandle
@@ -205,8 +179,6 @@ def __init__(
205179
meter: "Meter",
206180
label_keys: Sequence[str] = (),
207181
enabled: bool = True,
208-
monotonic: bool = True,
209-
absolute: bool = False,
210182
):
211183
super().__init__(
212184
name,
@@ -216,8 +188,6 @@ def __init__(
216188
meter,
217189
label_keys=label_keys,
218190
enabled=enabled,
219-
monotonic=monotonic,
220-
absolute=absolute,
221191
)
222192

223193
def add(self, value: metrics_api.ValueT, label_set: LabelSet) -> None:
@@ -229,9 +199,6 @@ def add(self, value: metrics_api.ValueT, label_set: LabelSet) -> None:
229199

230200
class Gauge(Metric, metrics_api.Gauge):
231201
"""See `opentelemetry.metrics.Gauge`.
232-
233-
By default, gauge values can go both up and down (non-monotonic).
234-
Negative inputs will be rejected for monotonic gauge metrics.
235202
"""
236203

237204
HANDLE_TYPE = GaugeHandle
@@ -245,8 +212,6 @@ def __init__(
245212
meter: "Meter",
246213
label_keys: Sequence[str] = (),
247214
enabled: bool = True,
248-
monotonic: bool = False,
249-
absolute: bool = False,
250215
):
251216
super().__init__(
252217
name,
@@ -256,8 +221,6 @@ def __init__(
256221
meter,
257222
label_keys=label_keys,
258223
enabled=enabled,
259-
monotonic=monotonic,
260-
absolute=absolute,
261224
)
262225

263226
def set(self, value: metrics_api.ValueT, label_set: LabelSet) -> None:
@@ -339,8 +302,6 @@ def create_metric(
339302
metric_type: Type[metrics_api.MetricT],
340303
label_keys: Sequence[str] = (),
341304
enabled: bool = True,
342-
monotonic: bool = False,
343-
absolute: bool = True,
344305
) -> metrics_api.MetricT:
345306
"""See `opentelemetry.metrics.Meter.create_metric`."""
346307
# Ignore type b/c of mypy bug in addition to missing annotations
@@ -352,8 +313,6 @@ def create_metric(
352313
self,
353314
label_keys=label_keys,
354315
enabled=enabled,
355-
monotonic=monotonic,
356-
absolute=absolute,
357316
)
358317
self.metrics.add(metric)
359318
return metric

opentelemetry-sdk/tests/metrics/test_metrics.py

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -203,36 +203,28 @@ def test_record(self):
203203
class TestCounterHandle(unittest.TestCase):
204204
def test_add(self):
205205
aggregator = export.aggregate.CounterAggregator()
206-
handle = metrics.CounterHandle(int, True, False, False, aggregator)
206+
handle = metrics.CounterHandle(int, True, aggregator)
207207
handle.add(3)
208208
self.assertEqual(handle.aggregator.current, 3)
209209

210210
def test_add_disabled(self):
211211
aggregator = export.aggregate.CounterAggregator()
212-
handle = metrics.CounterHandle(int, False, False, False, aggregator)
212+
handle = metrics.CounterHandle(int, False, aggregator)
213213
handle.add(3)
214214
self.assertEqual(handle.aggregator.current, 0)
215215

216-
@mock.patch("opentelemetry.sdk.metrics.logger")
217-
def test_add_monotonic(self, logger_mock):
218-
aggregator = export.aggregate.CounterAggregator()
219-
handle = metrics.CounterHandle(int, True, True, False, aggregator)
220-
handle.add(-3)
221-
self.assertEqual(handle.aggregator.current, 0)
222-
self.assertTrue(logger_mock.warning.called)
223-
224216
@mock.patch("opentelemetry.sdk.metrics.logger")
225217
def test_add_incorrect_type(self, logger_mock):
226218
aggregator = export.aggregate.CounterAggregator()
227-
handle = metrics.CounterHandle(int, True, False, False, aggregator)
219+
handle = metrics.CounterHandle(int, True, aggregator)
228220
handle.add(3.0)
229221
self.assertEqual(handle.aggregator.current, 0)
230222
self.assertTrue(logger_mock.warning.called)
231223

232224
@mock.patch("opentelemetry.sdk.metrics.time_ns")
233225
def test_update(self, time_mock):
234226
aggregator = export.aggregate.CounterAggregator()
235-
handle = metrics.CounterHandle(int, True, False, False, aggregator)
227+
handle = metrics.CounterHandle(int, True, aggregator)
236228
time_mock.return_value = 123
237229
handle.update(4.0)
238230
self.assertEqual(handle.last_update_timestamp, 123)
@@ -243,36 +235,28 @@ def test_update(self, time_mock):
243235
class TestGaugeHandle(unittest.TestCase):
244236
def test_set(self):
245237
aggregator = export.aggregate.CounterAggregator()
246-
handle = metrics.GaugeHandle(int, True, False, False, aggregator)
238+
handle = metrics.GaugeHandle(int, True, aggregator)
247239
handle.set(3)
248240
self.assertEqual(handle.aggregator.current, 3)
249241

250242
def test_set_disabled(self):
251243
aggregator = export.aggregate.CounterAggregator()
252-
handle = metrics.GaugeHandle(int, False, False, False, aggregator)
244+
handle = metrics.GaugeHandle(int, False, aggregator)
253245
handle.set(3)
254246
self.assertEqual(handle.aggregator.current, 0)
255247

256-
@mock.patch("opentelemetry.sdk.metrics.logger")
257-
def test_set_monotonic(self, logger_mock):
258-
aggregator = export.aggregate.CounterAggregator()
259-
handle = metrics.GaugeHandle(int, True, True, False, aggregator)
260-
handle.set(-3)
261-
self.assertEqual(handle.aggregator.current, 0)
262-
self.assertTrue(logger_mock.warning.called)
263-
264248
@mock.patch("opentelemetry.sdk.metrics.logger")
265249
def test_set_incorrect_type(self, logger_mock):
266250
aggregator = export.aggregate.CounterAggregator()
267-
handle = metrics.GaugeHandle(int, True, False, False, aggregator)
251+
handle = metrics.GaugeHandle(int, True, aggregator)
268252
handle.set(3.0)
269253
self.assertEqual(handle.aggregator.current, 0)
270254
self.assertTrue(logger_mock.warning.called)
271255

272256
@mock.patch("opentelemetry.sdk.metrics.time_ns")
273257
def test_update(self, time_mock):
274258
aggregator = export.aggregate.CounterAggregator()
275-
handle = metrics.GaugeHandle(int, True, False, False, aggregator)
259+
handle = metrics.GaugeHandle(int, True, aggregator)
276260
time_mock.return_value = 123
277261
handle.update(4.0)
278262
self.assertEqual(handle.last_update_timestamp, 123)
@@ -283,36 +267,28 @@ def test_update(self, time_mock):
283267
class TestMeasureHandle(unittest.TestCase):
284268
def test_record(self):
285269
aggregator = export.aggregate.CounterAggregator()
286-
handle = metrics.MeasureHandle(int, False, False, False, aggregator)
270+
handle = metrics.MeasureHandle(int, False, aggregator)
287271
handle.record(3)
288272
self.assertEqual(handle.aggregator.current, 0)
289273

290274
def test_record_disabled(self):
291275
aggregator = export.aggregate.CounterAggregator()
292-
handle = metrics.MeasureHandle(int, False, False, False, aggregator)
276+
handle = metrics.MeasureHandle(int, False, aggregator)
293277
handle.record(3)
294278
self.assertEqual(handle.aggregator.current, 0)
295279

296-
@mock.patch("opentelemetry.sdk.metrics.logger")
297-
def test_record_monotonic(self, logger_mock):
298-
aggregator = export.aggregate.CounterAggregator()
299-
handle = metrics.MeasureHandle(int, True, False, True, aggregator)
300-
handle.record(-3)
301-
self.assertEqual(handle.aggregator.current, 0)
302-
self.assertTrue(logger_mock.warning.called)
303-
304280
@mock.patch("opentelemetry.sdk.metrics.logger")
305281
def test_record_incorrect_type(self, logger_mock):
306282
aggregator = export.aggregate.CounterAggregator()
307-
handle = metrics.MeasureHandle(int, True, False, False, aggregator)
283+
handle = metrics.MeasureHandle(int, True, aggregator)
308284
handle.record(3.0)
309285
self.assertEqual(handle.aggregator.current, 0)
310286
self.assertTrue(logger_mock.warning.called)
311287

312288
@mock.patch("opentelemetry.sdk.metrics.time_ns")
313289
def test_update(self, time_mock):
314290
aggregator = export.aggregate.CounterAggregator()
315-
handle = metrics.MeasureHandle(int, True, False, False, aggregator)
291+
handle = metrics.MeasureHandle(int, True, aggregator)
316292
time_mock.return_value = 123
317293
handle.update(4.0)
318294
self.assertEqual(handle.last_update_timestamp, 123)

0 commit comments

Comments
 (0)