2828)
2929from opentelemetry .exporter .otlp .proto .common ._internal import (
3030 _encode_attributes ,
31+ _encode_span_id ,
32+ _encode_trace_id ,
3133)
3234from opentelemetry .sdk .environment_variables import (
3335 OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE ,
@@ -216,6 +218,7 @@ def encode_metrics(data: MetricsData) -> ExportMetricsServiceRequest:
216218 data_point .attributes
217219 ),
218220 time_unix_nano = data_point .time_unix_nano ,
221+ exemplars = encode_exemplars (data_point .exemplars ),
219222 )
220223 if isinstance (data_point .value , int ):
221224 pt .as_int = data_point .value
@@ -233,6 +236,7 @@ def encode_metrics(data: MetricsData) -> ExportMetricsServiceRequest:
233236 start_time_unix_nano = (
234237 data_point .start_time_unix_nano
235238 ),
239+ exemplars = encode_exemplars (data_point .exemplars ),
236240 count = data_point .count ,
237241 sum = data_point .sum ,
238242 bucket_counts = data_point .bucket_counts ,
@@ -255,6 +259,7 @@ def encode_metrics(data: MetricsData) -> ExportMetricsServiceRequest:
255259 data_point .start_time_unix_nano
256260 ),
257261 time_unix_nano = data_point .time_unix_nano ,
262+ exemplars = encode_exemplars (data_point .exemplars ),
258263 )
259264 if isinstance (data_point .value , int ):
260265 pt .as_int = data_point .value
@@ -296,6 +301,7 @@ def encode_metrics(data: MetricsData) -> ExportMetricsServiceRequest:
296301 start_time_unix_nano = (
297302 data_point .start_time_unix_nano
298303 ),
304+ exemplars = encode_exemplars (data_point .exemplars ),
299305 count = data_point .count ,
300306 sum = data_point .sum ,
301307 scale = data_point .scale ,
@@ -336,3 +342,32 @@ def encode_metrics(data: MetricsData) -> ExportMetricsServiceRequest:
336342 )
337343 resource_metrics = resource_data
338344 return ExportMetricsServiceRequest (resource_metrics = resource_metrics )
345+
346+ def encode_exemplars (sdk_exemplars : list ) -> list :
347+ """
348+ Converts a list of SDK Exemplars into a list of protobuf Exemplars.
349+
350+ Args:
351+ sdk_exemplars (list): The list of exemplars from the OpenTelemetry SDK.
352+
353+ Returns:
354+ list: A list of protobuf exemplars.
355+ """
356+ pb_exemplars = []
357+ for sdk_exemplar in sdk_exemplars :
358+ pb_exemplar = pb2 .Exemplar (
359+ time_unix_nano = sdk_exemplar .time_unix_nano ,
360+ span_id = _encode_span_id (sdk_exemplar .span_id ),
361+ trace_id = _encode_trace_id (sdk_exemplar .trace_id ),
362+ filtered_attributes = _encode_attributes (sdk_exemplar .filtered_attributes ),
363+ )
364+ # Assign the value based on its type in the SDK exemplar
365+ if isinstance (sdk_exemplar .value , float ):
366+ pb_exemplar .as_double = sdk_exemplar .value
367+ elif isinstance (sdk_exemplar .value , int ):
368+ pb_exemplar .as_int = sdk_exemplar .value
369+ else :
370+ raise ValueError ("Exemplar value must be an int or float" )
371+ pb_exemplars .append (pb_exemplar )
372+
373+ return pb_exemplars
0 commit comments