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