1515"""OTLP Span Exporter"""
1616
1717import logging
18+ from collections .abc import Mapping , Sequence
1819from time import sleep
19- from typing import Sequence
20+ from typing import Sequence as TypingSequence
2021
2122from backoff import expo
2223from google .rpc .error_details_pb2 import RetryInfo
3435from opentelemetry .proto .collector .trace .v1 .trace_service_pb2_grpc import (
3536 TraceServiceStub ,
3637)
37- from opentelemetry .proto .common .v1 .common_pb2 import AttributeKeyValue
38+ from opentelemetry .proto .common .v1 .common_pb2 import AnyValue , KeyValue
3839from opentelemetry .proto .resource .v1 .resource_pb2 import Resource
3940from opentelemetry .proto .trace .v1 .trace_pb2 import (
4041 InstrumentationLibrarySpans ,
4950
5051
5152def _translate_key_values (key , value ):
52- key_value = {"key" : key }
5353
5454 if isinstance (value , bool ):
55- key_value [ "bool_value" ] = value
55+ any_value = AnyValue ( bool_value = value )
5656
5757 elif isinstance (value , str ):
58- key_value [ "string_value" ] = value
58+ any_value = AnyValue ( string_value = value )
5959
6060 elif isinstance (value , int ):
61- key_value [ "int_value" ] = value
61+ any_value = AnyValue ( int_value = value )
6262
6363 elif isinstance (value , float ):
64- key_value ["double_value" ] = value
64+ any_value = AnyValue (double_value = value )
65+
66+ elif isinstance (value , Sequence ):
67+ any_value = AnyValue (array_value = value )
68+
69+ elif isinstance (value , Mapping ):
70+ any_value = AnyValue (kvlist_value = value )
6571
6672 else :
6773 raise Exception (
6874 "Invalid type {} of value {}" .format (type (value ), value )
6975 )
7076
71- return key_value
77+ return KeyValue ( key = key , value = any_value )
7278
7379
7480# pylint: disable=no-member
@@ -144,7 +150,7 @@ def _translate_attributes(self, sdk_span):
144150
145151 try :
146152 self ._collector_span_kwargs ["attributes" ].append (
147- AttributeKeyValue ( ** _translate_key_values (key , value ) )
153+ _translate_key_values (key , value )
148154 )
149155 except Exception as error : # pylint: disable=broad-except
150156 logger .exception (error )
@@ -163,9 +169,7 @@ def _translate_events(self, sdk_span):
163169 for key , value in sdk_span_event .attributes .items ():
164170 try :
165171 collector_span_event .attributes .append (
166- AttributeKeyValue (
167- ** _translate_key_values (key , value )
168- )
172+ _translate_key_values (key , value )
169173 )
170174 # pylint: disable=broad-except
171175 except Exception as error :
@@ -191,9 +195,7 @@ def _translate_links(self, sdk_span):
191195 for key , value in sdk_span_link .attributes .items ():
192196 try :
193197 collector_span_link .attributes .append (
194- AttributeKeyValue (
195- ** _translate_key_values (key , value )
196- )
198+ _translate_key_values (key , value )
197199 )
198200 # pylint: disable=broad-except
199201 except Exception as error :
@@ -211,7 +213,7 @@ def _translate_status(self, sdk_span):
211213 )
212214
213215 def _translate_spans (
214- self , sdk_spans : Sequence [SDKSpan ],
216+ self , sdk_spans : TypingSequence [SDKSpan ],
215217 ) -> ExportTraceServiceRequest :
216218
217219 sdk_resource_instrumentation_library_spans = {}
@@ -260,7 +262,7 @@ def _translate_spans(
260262
261263 try :
262264 collector_resource .attributes .append (
263- AttributeKeyValue ( ** _translate_key_values (key , value ) )
265+ _translate_key_values (key , value )
264266 )
265267 except Exception as error : # pylint: disable=broad-except
266268 logger .exception (error )
@@ -276,7 +278,7 @@ def _translate_spans(
276278
277279 return ExportTraceServiceRequest (resource_spans = resource_spans )
278280
279- def export (self , spans : Sequence [SDKSpan ]) -> SpanExportResult :
281+ def export (self , spans : TypingSequence [SDKSpan ]) -> SpanExportResult :
280282 # expo returns a generator that yields delay values which grow
281283 # exponentially. Once delay is greater than max_value, the yielded
282284 # value will remain constant.
0 commit comments