Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ddtrace.sym
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ ddtrace_remote_config_get_path
ddtrace_metric_register_buffer
ddtrace_metric_add_point
ddtrace_emit_asm_event
ddtrace_loaded_by_ssi
ddtrace_ssi_forced_injection_enabled
ddog_remote_config_reader_for_path
ddog_remote_config_read
ddog_remote_config_reader_drop
Expand Down
4 changes: 4 additions & 0 deletions ext/startup_logging.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

#define ISO_8601_LEN (20 + 1) // +1 for terminating null-character

extern bool ddtrace_loaded_by_ssi;

static void _dd_get_time(char *buf) {
time_t now = time(NULL);
struct tm *tm = gmtime(&now);
Expand Down Expand Up @@ -183,6 +185,8 @@ static void _dd_get_startup_config(HashTable *ht) {
_dd_add_assoc_bool(ht, ZEND_STRL("enabled_from_env"), get_DD_TRACE_ENABLED());
_dd_add_assoc_string(ht, ZEND_STRL("opcache.file_cache"), _dd_get_ini(ZEND_STRL("opcache.file_cache")));
_dd_add_assoc_bool(ht, ZEND_STRL("sidecar_trace_sender"), get_global_DD_TRACE_SIDECAR_TRACE_SENDER());

_dd_add_assoc_bool(ht, ZEND_STRL("loaded_by_ssi"), ddtrace_loaded_by_ssi);
}

#ifndef _WIN32
Expand Down
16 changes: 16 additions & 0 deletions ext/telemetry.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@

ZEND_EXTERN_MODULE_GLOBALS(ddtrace);

// These globals are set by the SSI loader
DDTRACE_PUBLIC bool ddtrace_loaded_by_ssi = false;
DDTRACE_PUBLIC bool ddtrace_ssi_forced_injection_enabled = false;

zend_long dd_composer_hook_id;
ddog_QueueId dd_bgs_queued_id;

Expand Down Expand Up @@ -162,6 +166,18 @@ void ddtrace_telemetry_finalize(void) {
}
}

// Send extra internal configuration
ddog_CharSlice instrumentation_source = ddtrace_loaded_by_ssi ? DDOG_CHARSLICE_C("ssi") : DDOG_CHARSLICE_C("manual");
ddog_sidecar_telemetry_enqueueConfig_buffer(buffer, DDOG_CHARSLICE_C("instrumentation_source"), instrumentation_source, DDOG_CONFIGURATION_ORIGIN_DEFAULT, DDOG_CHARSLICE_C(""));

ddog_CharSlice ssi_forced = ddtrace_ssi_forced_injection_enabled ? DDOG_CHARSLICE_C("True") : DDOG_CHARSLICE_C("False");
ddog_sidecar_telemetry_enqueueConfig_buffer(buffer, DDOG_CHARSLICE_C("ssi_forced_injection_enabled"), ssi_forced, DDOG_CONFIGURATION_ORIGIN_ENV_VAR, DDOG_CHARSLICE_C(""));

char *injection_enabled = getenv("DD_INJECTION_ENABLED");
if (injection_enabled) {
ddog_sidecar_telemetry_enqueueConfig_buffer(buffer, DDOG_CHARSLICE_C("ssi_injection_enabled"), (ddog_CharSlice) {.ptr = injection_enabled, .len = strlen(injection_enabled)}, DDOG_CONFIGURATION_ORIGIN_ENV_VAR, DDOG_CHARSLICE_C(""));
}

// Send information about explicitly disabled integrations
for (size_t i = 0; i < ddtrace_integrations_len; ++i) {
ddtrace_integration *integration = &ddtrace_integrations[i];
Expand Down
22 changes: 18 additions & 4 deletions loader/dd_library_loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ static bool ddloader_is_opcache_jit_enabled() {
return true;
}

static void ddtrace_pre_minit_hook(injected_ext *config) {
static void ddtrace_pre_minit_hook(injected_ext *config, zend_module_entry *module) {
HashTable *configuration_hash = php_ini_get_configuration_hash();
if (configuration_hash) {
char *sources_path;
Expand Down Expand Up @@ -228,9 +228,21 @@ static void ddtrace_pre_minit_hook(injected_ext *config) {
if (disable_tracer) {
ddloader_ini_set_configuration(config, ZEND_STRL("ddtrace.disable"), ZEND_STRL("1"));
}

// Let ddtrace knows that it was loaded by the loader
bool *ddtrace_loaded_by_ssi = (bool *)DL_FETCH_SYMBOL(module->handle, "ddtrace_loaded_by_ssi");
if (ddtrace_loaded_by_ssi) {
*ddtrace_loaded_by_ssi = true;
}
bool *ddtrace_ssi_forced_injection_enabled = (bool *)DL_FETCH_SYMBOL(module->handle, "ddtrace_ssi_forced_injection_enabled");
if (ddtrace_ssi_forced_injection_enabled) {
*ddtrace_ssi_forced_injection_enabled = force_load;
}
}

static void appsec_pre_minit_hook(injected_ext *config) {
static void appsec_pre_minit_hook(injected_ext *config, zend_module_entry *module) {
UNUSED(module);

HashTable *configuration_hash = php_ini_get_configuration_hash();
if (configuration_hash) {
char *helper_path;
Expand All @@ -242,7 +254,9 @@ static void appsec_pre_minit_hook(injected_ext *config) {
}
}

static void profiling_pre_minit_hook(injected_ext *config) {
static void profiling_pre_minit_hook(injected_ext *config, zend_module_entry *module) {
UNUSED(module);

if (!ddloader_ini_get_configuration(ZEND_STRL("datadog.profiling.enabled"))) {
ddloader_ini_set_configuration(config, ZEND_STRL("datadog.profiling.enabled"), ZEND_STRL("0"));
}
Expand Down Expand Up @@ -606,7 +620,7 @@ static PHP_MINIT_FUNCTION(ddloader_injected_extension_minit) {
}

if (config->pre_minit_hook) {
config->pre_minit_hook(config);
config->pre_minit_hook(config, module);
}

zend_result ret = module->module_startup_func(INIT_FUNC_ARGS_PASSTHRU);
Expand Down
2 changes: 1 addition & 1 deletion loader/php_dd_library_loader.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ typedef struct _injected_ext {
const char *tmp_name;
const zend_module_dep *tmp_deps;
char *(*pre_load_hook)(struct _injected_ext *config);
void (*pre_minit_hook)(struct _injected_ext *config);
void (*pre_minit_hook)(struct _injected_ext *config, zend_module_entry *module);

zend_result (*orig_module_startup_func)(INIT_FUNC_ARGS);
const zend_module_dep *orig_module_deps;
Expand Down
28 changes: 28 additions & 0 deletions loader/tests/functional/test_configuration_telemetry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

require_once __DIR__."/includes/autoload.php";
skip_if_php5();

$telemetryLogPath = tempnam(sys_get_temp_dir(), 'test_loader_');

$output = runCLI('-r "echo \'foo\';"', true, [
'DD_TRACE_AGENT_URL=file://'.$telemetryLogPath,
'DD_TRACE_LOG_LEVEL=debug,startup',
'DD_INJECT_FORCE=true',
'DD_INJECTION_ENABLED=tracer', // Normally set by the injector
]);

assertMatchesFormat($output, <<<EOS
%A
[ddtrace] [startup] DATADOG TRACER CONFIGURATION - %s,"loaded_by_ssi":true%s
%A
EOS
);

// Let time to write the telemetry log
usleep(10000);

$content = file_get_contents($telemetryLogPath);
assertContains($content, '{"name":"instrumentation_source","value":"ssi","origin":"default","config_id":null}');
assertContains($content, '{"name":"ssi_injection_enabled","value":"tracer","origin":"env_var","config_id":null}');
assertContains($content, '{"name":"ssi_forced_injection_enabled","value":"True","origin":"env_var","config_id":null}');
Loading