Skip to content
Closed
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
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 4 additions & 6 deletions components-rs/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,6 @@ typedef enum ddog_MetricNamespace {
DDOG_METRIC_NAMESPACE_SIDECAR,
} ddog_MetricNamespace;

typedef struct ddog_BlockingTransport_SidecarInterfaceResponse__SidecarInterfaceRequest ddog_BlockingTransport_SidecarInterfaceResponse__SidecarInterfaceRequest;

/**
* `InstanceId` is a structure that holds session and runtime identifiers.
*/
Expand All @@ -186,15 +184,15 @@ typedef struct ddog_InstanceId ddog_InstanceId;
typedef struct ddog_SidecarActionsBuffer ddog_SidecarActionsBuffer;

/**
* `SidecarTransport` is a type alias for the `BlockingTransport` struct from the `datadog_ipc`
* crate. It is used for sending `SidecarInterfaceRequest` and receiving
* `SidecarInterfaceResponse`.
* `SidecarTransport` is a wrapper around a BlockingTransport struct from the `datadog_ipc` crate
* that handles transparent reconnection.
* It is used for sending `SidecarInterfaceRequest` and receiving `SidecarInterfaceResponse`.
*
* This transport is used for communication between different parts of the sidecar service.
* It is a blocking transport, meaning that it will block the current thread until the operation is
* complete.
*/
typedef struct ddog_BlockingTransport_SidecarInterfaceResponse__SidecarInterfaceRequest ddog_SidecarTransport;
typedef struct ddog_SidecarTransport ddog_SidecarTransport;

typedef enum ddog_LogLevel {
DDOG_LOG_LEVEL_ERROR,
Expand Down
6 changes: 3 additions & 3 deletions components-rs/ddtrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ void ddog_reset_logger(void);

uint32_t ddog_get_logs_count(ddog_CharSlice level);

bool ddtrace_detect_composer_installed_json(ddog_SidecarTransport **transport,
bool ddtrace_detect_composer_installed_json(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id,
ddog_CharSlice path);
Expand All @@ -172,7 +172,7 @@ void ddog_sidecar_telemetry_enqueueConfig_buffer(struct ddog_SidecarActionsBuffe
ddog_CharSlice config_value,
enum ddog_ConfigurationOrigin origin);

ddog_MaybeError ddog_sidecar_telemetry_buffer_flush(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_telemetry_buffer_flush(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id,
struct ddog_SidecarActionsBuffer *buffer);
Expand All @@ -186,7 +186,7 @@ void ddog_sidecar_telemetry_add_span_metric_point_buffer(struct ddog_SidecarActi
double metric_value,
ddog_CharSlice tags);

ddog_MaybeError ddog_sidecar_connect_php(ddog_SidecarTransport **connection,
ddog_MaybeError ddog_sidecar_connect_php(struct ddog_SidecarTransport **connection,
const char *error_path,
ddog_CharSlice log_level,
bool enable_telemetry);
Expand Down
64 changes: 49 additions & 15 deletions components-rs/sidecar.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ void ddog_agent_remote_config_reader_drop(struct ddog_AgentRemoteConfigReader*);

void ddog_agent_remote_config_writer_drop(struct ddog_AgentRemoteConfigWriter_ShmHandle*);

void ddog_sidecar_transport_drop(ddog_SidecarTransport*);
void ddog_sidecar_transport_drop(struct ddog_SidecarTransport*);

/**
* # Safety
* Caller must ensure the process is safe to fork, at the time when this method is called
*/
ddog_MaybeError ddog_sidecar_connect(ddog_SidecarTransport **connection);
ddog_MaybeError ddog_sidecar_connect(struct ddog_SidecarTransport **connection);

ddog_MaybeError ddog_sidecar_ping(ddog_SidecarTransport **transport);
ddog_MaybeError ddog_sidecar_ping(struct ddog_SidecarTransport **transport);

struct ddog_InstanceId *ddog_sidecar_instanceId_build(ddog_CharSlice session_id,
ddog_CharSlice runtime_id);
Expand All @@ -83,60 +83,94 @@ struct ddog_RuntimeMetadata *ddog_sidecar_runtimeMeta_build(ddog_CharSlice langu

void ddog_sidecar_runtimeMeta_drop(struct ddog_RuntimeMetadata *meta);

ddog_MaybeError ddog_sidecar_telemetry_enqueueConfig(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_telemetry_enqueueConfig(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id,
ddog_CharSlice config_key,
ddog_CharSlice config_value,
enum ddog_ConfigurationOrigin origin);

ddog_MaybeError ddog_sidecar_telemetry_addDependency(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_telemetry_addDependency(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id,
ddog_CharSlice dependency_name,
ddog_CharSlice dependency_version);

ddog_MaybeError ddog_sidecar_telemetry_addIntegration(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_telemetry_addIntegration(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id,
ddog_CharSlice integration_name,
ddog_CharSlice integration_version,
bool integration_enabled);

ddog_MaybeError ddog_sidecar_telemetry_flushServiceData(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_telemetry_flushServiceData(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id,
const struct ddog_RuntimeMetadata *runtime_meta,
ddog_CharSlice service_name,
ddog_CharSlice env_name);

ddog_MaybeError ddog_sidecar_telemetry_end(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_telemetry_end(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
const ddog_QueueId *queue_id);

bool ddog_sidecar_is_closed(ddog_SidecarTransport **transport);
bool ddog_sidecar_is_closed(struct ddog_SidecarTransport **transport);

ddog_MaybeError ddog_sidecar_session_set_config(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_session_set_config(struct ddog_SidecarTransport **transport,
ddog_CharSlice session_id,
const struct ddog_Endpoint *endpoint,
const struct ddog_Endpoint *agent_endpoint,
const struct ddog_Endpoint *dogstatsd_endpoint,
uint64_t flush_interval_milliseconds,
uintptr_t force_flush_size,
uintptr_t force_drop_size,
ddog_CharSlice log_level,
ddog_CharSlice log_path);

ddog_MaybeError ddog_sidecar_send_trace_v04_shm(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_send_trace_v04_shm(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
struct ddog_ShmHandle *shm_handle,
const struct ddog_TracerHeaderTags *tracer_header_tags);

ddog_MaybeError ddog_sidecar_send_trace_v04_bytes(ddog_SidecarTransport **transport,
ddog_MaybeError ddog_sidecar_send_trace_v04_bytes(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
ddog_CharSlice data,
const struct ddog_TracerHeaderTags *tracer_header_tags);

ddog_CharSlice ddog_sidecar_dump(ddog_SidecarTransport **transport);
ddog_CharSlice ddog_sidecar_dump(struct ddog_SidecarTransport **transport);

ddog_CharSlice ddog_sidecar_stats(ddog_SidecarTransport **transport);
ddog_CharSlice ddog_sidecar_stats(struct ddog_SidecarTransport **transport);

ddog_MaybeError ddog_sidecar_dogstatsd_count(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
ddog_CharSlice metric,
int64_t value,
const struct ddog_Vec_Tag *tags);

ddog_MaybeError ddog_sidecar_dogstatsd_distribution(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
ddog_CharSlice metric,
double value,
const struct ddog_Vec_Tag *tags);

ddog_MaybeError ddog_sidecar_dogstatsd_gauge(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
ddog_CharSlice metric,
double value,
const struct ddog_Vec_Tag *tags);

ddog_MaybeError ddog_sidecar_dogstatsd_histogram(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
ddog_CharSlice metric,
double value,
const struct ddog_Vec_Tag *tags);

ddog_MaybeError ddog_sidecar_dogstatsd_set(struct ddog_SidecarTransport **transport,
const struct ddog_InstanceId *instance_id,
ddog_CharSlice metric,
int64_t value,
const struct ddog_Vec_Tag *tags);

void ddog_sidecar_reconnect(struct ddog_SidecarTransport **transport,
struct ddog_SidecarTransport *(*factory)(void));

#endif /* DDOG_SIDECAR_H */
77 changes: 44 additions & 33 deletions ext/sidecar.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,39 @@ ddog_Endpoint *ddtrace_endpoint;
struct ddog_InstanceId *ddtrace_sidecar_instance_id;
static uint8_t dd_sidecar_formatted_session_id[36];

static void ddtrace_set_sidecar_globals(void) {
uint8_t formatted_run_time_id[36];
ddtrace_format_runtime_id(&formatted_run_time_id);
ddog_CharSlice runtime_id = (ddog_CharSlice) {.ptr = (char *) formatted_run_time_id, .len = sizeof(formatted_run_time_id)};
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
ddtrace_sidecar_instance_id = ddog_sidecar_instanceId_build(session_id, runtime_id);
}
// Set the globals that stay unchanged in case of fork
static void ddtrace_set_non_resettable_sidecar_globals(void) {
ddtrace_format_runtime_id(&dd_sidecar_formatted_session_id);

static bool dd_sidecar_connection_init(void) {
if (get_global_DD_TRACE_AGENTLESS() && ZSTR_LEN(get_global_DD_API_KEY())) {
ddtrace_endpoint = ddog_endpoint_from_api_key(dd_zend_string_to_CharSlice(get_global_DD_API_KEY()));
} else {
char *agent_url = ddtrace_agent_url();
ddtrace_endpoint = ddog_endpoint_from_url((ddog_CharSlice) {.ptr = agent_url, .len = strlen(agent_url)});
free(agent_url);
}
}

// Set the globals that must be updated in case of fork
static void ddtrace_set_resettable_sidecar_globals(void) {
uint8_t formatted_run_time_id[36];
ddtrace_format_runtime_id(&formatted_run_time_id);
ddog_CharSlice runtime_id = (ddog_CharSlice) {.ptr = (char *) formatted_run_time_id, .len = sizeof(formatted_run_time_id)};
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
ddtrace_sidecar_instance_id = ddog_sidecar_instanceId_build(session_id, runtime_id);
}

ddog_SidecarTransport *dd_sidecar_connection_factory(void) {
// Should not happen
if (!ddtrace_endpoint) {
ddtrace_sidecar = NULL;
return false;
return NULL;
}

ddog_Endpoint *dogstatsd_endpoint;
char *tmp = ddtrace_agent_url();
dogstatsd_endpoint = ddog_endpoint_from_url((ddog_CharSlice) {.ptr = tmp, .len = strlen(tmp)});
free(tmp);

#ifdef _WIN32
DDOG_PHP_FUNCTION = (const uint8_t *)zend_hash_func;
#endif
Expand All @@ -43,43 +54,43 @@ static bool dd_sidecar_connection_init(void) {
*logpath = 0;
}

if (!ddtrace_ffi_try("Failed connecting to the sidecar", ddog_sidecar_connect_php(&ddtrace_sidecar, logpath, dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()), get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()))) {
ddog_endpoint_drop(ddtrace_endpoint);
ddtrace_endpoint = NULL;
ddtrace_sidecar = NULL;
return false;
}

if (!ddtrace_sidecar_instance_id) {
ddtrace_format_runtime_id(&dd_sidecar_formatted_session_id);
ddtrace_set_sidecar_globals();

if (get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()) {
ddtrace_telemetry_first_init();
}
ddog_SidecarTransport *sidecar_transport;
if (!ddtrace_ffi_try("Failed connecting to the sidecar", ddog_sidecar_connect_php(&sidecar_transport, logpath, dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()), get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()))) {
ddog_endpoint_drop(dogstatsd_endpoint);
return NULL;
}

ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
ddog_sidecar_session_set_config(&ddtrace_sidecar, session_id, ddtrace_endpoint,
ddog_sidecar_session_set_config(&sidecar_transport, session_id, ddtrace_endpoint, dogstatsd_endpoint,
get_global_DD_TRACE_AGENT_FLUSH_INTERVAL(),
get_global_DD_TRACE_AGENT_STACK_INITIAL_SIZE(),
get_global_DD_TRACE_AGENT_STACK_BACKLOG() * get_global_DD_TRACE_AGENT_MAX_PAYLOAD_SIZE(),
get_global_DD_TRACE_DEBUG() ? DDOG_CHARSLICE_C("debug") : dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()),
(ddog_CharSlice){ .ptr = logpath, .len = strlen(logpath) });

return true;
ddog_endpoint_drop(dogstatsd_endpoint);

return sidecar_transport;
}

void ddtrace_sidecar_setup(void) {
dd_sidecar_connection_init();
ddtrace_set_non_resettable_sidecar_globals();
ddtrace_set_resettable_sidecar_globals();

ddtrace_sidecar = dd_sidecar_connection_factory();
if (!ddtrace_sidecar && ddtrace_endpoint) { // Something went wrong
ddog_endpoint_drop(ddtrace_endpoint);
ddtrace_endpoint = NULL;
}

if (get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()) {
ddtrace_telemetry_first_init();
}
}

void ddtrace_sidecar_ensure_active(void) {
if (!ddtrace_sidecar || ddog_sidecar_is_closed(&ddtrace_sidecar)) {
if (ddtrace_sidecar) {
ddog_sidecar_transport_drop(ddtrace_sidecar);
}
dd_sidecar_connection_init();
if (ddtrace_sidecar) {
ddog_sidecar_reconnect(&ddtrace_sidecar, dd_sidecar_connection_factory);
}
}

Expand All @@ -98,6 +109,6 @@ void ddtrace_sidecar_shutdown(void) {
void ddtrace_reset_sidecar_globals(void) {
if (ddtrace_sidecar_instance_id) {
ddog_sidecar_instanceId_drop(ddtrace_sidecar_instance_id);
ddtrace_set_sidecar_globals();
ddtrace_set_resettable_sidecar_globals();
}
}
2 changes: 1 addition & 1 deletion libdatadog
Submodule libdatadog updated 53 files
+25 −0 .github/workflows/fuzz.yml
+9 −0 .github/workflows/test.yml
+3 −3 .github/workflows/weekly-verify-proto-files.yml
+143 −2 Cargo.lock
+7 −0 Cargo.toml
+81 −0 LICENSE-3rdparty.yml
+40 −12 alloc/src/chain.rs
+4 −0 alloc/src/linear.rs
+4 −0 alloc/src/virtual.rs
+1 −1 crashtracker/src/api.rs
+53 −1 crashtracker/src/collectors.rs
+2 −1 crashtracker/src/configuration.rs
+1 −1 crashtracker/src/crash_handler.rs
+18 −0 crashtracker/src/crash_info.rs
+1 −1 crashtracker/src/receiver.rs
+18 −0 crashtracker/src/stacktrace.rs
+1 −0 data-pipeline/Cargo.toml
+1 −1 data-pipeline/src/trace_exporter.rs
+1 −0 ddtelemetry/Cargo.toml
+11 −0 profiling/Cargo.toml
+68 −0 profiling/benches/interning_strings.rs
+8 −0 profiling/benches/main.rs
+1 −0 profiling/src/collections/mod.rs
+354 −0 profiling/src/collections/string_table/mod.rs
+1,070 −0 profiling/src/collections/string_table/wordpress_test_data.rs
+18 −22 profiling/src/internal/profile.rs
+23 −0 profiling/src/iter.rs
+1 −0 profiling/src/lib.rs
+130 −2 sidecar-ffi/src/lib.rs
+2 −0 sidecar-ffi/tests/sidecar.rs
+1 −0 sidecar/Cargo.toml
+273 −0 sidecar/src/dogstatsd.rs
+1 −0 sidecar/src/lib.rs
+15 −1 sidecar/src/log.rs
+62 −0 sidecar/src/self_telemetry.rs
+98 −5 sidecar/src/service/blocking.rs
+1 −0 sidecar/src/service/mod.rs
+1 −6 sidecar/src/service/runtime_info.rs
+13 −1 sidecar/src/service/session_info.rs
+9 −0 sidecar/src/service/sidecar_interface.rs
+21 −0 sidecar/src/service/sidecar_server.rs
+36 −2 sidecar/src/service/tracing/trace_flusher.rs
+4 −1 sidecar/src/setup/unix.rs
+2 −1 tools/docker/Dockerfile.build
+1 −0 trace-mini-agent/Cargo.toml
+1 −1 trace-mini-agent/src/trace_flusher.rs
+2 −2 trace-mini-agent/src/trace_processor.rs
+1 −0 trace-normalization/Cargo.toml
+1 −0 trace-obfuscation/Cargo.toml
+2 −0 trace-utils/src/lib.rs
+229 −0 trace-utils/src/send_data.rs
+8 −235 trace-utils/src/trace_utils.rs
+83 −0 trace-utils/src/tracer_header_tags.rs