Skip to content

Commit 0800779

Browse files
authored
Improve sentry workflow & activity interceptors (temporalio#46)
1 parent 636af75 commit 0800779

File tree

1 file changed

+33
-40
lines changed

1 file changed

+33
-40
lines changed

sentry/interceptor.py

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from dataclasses import asdict, is_dataclass
22
from typing import Any, Optional, Type, Union
33

4-
import sentry_sdk
54
from temporalio import activity, workflow
65
from temporalio.worker import (
76
ActivityInboundInterceptor,
@@ -12,66 +11,60 @@
1211
WorkflowInterceptorClassInput,
1312
)
1413

14+
with workflow.unsafe.imports_passed_through():
15+
from sentry_sdk import Hub, capture_exception, set_context, set_tag
1516

16-
def _set_common_workflow_tags(
17-
info: Union[workflow.Info, activity.Info], scope: sentry_sdk.Scope
18-
):
19-
scope.set_tag("temporal.workflow.type", info.workflow_type)
20-
scope.set_tag("temporal.workflow.id", info.workflow_id)
17+
18+
def _set_common_workflow_tags(info: Union[workflow.Info, activity.Info]):
19+
set_tag("temporal.workflow.type", info.workflow_type)
20+
set_tag("temporal.workflow.id", info.workflow_id)
2121

2222

2323
class _SentryActivityInboundInterceptor(ActivityInboundInterceptor):
2424
async def execute_activity(self, input: ExecuteActivityInput) -> Any:
25-
transaction_name = input.fn.__module__ + "." + input.fn.__qualname__
26-
scope_ctx_manager = sentry_sdk.configure_scope()
27-
with scope_ctx_manager as scope, sentry_sdk.start_transaction(
28-
name=transaction_name
29-
):
30-
scope.set_tag("temporal.execution_type", "activity")
25+
# https://docs.sentry.io/platforms/python/troubleshooting/#addressing-concurrency-issues
26+
with Hub(Hub.current):
27+
set_tag("temporal.execution_type", "activity")
28+
set_tag("module", input.fn.__module__ + "." + input.fn.__qualname__)
29+
3130
activity_info = activity.info()
32-
_set_common_workflow_tags(activity_info, scope)
33-
scope.set_tag("temporal.activity.id", activity_info.activity_id)
34-
scope.set_tag("temporal.activity.type", activity_info.activity_type)
35-
scope.set_tag("temporal.activity.task_queue", activity_info.task_queue)
36-
scope.set_tag(
37-
"temporal.workflow.namespace", activity_info.workflow_namespace
38-
)
39-
scope.set_tag("temporal.workflow.run_id", activity_info.workflow_run_id)
31+
_set_common_workflow_tags(activity_info)
32+
set_tag("temporal.activity.id", activity_info.activity_id)
33+
set_tag("temporal.activity.type", activity_info.activity_type)
34+
set_tag("temporal.activity.task_queue", activity_info.task_queue)
35+
set_tag("temporal.workflow.namespace", activity_info.workflow_namespace)
36+
set_tag("temporal.workflow.run_id", activity_info.workflow_run_id)
4037
try:
4138
return await super().execute_activity(input)
4239
except Exception as e:
4340
if len(input.args) == 1 and is_dataclass(input.args[0]):
44-
scope.set_context("temporal.activity.input", asdict(input.args[0]))
45-
scope.set_context("temporal.activity.info", activity.info().__dict__)
46-
sentry_sdk.capture_exception(e)
41+
set_context("temporal.activity.input", asdict(input.args[0]))
42+
set_context("temporal.activity.info", activity.info().__dict__)
43+
capture_exception()
4744
raise e
48-
finally:
49-
scope.clear()
5045

5146

5247
class _SentryWorkflowInterceptor(WorkflowInboundInterceptor):
5348
async def execute_workflow(self, input: ExecuteWorkflowInput) -> Any:
54-
transaction_name = input.run_fn.__module__ + "." + input.run_fn.__qualname__
55-
scope_ctx_manager = sentry_sdk.configure_scope()
56-
with scope_ctx_manager as scope, sentry_sdk.start_transaction(
57-
name=transaction_name
58-
):
59-
scope.set_tag("temporal.execution_type", "workflow")
49+
# https://docs.sentry.io/platforms/python/troubleshooting/#addressing-concurrency-issues
50+
with Hub(Hub.current):
51+
set_tag("temporal.execution_type", "workflow")
52+
set_tag("module", input.run_fn.__module__ + "." + input.run_fn.__qualname__)
6053
workflow_info = workflow.info()
61-
_set_common_workflow_tags(workflow_info, scope)
62-
scope.set_tag("temporal.workflow.task_queue", workflow_info.task_queue)
63-
scope.set_tag("temporal.workflow.namespace", workflow_info.namespace)
64-
scope.set_tag("temporal.workflow.run_id", workflow_info.run_id)
54+
_set_common_workflow_tags(workflow_info)
55+
set_tag("temporal.workflow.task_queue", workflow_info.task_queue)
56+
set_tag("temporal.workflow.namespace", workflow_info.namespace)
57+
set_tag("temporal.workflow.run_id", workflow_info.run_id)
6558
try:
6659
return await super().execute_workflow(input)
6760
except Exception as e:
6861
if len(input.args) == 1 and is_dataclass(input.args[0]):
69-
scope.set_context("temporal.workflow.input", asdict(input.args[0]))
70-
scope.set_context("temporal.workflow.info", workflow.info().__dict__)
71-
sentry_sdk.capture_exception(e)
62+
set_context("temporal.workflow.input", asdict(input.args[0]))
63+
set_context("temporal.workflow.info", workflow.info().__dict__)
64+
65+
if not workflow.unsafe.is_replaying():
66+
capture_exception()
7267
raise e
73-
finally:
74-
scope.clear()
7568

7669

7770
class SentryInterceptor(Interceptor):

0 commit comments

Comments
 (0)