1616from unittest import mock
1717
1818from 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
2122from 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)
3233from 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
3542class 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