Skip to content

Commit b1a2b34

Browse files
committed
fix docstring, add conversion in otel
1 parent 1b28653 commit b1a2b34

File tree

4 files changed

+50
-52
lines changed

4 files changed

+50
-52
lines changed

aws_lambda_powertools/tracing/provider/base.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,19 @@
44
from typing import AsyncGenerator, Generator, Sequence, Union
55

66

7-
## TO-Discuss how to refactor this one. Segment seems X-ray exclusive concept
87
class BaseSpan(abc.ABC):
9-
"""Holds common properties and methods on segment and subsegment."""
8+
"""Holds common properties and methods on span."""
109

1110
@abc.abstractmethod
1211
def set_attribute(self, key: str, value: Union[str, numbers.Number, bool], **kwargs) -> None:
13-
"""Annotate segment or subsegment with a key-value pair.
14-
15-
Note: Annotations will be indexed for later search query.
12+
"""set attribute for span with a key-value pair.
1613
1714
Parameters
1815
----------
1916
key: str
20-
Metadata key
17+
Attribute key
2118
value: Union[str, numbers.Number, bool]
22-
Annotation value
19+
Attribute value
2320
"""
2421

2522
@abc.abstractmethod
@@ -63,16 +60,14 @@ def trace_async(self, name: str, **kwargs) -> AsyncGenerator[BaseSpan, None]:
6360

6461
@abc.abstractmethod
6562
def set_attribute(self, key: str, value: Union[str, numbers.Number, bool], **kwargs) -> None:
66-
"""Annotate current active trace entity with a key-value pair.
67-
68-
Note: Annotations will be indexed for later search query.
63+
"""set attribute on current active trace entity with a key-value pair.
6964
7065
Parameters
7166
----------
7267
key: str
73-
Metadata key
68+
attribute key
7469
value: Union[str, numbers.Number, bool]
75-
Annotation value
70+
attribute value
7671
"""
7772

7873
@abc.abstractmethod

aws_lambda_powertools/tracing/provider/datadog/dd_tracer.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,6 @@ def record_exception(self, exception: BaseException, attributes: Optional[Dict]
2727
_attributes = kwargs
2828
self.dd_span.set_tags(tags=attributes)
2929

30-
def __enter__(self):
31-
print("entered")
32-
return self
33-
34-
def __exit__(self, exc_type, exc_val, exc_tb):
35-
try:
36-
if exc_type:
37-
self.dd_span.set_exc_info(exc_type, exc_val, exc_tb)
38-
self.dd_span.finish()
39-
except Exception as e:
40-
logger.exception(f"error closing trace {e}")
41-
4230

4331
class DDTraceProvider(BaseProvider):
4432
def __init__(self, dd_tracer: ddtrace.Tracer):
@@ -72,19 +60,19 @@ async def trace_async(
7260
span_type: Optional[str] = None,
7361
**kwargs,
7462
) -> AsyncGenerator[DDSpan, None]:
75-
dd_span = self.dd_tracer.trace(
63+
with self.dd_tracer.trace(
7664
name=name,
7765
service=service,
7866
resource=resource,
7967
span_type=span_type,
80-
)
81-
yield DDSpan(dd_span=dd_span)
68+
) as dd_span:
69+
yield DDSpan(dd_span=dd_span)
8270

8371
def set_attribute(self, key: str | bytes, value: Any, **kwargs: Any) -> None:
8472
span = self.dd_tracer.context_provider.active()
73+
# ignore if no active span
8574
if isinstance(span, ddtrace.Span):
8675
span.set_tag(key=key, value=value)
87-
# ignore if no active span
8876

8977
def patch(self, modules: Sequence[str]) -> None:
9078
module_to_patch = {}

aws_lambda_powertools/tracing/provider/otel/otel_tracer.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@
1111
logger = logging.getLogger(__name__)
1212

1313

14-
# optl terminology first
15-
# 1. Provider based on OTel terminology
16-
# 2. X-Ray provider on top of the new BaseProvider
17-
# 3. Datadog provider on top of the new BaseProvider
18-
# access xray sdk
1914
class OtelSpan(BaseSpan):
2015
def __init__(self, otel_span=otel_trace.Span):
2116
self.otel_span = otel_span
2217

2318
def set_attribute(self, key: str, value: str | float | bool, **kwargs) -> None: # type: ignore[override]
19+
if not isinstance(value, (str, bool, int, float)):
20+
# convert value to str if value is not a supported structur
21+
value = str(value)
2422
self.otel_span.set_attribute(key=key, value=value)
2523

2624
def record_exception(

aws_lambda_powertools/tracing/tracer.py

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,24 @@ def __init__(
175175
self._disable_xray_trace_batching()
176176

177177
def set_attribute(self, key: str, value: Union[str, numbers.Number, bool]):
178+
"""Set attribute on current active trace entity with a key-value pair.
179+
180+
Parameters
181+
----------
182+
key : str
183+
attribute key
184+
value : Union[str, numbers.Number, bool]
185+
Value for attribute
186+
187+
Example
188+
-------
189+
Set attribute for a pseudo service named payment
190+
191+
tracer = Tracer(service="payment")
192+
tracer.set_attribute("PaymentStatus", "CONFIRMED")
193+
"""
178194
if self.disabled:
179-
logger.debug("Tracing has been disabled, aborting put_annotation")
195+
logger.debug("Tracing has been disabled, aborting set_attribute")
180196
return
181197

182198
logger.debug(f"setting attribute on key '{key}' with '{value}'")
@@ -206,10 +222,10 @@ def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]):
206222

207223
logger.debug(f"Annotating on key '{key}' with '{value}'")
208224

209-
if not self._is_custom_provider():
210-
self.provider.put_annotation(key=key, value=value) # type: ignore
211-
else:
225+
if self._is_custom_provider():
212226
self.provider.set_attribute(key=key, value=value)
227+
else:
228+
self.provider.put_annotation(key=key, value=value) # type: ignore
213229

214230
def put_metadata(self, key: str, value: Any, namespace: Optional[str] = None):
215231
"""Adds metadata to existing segment or subsegment
@@ -237,10 +253,10 @@ def put_metadata(self, key: str, value: Any, namespace: Optional[str] = None):
237253

238254
namespace = namespace or self.service
239255
logger.debug(f"Adding metadata on key '{key}' with '{value}' at namespace '{namespace}'")
240-
if not self._is_custom_provider():
241-
self.provider.put_metadata(key=key, value=value, namespace=namespace) # type: ignore
242-
else:
256+
if self._is_custom_provider():
243257
self.provider.set_attribute(key=f"{namespace}.{key}", value=value)
258+
else:
259+
self.provider.put_metadata(key=key, value=value, namespace=namespace) # type: ignore
244260

245261
def patch(self, modules: Optional[Sequence[str]] = None):
246262
"""Patch modules for instrumentation.
@@ -348,19 +364,19 @@ def decorate(event, context, **kwargs):
348364
finally:
349365
global is_cold_start
350366
logger.debug("Annotating cold start")
351-
if not self._is_custom_provider():
352-
subsegment.put_annotation(key="ColdStart", value=is_cold_start)
353-
else:
367+
if self._is_custom_provider():
354368
subsegment.set_attribute(key="ColdStart", value=is_cold_start)
369+
else:
370+
subsegment.put_annotation(key="ColdStart", value=is_cold_start)
355371

356372
if is_cold_start:
357373
is_cold_start = False
358374

359375
if self.service:
360-
if not self._is_custom_provider():
361-
subsegment.put_annotation(key="Service", value=self.service)
362-
else:
376+
if self._is_custom_provider():
363377
subsegment.set_attribute(key="Service", value=self.service)
378+
else:
379+
subsegment.put_annotation(key="Service", value=self.service)
364380

365381
return response
366382

@@ -739,10 +755,10 @@ def _add_response_as_metadata(
739755
"""
740756
if data is None or not capture_response or subsegment is None:
741757
return
742-
if not self._is_custom_provider():
743-
subsegment.put_metadata(key=f"{method_name} response", value=data, namespace=self.service) # type: ignore
744-
else:
758+
if self._is_custom_provider():
745759
subsegment.set_attribute(key=f"{method_name} response", value=data, namespace=self.service)
760+
else:
761+
subsegment.put_metadata(key=f"{method_name} response", value=data, namespace=self.service) # type: ignore
746762

747763
def _add_full_exception_as_metadata(
748764
self,
@@ -767,14 +783,14 @@ def _add_full_exception_as_metadata(
767783
if not capture_error:
768784
return
769785

770-
if not self._is_custom_provider():
771-
subsegment.put_metadata(key=f"{method_name} error", value=error, namespace=self.service) # type: ignore
772-
else:
786+
if self._is_custom_provider():
773787
subsegment.set_attribute(
774788
key=f"{self.service}.{method_name} error",
775789
value=str(error),
776790
namespace=self.service,
777791
)
792+
else:
793+
subsegment.put_metadata(key=f"{method_name} error", value=error, namespace=self.service) # type: ignore
778794

779795
@staticmethod
780796
def _disable_tracer_provider():
@@ -858,6 +874,7 @@ def _is_xray_provider(self):
858874
return isinstance(self.provider, XrayProvider)
859875

860876
def _is_custom_provider(self):
877+
# check if provider is not default xray_provider. Avoid test conflits
861878
return not self._is_xray_provider() and isinstance(self.provider, BaseProvider)
862879

863880
def ignore_endpoint(self, hostname: Optional[str] = None, urls: Optional[List[str]] = None):

0 commit comments

Comments
 (0)