1111# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212# See the License for the specific language governing permissions and
1313# limitations under the License.
14-
1514import os
1615from unittest import TestCase , mock
1716
18- from opentelemetry import trace
17+ from opentelemetry import trace as trace_api
1918from opentelemetry .sdk .metrics import Exemplar , MeterProvider
2019from opentelemetry .sdk .metrics .export import (
2120 AggregationTemporality ,
@@ -41,7 +40,6 @@ def test_always_on_exemplars(self):
4140 counter = meter .create_counter ("testcounter" )
4241 counter .add (10 , {"label" : "value1" })
4342 data = reader .get_metrics_data ()
44-
4543 metrics = data .resource_metrics [0 ].scope_metrics [0 ].metrics
4644 self .assertEqual (
4745 metrics ,
@@ -86,18 +84,123 @@ def test_trace_based_exemplars(self):
8684 trace_flags = TraceFlags (TraceFlags .SAMPLED ),
8785 trace_state = {},
8886 )
89- span = trace .NonRecordingSpan (span_context )
90- trace .set_span_in_context (span )
87+ span = trace_api .NonRecordingSpan (span_context )
88+ trace_api .set_span_in_context (span )
89+ reader = InMemoryMetricReader ()
90+ meter_provider = MeterProvider (
91+ metric_readers = [reader ],
92+ )
93+
94+ meter = meter_provider .get_meter ("testmeter" )
95+ counter = meter .create_counter ("testcounter" )
96+ with trace_api .use_span (span ):
97+ counter .add (10 , {"label" : "value1" })
98+ data = reader .get_metrics_data ()
99+ metrics = data .resource_metrics [0 ].scope_metrics [0 ].metrics
100+ self .assertEqual (
101+ metrics ,
102+ [
103+ Metric (
104+ name = "testcounter" ,
105+ description = "" ,
106+ unit = "" ,
107+ data = Sum (
108+ data_points = [
109+ NumberDataPoint (
110+ attributes = {"label" : "value1" },
111+ start_time_unix_nano = mock .ANY ,
112+ time_unix_nano = mock .ANY ,
113+ value = 10 ,
114+ exemplars = [
115+ Exemplar (
116+ filtered_attributes = {},
117+ value = 10 ,
118+ time_unix_nano = mock .ANY ,
119+ span_id = self .SPAN_ID ,
120+ trace_id = self .TRACE_ID ,
121+ ),
122+ ],
123+ )
124+ ],
125+ aggregation_temporality = AggregationTemporality .CUMULATIVE ,
126+ is_monotonic = True ,
127+ ),
128+ )
129+ ],
130+ )
91131
132+ def test_default_exemplar_filter (self ):
133+ span_context = SpanContext (
134+ trace_id = self .TRACE_ID ,
135+ span_id = self .SPAN_ID ,
136+ is_remote = False ,
137+ trace_flags = TraceFlags (TraceFlags .SAMPLED ),
138+ trace_state = {},
139+ )
140+ span = trace_api .NonRecordingSpan (span_context )
141+ trace_api .set_span_in_context (span )
92142 reader = InMemoryMetricReader ()
93143 meter_provider = MeterProvider (
94144 metric_readers = [reader ],
95145 )
146+
96147 meter = meter_provider .get_meter ("testmeter" )
97148 counter = meter .create_counter ("testcounter" )
98- counter .add (10 , {"label" : "value1" })
149+ with trace_api .use_span (span ):
150+ counter .add (10 , {"label" : "value1" })
99151 data = reader .get_metrics_data ()
152+ metrics = data .resource_metrics [0 ].scope_metrics [0 ].metrics
153+ self .assertEqual (
154+ metrics ,
155+ [
156+ Metric (
157+ name = "testcounter" ,
158+ description = "" ,
159+ unit = "" ,
160+ data = Sum (
161+ data_points = [
162+ NumberDataPoint (
163+ attributes = {"label" : "value1" },
164+ start_time_unix_nano = mock .ANY ,
165+ time_unix_nano = mock .ANY ,
166+ value = 10 ,
167+ exemplars = [
168+ Exemplar (
169+ filtered_attributes = {},
170+ value = 10 ,
171+ time_unix_nano = mock .ANY ,
172+ span_id = self .SPAN_ID ,
173+ trace_id = self .TRACE_ID ,
174+ ),
175+ ],
176+ )
177+ ],
178+ aggregation_temporality = AggregationTemporality .CUMULATIVE ,
179+ is_monotonic = True ,
180+ ),
181+ )
182+ ],
183+ )
100184
185+ def test_exemplar_trace_based_manual_context (self ):
186+ span_context = SpanContext (
187+ trace_id = self .TRACE_ID ,
188+ span_id = self .SPAN_ID ,
189+ is_remote = False ,
190+ trace_flags = TraceFlags (TraceFlags .SAMPLED ),
191+ trace_state = {},
192+ )
193+ span = trace_api .NonRecordingSpan (span_context )
194+ ctx = trace_api .set_span_in_context (span )
195+ reader = InMemoryMetricReader ()
196+ meter_provider = MeterProvider (
197+ metric_readers = [reader ],
198+ )
199+
200+ meter = meter_provider .get_meter ("testmeter" )
201+ counter = meter .create_counter ("testcounter" )
202+ counter .add (10 , {"label" : "value1" }, context = ctx )
203+ data = reader .get_metrics_data ()
101204 metrics = data .resource_metrics [0 ].scope_metrics [0 ].metrics
102205 self .assertEqual (
103206 metrics ,
@@ -142,9 +245,8 @@ def test_always_off_exemplars(self):
142245 trace_flags = TraceFlags (TraceFlags .SAMPLED ),
143246 trace_state = {},
144247 )
145- span = trace .NonRecordingSpan (span_context )
146- trace .set_span_in_context (span )
147-
248+ span = trace_api .NonRecordingSpan (span_context )
249+ trace_api .set_span_in_context (span )
148250 reader = InMemoryMetricReader ()
149251 meter_provider = MeterProvider (
150252 metric_readers = [reader ],
@@ -153,7 +255,6 @@ def test_always_off_exemplars(self):
153255 counter = meter .create_counter ("testcounter" )
154256 counter .add (10 , {"label" : "value1" })
155257 data = reader .get_metrics_data ()
156-
157258 metrics = data .resource_metrics [0 ].scope_metrics [0 ].metrics
158259 self .assertEqual (
159260 metrics ,
0 commit comments