Skip to content

Commit fadcefc

Browse files
committed
add unit tests for exemplarfilter, exemplarreservoir, and reservoirfactory
1 parent f0ecace commit fadcefc

File tree

2 files changed

+129
-3
lines changed

2 files changed

+129
-3
lines changed

opentelemetry-sdk/tests/metrics/test_exemplarfilter.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
from unittest import TestCase
22

3+
from opentelemetry import trace
34
from opentelemetry.context import Context
5+
from opentelemetry.trace.span import SpanContext
6+
from opentelemetry.trace import TraceFlags
47
from opentelemetry.sdk.metrics._internal.exemplar import (
58
AlwaysOffExemplarFilter,
69
AlwaysOnExemplarFilter,
710
TraceBasedExemplarFilter,
811
)
912

10-
1113
class TestAlwaysOnExemplarFilter(TestCase):
1214
def test_should_sample(self):
1315
filter = AlwaysOnExemplarFilter()
@@ -21,8 +23,34 @@ def test_should_sample(self):
2123

2224

2325
class TestTraceBasedExemplarFilter(TestCase):
26+
TRACE_ID = int("d4cda95b652f4a1592b449d5929fda1b", 16)
27+
SPAN_ID = int("6e0c63257de34c92", 16)
2428
def test_should_not_sample_without_trace(self):
29+
filter = TraceBasedExemplarFilter()
30+
span_context = SpanContext(
31+
trace_id=self.TRACE_ID,
32+
span_id=self.SPAN_ID,
33+
is_remote=False,
34+
trace_flags= TraceFlags(TraceFlags.DEFAULT),
35+
trace_state={}
36+
)
37+
span = trace.NonRecordingSpan(span_context)
38+
ctx = trace.set_span_in_context(span)
39+
self.assertFalse(filter.should_sample(10, 0, {}, ctx))
40+
41+
def test_should_not_sample_with_invalid_span(self):
2542
filter = TraceBasedExemplarFilter()
2643
self.assertFalse(filter.should_sample(10, 0, {}, Context()))
27-
28-
# FIXME add test with trace that should sample
44+
45+
def test_should_sample_when_trace_is_sampled(self):
46+
filter = TraceBasedExemplarFilter()
47+
span_context = SpanContext(
48+
trace_id=self.TRACE_ID,
49+
span_id=self.SPAN_ID,
50+
is_remote=False,
51+
trace_flags= TraceFlags(TraceFlags.SAMPLED),
52+
trace_state={}
53+
)
54+
span = trace.NonRecordingSpan(span_context)
55+
ctx = trace.set_span_in_context(span)
56+
self.assertTrue(filter.should_sample(10, 0, {}, ctx))
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
from unittest import TestCase
2+
3+
#from opentelemetry.context import Context
4+
from opentelemetry.trace import INVALID_SPAN, SpanContext, TraceFlags
5+
from opentelemetry import trace
6+
from time import time_ns
7+
from opentelemetry.sdk.metrics._internal.view import default_reservoir_factory
8+
from opentelemetry.sdk.metrics._internal.exemplar import (
9+
AlignedHistogramBucketExemplarReservoir,
10+
ExemplarReservoir,
11+
ExemplarReservoirFactory,
12+
SimpleFixedSizeExemplarReservoir
13+
)
14+
from opentelemetry.sdk.metrics._internal.aggregation import (
15+
_ExplicitBucketHistogramAggregation,
16+
_LastValueAggregation,
17+
_SumAggregation,
18+
)
19+
20+
class TestSimpleFixedSizeExemplarReservoir(TestCase):
21+
22+
TRACE_ID = int("d4cda95b652f4a1592b449d5929fda1b", 16)
23+
SPAN_ID = int("6e0c63257de34c92", 16)
24+
25+
def test_no_measurements(self):
26+
reservoir = SimpleFixedSizeExemplarReservoir(10)
27+
self.assertEqual(len(reservoir.collect({})), 0)
28+
29+
def test_has_context(self):
30+
reservoir = SimpleFixedSizeExemplarReservoir(1)
31+
span_context = SpanContext(
32+
trace_id=self.TRACE_ID,
33+
span_id=self.SPAN_ID,
34+
is_remote=False,
35+
trace_flags= TraceFlags(TraceFlags.SAMPLED),
36+
trace_state={}
37+
)
38+
span = trace.NonRecordingSpan(span_context)
39+
ctx = trace.set_span_in_context(span)
40+
reservoir.offer(1, time_ns(), {}, ctx)
41+
exemplars = reservoir.collect({})
42+
self.assertEqual(len(exemplars), 1)
43+
self.assertEqual(exemplars[0].trace_id, self.TRACE_ID)
44+
self.assertEqual(exemplars[0].span_id, self.SPAN_ID)
45+
46+
def test_filter_attributes(self):
47+
reservoir = SimpleFixedSizeExemplarReservoir(1)
48+
span_context = SpanContext(
49+
trace_id=self.TRACE_ID,
50+
span_id=self.SPAN_ID,
51+
is_remote=False,
52+
trace_flags= TraceFlags(TraceFlags.SAMPLED),
53+
trace_state={}
54+
)
55+
span = trace.NonRecordingSpan(span_context)
56+
ctx = trace.set_span_in_context(span)
57+
reservoir.offer(1, time_ns(), {"key1": "value1", "key2": "value2"}, ctx)
58+
exemplars = reservoir.collect({"key2": "value2", "key3": "value3"})
59+
self.assertEqual(len(exemplars), 1)
60+
self.assertNotEqual("key1", exemplars[0].filtered_attributes)
61+
62+
class TestAlignedHistogramBucketExemplarReservoir(TestCase):
63+
64+
TRACE_ID = int("d4cda95b652f4a1592b449d5929fda1b", 16)
65+
SPAN_ID = int("6e0c63257de34c92", 16)
66+
67+
def test_measurement_in_buckets(self):
68+
reservoir = AlignedHistogramBucketExemplarReservoir([0, 5, 10, 25, 50, 75])
69+
span_context = SpanContext(
70+
trace_id=self.TRACE_ID,
71+
span_id=self.SPAN_ID,
72+
is_remote=False,
73+
trace_flags= TraceFlags(TraceFlags.SAMPLED),
74+
trace_state={}
75+
)
76+
span = trace.NonRecordingSpan(span_context)
77+
ctx = trace.set_span_in_context(span)
78+
reservoir.offer(52, time_ns(), {"bucket": "5"}, ctx)
79+
reservoir.offer(7, time_ns(), {"bucket": "3"}, ctx)
80+
reservoir.offer(6, time_ns(), {"bucket": "3"}, ctx)
81+
exemplars = reservoir.collect({"bucket": "3"})
82+
self.assertEqual(len(exemplars), 2)
83+
self.assertEqual(exemplars[0].value, 6)
84+
self.assertEqual(exemplars[1].value, 52)
85+
self.assertEqual(len(exemplars[0].filtered_attributes), 0)
86+
self.assertNotEqual(exemplars[1].filtered_attributes, {"bucket": "5"})
87+
88+
89+
class TestExemplarReservoirFactory(TestCase):
90+
def test_sum_aggregation(self):
91+
exemplar_reservoir = default_reservoir_factory(_SumAggregation)
92+
self.assertEqual(exemplar_reservoir, SimpleFixedSizeExemplarReservoir)
93+
def test_last_value_aggregation(self):
94+
exemplar_reservoir = default_reservoir_factory(_LastValueAggregation)
95+
self.assertEqual(exemplar_reservoir, SimpleFixedSizeExemplarReservoir)
96+
def test_explicit_histogram_aggregation(self):
97+
exemplar_reservoir = default_reservoir_factory(_ExplicitBucketHistogramAggregation)
98+
self.assertEqual(exemplar_reservoir, AlignedHistogramBucketExemplarReservoir)

0 commit comments

Comments
 (0)