Skip to content
Draft
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
671 changes: 569 additions & 102 deletions components-rs/bytes.rs

Large diffs are not rendered by default.

35 changes: 35 additions & 0 deletions components-rs/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,24 @@ typedef struct ddog_AttributeAnyValueBytes ddog_AttributeAnyValueBytes;
typedef struct ddog_AttributeArrayValueBytes ddog_AttributeArrayValueBytes;


/**
* Attribute value type tags from `ddog_v1_get_*_attr_type`, so a C caller picks the matching typed
* value getter (`_attr_str`/`_attr_int`/`_attr_double`/`_attr_bool`/`_attr_bytes`).
*/
#define ddog_DDOG_V1_ATTR_STRING 0

#define ddog_DDOG_V1_ATTR_INT 1

#define ddog_DDOG_V1_ATTR_DOUBLE 2

#define ddog_DDOG_V1_ATTR_BOOL 3

#define ddog_DDOG_V1_ATTR_BYTES 4

#define ddog_DDOG_V1_ATTR_KEYVALUE 5

#define ddog_DDOG_V1_ATTR_LIST 6

typedef enum ddog_DynamicInstrumentationConfigState {
DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_ENABLED,
DDOG_DYNAMIC_INSTRUMENTATION_CONFIG_STATE_DISABLED,
Expand Down Expand Up @@ -1227,6 +1245,11 @@ typedef struct ddog_RuntimeMetadata ddog_RuntimeMetadata;

typedef struct ddog_ShmHandle ddog_ShmHandle;

/**
* Builds a native V1 [`TracerPayloadBytes`] holding readable strings.
*/
typedef struct ddog_TracerPayloadV1Builder ddog_TracerPayloadV1Builder;

typedef struct ddog_NativeFile {
struct ddog_PlatformHandle_File *handle;
} ddog_NativeFile;
Expand Down Expand Up @@ -1373,6 +1396,18 @@ typedef struct ddog_SenderParameters {
ddog_CharSlice url;
} ddog_SenderParameters;

/**
* Payload-level tracer metadata for the V1 send path not already carried by the sender's
* `tracer_headers_tags` (lang, tracer_version, container_id live there and are routed from there).
*/
typedef struct ddog_TracerMetadataV1 {
ddog_CharSlice hostname;
ddog_CharSlice env;
ddog_CharSlice app_version;
ddog_CharSlice runtime_id;
ddog_CharSlice git_commit_sha;
} ddog_TracerMetadataV1;

/**
* Raw AppSec response returned by the AppSec message functions.
*
Expand Down
300 changes: 259 additions & 41 deletions components-rs/datadog.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,59 +72,277 @@ void ddog_init_span_func(void (*free_func)(ddog_OwnedZendString),
void (*addref_func)(struct _zend_string*),
ddog_OwnedZendString (*init_func)(ddog_CharSlice));

void ddog_set_span_service_zstr(ddog_SpanBytes *ptr, struct _zend_string *str);

void ddog_set_span_name_zstr(ddog_SpanBytes *ptr, struct _zend_string *str);

void ddog_set_span_resource_zstr(ddog_SpanBytes *ptr, struct _zend_string *str);

void ddog_set_span_type_zstr(ddog_SpanBytes *ptr, struct _zend_string *str);

void ddog_add_span_meta_zstr(ddog_SpanBytes *ptr,
struct _zend_string *key,
struct _zend_string *val);

void ddog_add_CharSlice_span_meta_zstr(ddog_SpanBytes *ptr,
ddog_CharSlice key,
struct _zend_string *val);

void ddog_add_zstr_span_meta_str(ddog_SpanBytes *ptr, struct _zend_string *key, const char *val);

void ddog_add_str_span_meta_str(ddog_SpanBytes *ptr, const char *key, const char *val);

void ddog_add_str_span_meta_zstr(ddog_SpanBytes *ptr, const char *key, struct _zend_string *val);

void ddog_add_str_span_meta_CharSlice(ddog_SpanBytes *ptr, const char *key, ddog_CharSlice val);

void ddog_del_span_meta_zstr(ddog_SpanBytes *ptr, struct _zend_string *key);
/**
* Appends a chunk carrying the 128-bit trace id (high/low halves), returning its index.
*/
uintptr_t ddog_new_chunk(ddog_TracerPayloadV1Builder *builder,
uint64_t trace_id_high,
uint64_t trace_id_low);

void ddog_del_span_meta_str(ddog_SpanBytes *ptr, const char *key);
/**
* Appends an empty span to `chunk`, returning its index.
*/
uintptr_t ddog_new_span(ddog_TracerPayloadV1Builder *builder, uintptr_t chunk);

bool ddog_has_span_meta_zstr(ddog_SpanBytes *ptr, struct _zend_string *key);
/**
* Appends an empty link to a span, returning its index.
*/
uintptr_t ddog_new_link(ddog_TracerPayloadV1Builder *builder, uintptr_t chunk, uintptr_t span);

bool ddog_has_span_meta_str(ddog_SpanBytes *ptr, const char *key);
/**
* Appends an empty event to a span, returning its index.
*/
uintptr_t ddog_new_event(ddog_TracerPayloadV1Builder *builder, uintptr_t chunk, uintptr_t span);

void ddog_span_set_id(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uint64_t value);

void ddog_span_set_parent_id(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uint64_t value);

void ddog_span_set_start(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
int64_t value);

void ddog_span_set_duration(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
int64_t value);

void ddog_span_set_error(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
bool error);

void ddog_set_span_service_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *str);

void ddog_set_span_name_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *str);

void ddog_set_span_resource_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *str);

void ddog_set_span_type_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *str);

void ddog_set_span_env(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
ddog_CharSlice value);

void ddog_set_span_version(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
ddog_CharSlice value);

void ddog_set_span_component(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
ddog_CharSlice value);

ddog_CharSlice ddog_get_span_meta_str(ddog_SpanBytes *span, const char *key);
/**
* Sets the span kind from an OTEL wire value (unset/unknown → Internal).
*/
void ddog_set_span_kind(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uint32_t kind);

void ddog_add_span_metrics_zstr(ddog_SpanBytes *ptr, struct _zend_string *key, double val);
/**
* Sets the span kind from a v0.4 `span.kind` meta string (mapping owned by libdatadog's
* `SpanKind::from_meta`; unknown → Internal).
*/
void ddog_set_span_kind_str(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
ddog_CharSlice value);

void ddog_add_span_attr_cs_cs(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
ddog_CharSlice key,
ddog_CharSlice value);

void ddog_add_span_attr_lit_cs(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
const char *key,
ddog_CharSlice value);

void ddog_add_span_attr_zstr_cs(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *key,
ddog_CharSlice value);

void ddog_add_span_attr_zstr_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *key,
struct _zend_string *value);

bool ddog_has_span_metrics_zstr(ddog_SpanBytes *ptr, struct _zend_string *key);
/**
* Adds a numeric (double) attribute under a `CharSlice` key.
*/
void ddog_add_span_attr_double_cs(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
ddog_CharSlice key,
double value);

void ddog_del_span_metrics_zstr(ddog_SpanBytes *ptr, struct _zend_string *key);
/**
* Adds a numeric (double) attribute under a static C literal key.
*/
void ddog_add_span_attr_double_lit(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
const char *key,
double value);

void ddog_add_span_metrics_str(ddog_SpanBytes *ptr, const char *key, double val);
/**
* Adds a numeric (double) attribute under a `ZendString` key.
*/
void ddog_add_span_attr_double_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *key,
double value);

bool ddog_get_span_metrics_str(ddog_SpanBytes *ptr, const char *key, double *result);
/**
* Adds a bytes-valued attribute (v0.4 `meta_struct`) under a `ZendString` key. The value bytes are
* copied verbatim and encoded as msgpack `bin`.
*/
void ddog_add_span_attr_bytes_zstr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *key,
ddog_CharSlice value);

void ddog_del_span_metrics_str(ddog_SpanBytes *ptr, const char *key);
/**
* Whether the span carries an attribute under `key` (`ZendString`). Mirrors the v0.4
* `has_span_meta`/`has_span_metrics` guard so the generic loops never overwrite a promoted value.
*/
bool ddog_has_span_attr_zstr(const ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
struct _zend_string *key);

void ddog_add_span_meta_struct_zstr(ddog_SpanBytes *ptr,
struct _zend_string *key,
struct _zend_string *val);
/**
* Removes the attribute under a static C literal `key`, returning whether it was present.
*/
bool ddog_del_span_attr_lit(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
const char *key);

void ddog_add_zstr_span_meta_struct_CharSlice(ddog_SpanBytes *ptr,
struct _zend_string *key,
ddog_CharSlice val);
/**
* Copies the attribute `key` from `from_span` onto `to_span` (within `chunk`), returning whether
* the source had it; removes it from the source when `delete_source` is set. Type-preserving, so it
* covers the v0.4 meta and metrics transfer cases. The clone completes before the mutable borrow,
* so the op routes through a single `&mut`.
*/
bool ddog_transfer_span_attr(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t from_span,
uintptr_t to_span,
const char *key,
bool delete_source);

void ddog_set_chunk_origin(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
ddog_CharSlice origin);

void ddog_set_chunk_dropped_trace(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
bool dropped);

void ddog_set_chunk_sampling_priority(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
int32_t priority);

void ddog_set_chunk_sampling_mechanism(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uint32_t mechanism);

void ddog_link_set_trace_id(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t link,
uint64_t trace_id_high,
uint64_t trace_id_low);

void ddog_link_set_span_id(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t link,
uint64_t value);

void ddog_link_set_tracestate(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t link,
ddog_CharSlice value);

void ddog_link_add_attr_str(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t link,
ddog_CharSlice key,
ddog_CharSlice value);

void ddog_event_set_name(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t event,
ddog_CharSlice value);

void ddog_event_set_time(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t event,
uint64_t time_unix_nano);

void ddog_event_add_attr_str(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t event,
ddog_CharSlice key,
ddog_CharSlice value);

void ddog_event_add_attr_int(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t event,
ddog_CharSlice key,
int64_t value);

void ddog_event_add_attr_double(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t event,
ddog_CharSlice key,
double value);

void ddog_event_add_attr_bool(ddog_TracerPayloadV1Builder *builder,
uintptr_t chunk,
uintptr_t span,
uintptr_t event,
ddog_CharSlice key,
bool value);

bool ddog_ffe_load_config(ddog_CharSlice json);

Expand Down
Loading
Loading