Skip to content

Commit fe9c763

Browse files
committed
add set_attribute in tracer
1 parent 5bc0158 commit fe9c763

File tree

4 files changed

+49
-20
lines changed

4 files changed

+49
-20
lines changed

aws_lambda_powertools/tracing/provider/otel/otel_tracer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,5 @@ def patch(self, modules: Sequence[str]) -> None:
8080
pass
8181

8282
def patch_all(self) -> None:
83+
# OTEL sdk doesn't have patch
8384
pass

aws_lambda_powertools/tracing/provider/xray/xray_tracer.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from contextlib import asynccontextmanager, contextmanager
44
from numbers import Number
5-
from typing import AsyncGenerator, Generator, Sequence
5+
from typing import Any, AsyncGenerator, Generator, Sequence
66

77
from ....shared import constants
88
from ....shared.lazy_import import LazyLoader
@@ -37,12 +37,8 @@ def __init__(self, xray_recorder=None):
3737
if not xray_recorder:
3838
from aws_xray_sdk.core import xray_recorder
3939
self.recorder = xray_recorder
40-
self.patch = aws_xray_sdk.core.patch
41-
self.patch_all = aws_xray_sdk.core.patch_all
4240
self.in_subsegment = self.recorder.in_subsegment
4341
self.in_subsegment_async = self.recorder.in_subsegment_async
44-
self.put_annotation = self.recorder.put_annotation
45-
self.put_metadata = self.recorder.put_metadata
4642

4743
@contextmanager
4844
def trace(self, name: str, **kwargs) -> Generator[XraySpan, None, None]:
@@ -60,9 +56,14 @@ def set_attribute(self, key: str, value: str | Number | bool, **kwargs) -> None:
6056
else:
6157
self.put_annotation(key=key, value=value)
6258

59+
def put_annotation(self, key: str, value: str | Number | bool) -> None:
60+
return self.recorder.put_annotation(key=key, value=value)
61+
62+
def put_metadata(self, key: str, value: Any, namespace: str = "default") -> None:
63+
return self.recorder.put_metadata(key=key, value=value, namespace=namespace)
64+
6365
def patch(self, modules: Sequence[str]) -> None:
64-
# defined in init
65-
pass
66+
return aws_xray_sdk.core.patch(modules)
6667

6768
def patch_all(self) -> None:
68-
pass
69+
return aws_xray_sdk.core.patch_all()

aws_lambda_powertools/tracing/tracer.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
from aws_lambda_powertools.shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
1212
from aws_lambda_powertools.shared.lazy_import import LazyLoader
1313
from aws_lambda_powertools.shared.types import AnyCallableT
14-
from aws_lambda_powertools.tracing.base import BaseProvider, BaseSegment
1514
from aws_lambda_powertools.tracing.provider import XrayProvider
15+
from aws_lambda_powertools.tracing.provider.base import BaseProvider, BaseSpan
1616

1717
is_cold_start = True
1818
logger = logging.getLogger(__name__)
@@ -172,9 +172,17 @@ def __init__(
172172
self.patch(modules=patch_modules)
173173

174174
if self._is_xray_provider():
175-
# TO why?
176175
self._disable_xray_trace_batching()
177176

177+
def set_attribute(self, key: str, value: Union[str, numbers.Number, bool]):
178+
if self.disabled:
179+
logger.debug("Tracing has been disabled, aborting put_annotation")
180+
return
181+
182+
logger.debug(f"setting attribute on key '{key}' with '{value}'")
183+
184+
self.provider.set_attribute(key=key, value=value)
185+
178186
def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]):
179187
"""Adds annotation to existing segment or subsegment
180188
@@ -197,7 +205,11 @@ def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]):
197205
return
198206

199207
logger.debug(f"Annotating on key '{key}' with '{value}'")
200-
self.provider.put_annotation(key=key, value=value)
208+
209+
if not self._is_custom_provider():
210+
self.provider.put_annotation(key=key, value=value) # type: ignore
211+
else:
212+
self.provider.set_attribute(key=key, value=value)
201213

202214
def put_metadata(self, key: str, value: Any, namespace: Optional[str] = None):
203215
"""Adds metadata to existing segment or subsegment
@@ -225,7 +237,10 @@ def put_metadata(self, key: str, value: Any, namespace: Optional[str] = None):
225237

226238
namespace = namespace or self.service
227239
logger.debug(f"Adding metadata on key '{key}' with '{value}' at namespace '{namespace}'")
228-
self.provider.put_metadata(key=key, value=value, namespace=namespace)
240+
if not self._is_custom_provider():
241+
self.provider.put_metadata(key=key, value=value, namespace=namespace) # type: ignore
242+
else:
243+
self.provider.set_attribute(key=f"{namespace}.{key}", value=value)
229244

230245
def patch(self, modules: Optional[Sequence[str]] = None):
231246
"""Patch modules for instrumentation.
@@ -700,7 +715,7 @@ def _add_response_as_metadata(
700715
self,
701716
method_name: Optional[str] = None,
702717
data: Optional[Any] = None,
703-
subsegment: Optional[BaseSegment] = None,
718+
subsegment: Optional[BaseSpan] = None,
704719
capture_response: Optional[Union[bool, str]] = None,
705720
):
706721
"""Add response as metadata for given subsegment
@@ -718,14 +733,16 @@ def _add_response_as_metadata(
718733
"""
719734
if data is None or not capture_response or subsegment is None:
720735
return
721-
722-
subsegment.put_metadata(key=f"{method_name} response", value=data, namespace=self.service)
736+
if not self._is_custom_provider():
737+
subsegment.put_metadata(key=f"{method_name} response", value=data, namespace=self.service) # type: ignore
738+
else:
739+
subsegment.set_attribute(key=f"{method_name} response", value=data, namespace=self.service)
723740

724741
def _add_full_exception_as_metadata(
725742
self,
726743
method_name: str,
727744
error: Exception,
728-
subsegment: BaseSegment,
745+
subsegment: BaseSpan,
729746
capture_error: Optional[bool] = None,
730747
):
731748
"""Add full exception object as metadata for given subsegment
@@ -744,7 +761,14 @@ def _add_full_exception_as_metadata(
744761
if not capture_error:
745762
return
746763

747-
subsegment.put_metadata(key=f"{method_name} error", value=error, namespace=self.service)
764+
if not self._is_custom_provider():
765+
subsegment.put_metadata(key=f"{method_name} error", value=error, namespace=self.service) # type: ignore
766+
else:
767+
subsegment.set_attribute(
768+
key=f"{self.service}.{method_name} error",
769+
value=str(error),
770+
namespace=self.service,
771+
)
748772

749773
@staticmethod
750774
def _disable_tracer_provider():
@@ -827,6 +851,9 @@ def _disable_xray_trace_batching(self):
827851
def _is_xray_provider(self):
828852
return isinstance(self.provider, XrayProvider)
829853

854+
def _is_custom_provider(self):
855+
return not self._is_xray_provider and isinstance(self.provider, BaseProvider)
856+
830857
def ignore_endpoint(self, hostname: Optional[str] = None, urls: Optional[List[str]] = None):
831858
"""If you want to ignore certain httplib requests you can do so based on the hostname or URL that is being
832859
requested.

examples/tracer/src/sdk_escape_hatch.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ def collect_payment(charge_id: str) -> str:
1111
@tracer.capture_lambda_handler
1212
def lambda_handler(event: dict, context: LambdaContext) -> str:
1313
charge_id = event.get("charge_id", "")
14-
with tracer.provider.in_subsegment("## collect_payment") as subsegment:
15-
subsegment.put_annotation(key="PaymentId", value=charge_id)
14+
with tracer.provider.trace("## collect_payment") as span:
15+
span.set_attribute(key="PaymentId", value=charge_id)
1616
ret = collect_payment(charge_id=charge_id)
17-
subsegment.put_metadata(key="payment_response", value=ret)
17+
span.set_attribute(key="payment_response", value=ret)
1818

1919
return ret

0 commit comments

Comments
 (0)