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 ,
@@ -254,6 +256,7 @@ def _encode_metric(metric, pb2_metric):
254256 pt = pb2 .NumberDataPoint (
255257 attributes = _encode_attributes (data_point .attributes ),
256258 time_unix_nano = data_point .time_unix_nano ,
259+ exemplars = _encode_exemplars (data_point .exemplars ),
257260 )
258261 if isinstance (data_point .value , int ):
259262 pt .as_int = data_point .value
@@ -267,6 +270,7 @@ def _encode_metric(metric, pb2_metric):
267270 attributes = _encode_attributes (data_point .attributes ),
268271 time_unix_nano = data_point .time_unix_nano ,
269272 start_time_unix_nano = data_point .start_time_unix_nano ,
273+ exemplars = _encode_exemplars (data_point .exemplars ),
270274 count = data_point .count ,
271275 sum = data_point .sum ,
272276 bucket_counts = data_point .bucket_counts ,
@@ -285,6 +289,7 @@ def _encode_metric(metric, pb2_metric):
285289 attributes = _encode_attributes (data_point .attributes ),
286290 start_time_unix_nano = data_point .start_time_unix_nano ,
287291 time_unix_nano = data_point .time_unix_nano ,
292+ exemplars = _encode_exemplars (data_point .exemplars ),
288293 )
289294 if isinstance (data_point .value , int ):
290295 pt .as_int = data_point .value
@@ -322,6 +327,7 @@ def _encode_metric(metric, pb2_metric):
322327 attributes = _encode_attributes (data_point .attributes ),
323328 time_unix_nano = data_point .time_unix_nano ,
324329 start_time_unix_nano = data_point .start_time_unix_nano ,
330+ exemplars = _encode_exemplars (data_point .exemplars ),
325331 count = data_point .count ,
326332 sum = data_point .sum ,
327333 scale = data_point .scale ,
@@ -342,3 +348,35 @@ def _encode_metric(metric, pb2_metric):
342348 "unsupported data type %s" ,
343349 metric .data .__class__ .__name__ ,
344350 )
351+
352+
353+ def _encode_exemplars (sdk_exemplars : list ) -> list :
354+ """
355+ Converts a list of SDK Exemplars into a list of protobuf Exemplars.
356+
357+ Args:
358+ sdk_exemplars (list): The list of exemplars from the OpenTelemetry SDK.
359+
360+ Returns:
361+ list: A list of protobuf exemplars.
362+ """
363+ pb_exemplars = []
364+ for sdk_exemplar in sdk_exemplars :
365+ pb_exemplar = pb2 .Exemplar (
366+ time_unix_nano = sdk_exemplar .time_unix_nano ,
367+ span_id = _encode_span_id (sdk_exemplar .span_id ),
368+ trace_id = _encode_trace_id (sdk_exemplar .trace_id ),
369+ filtered_attributes = _encode_attributes (
370+ sdk_exemplar .filtered_attributes
371+ ),
372+ )
373+ # Assign the value based on its type in the SDK exemplar
374+ if isinstance (sdk_exemplar .value , float ):
375+ pb_exemplar .as_double = sdk_exemplar .value
376+ elif isinstance (sdk_exemplar .value , int ):
377+ pb_exemplar .as_int = sdk_exemplar .value
378+ else :
379+ raise ValueError ("Exemplar value must be an int or float" )
380+ pb_exemplars .append (pb_exemplar )
381+
382+ return pb_exemplars
0 commit comments