Skip to content

Commit 78051f6

Browse files
committed
fix mypy, move into folder
1 parent 2c3f42e commit 78051f6

File tree

10 files changed

+213
-191
lines changed

10 files changed

+213
-191
lines changed
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from .dd_tracer import DDTraceProvider
2-
from .otel_tracer import OtelProvider
1+
from .datadog.dd_tracer import DDTraceProvider
2+
from .otel.otel_tracer import OtelProvider
3+
from .xray.xray_tracer import XrayProvider
34

4-
__all__ = ["DDTraceProvider", "OtelProvider"]
5+
__all__ = ["DDTraceProvider", "OtelProvider", "XrayProvider"]

aws_lambda_powertools/tracing/provider/base.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import abc
22
import numbers
3-
from contextlib import contextmanager
4-
from typing import Generator, Sequence, Union
3+
from contextlib import asynccontextmanager, contextmanager
4+
from typing import AsyncGenerator, Generator, Sequence, Union
55

66

77
## TO-Discuss how to refactor this one. Segment seems X-ray exclusive concept
88
class BaseSpan(abc.ABC):
99
"""Holds common properties and methods on segment and subsegment."""
1010

11-
"""Triggering"""
12-
1311
@abc.abstractmethod
1412
def set_attribute(self, key: str, value: Union[str, numbers.Number, bool], **kwargs) -> None:
1513
"""Annotate segment or subsegment with a key-value pair.
@@ -39,7 +37,7 @@ def record_exception(self, exception: BaseException, **kwargs):
3937
class BaseProvider(abc.ABC):
4038
@abc.abstractmethod
4139
@contextmanager
42-
def trace(self, name=None, **kwargs) -> Generator[BaseSpan, None, None]:
40+
def trace(self, name: str, **kwargs) -> Generator[BaseSpan, None, None]:
4341
"""Return a span context manger.
4442
4543
Parameters
@@ -51,8 +49,8 @@ def trace(self, name=None, **kwargs) -> Generator[BaseSpan, None, None]:
5149
"""
5250

5351
@abc.abstractmethod
54-
@contextmanager
55-
def trace_async(self, name=None, **kwargs) -> Generator[BaseSpan, None, None]:
52+
@asynccontextmanager
53+
def trace_async(self, name: str, **kwargs) -> AsyncGenerator[BaseSpan, None]:
5654
"""Return a async span context manger.
5755
5856
Parameters
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
from __future__ import annotations
2+
3+
import logging
4+
from contextlib import asynccontextmanager, contextmanager
5+
from typing import Any, AsyncGenerator, Dict, Generator, Optional, Sequence
6+
7+
import ddtrace
8+
9+
from ..base import BaseProvider, BaseSpan
10+
11+
logger = logging.getLogger(__name__)
12+
13+
14+
class DDSpan(BaseSpan):
15+
def __init__(self, dd_span=ddtrace.Span):
16+
self.dd_span = dd_span
17+
18+
def set_attribute(self, key: str | bytes, value: Any, **kwargs) -> None:
19+
self.dd_span.set_tag(key=key, value=value)
20+
21+
def record_exception(self, exception: BaseException, attributes: Optional[Dict] = None, **kwargs):
22+
self.dd_span.set_traceback()
23+
_attributes = attributes or {}
24+
if kwargs:
25+
kwargs.update(_attributes)
26+
# attribute should overwrite kwargs
27+
_attributes = kwargs
28+
self.dd_span.set_tags(tags=attributes)
29+
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+
42+
43+
class DDTraceProvider(BaseProvider):
44+
def __init__(self, dd_tracer: ddtrace.Tracer):
45+
self.dd_tracer = dd_tracer
46+
47+
@contextmanager
48+
def trace(
49+
self,
50+
name: str,
51+
service: Optional[str] = None,
52+
resource: Optional[str] = None,
53+
span_type: Optional[str] = None,
54+
**kwargs,
55+
) -> Generator[DDSpan, None, None]:
56+
dd_span = self.dd_tracer.trace(
57+
name=name,
58+
service=service,
59+
resource=resource,
60+
span_type=span_type,
61+
)
62+
yield DDSpan(dd_span=dd_span)
63+
64+
in_subsegment = trace
65+
66+
@asynccontextmanager
67+
async def trace_async(
68+
self,
69+
name: str,
70+
service: Optional[str] = None,
71+
resource: Optional[str] = None,
72+
span_type: Optional[str] = None,
73+
**kwargs,
74+
) -> AsyncGenerator[DDSpan, None]:
75+
dd_span = self.dd_tracer.trace(
76+
name=name,
77+
service=service,
78+
resource=resource,
79+
span_type=span_type,
80+
)
81+
yield DDSpan(dd_span=dd_span)
82+
83+
def set_attribute(self, key: str | bytes, value: Any, **kwargs: Any) -> None:
84+
span = self.dd_tracer.context_provider.active()
85+
if isinstance(span, ddtrace.Span):
86+
span.set_tag(key=key, value=value)
87+
# ignore if no active span
88+
89+
def patch(self, modules: Sequence[str]) -> None:
90+
module_to_patch = {}
91+
for m in modules:
92+
module_to_patch[m] = True
93+
ddtrace.patch(**module_to_patch) # type:ignore
94+
95+
def patch_all(self) -> None:
96+
ddtrace.patch_all()

aws_lambda_powertools/tracing/provider/dd_tracer.py

Lines changed: 0 additions & 89 deletions
This file was deleted.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from __future__ import annotations
2+
3+
import logging
4+
from contextlib import asynccontextmanager, contextmanager
5+
from typing import AsyncGenerator, Dict, Generator, Optional, Sequence
6+
7+
from opentelemetry import trace as otel_trace
8+
9+
from ..base import BaseProvider, BaseSpan
10+
11+
logger = logging.getLogger(__name__)
12+
13+
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
19+
class OtelSpan(BaseSpan):
20+
def __init__(self, otel_span=otel_trace.Span):
21+
self.otel_span = otel_span
22+
23+
def set_attribute(self, key: str, value: str | float | bool, **kwargs) -> None: # type: ignore[override]
24+
self.otel_span.set_attribute(key=key, value=value)
25+
26+
def record_exception(
27+
self,
28+
exception: BaseException,
29+
attributes: Optional[Dict] = None,
30+
timestamp: Optional[int] = None,
31+
escaped: bool = False,
32+
**kwargs,
33+
):
34+
_attributes = attributes or {}
35+
if kwargs:
36+
kwargs.update(_attributes)
37+
# attribute should overwrite kwargs
38+
_attributes = kwargs
39+
self.otel_span.record_exception(
40+
exception=exception,
41+
attributes=_attributes,
42+
timestamp=timestamp,
43+
escaped=escaped,
44+
)
45+
46+
def __enter__(self):
47+
return self
48+
49+
def __exit__(self, exc_type, exc_val, exc_tb):
50+
try:
51+
self.otel_span.__exit__(exc_type, exc_val, exc_tb)
52+
except Exception as e:
53+
logger.exception(f"error closing trace {e}")
54+
55+
56+
class OtelProvider(BaseProvider):
57+
def __init__(self, otel_tracer: otel_trace.Tracer):
58+
self.otel_tracer = otel_tracer
59+
60+
@contextmanager
61+
def trace(self, name: str, **kwargs) -> Generator[OtelSpan, None, None]:
62+
with self.otel_tracer.start_as_current_span(name=name, **kwargs) as otel_span:
63+
yield OtelSpan(otel_span=otel_span)
64+
65+
in_subsegment = trace
66+
67+
@asynccontextmanager
68+
async def trace_async(self, name: str, **kwargs) -> AsyncGenerator[OtelSpan, None]:
69+
with self.otel_tracer.start_as_current_span(name=name, **kwargs) as otel_span:
70+
yield OtelSpan(otel_span=otel_span)
71+
72+
in_subsegment_async = trace_async
73+
74+
def set_attribute(self, key: str, value: str | float | bool, **kwargs) -> None: # type: ignore[override]
75+
active_span = otel_trace.get_current_span()
76+
active_span.set_attribute(key=key, value=value)
77+
78+
def patch(self, modules: Sequence[str]) -> None:
79+
# OTEL sdk doesn't have patch
80+
pass
81+
82+
def patch_all(self) -> None:
83+
pass

aws_lambda_powertools/tracing/provider/otel_tracer.py

Lines changed: 0 additions & 79 deletions
This file was deleted.

0 commit comments

Comments
 (0)