Skip to content

Commit ee2046e

Browse files
author
Alex Boten
committed
update more references
1 parent 4476871 commit ee2046e

File tree

3 files changed

+123
-117
lines changed

3 files changed

+123
-117
lines changed

exporter/opentelemetry-exporter-prometheus/setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,4 @@ test =
5252

5353
[options.entry_points]
5454
opentelemetry_exporter =
55-
prometheus = opentelemetry.exporter.prometheus:PrometheusMetricsExporter
55+
prometheus = opentelemetry.exporter.prometheus:PrometheusMetricExporter

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

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
.. code:: python
2828
2929
from opentelemetry import metrics
30-
from opentelemetry.exporter.prometheus import PrometheusMetricsExporter
30+
from opentelemetry.exporter.prometheus import PrometheusMetricExporter
3131
from opentelemetry.sdk.metrics import Meter
3232
from prometheus_client import start_http_server
3333
@@ -39,7 +39,7 @@
3939
meter = metrics.get_meter(__name__)
4040
# exporter to export metrics to Prometheus
4141
prefix = "MyAppPrefix"
42-
exporter = PrometheusMetricsExporter(prefix)
42+
exporter = PrometheusMetricExporter(prefix)
4343
# Starts the collect/export pipeline for metrics
4444
metrics.get_meter_provider().start_pipeline(meter, exporter, 5)
4545
@@ -70,17 +70,21 @@
7070
from prometheus_client.core import (
7171
REGISTRY,
7272
CounterMetricFamily,
73-
SummaryMetricFamily,
74-
UnknownMetricFamily,
73+
GaugeMetricFamily,
74+
HistogramMetricFamily,
7575
)
7676

77-
from opentelemetry._metrics import Counter, Histogram
7877
from opentelemetry.sdk._metrics.export import (
79-
ExportRecord,
8078
MetricExporter,
81-
MetricsExportResult,
79+
MetricExportResult,
80+
)
81+
from opentelemetry.sdk._metrics.point import (
82+
AggregationTemporality,
83+
Gauge,
84+
Histogram,
85+
Metric,
86+
Sum,
8287
)
83-
from opentelemetry.sdk.metrics.export.aggregate import MinMaxSumCountAggregator
8488

8589
logger = logging.getLogger(__name__)
8690

@@ -97,11 +101,9 @@ def __init__(self, prefix: str = ""):
97101
self._collector = CustomCollector(prefix)
98102
REGISTRY.register(self._collector)
99103

100-
def export(
101-
self, export_records: Sequence[ExportRecord]
102-
) -> MetricsExportResult:
104+
def export(self, export_records: Sequence[Metric]) -> MetricExportResult:
103105
self._collector.add_metrics_data(export_records)
104-
return MetricsExportResult.SUCCESS
106+
return MetricExportResult.SUCCESS
105107

106108
def shutdown(self) -> None:
107109
REGISTRY.unregister(self._collector)
@@ -119,7 +121,7 @@ def __init__(self, prefix: str = ""):
119121
r"[^\w]", re.UNICODE | re.IGNORECASE
120122
)
121123

122-
def add_metrics_data(self, export_records: Sequence[ExportRecord]) -> None:
124+
def add_metrics_data(self, export_records: Sequence[Metric]) -> None:
123125
self._metrics_to_export.append(export_records)
124126

125127
def collect(self):
@@ -137,52 +139,48 @@ def collect(self):
137139
if prometheus_metric is not None:
138140
yield prometheus_metric
139141

140-
def _translate_to_prometheus(self, export_record: ExportRecord):
142+
def _translate_to_prometheus(self, export_record: Metric):
141143
prometheus_metric = None
142144
label_values = []
143145
label_keys = []
144-
for label_tuple in export_record.labels:
145-
label_keys.append(self._sanitize(label_tuple[0]))
146-
label_values.append(label_tuple[1])
146+
for key, value in export_record.attributes.items():
147+
label_keys.append(self._sanitize(key))
148+
label_values.append(str(value))
147149

148150
metric_name = ""
149151
if self._prefix != "":
150152
metric_name = self._prefix + "_"
151-
metric_name += self._sanitize(export_record.instrument.name)
153+
metric_name += self._sanitize(export_record.name)
152154

153-
description = getattr(export_record.instrument, "description", "")
154-
if isinstance(export_record.instrument, Counter):
155+
description = export_record.description or ""
156+
if isinstance(export_record.point, Sum):
155157
prometheus_metric = CounterMetricFamily(
156158
name=metric_name, documentation=description, labels=label_keys
157159
)
158160
prometheus_metric.add_metric(
159-
labels=label_values, value=export_record.aggregator.checkpoint
161+
labels=label_values, value=export_record.point.value
162+
)
163+
elif isinstance(export_record.point, Gauge):
164+
prometheus_metric = GaugeMetricFamily(
165+
name=metric_name, documentation=description, labels=label_keys
166+
)
167+
prometheus_metric.add_metric(
168+
labels=label_values, value=export_record.point.value
160169
)
161170
# TODO: Add support for histograms when supported in OT
162-
elif isinstance(export_record.instrument, Histogram):
163-
value = export_record.aggregator.checkpoint
164-
if isinstance(export_record.aggregator, MinMaxSumCountAggregator):
165-
prometheus_metric = SummaryMetricFamily(
166-
name=metric_name,
167-
documentation=description,
168-
labels=label_keys,
169-
)
170-
prometheus_metric.add_metric(
171-
labels=label_values,
172-
count_value=value.count,
173-
sum_value=value.sum,
174-
)
175-
else:
176-
prometheus_metric = UnknownMetricFamily(
177-
name=metric_name,
178-
documentation=description,
179-
labels=label_keys,
180-
)
181-
prometheus_metric.add_metric(labels=label_values, value=value)
182-
171+
# elif isinstance(export_record.point, Histogram):
172+
# value = export_record.point.sum
173+
# prometheus_metric = HistogramMetricFamily(
174+
# name=metric_name,
175+
# documentation=description,
176+
# labels=label_keys,
177+
# )
178+
# prometheus_metric.add_metric(labels=label_values, buckets=export_record.point.explicit_bounds, sum_value=value)
179+
# TODO: add support for Summary once implemented
180+
# elif isinstance(export_record.point, Summary):
183181
else:
184182
logger.warning(
185-
"Unsupported metric type. %s", type(export_record.instrument)
183+
"Unsupported metric type. %s", type(export_record.point)
186184
)
187185
return prometheus_metric
188186

exporter/opentelemetry-exporter-prometheus/tests/test_prometheus_exporter.py

Lines changed: 81 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,37 @@
1616
from unittest import mock
1717

1818
from prometheus_client import generate_latest
19-
from prometheus_client.core import CounterMetricFamily
19+
from prometheus_client.core import CounterMetricFamily, GaugeMetricFamily
2020

21+
from opentelemetry._metrics import get_meter_provider, set_meter_provider
2122
from opentelemetry.exporter.prometheus import (
2223
CustomCollector,
23-
PrometheusMetricsExporter,
24+
PrometheusMetricExporter,
2425
)
25-
from opentelemetry.metrics import get_meter_provider, set_meter_provider
26-
from opentelemetry.sdk import metrics
27-
from opentelemetry.sdk.metrics.export import ExportRecord, MetricsExportResult
28-
from opentelemetry.sdk.metrics.export.aggregate import (
29-
MinMaxSumCountAggregator,
30-
SumAggregator,
26+
from opentelemetry.sdk._metrics import MeterProvider
27+
from opentelemetry.sdk._metrics.export import MetricExportResult
28+
from opentelemetry.sdk._metrics.point import (
29+
AggregationTemporality,
30+
Histogram,
31+
Metric,
3132
)
3233
from opentelemetry.sdk.util import get_dict_as_key
34+
from opentelemetry.test.metrictestutil import (
35+
_generate_gauge,
36+
_generate_metric,
37+
_generate_sum,
38+
_generate_unsupported_metric,
39+
)
3340

3441

3542
class TestPrometheusMetricExporter(unittest.TestCase):
3643
def setUp(self):
37-
set_meter_provider(metrics.MeterProvider())
44+
set_meter_provider(MeterProvider())
3845
self._meter = get_meter_provider().get_meter(__name__)
3946
self._test_metric = self._meter.create_counter(
40-
"testname", "testdesc", "unit", int,
47+
"testname",
48+
description="testdesc",
49+
unit="unit",
4150
)
4251
labels = {"environment": "staging"}
4352
self._labels_key = get_dict_as_key(labels)
@@ -52,70 +61,63 @@ def setUp(self):
5261
def test_constructor(self):
5362
"""Test the constructor."""
5463
with self._registry_register_patch:
55-
exporter = PrometheusMetricsExporter("testprefix")
64+
exporter = PrometheusMetricExporter("testprefix")
5665
self.assertEqual(exporter._collector._prefix, "testprefix")
5766
self.assertTrue(self._mock_registry_register.called)
5867

5968
def test_shutdown(self):
6069
with mock.patch(
6170
"prometheus_client.core.REGISTRY.unregister"
6271
) as registry_unregister_patch:
63-
exporter = PrometheusMetricsExporter()
72+
exporter = PrometheusMetricExporter()
6473
exporter.shutdown()
6574
self.assertTrue(registry_unregister_patch.called)
6675

6776
def test_export(self):
6877
with self._registry_register_patch:
69-
record = ExportRecord(
70-
self._test_metric,
71-
self._labels_key,
72-
SumAggregator(),
73-
get_meter_provider().resource,
74-
)
75-
exporter = PrometheusMetricsExporter()
78+
record = _generate_sum("sum_int", 33)
79+
exporter = PrometheusMetricExporter()
7680
result = exporter.export([record])
7781
# pylint: disable=protected-access
7882
self.assertEqual(len(exporter._collector._metrics_to_export), 1)
79-
self.assertIs(result, MetricsExportResult.SUCCESS)
80-
81-
def test_min_max_sum_aggregator_to_prometheus(self):
82-
meter = get_meter_provider().get_meter(__name__)
83-
metric = meter.create_valuerecorder(
84-
"test@name", "testdesc", "unit", int, []
83+
self.assertIs(result, MetricExportResult.SUCCESS)
84+
85+
# # TODO: Add unit test for histogram
86+
def test_histogram_to_prometheus(self):
87+
record = _generate_metric(
88+
"test@name",
89+
Histogram(
90+
time_unix_nano=1641946016139533244,
91+
start_time_unix_nano=1641946016139533244,
92+
bucket_counts=[1, 1],
93+
sum=579.0,
94+
explicit_bounds=[123.0, 456.0],
95+
aggregation_temporality=AggregationTemporality.DELTA,
96+
),
8597
)
86-
labels = {}
87-
key_labels = get_dict_as_key(labels)
88-
aggregator = MinMaxSumCountAggregator()
89-
aggregator.update(123)
90-
aggregator.update(456)
91-
aggregator.take_checkpoint()
92-
record = ExportRecord(
93-
metric, key_labels, aggregator, get_meter_provider().resource
94-
)
95-
collector = CustomCollector("testprefix")
96-
collector.add_metrics_data([record])
97-
result_bytes = generate_latest(collector)
98-
result = result_bytes.decode("utf-8")
99-
self.assertIn("testprefix_test_name_count 2.0", result)
100-
self.assertIn("testprefix_test_name_sum 579.0", result)
101-
102-
def test_counter_to_prometheus(self):
103-
meter = get_meter_provider().get_meter(__name__)
104-
metric = meter.create_counter("test@name", "testdesc", "unit", int,)
98+
99+
# collector = CustomCollector("testprefix")
100+
# collector.add_metrics_data([record])
101+
# result_bytes = generate_latest(collector)
102+
# result = result_bytes.decode("utf-8")
103+
# self.assertIn("testprefix_test_name_count 2.0", result)
104+
# self.assertIn("testprefix_test_name_sum 579.0", result)
105+
106+
def test_sum_to_prometheus(self):
105107
labels = {"environment@": "staging", "os": "Windows"}
106-
key_labels = get_dict_as_key(labels)
107-
aggregator = SumAggregator()
108-
aggregator.update(123)
109-
aggregator.take_checkpoint()
110-
record = ExportRecord(
111-
metric, key_labels, aggregator, get_meter_provider().resource
108+
record = _generate_sum(
109+
"test@sum",
110+
123,
111+
attributes=labels,
112+
description="testdesc",
113+
unit="testunit",
112114
)
113115
collector = CustomCollector("testprefix")
114116
collector.add_metrics_data([record])
115117

116118
for prometheus_metric in collector.collect():
117119
self.assertEqual(type(prometheus_metric), CounterMetricFamily)
118-
self.assertEqual(prometheus_metric.name, "testprefix_test_name")
120+
self.assertEqual(prometheus_metric.name, "testprefix_test_sum")
119121
self.assertEqual(prometheus_metric.documentation, "testdesc")
120122
self.assertTrue(len(prometheus_metric.samples) == 1)
121123
self.assertEqual(prometheus_metric.samples[0].value, 123)
@@ -127,16 +129,37 @@ def test_counter_to_prometheus(self):
127129
prometheus_metric.samples[0].labels["os"], "Windows"
128130
)
129131

130-
# TODO: Add unit test once GaugeAggregator is available
131-
# TODO: Add unit test once Measure Aggregators are available
132+
def test_gauge_to_prometheus(self):
133+
labels = {"environment@": "dev", "os": "Unix"}
134+
record = _generate_gauge(
135+
"test@gauge",
136+
123,
137+
attributes=labels,
138+
description="testdesc",
139+
unit="testunit",
140+
)
141+
collector = CustomCollector("testprefix")
142+
collector.add_metrics_data([record])
143+
144+
for prometheus_metric in collector.collect():
145+
self.assertEqual(type(prometheus_metric), GaugeMetricFamily)
146+
self.assertEqual(prometheus_metric.name, "testprefix_test_gauge")
147+
self.assertEqual(prometheus_metric.documentation, "testdesc")
148+
self.assertTrue(len(prometheus_metric.samples) == 1)
149+
self.assertEqual(prometheus_metric.samples[0].value, 123)
150+
self.assertTrue(len(prometheus_metric.samples[0].labels) == 2)
151+
self.assertEqual(
152+
prometheus_metric.samples[0].labels["environment_"], "dev"
153+
)
154+
self.assertEqual(prometheus_metric.samples[0].labels["os"], "Unix")
132155

133156
def test_invalid_metric(self):
134-
meter = get_meter_provider().get_meter(__name__)
135-
metric = StubMetric("tesname", "testdesc", "unit", int, meter)
136157
labels = {"environment": "staging"}
137-
key_labels = get_dict_as_key(labels)
138-
record = ExportRecord(
139-
metric, key_labels, None, get_meter_provider().resource
158+
record = _generate_unsupported_metric(
159+
"tesname",
160+
attributes=labels,
161+
description="testdesc",
162+
unit="testunit",
140163
)
141164
collector = CustomCollector("testprefix")
142165
collector.add_metrics_data([record])
@@ -152,18 +175,3 @@ def test_sanitize(self):
152175
self.assertEqual(collector._sanitize(",./?;:[]{}"), "__________")
153176
self.assertEqual(collector._sanitize("TestString"), "TestString")
154177
self.assertEqual(collector._sanitize("aAbBcC_12_oi"), "aAbBcC_12_oi")
155-
156-
157-
class StubMetric(metrics.Metric):
158-
def __init__(
159-
self,
160-
name: str,
161-
description: str,
162-
unit: str,
163-
value_type,
164-
meter,
165-
enabled: bool = True,
166-
):
167-
super().__init__(
168-
name, description, unit, value_type, meter, enabled=enabled,
169-
)

0 commit comments

Comments
 (0)