Skip to content

Commit 4766cfb

Browse files
committed
Collect agent info and apply the env for remote config
Signed-off-by: Bob Weinand <[email protected]>
1 parent e2b0a15 commit 4766cfb

File tree

14 files changed

+204
-28
lines changed

14 files changed

+204
-28
lines changed

Cargo.lock

Lines changed: 68 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components-rs/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,8 @@ typedef struct ddog_ContextKey {
821821
enum ddog_MetricType _1;
822822
} ddog_ContextKey;
823823

824+
typedef struct ddog_AgentInfoReader ddog_AgentInfoReader;
825+
824826
typedef struct ddog_AgentRemoteConfigReader ddog_AgentRemoteConfigReader;
825827

826828
typedef struct ddog_AgentRemoteConfigWriter_ShmHandle ddog_AgentRemoteConfigWriter_ShmHandle;

components-rs/sidecar.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,4 +306,19 @@ void ddog_sidecar_reconnect(struct ddog_SidecarTransport **transport,
306306
*/
307307
ddog_CharSlice ddog_sidecar_get_crashtracker_unix_socket_path(void);
308308

309+
/**
310+
* Gets an agent info reader.
311+
*/
312+
struct ddog_AgentInfoReader *ddog_get_agent_info_reader(const struct ddog_Endpoint *endpoint);
313+
314+
/**
315+
* Gets the current agent info environment (or empty if not existing)
316+
*/
317+
ddog_CharSlice ddog_get_agent_info_env(struct ddog_AgentInfoReader *reader, bool *changed);
318+
319+
/**
320+
* Drops the agent info reader.
321+
*/
322+
void ddog_drop_agent_info_reader(struct ddog_AgentInfoReader*);
323+
309324
#endif /* DDOG_SIDECAR_H */

config.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ if test "$PHP_DDTRACE" != "no"; then
162162
dnl ddtrace.c comes first, then everything else alphabetically
163163
DD_TRACE_PHP_SOURCES="$EXTRA_PHP_SOURCES \
164164
ext/ddtrace.c \
165+
ext/agent_info.c \
165166
ext/arrays.c \
166167
ext/auto_flush.c \
167168
ext/autoload_php_files.c \

config.w32

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ if (PHP_DDTRACE != 'no') {
1515

1616
var version = PHP_VERSION * 100 + PHP_MINOR_VERSION;
1717

18-
var DDTRACE_EXT_SOURCES = "arrays.c";
18+
var DDTRACE_EXT_SOURCES = "agent_info.c";
19+
DDTRACE_EXT_SOURCES += " arrays.c";
1920
DDTRACE_EXT_SOURCES += " auto_flush.c";
2021
DDTRACE_EXT_SOURCES += " autoload_php_files.c";
2122
DDTRACE_EXT_SOURCES += " collect_backtrace.c";

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ function decodeDogStatsDMetrics($metrics)
7878
define('REQUEST_RC_CONFIGS_FILE', getenv('REQUEST_RC_CONFIGS_FILE') ?: ("$temp_location/rc_configs.json"));
7979
define('REQUEST_METRICS_FILE', getenv('REQUEST_METRICS_FILE') ?: ("$temp_location/metrics.json"));
8080
define('REQUEST_METRICS_LOG_FILE', getenv('REQUEST_METRICS_LOG_FILE') ?: ("$temp_location/metrics-log.txt"));
81+
define('REQUEST_AGENT_INFO_FILE', getenv('REQUEST_AGENT_INFO_FILE') ?: ("$temp_location/agent-info.txt"));
8182

8283
function logRequest($message, $data = '')
8384
{
@@ -91,8 +92,8 @@ function logRequest($message, $data = '')
9192
}
9293

9394
set_error_handler(function ($number, $message, $errfile, $errline) {
94-
if (error_reporting() == 0) {
95-
return;
95+
if (!($number & error_reporting())) {
96+
return true;
9697
}
9798
logRequest("Triggered error $number $message in $errfile on line $errline: " . (new \Exception)->getTraceAsString());
9899
trigger_error($message, $number);
@@ -142,6 +143,9 @@ function logRequest($message, $data = '')
142143
if (file_exists(REQUEST_NEXT_RESPONSE_FILE)) {
143144
unlink(REQUEST_NEXT_RESPONSE_FILE);
144145
}
146+
if (file_exists(REQUEST_AGENT_INFO_FILE)) {
147+
unlink(REQUEST_AGENT_INFO_FILE);
148+
}
145149
logRequest('Deleted request log');
146150
break;
147151
case '/next-response':
@@ -214,6 +218,16 @@ function logRequest($message, $data = '')
214218
file_put_contents(REQUEST_METRICS_FILE, json_encode($allMetrics));
215219
}
216220
break;
221+
case '/set-agent-info':
222+
$raw = file_get_contents('php://input');
223+
file_put_contents(REQUEST_AGENT_INFO_FILE, $raw);
224+
break;
225+
case '/info':
226+
$file = @file_get_contents(REQUEST_AGENT_INFO_FILE) ?: "{}";
227+
logRequest('Requested /info endpoint, returning ' . $file);
228+
header("datadog-agent-state: " . sha1($file));
229+
echo $file;
230+
break;
217231
default:
218232
$headers = getallheaders();
219233
if (isset($headers['X-Datadog-Diagnostic-Check']) || isset($headers['x-datadog-diagnostic-check'])) {

ext/agent_info.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "agent_info.h"
2+
#include "ddtrace.h"
3+
#include "sidecar.h"
4+
#include "configuration.h"
5+
6+
ZEND_EXTERN_MODULE_GLOBALS(ddtrace);
7+
8+
void ddtrace_check_agent_info_env() {
9+
if (DDTRACE_G(agent_info_reader) && ZSTR_LEN(get_DD_ENV()) == 0) {
10+
bool changed;
11+
ddog_CharSlice env = ddog_get_agent_info_env(DDTRACE_G(agent_info_reader), &changed);
12+
if (env.len) {
13+
zend_alter_ini_entry_chars(zai_config_memoized_entries[DDTRACE_CONFIG_DD_ENV].ini_entries[0]->name, env.ptr, env.len, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
14+
}
15+
}
16+
}
17+
18+
void ddtrace_agent_info_rinit() {
19+
if (ddtrace_endpoint && !ZSTR_LEN(get_global_DD_ENV())) {
20+
DDTRACE_G(agent_info_reader) = ddog_get_agent_info_reader(ddtrace_endpoint);
21+
}
22+
}

ext/agent_info.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#ifndef DD_AGENT_INFO_H
2+
#define DD_AGENT_INFO_H
3+
4+
void ddtrace_check_agent_info_env(void);
5+
void ddtrace_agent_info_rinit(void);
6+
7+
#endif // DD_AGENT_INFO_H

ext/ddtrace.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
#include "ddtrace_arginfo.h"
100100
#include "distributed_tracing_headers.h"
101101
#include "live_debugger.h"
102+
#include "agent_info.h"
102103

103104
#if PHP_VERSION_ID < 70200
104105
#pragma pop_macro("ZVAL_EMPTY_STRING")
@@ -662,6 +663,9 @@ static PHP_GSHUTDOWN_FUNCTION(ddtrace) {
662663
if (ddtrace_globals->remote_config_state) {
663664
ddog_shutdown_remote_config(ddtrace_globals->remote_config_state);
664665
}
666+
if (ddtrace_globals->agent_info_reader) {
667+
ddog_drop_agent_info_reader(ddtrace_globals->agent_info_reader);
668+
}
665669
zai_hook_gshutdown();
666670
if (ddtrace_globals->telemetry_buffer) {
667671
ddog_sidecar_telemetry_buffer_drop(ddtrace_globals->telemetry_buffer);
@@ -1526,7 +1530,6 @@ static void dd_rinit_once(void) {
15261530
static pthread_once_t dd_rinit_once_control = PTHREAD_ONCE_INIT;
15271531

15281532
static void dd_initialize_request(void) {
1529-
DDTRACE_G(request_initialized) = true;
15301533
DDTRACE_G(distributed_trace_id) = (ddtrace_trace_id){0};
15311534
DDTRACE_G(distributed_parent_trace_id) = 0;
15321535
DDTRACE_G(additional_global_tags) = zend_new_array(0);
@@ -1536,6 +1539,12 @@ static void dd_initialize_request(void) {
15361539
zend_hash_init(&DDTRACE_G(propagated_root_span_tags), 8, unused, ZVAL_PTR_DTOR, 0);
15371540
zend_hash_init(&DDTRACE_G(tracestate_unknown_dd_keys), 8, unused, ZVAL_PTR_DTOR, 0);
15381541

1542+
// Check for the env first, before the first RC
1543+
ddtrace_check_agent_info_env();
1544+
1545+
// Do after env check, so that RC data is not updated before RC init
1546+
DDTRACE_G(request_initialized) = true;
1547+
15391548
ddtrace_sidecar_rinit();
15401549

15411550
// Things that should only run on the first RINIT after each minit.
@@ -1575,6 +1584,8 @@ static void dd_initialize_request(void) {
15751584
}
15761585
#endif
15771586

1587+
ddtrace_agent_info_rinit();
1588+
15781589
// Reset compile time after request init hook has compiled
15791590
ddtrace_compile_time_reset();
15801591

@@ -2269,6 +2280,10 @@ void dd_internal_handle_fork(void) {
22692280
ddog_shutdown_remote_config(DDTRACE_G(remote_config_state));
22702281
DDTRACE_G(remote_config_state) = NULL;
22712282
}
2283+
if (DDTRACE_G(agent_info_reader)) {
2284+
ddog_drop_agent_info_reader(DDTRACE_G(agent_info_reader));
2285+
DDTRACE_G(agent_info_reader) = NULL;
2286+
}
22722287
ddtrace_seed_prng();
22732288
ddtrace_generate_runtime_id();
22742289
ddtrace_reset_sidecar_globals();

ext/ddtrace.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ ZEND_BEGIN_MODULE_GLOBALS(ddtrace)
133133
ddog_QueueId sidecar_queue_id;
134134
ddog_AgentRemoteConfigReader *agent_config_reader;
135135
ddog_RemoteConfigState *remote_config_state;
136+
ddog_AgentInfoReader *agent_info_reader;
136137
zend_arena *debugger_capture_arena;
137138
ddog_Vec_DebuggerPayload exception_debugger_buffer;
138139
HashTable active_rc_hooks;

0 commit comments

Comments
 (0)