1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15- from itertools import count
16- from logging import ERROR
1715from platform import system
1816from unittest import TestCase
1917
2018from pytest import mark
2119
22- from opentelemetry .metrics import Observation
23- from opentelemetry .sdk .metrics import Counter , MeterProvider , ObservableCounter
20+ from opentelemetry .sdk .metrics import Histogram , MeterProvider
2421from opentelemetry .sdk .metrics .export import (
2522 AggregationTemporality ,
2623 InMemoryMetricReader ,
2724)
28- from opentelemetry .sdk .metrics .view import SumAggregation
25+ from opentelemetry .sdk .metrics .view import ExplicitBucketHistogramAggregation
2926
3027
31- class TestSumAggregation (TestCase ):
32- @mark .skipif (
33- system () != "Linux" ,
34- reason = (
35- "Tests fail because Windows time_ns resolution is too low so "
36- "two different time measurements may end up having the exact same"
37- "value."
38- ),
39- )
40- def test_asynchronous_delta_temporality (self ):
41-
42- eight_multiple_generator = count (start = 8 , step = 8 )
43-
44- counter = 0
45-
46- def observable_counter_callback (callback_options ):
47- nonlocal counter
48- counter += 1
49-
50- if counter < 11 :
51- yield
52-
53- elif counter < 21 :
54- yield Observation (next (eight_multiple_generator ))
55-
56- else :
57- yield
58-
59- aggregation = SumAggregation ()
60-
61- reader = InMemoryMetricReader (
62- preferred_aggregation = {ObservableCounter : aggregation },
63- preferred_temporality = {
64- ObservableCounter : AggregationTemporality .DELTA
65- },
66- )
67-
68- provider = MeterProvider (metric_readers = [reader ])
69- meter = provider .get_meter ("name" , "version" )
70-
71- meter .create_observable_counter (
72- "observable_counter" , [observable_counter_callback ]
73- )
74-
75- results = []
76-
77- for _ in range (10 ):
78- with self .assertLogs (level = ERROR ):
79- results .append (reader .get_metrics_data ())
80-
81- self .assertEqual (counter , 10 )
82-
83- for metrics_data in results :
84- self .assertIsNone (metrics_data )
85-
86- results = []
28+ class TestExplicitBucketHistogramAggregation (TestCase ):
8729
88- for _ in range (10 ):
89- results .append (reader .get_metrics_data ())
90-
91- self .assertEqual (counter , 20 )
92-
93- previous_time_unix_nano = (
94- results [0 ]
95- .resource_metrics [0 ]
96- .scope_metrics [0 ]
97- .metrics [0 ]
98- .data .data_points [0 ]
99- .time_unix_nano
100- )
101-
102- self .assertEqual (
103- (
104- results [0 ]
105- .resource_metrics [0 ]
106- .scope_metrics [0 ]
107- .metrics [0 ]
108- .data .data_points [0 ]
109- .value
110- ),
111- 8 ,
112- )
113-
114- self .assertLess (
115- (
116- results [0 ]
117- .resource_metrics [0 ]
118- .scope_metrics [0 ]
119- .metrics [0 ]
120- .data .data_points [0 ]
121- .start_time_unix_nano
122- ),
123- previous_time_unix_nano ,
124- )
125-
126- for metrics_data in results [1 :]:
127-
128- metric_data = (
129- metrics_data .resource_metrics [0 ]
130- .scope_metrics [0 ]
131- .metrics [0 ]
132- .data .data_points [0 ]
133- )
134-
135- self .assertEqual (
136- previous_time_unix_nano , metric_data .start_time_unix_nano
137- )
138- previous_time_unix_nano = metric_data .time_unix_nano
139- self .assertEqual (metric_data .value , 8 )
140- self .assertLess (
141- metric_data .start_time_unix_nano , metric_data .time_unix_nano
142- )
143-
144- results = []
145-
146- for _ in range (10 ):
147- with self .assertLogs (level = ERROR ):
148- results .append (reader .get_metrics_data ())
149-
150- self .assertEqual (counter , 30 )
151-
152- provider .shutdown ()
153-
154- for metrics_data in results :
155- self .assertIsNone (metrics_data )
156-
157- @mark .skipif (
158- system () != "Linux" ,
159- reason = (
160- "Tests fail because Windows time_ns resolution is too low so "
161- "two different time measurements may end up having the exact same"
162- "value."
163- ),
164- )
165- def test_asynchronous_cumulative_temporality (self ):
166-
167- eight_multiple_generator = count (start = 8 , step = 8 )
168-
169- counter = 0
170-
171- def observable_counter_callback (callback_options ):
172- nonlocal counter
173- counter += 1
174-
175- if counter < 11 :
176- yield
177-
178- elif counter < 21 :
179- yield Observation (next (eight_multiple_generator ))
180-
181- else :
182- yield
183-
184- aggregation = SumAggregation ()
185-
186- reader = InMemoryMetricReader (
187- preferred_aggregation = {ObservableCounter : aggregation },
188- preferred_temporality = {
189- ObservableCounter : AggregationTemporality .CUMULATIVE
190- },
191- )
192-
193- provider = MeterProvider (metric_readers = [reader ])
194- meter = provider .get_meter ("name" , "version" )
195-
196- meter .create_observable_counter (
197- "observable_counter" , [observable_counter_callback ]
198- )
199-
200- results = []
201-
202- for _ in range (10 ):
203- with self .assertLogs (level = ERROR ):
204- results .append (reader .get_metrics_data ())
205-
206- self .assertEqual (counter , 10 )
207-
208- for metrics_data in results :
209- self .assertIsNone (metrics_data )
210-
211- results = []
212-
213- for _ in range (10 ):
214- results .append (reader .get_metrics_data ())
215-
216- self .assertEqual (counter , 20 )
217-
218- start_time_unix_nano = (
219- results [0 ]
220- .resource_metrics [0 ]
221- .scope_metrics [0 ]
222- .metrics [0 ]
223- .data .data_points [0 ]
224- .start_time_unix_nano
225- )
226-
227- for index , metrics_data in enumerate (results ):
228-
229- metric_data = (
230- metrics_data .resource_metrics [0 ]
231- .scope_metrics [0 ]
232- .metrics [0 ]
233- .data .data_points [0 ]
234- )
235-
236- self .assertEqual (
237- start_time_unix_nano , metric_data .start_time_unix_nano
238- )
239- self .assertEqual (metric_data .value , 8 * (index + 1 ))
240-
241- results = []
242-
243- for _ in range (10 ):
244- with self .assertLogs (level = ERROR ):
245- results .append (reader .get_metrics_data ())
246-
247- self .assertEqual (counter , 30 )
248-
249- provider .shutdown ()
250-
251- for metrics_data in results :
252- self .assertIsNone (metrics_data )
30+ def setUp (self ):
31+ self .test_values = iter ([1 , 6 , 11 , 26 , 51 , 76 , 101 , 251 , 501 , 751 ])
25332
25433 @mark .skipif (
25534 system () != "Linux" ,
@@ -261,17 +40,17 @@ def observable_counter_callback(callback_options):
26140 )
26241 def test_synchronous_delta_temporality (self ):
26342
264- aggregation = SumAggregation ()
43+ aggregation = ExplicitBucketHistogramAggregation ()
26544
26645 reader = InMemoryMetricReader (
267- preferred_aggregation = {Counter : aggregation },
268- preferred_temporality = {Counter : AggregationTemporality .DELTA },
46+ preferred_aggregation = {Histogram : aggregation },
47+ preferred_temporality = {Histogram : AggregationTemporality .DELTA },
26948 )
27049
27150 provider = MeterProvider (metric_readers = [reader ])
27251 meter = provider .get_meter ("name" , "version" )
27352
274- counter = meter .create_counter ( "counter " )
53+ histogram = meter .create_histogram ( "histogram " )
27554
27655 results = []
27756
@@ -284,8 +63,8 @@ def test_synchronous_delta_temporality(self):
28463
28564 results = []
28665
287- for _ in range ( 10 ) :
288- counter . add ( 8 )
66+ for test_value in self . test_values :
67+ histogram . record ( test_value )
28968 results .append (reader .get_metrics_data ())
29069
29170 previous_time_unix_nano = (
@@ -304,9 +83,9 @@ def test_synchronous_delta_temporality(self):
30483 .scope_metrics [0 ]
30584 .metrics [0 ]
30685 .data .data_points [0 ]
307- .value
86+ .bucket_counts
30887 ),
309- 8 ,
88+ ( 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )
31089 )
31190
31291 self .assertLess (
@@ -321,8 +100,7 @@ def test_synchronous_delta_temporality(self):
321100 previous_time_unix_nano ,
322101 )
323102
324- for metrics_data in results [1 :]:
325-
103+ for index , metrics_data in enumerate (results [1 :]):
326104 metric_data = (
327105 metrics_data .resource_metrics [0 ]
328106 .scope_metrics [0 ]
@@ -334,7 +112,16 @@ def test_synchronous_delta_temporality(self):
334112 previous_time_unix_nano , metric_data .start_time_unix_nano
335113 )
336114 previous_time_unix_nano = metric_data .time_unix_nano
337- self .assertEqual (metric_data .value , 8 )
115+ self .assertEqual (
116+ metric_data .bucket_counts ,
117+ tuple (
118+ [
119+ 1 if internal_index == index + 2 else 0
120+ for internal_index in range (16 )
121+ ]
122+ )
123+
124+ )
338125 self .assertLess (
339126 metric_data .start_time_unix_nano , metric_data .time_unix_nano
340127 )
@@ -360,17 +147,17 @@ def test_synchronous_delta_temporality(self):
360147 )
361148 def test_synchronous_cumulative_temporality (self ):
362149
363- aggregation = SumAggregation ()
150+ aggregation = ExplicitBucketHistogramAggregation ()
364151
365152 reader = InMemoryMetricReader (
366- preferred_aggregation = {Counter : aggregation },
367- preferred_temporality = {Counter : AggregationTemporality .CUMULATIVE },
153+ preferred_aggregation = {Histogram : aggregation },
154+ preferred_temporality = {Histogram : AggregationTemporality .CUMULATIVE },
368155 )
369156
370157 provider = MeterProvider (metric_readers = [reader ])
371158 meter = provider .get_meter ("name" , "version" )
372159
373- counter = meter .create_counter ( "counter " )
160+ histogram = meter .create_histogram ( "histogram " )
374161
375162 results = []
376163
@@ -383,9 +170,9 @@ def test_synchronous_cumulative_temporality(self):
383170
384171 results = []
385172
386- for _ in range ( 10 ) :
173+ for test_value in self . test_values :
387174
388- counter . add ( 8 )
175+ histogram . record ( test_value )
389176 results .append (reader .get_metrics_data ())
390177
391178 start_time_unix_nano = (
@@ -409,7 +196,15 @@ def test_synchronous_cumulative_temporality(self):
409196 self .assertEqual (
410197 start_time_unix_nano , metric_data .start_time_unix_nano
411198 )
412- self .assertEqual (metric_data .value , 8 * (index + 1 ))
199+ self .assertEqual (
200+ metric_data .bucket_counts ,
201+ tuple (
202+ [
203+ 0 if internal_index < 1 or internal_index > index + 1 else 1
204+ for internal_index in range (16 )
205+ ]
206+ )
207+ )
413208
414209 results = []
415210
@@ -440,4 +235,7 @@ def test_synchronous_cumulative_temporality(self):
440235 self .assertEqual (
441236 start_time_unix_nano , metric_data .start_time_unix_nano
442237 )
443- self .assertEqual (metric_data .value , 80 )
238+ self .assertEqual (
239+ metric_data .bucket_counts ,
240+ (0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 )
241+ )
0 commit comments