Skip to content

Commit 046057d

Browse files
metrics: Remove LabelSet (#527)
Remove LabelSet according to OTEP 90: https://github.com/open-telemetry/oteps/blob/master/text/0090-remove-labelset-from-metrics-api.md Co-Authored-By: Leighton Chen <[email protected]>
1 parent 6afcea9 commit 046057d

File tree

21 files changed

+230
-324
lines changed

21 files changed

+230
-324
lines changed

docs/examples/basic_meter/basic_metrics.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,21 @@ def usage(argv):
8484
label_keys=("environment",),
8585
)
8686

87-
# Labelsets are used to identify key-values that are associated with a specific
87+
# Labels are used to identify key-values that are associated with a specific
8888
# metric that you want to record. These are useful for pre-aggregation and can
8989
# be used to store custom dimensions pertaining to a metric
90-
staging_label_set = meter.get_label_set({"environment": "staging"})
91-
testing_label_set = meter.get_label_set({"environment": "testing"})
90+
staging_labels = {"environment": "staging"}
91+
testing_labels = {"environment": "testing"}
9292

9393
# Update the metric instruments using the direct calling convention
94-
requests_counter.add(25, staging_label_set)
95-
requests_size.record(100, staging_label_set)
94+
requests_counter.add(25, staging_labels)
95+
requests_size.record(100, staging_labels)
9696
time.sleep(5)
9797

98-
requests_counter.add(50, staging_label_set)
99-
requests_size.record(5000, staging_label_set)
98+
requests_counter.add(50, staging_labels)
99+
requests_size.record(5000, staging_labels)
100100
time.sleep(5)
101101

102-
requests_counter.add(35, testing_label_set)
103-
requests_size.record(2, testing_label_set)
102+
requests_counter.add(35, testing_labels)
103+
requests_size.record(2, testing_labels)
104104
time.sleep(5)

docs/examples/basic_meter/calling_conventions.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,27 @@
5656
label_keys=("environment",),
5757
)
5858

59-
label_set = meter.get_label_set({"environment": "staging"})
59+
labels = {"environment": "staging"}
6060

6161
print("Updating using direct calling convention...")
62-
# You can record metrics directly using the metric instrument. You pass in a
63-
# labelset that you would like to record for.
64-
requests_counter.add(25, label_set)
62+
# You can record metrics directly using the metric instrument. You pass in
63+
# labels that you would like to record for.
64+
requests_counter.add(25, labels)
6565
time.sleep(5)
6666

6767
print("Updating using a bound instrument...")
6868
# You can record metrics with bound metric instruments. Bound metric
69-
# instruments are created by passing in a labelset. A bound metric instrument
69+
# instruments are created by passing in labels. A bound metric instrument
7070
# is essentially metric data that corresponds to a specific set of labels.
7171
# Therefore, getting a bound metric instrument using the same set of labels
7272
# will yield the same bound metric instrument.
73-
bound_requests_counter = requests_counter.bind(label_set)
73+
bound_requests_counter = requests_counter.bind(labels)
7474
bound_requests_counter.add(100)
7575
time.sleep(5)
7676

7777
print("Updating using batch calling convention...")
78-
# You can record metrics in a batch by passing in a labelset and a sequence of
78+
# You can record metrics in a batch by passing in labels and a sequence of
7979
# (metric, value) pairs. The value would be recorded for each metric using the
80-
# specified labelset for each.
81-
meter.record_batch(label_set, ((requests_counter, 50), (clicks_counter, 70)))
80+
# specified labels for each.
81+
meter.record_batch(labels, ((requests_counter, 50), (clicks_counter, 70)))
8282
time.sleep(5)

docs/examples/basic_meter/observer.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import psutil
2020

2121
from opentelemetry import metrics
22-
from opentelemetry.sdk.metrics import LabelSet, MeterProvider
22+
from opentelemetry.sdk.metrics import MeterProvider
2323
from opentelemetry.sdk.metrics.export import ConsoleMetricsExporter
2424
from opentelemetry.sdk.metrics.export.batcher import UngroupedBatcher
2525
from opentelemetry.sdk.metrics.export.controller import PushController
@@ -35,8 +35,8 @@
3535
# Callback to gather cpu usage
3636
def get_cpu_usage_callback(observer):
3737
for (number, percent) in enumerate(psutil.cpu_percent(percpu=True)):
38-
label_set = meter.get_label_set({"cpu_number": str(number)})
39-
observer.observe(percent, label_set)
38+
labels = {"cpu_number": str(number)}
39+
observer.observe(percent, labels)
4040

4141

4242
meter.register_observer(
@@ -52,7 +52,7 @@ def get_cpu_usage_callback(observer):
5252
# Callback to gather RAM memory usage
5353
def get_ram_usage_callback(observer):
5454
ram_percent = psutil.virtual_memory().percent
55-
observer.observe(ram_percent, LabelSet())
55+
observer.observe(ram_percent, {})
5656

5757

5858
meter.register_observer(

docs/examples/otcollector-metrics/collector.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040
label_keys=("environment",),
4141
)
4242

43-
staging_label_set = meter.get_label_set({"environment": "staging"})
44-
requests_counter.add(25, staging_label_set)
43+
staging_labels = {"environment": "staging"}
44+
requests_counter.add(25, staging_labels)
4545

4646
print("Metrics are available now at http://localhost:9090/graph")
4747
input("Press any key to exit...")

docs/examples/prometheus/prometheus.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
label_keys=("environment",),
4242
)
4343

44-
staging_label_set = meter.get_label_set({"environment": "staging"})
45-
requests_counter.add(25, staging_label_set)
44+
staging_labels = {"environment": "staging"}
45+
requests_counter.add(25, staging_labels)
4646

4747
print("Metrics are available now at http://localhost:8000/")
4848
input("Press any key to exit...")

docs/getting-started.rst

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ The following is an example of emitting metrics to console, in a similar fashion
249249
exporter = ConsoleMetricsExporter()
250250
controller = PushController(meter, exporter, 5)
251251
252-
staging_label_set = meter.get_label_set({"environment": "staging"})
252+
staging_labels = {"environment": "staging"}
253253
254254
requests_counter = meter.create_metric(
255255
name="requests",
@@ -260,10 +260,10 @@ The following is an example of emitting metrics to console, in a similar fashion
260260
label_keys=("environment",),
261261
)
262262
263-
requests_counter.add(25, staging_label_set)
263+
requests_counter.add(25, staging_labels)
264264
time.sleep(5)
265265
266-
requests_counter.add(20, staging_label_set)
266+
requests_counter.add(20, staging_labels)
267267
time.sleep(5)
268268
269269
@@ -272,8 +272,8 @@ The sleeps will cause the script to take a while, but running it should yield:
272272
.. code-block:: sh
273273
274274
$ python metrics.py
275-
ConsoleMetricsExporter(data="Counter(name="requests", description="number of requests")", label_set="(('environment', 'staging'),)", value=25)
276-
ConsoleMetricsExporter(data="Counter(name="requests", description="number of requests")", label_set="(('environment', 'staging'),)", value=45)
275+
ConsoleMetricsExporter(data="Counter(name="requests", description="number of requests")", labels="(('environment', 'staging'),)", value=25)
276+
ConsoleMetricsExporter(data="Counter(name="requests", description="number of requests")", labels="(('environment', 'staging'),)", value=45)
277277
278278
Using Prometheus
279279
----------------
@@ -331,7 +331,7 @@ And use that instead of the `ConsoleMetricsExporter`:
331331
exporter = PrometheusMetricsExporter("MyAppPrefix")
332332
controller = PushController(meter, exporter, 5)
333333
334-
staging_label_set = meter.get_label_set({"environment": "staging"})
334+
staging_labels = {"environment": "staging"}
335335
336336
requests_counter = meter.create_metric(
337337
name="requests",
@@ -342,10 +342,10 @@ And use that instead of the `ConsoleMetricsExporter`:
342342
label_keys=("environment",),
343343
)
344344
345-
requests_counter.add(25, staging_label_set)
345+
requests_counter.add(25, staging_labels)
346346
time.sleep(5)
347347
348-
requests_counter.add(20, staging_label_set)
348+
requests_counter.add(20, staging_labels)
349349
time.sleep(5)
350350
351351
# This line is added to keep the HTTP server up long enough to scrape.
@@ -463,11 +463,9 @@ And execute the following script:
463463
metric_type=Counter,
464464
label_keys=("environment",),
465465
)
466-
467-
# Labelsets are used to identify key-values that are associated with a specific
466+
# Labels are used to identify key-values that are associated with a specific
468467
# metric that you want to record. These are useful for pre-aggregation and can
469468
# be used to store custom dimensions pertaining to a metric
470-
label_set = meter.get_label_set({"environment": "staging"})
471-
472-
requests_counter.add(25, label_set)
469+
labels = {"environment": "staging"}
470+
requests_counter.add(25, labels)
473471
time.sleep(10) # give push_controller time to push metrics

docs/metrics_example.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
label_keys=("environment",),
1818
)
1919

20-
staging_label_set = meter.get_label_set({"environment": "staging"})
21-
requests_counter.add(25, staging_label_set)
20+
staging_labels = {"environment": "staging"}
21+
requests_counter.add(25, staging_labels)
2222

2323
input("Press a key to finish...\n")

ext/opentelemetry-ext-otcollector/src/opentelemetry/ext/otcollector/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@
7777
Counter,
7878
("environment",),
7979
)
80-
# Labelsets are used to identify key-values that are associated with a specific
80+
# Labels are used to identify key-values that are associated with a specific
8181
# metric that you want to record. These are useful for pre-aggregation and can
8282
# be used to store custom dimensions pertaining to a metric
83-
label_set = meter.get_label_set({"environment": "staging"})
83+
labels = {"environment": "staging"}
8484
85-
counter.add(25, label_set)
85+
counter.add(25, labels)
8686
"""

ext/opentelemetry-ext-otcollector/src/opentelemetry/ext/otcollector/metrics_exporter/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def translate_to_collector(
106106

107107
label_values = []
108108
label_keys = []
109-
for label_tuple in metric_record.label_set.labels:
109+
for label_tuple in metric_record.labels:
110110
label_keys.append(metrics_pb2.LabelKey(key=label_tuple[0]))
111111
label_values.append(
112112
metrics_pb2.LabelValue(
@@ -145,11 +145,12 @@ def get_collector_metric_type(metric: Metric) -> metrics_pb2.MetricDescriptor:
145145

146146

147147
def get_collector_point(metric_record: MetricRecord) -> metrics_pb2.Point:
148+
# TODO: horrible hack to get original list of keys to then get the bound
149+
# instrument
150+
key = dict(metric_record.labels)
148151
point = metrics_pb2.Point(
149152
timestamp=utils.proto_timestamp_from_time_ns(
150-
metric_record.metric.bind(
151-
metric_record.label_set
152-
).last_update_timestamp
153+
metric_record.metric.bind(key).last_update_timestamp
153154
)
154155
)
155156
if metric_record.metric.value_type == int:

ext/opentelemetry-ext-otcollector/tests/test_otcollector_metrics_exporter.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@
2121

2222
from opentelemetry import metrics
2323
from opentelemetry.ext.otcollector import metrics_exporter
24-
from opentelemetry.sdk.metrics import Counter, Measure, MeterProvider
24+
from opentelemetry.sdk.metrics import (
25+
Counter,
26+
Measure,
27+
MeterProvider,
28+
get_labels_as_key,
29+
)
2530
from opentelemetry.sdk.metrics.export import (
2631
MetricRecord,
2732
MetricsExportResult,
@@ -36,8 +41,8 @@ def setUpClass(cls):
3641
# pylint: disable=protected-access
3742
metrics.set_meter_provider(MeterProvider())
3843
cls._meter = metrics.get_meter(__name__)
39-
kvp = {"environment": "staging"}
40-
cls._test_label_set = cls._meter.get_label_set(kvp)
44+
cls._labels = {"environment": "staging"}
45+
cls._key_labels = get_labels_as_key(cls._labels)
4146

4247
def test_constructor(self):
4348
mock_get_node = mock.Mock()
@@ -77,7 +82,6 @@ def test_get_collector_metric_type(self):
7782

7883
def test_get_collector_point(self):
7984
aggregator = aggregate.CounterAggregator()
80-
label_set = self._meter.get_label_set({"environment": "staging"})
8185
int_counter = self._meter.create_metric(
8286
"testName", "testDescription", "unit", int, Counter
8387
)
@@ -88,21 +92,21 @@ def test_get_collector_point(self):
8892
"testName", "testDescription", "unit", float, Measure
8993
)
9094
result = metrics_exporter.get_collector_point(
91-
MetricRecord(aggregator, label_set, int_counter)
95+
MetricRecord(aggregator, self._key_labels, int_counter)
9296
)
9397
self.assertIsInstance(result, metrics_pb2.Point)
9498
self.assertIsInstance(result.timestamp, Timestamp)
9599
self.assertEqual(result.int64_value, 0)
96100
aggregator.update(123.5)
97101
aggregator.take_checkpoint()
98102
result = metrics_exporter.get_collector_point(
99-
MetricRecord(aggregator, label_set, float_counter)
103+
MetricRecord(aggregator, self._key_labels, float_counter)
100104
)
101105
self.assertEqual(result.double_value, 123.5)
102106
self.assertRaises(
103107
TypeError,
104108
metrics_exporter.get_collector_point(
105-
MetricRecord(aggregator, label_set, measure)
109+
MetricRecord(aggregator, self._key_labels, measure)
106110
),
107111
)
108112

@@ -118,7 +122,7 @@ def test_export(self):
118122
"testname", "testdesc", "unit", int, Counter, ["environment"]
119123
)
120124
record = MetricRecord(
121-
aggregate.CounterAggregator(), self._test_label_set, test_metric
125+
aggregate.CounterAggregator(), self._key_labels, test_metric
122126
)
123127

124128
result = collector_exporter.export([record])
@@ -137,14 +141,13 @@ def test_export(self):
137141
)
138142

139143
def test_translate_to_collector(self):
140-
141144
test_metric = self._meter.create_metric(
142145
"testname", "testdesc", "unit", int, Counter, ["environment"]
143146
)
144147
aggregator = aggregate.CounterAggregator()
145148
aggregator.update(123)
146149
aggregator.take_checkpoint()
147-
record = MetricRecord(aggregator, self._test_label_set, test_metric)
150+
record = MetricRecord(aggregator, self._key_labels, test_metric)
148151
output_metrics = metrics_exporter.translate_to_collector([record])
149152
self.assertEqual(len(output_metrics), 1)
150153
self.assertIsInstance(output_metrics[0], metrics_pb2.Metric)
@@ -175,12 +178,12 @@ def test_translate_to_collector(self):
175178
self.assertEqual(len(output_metrics[0].timeseries[0].points), 1)
176179
self.assertEqual(
177180
output_metrics[0].timeseries[0].points[0].timestamp.seconds,
178-
record.metric.bind(record.label_set).last_update_timestamp
181+
record.metric.bind(self._labels).last_update_timestamp
179182
// 1000000000,
180183
)
181184
self.assertEqual(
182185
output_metrics[0].timeseries[0].points[0].timestamp.nanos,
183-
record.metric.bind(record.label_set).last_update_timestamp
186+
record.metric.bind(self._labels).last_update_timestamp
184187
% 1000000000,
185188
)
186189
self.assertEqual(

ext/opentelemetry-ext-prometheus/src/opentelemetry/ext/prometheus/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@
5454
("environment",),
5555
)
5656
57-
# Labelsets are used to identify key-values that are associated with a specific
57+
# Labels are used to identify key-values that are associated with a specific
5858
# metric that you want to record. These are useful for pre-aggregation and can
5959
# be used to store custom dimensions pertaining to a metric
60-
label_set = meter.get_label_set({"environment": "staging"})
60+
labels = {"environment": "staging"}
6161
62-
counter.add(25, label_set)
62+
counter.add(25, labels)
6363
input("Press any key to exit...")
6464
6565
API
@@ -145,7 +145,7 @@ def _translate_to_prometheus(self, metric_record: MetricRecord):
145145
prometheus_metric = None
146146
label_values = []
147147
label_keys = []
148-
for label_tuple in metric_record.label_set.labels:
148+
for label_tuple in metric_record.labels:
149149
label_keys.append(self._sanitize(label_tuple[0]))
150150
label_values.append(label_tuple[1])
151151

0 commit comments

Comments
 (0)