Skip to content

Commit ec92fdf

Browse files
authored
Adds container tags support for DBM (#3708)
* Adds container tags support for DBM * fix tests * bwoebi review * bump libdatadog * cargo lock * deactivate process tags for 8.3 as well
1 parent a8ee11d commit ec92fdf

File tree

18 files changed

+347
-28
lines changed

18 files changed

+347
-28
lines changed

appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/docker/AppSecContainer.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class AppSecContainer<SELF extends AppSecContainer<SELF>> extends GenericContain
9090
withEnv 'DD_TRACE_DEBUG', '1'
9191
withEnv 'DD_AUTOLOAD_NO_COMPILE', 'true' // must be exactly 'true'
9292
withEnv 'DD_TRACE_GIT_METADATA_ENABLED', '0'
93+
withEnv 'DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED', '0'
9394
withEnv 'DD_INSTRUMENTATION_TELEMETRY_ENABLED', '1'
9495
// very verbose:
9596
withEnv '_DD_DEBUG_SIDECAR_LOG_METHOD', 'file:///tmp/logs/sidecar.log'

components-rs/ddtrace.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ ddog_Configurator *ddog_library_configurator_new_dummy(bool debug_logs, ddog_Cha
4747

4848
int posix_spawn_file_actions_addchdir_np(void *file_actions, const char *path);
4949

50+
uint64_t dd_fnv1a_64(const uint8_t *data, uintptr_t len);
51+
5052
const char *ddog_normalize_process_tag_value(ddog_CharSlice tag_value);
5153

5254
void ddog_free_normalized_tag_value(const char *ptr);

components-rs/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,24 @@ pub unsafe extern "C" fn posix_spawn_file_actions_addchdir_np(
156156
}
157157

158158
const MAX_TAG_VALUE_LENGTH: usize = 100;
159+
const DD_FNV_PRIME: u64 = 1_099_511_628_211;
160+
const DD_FNV_OFFSET_BASIS: u64 = 14_695_981_039_346_656_037;
161+
162+
#[no_mangle]
163+
pub unsafe extern "C" fn dd_fnv1a_64(data: *const u8, len: usize) -> u64 {
164+
if data.is_null() || len == 0 {
165+
return DD_FNV_OFFSET_BASIS;
166+
}
167+
168+
let bytes = std::slice::from_raw_parts(data, len);
169+
let mut hash = DD_FNV_OFFSET_BASIS;
170+
for byte in bytes {
171+
hash ^= u64::from(*byte);
172+
hash = hash.wrapping_mul(DD_FNV_PRIME);
173+
}
174+
175+
hash
176+
}
159177

160178
#[no_mangle]
161179
pub extern "C" fn ddog_normalize_process_tag_value(

components-rs/sidecar.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,12 @@ struct ddog_AgentInfoReader *ddog_get_agent_info_reader(const struct ddog_Endpoi
401401
*/
402402
ddog_CharSlice ddog_get_agent_info_env(struct ddog_AgentInfoReader *reader, bool *changed);
403403

404+
/**
405+
* Gets the container tags hash from agent info (or empty if not existing)
406+
*/
407+
ddog_CharSlice ddog_get_agent_info_container_tags_hash(struct ddog_AgentInfoReader *reader,
408+
bool *changed);
409+
404410
void ddog_send_traces_to_sidecar(ddog_TracesBytes *traces,
405411
struct ddog_SenderParameters *parameters);
406412

ext/agent_info.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "ddtrace.h"
33
#include "sidecar.h"
44
#include "configuration.h"
5+
#include "process_tags.h"
56

67
ZEND_EXTERN_MODULE_GLOBALS(ddtrace);
78

@@ -20,3 +21,18 @@ void ddtrace_agent_info_rinit() {
2021
DDTRACE_G(agent_info_reader) = ddog_get_agent_info_reader(ddtrace_endpoint);
2122
}
2223
}
24+
25+
void ddtrace_get_container_tags_hash(void) {
26+
if (DDTRACE_G(agent_info_reader)) {
27+
bool changed;
28+
ddog_CharSlice hash = ddog_get_agent_info_container_tags_hash(
29+
DDTRACE_G(agent_info_reader),
30+
&changed
31+
);
32+
if (hash.len > 0) {
33+
zend_string *hash_str = zend_string_init(hash.ptr, hash.len, 1);
34+
ddtrace_process_tags_set_container_tags_hash(hash_str);
35+
zend_string_release(hash_str);
36+
}
37+
}
38+
}

ext/agent_info.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
#ifndef DD_AGENT_INFO_H
22
#define DD_AGENT_INFO_H
33

4+
#include <stddef.h>
5+
#include "Zend/zend_types.h"
6+
47
void ddtrace_check_agent_info_env(void);
58
void ddtrace_agent_info_rinit(void);
9+
void ddtrace_get_container_tags_hash(void);
610

711
#endif // DD_AGENT_INFO_H

ext/configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ enum ddtrace_sidecar_connection_mode {
231231
CONFIG(STRING, DD_TRACE_AGENT_TEST_SESSION_TOKEN, "", .ini_change = ddtrace_alter_test_session_token) \
232232
CONFIG(BOOL, DD_TRACE_PROPAGATE_USER_ID_DEFAULT, "false") \
233233
CONFIG(CUSTOM(INT), DD_DBM_PROPAGATION_MODE, "disabled", .parser = dd_parse_dbm_mode) \
234+
CONFIG(BOOL, DD_DBM_INJECT_SQL_BASEHASH, "false") \
234235
CONFIG(CUSTOM(INT), DD_TRACE_SIDECAR_CONNECTION_MODE, "auto", .parser = dd_parse_sidecar_connection_mode) \
235236
CONFIG(SET, DD_TRACE_WORDPRESS_ADDITIONAL_ACTIONS, "") \
236237
CONFIG(BOOL, DD_TRACE_WORDPRESS_CALLBACKS, "true") \

ext/ddtrace.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,6 +1720,8 @@ static void dd_initialize_request(void) {
17201720

17211721
ddtrace_agent_info_rinit();
17221722

1723+
ddtrace_get_container_tags_hash();
1724+
17231725
// Reset compile time after request init hook has compiled
17241726
ddtrace_compile_time_reset();
17251727

@@ -2583,6 +2585,17 @@ PHP_FUNCTION(DDTrace_System_container_id) {
25832585
}
25842586
}
25852587

2588+
PHP_FUNCTION(DDTrace_System_process_tags_base_hash) {
2589+
UNUSED(execute_data);
2590+
2591+
zend_string *base_hash = ddtrace_process_tags_get_base_hash();
2592+
if (base_hash) {
2593+
RETVAL_STRINGL(ZSTR_VAL(base_hash), ZSTR_LEN(base_hash));
2594+
} else {
2595+
RETURN_NULL();
2596+
}
2597+
}
2598+
25862599
PHP_FUNCTION(DDTrace_Testing_trigger_error) {
25872600
ddtrace_string message;
25882601
ddtrace_zpplong_t error_type;
@@ -3028,6 +3041,20 @@ PHP_FUNCTION(dd_trace_internal_fn) {
30283041
ddtrace_generate_runtime_id();
30293042
ddtrace_force_new_instance_id();
30303043
RETURN_TRUE;
3044+
} else if (FUNCTION_NAME_MATCHES("reload_process_tags")) {
3045+
if (ddtrace_process_tags_enabled()) {
3046+
ddtrace_process_tags_reload();
3047+
ddtrace_sidecar_update_process_tags();
3048+
}
3049+
RETVAL_TRUE;
3050+
} else if (params_count == 1 && FUNCTION_NAME_MATCHES("set_container_tags_hash")) {
3051+
zval *container_tags_hash = ZVAL_VARARG_PARAM(params, 0);
3052+
if (Z_TYPE_P(container_tags_hash) == IS_STRING) {
3053+
ddtrace_process_tags_set_container_tags_hash(Z_STR_P(container_tags_hash));
3054+
RETVAL_TRUE;
3055+
} else {
3056+
RETVAL_FALSE;
3057+
}
30313058
} else if (FUNCTION_NAME_MATCHES("synchronous_flush")) {
30323059
uint32_t timeout = 100;
30333060
if (params_count == 1) {

ext/ddtrace.stub.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,16 @@ function add_endpoint(string $path, string $operation_name, string $resource_nam
849849
* @return string|null The container id, or 'null' if no id was found
850850
*/
851851
function container_id(): string|null {}
852+
853+
/**
854+
* Get the process tags base hash
855+
*
856+
* Returns the FNV-1a 64-bit hash of serialized process tags combined with container tags hash.
857+
* This hash is used for Database Monitoring to correlate queries with application processes.
858+
*
859+
* @return string|null The base hash as a binary string (8 bytes), or 'null' if process tags are disabled or not computed
860+
*/
861+
function process_tags_base_hash(): string|null {}
852862
}
853863

854864
namespace DDTrace\Config {

ext/ddtrace_arginfo.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ ZEND_END_ARG_INFO()
177177
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_System_container_id, 0, 0, IS_STRING, 1)
178178
ZEND_END_ARG_INFO()
179179

180+
#define arginfo_DDTrace_System_process_tags_base_hash arginfo_DDTrace_System_container_id
181+
180182
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_Config_integration_analytics_enabled, 0, 1, _IS_BOOL, 0)
181183
ZEND_ARG_TYPE_INFO(0, integrationName, IS_STRING, 0)
182184
ZEND_END_ARG_INFO()
@@ -390,6 +392,7 @@ ZEND_FUNCTION(DDTrace_resource_weak_get);
390392
ZEND_FUNCTION(DDTrace_are_endpoints_collected);
391393
ZEND_FUNCTION(DDTrace_add_endpoint);
392394
ZEND_FUNCTION(DDTrace_System_container_id);
395+
ZEND_FUNCTION(DDTrace_System_process_tags_base_hash);
393396
ZEND_FUNCTION(DDTrace_Config_integration_analytics_enabled);
394397
ZEND_FUNCTION(DDTrace_Config_integration_analytics_sample_rate);
395398
ZEND_FUNCTION(DDTrace_UserRequest_has_listeners);
@@ -483,6 +486,7 @@ static const zend_function_entry ext_functions[] = {
483486
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "are_endpoints_collected"), zif_DDTrace_are_endpoints_collected, arginfo_DDTrace_are_endpoints_collected, 0, NULL, NULL)
484487
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace", "add_endpoint"), zif_DDTrace_add_endpoint, arginfo_DDTrace_add_endpoint, 0, NULL, NULL)
485488
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\System", "container_id"), zif_DDTrace_System_container_id, arginfo_DDTrace_System_container_id, 0, NULL, NULL)
489+
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\System", "process_tags_base_hash"), zif_DDTrace_System_process_tags_base_hash, arginfo_DDTrace_System_process_tags_base_hash, 0, NULL, NULL)
486490
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\Config", "integration_analytics_enabled"), zif_DDTrace_Config_integration_analytics_enabled, arginfo_DDTrace_Config_integration_analytics_enabled, 0, NULL, NULL)
487491
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\Config", "integration_analytics_sample_rate"), zif_DDTrace_Config_integration_analytics_sample_rate, arginfo_DDTrace_Config_integration_analytics_sample_rate, 0, NULL, NULL)
488492
ZEND_RAW_FENTRY(ZEND_NS_NAME("DDTrace\\UserRequest", "has_listeners"), zif_DDTrace_UserRequest_has_listeners, arginfo_DDTrace_UserRequest_has_listeners, 0, NULL, NULL)

0 commit comments

Comments
 (0)