Skip to content

Commit 057d031

Browse files
authored
fix(test): stabilize crashtracker_segfault_disabled test and isolate RC requests in request-replayer (#3668)
* test(request-replayer): restore latest request-replayer image Signed-off-by: Alexandre Rulleau <alexandre.rulleau@datadoghq.com> * test(crashtracker_segfault_disabled): limit number of iterations and properly filter Signed-off-by: Alexandre Rulleau <alexandre.rulleau@datadoghq.com> * feat(request-replayer): write remote config requests to a separate file Signed-off-by: Alexandre Rulleau <alexandre.rulleau@datadoghq.com> * test(crashtracker_segfault_disabled): update tet to make it more reliable Signed-off-by: Alexandre Rulleau <alexandre.rulleau@datadoghq.com> * fix(crashtracker_segfault_disabled): suppress segfault output and use non-debug request-replayer - Add 2>/dev/null to silence segfault output from child process on stdout - Switch CI to use php-request-replayer-2.0 instead of the debug variant --------- Signed-off-by: Alexandre Rulleau <alexandre.rulleau@datadoghq.com>
1 parent 3b21827 commit 057d031

4 files changed

Lines changed: 51 additions & 29 deletions

File tree

.gitlab/generate-common.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ function dockerhub_login() {
104104
SNAPSHOT_REGEX_PLACEHOLDERS: 'path:/\S+/dd-trace-php(?=/),httpbin:(?<=//)httpbin-integration:8080'
105105

106106
request-replayer:
107-
name: registry.ddbuild.io/images/mirror/datadog/dd-trace-ci:php-request-replayer-2.0@sha256:4f26c11d568d2401bdd35d592aeff003b89b289e525166ee5ad376066877e4ad
107+
name: registry.ddbuild.io/images/mirror/datadog/dd-trace-ci:php-request-replayer-2.0
108108
alias: request-replayer
109109
command: ["php", "-S", "<?= $service_bind_address ?>:80", "index.php"]
110110
variables:

dockerfiles/services/request-replayer/src/index.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ function decodeDogStatsDMetrics($metrics)
7676
define('REQUEST_NEXT_RESPONSE_FILE', getenv('REQUEST_NEXT_RESPONSE_FILE') ?: ("$temp_location/response.json"));
7777
define('REQUEST_LOG_FILE', getenv('REQUEST_LOG_FILE') ?: ("$temp_location/requests-log.txt"));
7878
define('REQUEST_RC_CONFIGS_FILE', getenv('REQUEST_RC_CONFIGS_FILE') ?: ("$temp_location/rc_configs.json"));
79+
define('REQUEST_RC_REQUESTS_FILE', getenv('REQUEST_RC_REQUESTS_FILE') ?: ("$temp_location/rc_requests.json"));
7980
define('REQUEST_METRICS_FILE', getenv('REQUEST_METRICS_FILE') ?: ("$temp_location/metrics.json"));
8081
define('REQUEST_METRICS_LOG_FILE', getenv('REQUEST_METRICS_LOG_FILE') ?: ("$temp_location/metrics-log.txt"));
8182
define('REQUEST_AGENT_INFO_FILE', getenv('REQUEST_AGENT_INFO_FILE') ?: ("$temp_location/agent-info.txt"));
@@ -124,6 +125,16 @@ function logRequest($message, $data = '')
124125
unlink(REQUEST_METRICS_LOG_FILE);
125126
logRequest('Returned last metrics and deleted metrics log', $request);
126127
break;
128+
case '/replay-rc-requests':
129+
if (!file_exists(REQUEST_RC_REQUESTS_FILE)) {
130+
logRequest('Cannot replay RC requests; RC requests log does not exist');
131+
break;
132+
}
133+
$request = file_get_contents(REQUEST_RC_REQUESTS_FILE);
134+
echo $request;
135+
unlink(REQUEST_RC_REQUESTS_FILE);
136+
logRequest('Returned RC requests and deleted RC requests log', $request);
137+
break;
127138
case '/clear-dumped-data':
128139
if (!file_exists(REQUEST_LATEST_DUMP_FILE) && !file_exists(REQUEST_METRICS_FILE) && !file_exists(REQUEST_RC_CONFIGS_FILE)) {
129140
logRequest('Cannot delete request log; request log does not exist');
@@ -146,6 +157,9 @@ function logRequest($message, $data = '')
146157
if (file_exists(REQUEST_AGENT_INFO_FILE)) {
147158
unlink(REQUEST_AGENT_INFO_FILE);
148159
}
160+
if (file_exists(REQUEST_RC_REQUESTS_FILE)) {
161+
unlink(REQUEST_RC_REQUESTS_FILE);
162+
}
149163
logRequest('Deleted request log');
150164
break;
151165
case '/next-response':
@@ -164,13 +178,13 @@ function logRequest($message, $data = '')
164178
$request = file_get_contents('php://input');
165179
logRequest("Requested remote config", $request);
166180

167-
if (file_exists(REQUEST_LATEST_DUMP_FILE)) {
168-
$tracesStack = json_decode(file_get_contents(REQUEST_LATEST_DUMP_FILE), true);
181+
if (file_exists(REQUEST_RC_REQUESTS_FILE)) {
182+
$tracesStack = json_decode(file_get_contents(REQUEST_RC_REQUESTS_FILE), true);
169183
} else {
170184
$tracesStack = [];
171185
}
172186
$tracesStack[] = ['uri' => $_SERVER['REQUEST_URI'], 'headers' => getallheaders(), 'body' => $request];
173-
file_put_contents(REQUEST_LATEST_DUMP_FILE, json_encode($tracesStack));
187+
file_put_contents(REQUEST_RC_REQUESTS_FILE, json_encode($tracesStack));
174188

175189
$request = json_decode($request, true);
176190
$recentUpdate = @filemtime(REQUEST_RC_CONFIGS_FILE) > time() - 2;

tests/ext/crashtracker_segfault_disabled.phpt

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,42 +21,41 @@ datadog.trace.agent_test_session_token=tests/ext/crashtracker_segfault_disabled.
2121

2222
include __DIR__ . '/includes/request_replayer.inc';
2323
$rr = new RequestReplayer();
24-
$rr->replayRequest(); // cleanup possible leftover
24+
$rr->clearDumpedData(); // ensure clean state
2525

2626
usleep(100000); // Let time to the sidecar to open the crashtracker socket
2727

2828
$php = getenv('TEST_PHP_EXECUTABLE');
2929
$args = getenv('TEST_PHP_ARGS')." ".getenv("TEST_PHP_EXTRA_ARGS");
30-
$cmd = $php." ".$args." -r 'posix_kill(posix_getpid(), 11);'";
30+
$cmd = $php." ".$args." -r 'posix_kill(posix_getpid(), 11);' 2>/dev/null";
3131
system($cmd);
3232

33-
$rr->waitForRequest(function ($request) {
34-
if ($request["uri"] != "/telemetry/proxy/api/v2/apmtelemetry") {
35-
return false;
36-
}
37-
$body = json_decode($request["body"], true);
38-
$batch = $body["request_type"] == "message-batch" ? $body["payload"] : [$body];
39-
40-
foreach ($batch as $json) {
41-
if ($json["request_type"] != "logs" || !isset($json["payload"]["logs"])) {
33+
// Poll up to 5s to confirm no crash report (is_crash:true) arrives.
34+
$crashReportFound = false;
35+
for ($i = 0; $i < 10 && !$crashReportFound; $i++) {
36+
usleep(500000);
37+
foreach ($rr->replayAllRequests() ?: [] as $request) {
38+
if ($request["uri"] != "/telemetry/proxy/api/v2/apmtelemetry") {
4239
continue;
4340
}
44-
45-
foreach ($json["payload"]["logs"] as $payload) {
46-
$payload["message"] = json_decode($payload["message"], true);
47-
$output = json_encode($payload, JSON_PRETTY_PRINT);
48-
49-
echo $output;
50-
51-
return true;
41+
$body = json_decode($request["body"], true);
42+
$batch = $body["request_type"] == "message-batch" ? $body["payload"] : [$body];
43+
foreach ($batch as $json) {
44+
if ($json["request_type"] != "logs" || !isset($json["payload"]["logs"])) {
45+
continue;
46+
}
47+
foreach ($json["payload"]["logs"] as $payload) {
48+
if ($payload["is_crash"] ?? false) {
49+
$crashReportFound = true;
50+
break 3;
51+
}
52+
}
5253
}
5354
}
55+
}
5456

55-
return false;
56-
});
57+
echo $crashReportFound ? "FAIL: unexpected crash report sent\n" : "OK\n";
5758

5859
?>
59-
--EXPECTF--
60-
%A
61-
Fatal error: Uncaught Exception: wait for replay timeout in %s
62-
%A
60+
--EXPECT--
61+
OK

tests/ext/includes/request_replayer.inc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,15 @@ class RequestReplayer
104104
])), true);
105105
}
106106

107+
public function clearDumpedData()
108+
{
109+
file_get_contents($this->endpoint . '/clear-dumped-data', false, stream_context_create([
110+
"http" => [
111+
"header" => "X-Datadog-Test-Session-Token: " . ini_get("datadog.trace.agent_test_session_token"),
112+
],
113+
]));
114+
}
115+
107116
public function replayHeaders($showOnly = [])
108117
{
109118
$request = $this->waitForDataAndReplay();

0 commit comments

Comments
 (0)