Skip to content

Commit 6a25608

Browse files
committed
Add first test focusing on exemplar
1 parent 2b7793a commit 6a25608

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@
1616
from opentelemetry.sdk.metrics._internal import Meter, MeterProvider
1717
from opentelemetry.sdk.metrics._internal.exceptions import MetricsTimeoutError
1818
from opentelemetry.sdk.metrics._internal.exemplar import (
19+
AlignedHistogramBucketExemplarReservoir,
20+
AlwaysOnExemplarFilter,
21+
AlwaysOffExemplarFilter,
1922
ExemplarFilter,
2023
ExemplarReservoir,
24+
SimpleFixedSizeExemplarReservoir,
25+
TraceBasedExemplarFilter,
2126
)
2227
from opentelemetry.sdk.metrics._internal.instrument import Counter
2328
from opentelemetry.sdk.metrics._internal.instrument import Gauge as _Gauge
@@ -30,6 +35,9 @@
3035
)
3136

3237
__all__ = [
38+
"AlignedHistogramBucketExemplarReservoir",
39+
"AlwaysOnExemplarFilter",
40+
"AlwaysOffExemplarFilter",
3341
"ExemplarFilter",
3442
"ExemplarReservoir",
3543
"Meter",
@@ -41,5 +49,7 @@
4149
"ObservableCounter",
4250
"ObservableGauge",
4351
"ObservableUpDownCounter",
52+
"SimpleFixedSizeExemplarReservoir",
4453
"UpDownCounter",
54+
"TraceBasedExemplarFilter",
4555
]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ def __init__(
384384
metric_readers: Sequence[
385385
"opentelemetry.sdk.metrics.export.MetricReader"
386386
] = (),
387-
resource: Resource = None,
387+
resource: Optional[Resource] = None,
388388
exemplar_filter: Optional[ExemplarFilter] = None,
389389
shutdown_on_exit: bool = True,
390390
views: Sequence["opentelemetry.sdk.metrics.view.View"] = (),

opentelemetry-sdk/tests/metrics/integration_test/test_console_exporter.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,21 @@
1515
from io import StringIO
1616
from json import loads
1717
from unittest import TestCase
18+
from unittest.mock import Mock, patch
1819

20+
from opentelemetry.context import Context
1921
from opentelemetry.metrics import get_meter, set_meter_provider
20-
from opentelemetry.sdk.metrics import MeterProvider
22+
from opentelemetry.sdk.metrics import AlwaysOnExemplarFilter, MeterProvider
2123
from opentelemetry.sdk.metrics.export import (
2224
ConsoleMetricExporter,
2325
PeriodicExportingMetricReader,
2426
)
2527
from opentelemetry.test.globals_test import reset_metrics_globals
2628

2729

30+
TEST_TIMESTAMP = 1_234_567_890
31+
32+
2833
class TestConsoleExporter(TestCase):
2934
def setUp(self):
3035
reset_metrics_globals()
@@ -88,3 +93,39 @@ def test_console_exporter_no_export(self):
8893
expected = ""
8994

9095
self.assertEqual(actual, expected)
96+
97+
@patch(
98+
"opentelemetry.sdk.metrics._internal.instrument.time_ns",
99+
Mock(return_value=TEST_TIMESTAMP),
100+
)
101+
def test_console_exporter_with_exemplars(self):
102+
ctx = Context()
103+
104+
output = StringIO()
105+
exporter = ConsoleMetricExporter(out=output)
106+
reader = PeriodicExportingMetricReader(
107+
exporter, export_interval_millis=100
108+
)
109+
provider = MeterProvider(metric_readers=[reader], exemplar_filter=AlwaysOnExemplarFilter())
110+
set_meter_provider(provider)
111+
meter = get_meter(__name__)
112+
counter = meter.create_counter(
113+
"name", description="description", unit="unit"
114+
)
115+
counter.add(1, attributes={"a": "b"}, context=ctx)
116+
provider.shutdown()
117+
118+
output.seek(0)
119+
result_0 = loads("".join(output.readlines()))
120+
121+
self.assertGreater(len(result_0), 0)
122+
123+
metrics = result_0["resource_metrics"][0]["scope_metrics"][0]
124+
125+
self.assertEqual(metrics["scope"]["name"], "test_console_exporter")
126+
127+
point = metrics["metrics"][0]["data"]["data_points"][0]
128+
129+
self.assertEqual(point["attributes"], {"a": "b"})
130+
self.assertEqual(point["value"], 1)
131+
self.assertEqual(point["exemplars"], [{"filtered_attributes": {}, "value": 1, "time_unix_nano": TEST_TIMESTAMP, "span_id": None, "trace_id": None}])

0 commit comments

Comments
 (0)