Skip to content

Commit ceff470

Browse files
committed
add nerelic background rasks contextmanager
1 parent 6826464 commit ceff470

4 files changed

Lines changed: 70 additions & 2 deletions

File tree

agave/core/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
accept_trace_from_queue,
44
accept_trace_headers,
55
add_custom_attribute,
6+
background_task,
67
get_trace_headers,
78
inject_trace_headers,
89
trace_attributes,
@@ -13,6 +14,7 @@
1314
'accept_trace_from_queue',
1415
'accept_trace_headers',
1516
'add_custom_attribute',
17+
'background_task',
1618
'get_trace_headers',
1719
'inject_trace_headers',
1820
'trace_attributes',

agave/core/tracing.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,32 @@
11
from __future__ import annotations
22

33
import inspect
4+
from contextlib import contextmanager
45
from functools import wraps
5-
from typing import Any, Callable
6+
from typing import Any, Callable, Optional
67

78
import newrelic.agent
89

910
# trace headers key
1011
TRACE_HEADERS_KEY = "_nr_trace_headers"
1112

1213

14+
@contextmanager
15+
def background_task(
16+
name: str,
17+
group: str = "Task",
18+
trace_headers: Optional[dict] = None,
19+
):
20+
with newrelic.agent.BackgroundTask(
21+
application=newrelic.agent.application(),
22+
name=name,
23+
group=group,
24+
):
25+
if trace_headers:
26+
accept_trace_headers(trace_headers, transport_type="Queue")
27+
yield
28+
29+
1330
def get_trace_headers() -> dict:
1431
headers_list: list = []
1532
newrelic.agent.insert_distributed_trace_headers(headers_list)

agave/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.5.3.dev00"
1+
__version__ = "1.5.3.dev01"

tests/core/test_tracing.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
accept_trace_from_queue,
1010
accept_trace_headers,
1111
add_custom_attribute,
12+
background_task,
1213
get_trace_headers,
1314
inject_trace_headers,
1415
trace_attributes,
@@ -416,3 +417,51 @@ def test_add_attributes_with_non_callable_non_string_extractor():
416417
with patch("agave.core.tracing.add_custom_attribute") as mock_add:
417418
_add_attributes(kwargs, extractors)
418419
mock_add.assert_called_once_with("result", None)
420+
421+
422+
def test_background_task_creates_transaction():
423+
"""Test that background_task creates a New Relic BackgroundTask."""
424+
with patch("agave.core.tracing.newrelic.agent") as mock_agent:
425+
mock_agent.application.return_value = "test_app"
426+
mock_agent.BackgroundTask.return_value.__enter__ = lambda s: None
427+
mock_agent.BackgroundTask.return_value.__exit__ = lambda s, *a: None
428+
429+
with background_task("my_task", "Redis/Queue"):
430+
pass
431+
432+
mock_agent.BackgroundTask.assert_called_once_with(
433+
application="test_app",
434+
name="my_task",
435+
group="Redis/Queue",
436+
)
437+
438+
439+
def test_background_task_accepts_trace_headers():
440+
"""Test that background_task accepts trace headers inside transaction."""
441+
with patch("agave.core.tracing.newrelic.agent") as mock_agent:
442+
mock_agent.application.return_value = "test_app"
443+
mock_agent.BackgroundTask.return_value.__enter__ = lambda s: None
444+
mock_agent.BackgroundTask.return_value.__exit__ = lambda s, *a: None
445+
446+
with patch("agave.core.tracing.accept_trace_headers") as mock_accept:
447+
headers = {"traceparent": "abc"}
448+
with background_task("my_task", "SQS/Queue", headers):
449+
pass
450+
451+
mock_accept.assert_called_once_with(
452+
headers, transport_type="Queue"
453+
)
454+
455+
456+
def test_background_task_does_not_accept_when_no_headers():
457+
"""Test that background_task skips accept when no trace headers."""
458+
with patch("agave.core.tracing.newrelic.agent") as mock_agent:
459+
mock_agent.application.return_value = "test_app"
460+
mock_agent.BackgroundTask.return_value.__enter__ = lambda s: None
461+
mock_agent.BackgroundTask.return_value.__exit__ = lambda s, *a: None
462+
463+
with patch("agave.core.tracing.accept_trace_headers") as mock_accept:
464+
with background_task("my_task", "Task"):
465+
pass
466+
467+
mock_accept.assert_not_called()

0 commit comments

Comments
 (0)