Skip to content

Commit 8d59e03

Browse files
committed
Use ddconfig for runtime stacktrace emission
1 parent 055a5f2 commit 8d59e03

File tree

5 files changed

+20
-5
lines changed

5 files changed

+20
-5
lines changed

ddtrace/internal/core/crashtracking.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,9 @@ def start(additional_tags: Optional[Dict[str, str]] = None) -> bool:
153153
print("Failed to start crashtracker: failed to construct crashtracker configuration", file=sys.stderr)
154154
return False
155155

156-
crashtracker_init(config, receiver_config, metadata)
156+
crashtracker_init(
157+
config, receiver_config, metadata, emit_runtime_stacks=crashtracker_config.emit_runtime_stacks
158+
)
157159

158160
def crashtracker_fork_handler():
159161
# We recreate the args here mainly to pass updated runtime_id after

ddtrace/internal/native/_native.pyi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ class CrashtrackerStatus:
9696
FailedToInitialize: "CrashtrackerStatus"
9797

9898
def crashtracker_init(
99-
config: CrashtrackerConfiguration, receiver_config: CrashtrackerReceiverConfig, metadata: CrashtrackerMetadata
99+
config: CrashtrackerConfiguration,
100+
receiver_config: CrashtrackerReceiverConfig,
101+
metadata: CrashtrackerMetadata,
102+
emit_runtime_stacks: bool,
100103
) -> None: ...
101104
def crashtracker_on_fork(
102105
config: CrashtrackerConfiguration, receiver_config: CrashtrackerReceiverConfig, metadata: CrashtrackerMetadata

ddtrace/internal/settings/crashtracker.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@ class CrashtrackingConfig(DDConfig):
121121
help="Whether to wait for the crashtracking receiver",
122122
)
123123

124+
emit_runtime_stacks = DDConfig.v(
125+
bool,
126+
"emit_runtime_stacks",
127+
default=False,
128+
help_type="Boolean",
129+
help="Whether to emit runtime stacks during a crash.",
130+
)
131+
124132

125133
config = CrashtrackingConfig()
126134
report_configuration(config)

src/native/crashtracker.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ type PyDumpTracebackThreadsFn = unsafe extern "C" fn(
2424
static mut DUMP_TRACEBACK_FN: Option<PyDumpTracebackThreadsFn> = None;
2525
static DUMP_TRACEBACK_INIT: std::sync::Once = std::sync::Once::new();
2626

27+
// Use raw system calls within signal handler context.
28+
// These direct C functions are preferred over going throughRust wrappers
2729
extern "C" {
2830
fn pipe(pipefd: *mut [c_int; 2]) -> c_int;
2931
fn read(fd: c_int, buf: *mut c_void, count: usize) -> isize;
@@ -245,6 +247,7 @@ pub fn crashtracker_init<'py>(
245247
mut config: PyRefMut<'py, CrashtrackerConfigurationPy>,
246248
mut receiver_config: PyRefMut<'py, CrashtrackerReceiverConfigPy>,
247249
mut metadata: PyRefMut<'py, CrashtrackerMetadataPy>,
250+
emit_runtime_stacks: bool,
248251
) -> anyhow::Result<()> {
249252
INIT.call_once(|| {
250253
let (config_opt, receiver_config_opt, metadata_opt) = (
@@ -256,8 +259,7 @@ pub fn crashtracker_init<'py>(
256259
if let (Some(config), Some(receiver_config), Some(metadata)) =
257260
(config_opt, receiver_config_opt, metadata_opt)
258261
{
259-
let runtime_stacktrace_enabled = std::env::var("DD_CRASHTRACKER_EMIT_RUNTIME_STACKS").unwrap_or_default();
260-
if runtime_stacktrace_enabled == "true" || runtime_stacktrace_enabled == "1" {
262+
if emit_runtime_stacks {
261263
unsafe {
262264
init_dump_traceback_fn();
263265
}

tests/internal/crashtracker/test_crashtracker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ def test_crashtracker_tags_required():
460460
def test_crashtracker_runtime_stacktrace_required(run_python_code_in_subprocess):
461461
with utils.with_test_agent() as client:
462462
env = os.environ.copy()
463-
env["DD_CRASHTRACKER_EMIT_RUNTIME_STACKS"] = "true"
463+
env["DD_CRASHTRACKING_EMIT_RUNTIME_STACKS"] = "true"
464464
stdout, stderr, exitcode, _ = run_python_code_in_subprocess(auto_code, env=env)
465465

466466
# Check for expected exit condition

0 commit comments

Comments
 (0)