Skip to content

Commit da8effc

Browse files
committed
add OPTL POC
1 parent dde7b7f commit da8effc

File tree

8 files changed

+112
-259
lines changed

8 files changed

+112
-259
lines changed

aws_lambda_powertools/tracing/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def close(self, end_time: Optional[int] = None):
1717
Parameters
1818
----------
1919
end_time: int
20+
# TO-discuss: Providers typically use ns(time_ns -> nanosecond) as start or close time
2021
Time in epoch seconds, by default current time will be used.
2122
"""
2223

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
from .xray_provider import Xray_provider
1+
from .dd_tracer import DDTraceProvider
2+
from .otel_tracer import OtelProvider
23

3-
__all__ = ["Xray_provider"]
4+
__all__ = ["DDTraceProvider", "OtelProvider"]

aws_lambda_powertools/tracing/provider/base.py

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

aws_lambda_powertools/tracing/dd_tracer.py renamed to aws_lambda_powertools/tracing/provider/dd_tracer.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import ddtrace
99

10-
from .base import BaseProvider, BaseSegment
10+
from ..base import BaseProvider, BaseSegment
1111

1212
logger = logging.getLogger(__name__)
1313

@@ -47,8 +47,8 @@ def __exit__(self, exc_type, exc_val, exc_tb):
4747
self.dd_span.set_exc_info(exc_type, exc_val, exc_tb)
4848
print("exited")
4949
self.close()
50-
except Exception:
51-
logger.exception("error closing trace")
50+
except Exception as e:
51+
logger.exception(f"error closing trace {e}")
5252

5353

5454
class DDTraceProvider(BaseProvider):
@@ -77,7 +77,7 @@ def put_annotation(self, key: str, value: str | Number | bool) -> None:
7777
self.dd_tracer.context_provider.active().set_tag(key=key, value=value)
7878

7979
def put_metadata(self, key: str, value: Any, namespace: str = "default") -> None:
80-
self.dd_tracer.context_provider.active().set_tag(key=f"{namespace},{key}", value=value)
80+
self.dd_tracer.context_provider.active().set_tag(key=f"{namespace}.{key}", value=value)
8181

8282
def patch(self, modules: Sequence[str]) -> None:
8383
module_to_patch = {}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from __future__ import annotations
2+
3+
import logging
4+
from contextlib import contextmanager
5+
from numbers import Number
6+
from traceback import StackSummary
7+
from typing import Any, Generator, List, Sequence
8+
9+
from opentelemetry import trace as otel_trace
10+
11+
from ..base import BaseProvider, BaseSegment
12+
13+
logger = logging.getLogger(__name__)
14+
15+
16+
class OtelSpan(BaseSegment):
17+
def __init__(self, otel_span=otel_trace.Span):
18+
self.otel_span = otel_span
19+
20+
def close(self, end_time: int | None = None):
21+
print("close is called")
22+
self.otel_span.end(end_time=end_time)
23+
24+
def add_subsegment(self, subsegment: Any):
25+
raise NotImplementedError
26+
27+
def remove_subsegment(self, subsegment: Any):
28+
raise NotImplementedError
29+
30+
def put_annotation(self, key: str, value: str | Number | bool) -> None:
31+
self.otel_span.set_attribute(key=key, value=value)
32+
33+
def put_metadata(self, key: str, value: Any, namespace: str = "default") -> None:
34+
self.otel_span.set_attribute(key=f"{namespace}.{key}", value=str(value))
35+
36+
def add_exception(self, exception: BaseException, stack: List[StackSummary], remote: bool = False):
37+
self.otel_span.record_exception(exception=exception, attributes={"traceback": stack, "remote": remote})
38+
39+
def __enter__(self):
40+
return self
41+
42+
def __exit__(self, exc_type, exc_val, exc_tb):
43+
try:
44+
self.otel_span.__exit__(exc_type, exc_val, exc_tb)
45+
except Exception as e:
46+
logger.exception(f"error closing trace {e}")
47+
48+
49+
class OtelProvider(BaseProvider):
50+
def __init__(self, otel_tracer: otel_trace.Tracer):
51+
self.otel_tracer = otel_tracer
52+
53+
@contextmanager
54+
def in_subsegment(self, name: str, **kwargs) -> Generator[BaseSegment, None, None]:
55+
with self.otel_tracer.start_as_current_span(name=name, **kwargs) as otel_span:
56+
yield OtelSpan(otel_span=otel_span)
57+
58+
start_as_current_span = in_subsegment
59+
in_subsegment_async = in_subsegment
60+
61+
def put_annotation(self, key: str, value: str | Number | bool) -> None:
62+
active_span = otel_trace.get_current_span()
63+
active_span.set_attribute(key=key, value=value)
64+
65+
def put_metadata(self, key: str, value: Any, namespace: str = "default") -> None:
66+
active_span = otel_trace.get_current_span()
67+
active_span.set_attribute(key=f"{namespace}.{key}", value=value)
68+
69+
def patch(self, modules: Sequence[str]) -> None:
70+
# OTEL sdk doesn't have patch
71+
pass
72+
73+
def patch_all(self) -> None:
74+
pass

aws_lambda_powertools/tracing/provider/xray_provider.py

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

0 commit comments

Comments
 (0)