Skip to content

Commit

Permalink
Make translate_span a little faster (#132)
Browse files Browse the repository at this point in the history
* Make translate_span a little faster

Using py-spy, it looks like the previous version spent some time doing

list(default_resource.attributes.keys()) every time it was called.

It seems this can be done once in the OTELWriter constructor instead.
Also, I think we can make it a set instead of a list (I believe `a in
my_set` is a bit quicker than `a in my_list`).

Does this commit include tests to verify the speed increase? Nah... 🤷

* isort
  • Loading branch information
torarvid authored Jun 2, 2023
1 parent 37f98c1 commit 206f25d
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
17 changes: 11 additions & 6 deletions troncos/tracing/_span.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@
from opentelemetry.trace import SpanContext, SpanKind, Status, StatusCode
from opentelemetry.trace.span import TraceFlags

_dd_span_ignore_attr = [
_dd_span_ignore_attr = {
"runtime-id",
"_sampling_priority_v1",
"env",
"version",
"span.kind",
]
}


def _span_context(span: DDSpan) -> SpanContext:
Expand Down Expand Up @@ -58,7 +58,7 @@ def _span_kind(dd_span: DDSpan) -> SpanKind:


def _span_status_and_attributes(
dd_span: DDSpan, ignore_attrs: list[str]
dd_span: DDSpan, ignore_attrs: set[str]
) -> tuple[Status, list[Event], dict[str, Any]]:
dd_span_err_attr_mapping = {
"error.msg": "exception.message",
Expand Down Expand Up @@ -124,13 +124,18 @@ def _span_resource(dd_span: DDSpan, default_resource: Resource) -> Resource:
return Resource(base_attributes)


def translate_span(dd_span: DDSpan, default_resource: Resource) -> ReadableSpan:
def default_ignore_attrs() -> set[str]:
return _dd_span_ignore_attr


def translate_span(
dd_span: DDSpan, default_resource: Resource, ignore_attrs: set[str]
) -> ReadableSpan:
"""Transelate a ddtrace span to an OTEL span."""
assert dd_span.duration_ns, "Span not finished."

status, events, attributes = _span_status_and_attributes(
dd_span,
ignore_attrs=_dd_span_ignore_attr + list(default_resource.attributes.keys()),
dd_span, ignore_attrs=ignore_attrs
)

otel_span = ReadableSpan(
Expand Down
11 changes: 9 additions & 2 deletions troncos/tracing/_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from ._enums import Exporter
from ._otel import get_otel_span_processors
from ._span import translate_span
from ._span import default_ignore_attrs, translate_span


class OTELWriter(TraceWriter):
Expand All @@ -28,6 +28,9 @@ def __init__(
self.otel_default_resource = Resource.create(
{"service.name": service_name, **(service_attributes or {})}
)
self.otel_ignore_attrs = (
set(self.otel_default_resource.attributes.keys()) | default_ignore_attrs()
)

def recreate(self) -> "OTELWriter":
return self.__class__(
Expand All @@ -39,7 +42,11 @@ def recreate(self) -> "OTELWriter":

def write(self, spans: list[Span] | None = None) -> None:
transelated_spans = [
translate_span(span, default_resource=self.otel_default_resource)
translate_span(
span,
default_resource=self.otel_default_resource,
ignore_attrs=self.otel_ignore_attrs,
)
for span in spans or []
]

Expand Down

0 comments on commit 206f25d

Please sign in to comment.