Skip to content

Commit 7169ff4

Browse files
iamlucbwoebi
andauthored
Send spans_created telemetry metric (#2577)
* WIP Start sending some telemetry metrics Signed-off-by: Bob Weinand <[email protected]> * Address Bob's comments * Change metric value's type to double + use MetricContext struct to register a metric * Rename function Signed-off-by: Bob Weinand <[email protected]> * Add a new internal function to mark a span as created by OpenTelemetry or OpenTracing Signed-off-by: Bob Weinand <[email protected]> * Address FIXMEs * Update extension stub * Regenerate arginfo from stubs Signed-off-by: Bob Weinand <[email protected]> * Fix memory leak * Update broken test * Fix a use-after-free * Update libdatadog, cbindgen Signed-off-by: Bob Weinand <[email protected]> * Fix metric name * Flag spans created by OpenTelemetry Tracers * Test the 'spans_created' metric with OpenTelemetry/OpenTracing * Fix broken test * Extract OpenTelemetry test * Re-add OpenTracing test --------- Signed-off-by: Bob Weinand <[email protected]> Co-authored-by: Bob Weinand <[email protected]>
1 parent 0ca98e6 commit 7169ff4

27 files changed

Lines changed: 742 additions & 114 deletions

File tree

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,7 @@ benchmarks_opcache: benchmarks_run_dependencies call_benchmarks_opcache
11171117
test_opentelemetry_1: global_test_run_dependencies
11181118
rm -f tests/.scenarios.lock/opentelemetry1/composer.lock
11191119
$(MAKE) test_scenario_opentelemetry1
1120+
$(call run_composer_with_retry,tests/Frameworks/Custom/OpenTelemetry,)
11201121
$(eval TEST_EXTRA_ENV=$(shell [ $(PHP_MAJOR_MINOR) -ge 81 ] && echo "OTEL_PHP_FIBERS_ENABLED=1" || echo '') DD_TRACE_OTEL_ENABLED=1 DD_TRACE_GENERATE_ROOT_SPAN=0)
11211122
$(call run_tests,--testsuite=opentelemetry1 $(TESTS))
11221123
$(eval TEST_EXTRA_ENV=)
@@ -1131,7 +1132,9 @@ test_opentracing_beta6: global_test_run_dependencies
11311132

11321133
test_opentracing_10: global_test_run_dependencies
11331134
$(MAKE) test_scenario_opentracing10
1135+
$(call run_composer_with_retry,tests/Frameworks/Custom/OpenTracing,)
11341136
$(call run_tests,tests/OpenTracer1Unit)
1137+
$(call run_tests,tests/OpenTracing)
11351138

11361139
test_integrations: $(TEST_INTEGRATIONS_$(PHP_MAJOR_MINOR))
11371140
test_web: $(TEST_WEB_$(PHP_MAJOR_MINOR))

components-rs/ddtrace.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,14 @@ ddog_MaybeError ddog_sidecar_telemetry_buffer_flush(ddog_SidecarTransport **tran
171171
const ddog_QueueId *queue_id,
172172
struct ddog_SidecarActionsBuffer *buffer);
173173

174+
void ddog_sidecar_telemetry_register_metric_buffer(struct ddog_SidecarActionsBuffer *buffer,
175+
ddog_CharSlice metric_name);
176+
177+
void ddog_sidecar_telemetry_add_span_metric_point_buffer(struct ddog_SidecarActionsBuffer *buffer,
178+
ddog_CharSlice metric_name,
179+
double metric_value,
180+
ddog_CharSlice integration_name);
181+
174182
ddog_MaybeError ddog_sidecar_connect_php(ddog_SidecarTransport **connection,
175183
const char *error_path,
176184
ddog_CharSlice log_level,

components-rs/telemetry.h

Lines changed: 101 additions & 101 deletions
Large diffs are not rendered by default.

components-rs/telemetry.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ use datadog_sidecar::interface::blocking::SidecarTransport;
22
use datadog_sidecar::interface::{blocking, InstanceId, QueueId, SidecarAction};
33
use ddcommon_ffi::slice::AsBytes;
44
use ddcommon_ffi::CharSlice;
5+
use ddcommon::tag::Tag;
56
use ddtelemetry::data;
67
use ddtelemetry::data::{Dependency, Integration};
8+
use ddtelemetry::metrics::MetricContext;
79
use ddtelemetry::worker::TelemetryActions;
810
use ddtelemetry_ffi::{try_c, MaybeError};
911
use std::error::Error;
@@ -127,3 +129,37 @@ pub extern "C" fn ddog_sidecar_telemetry_buffer_flush(
127129

128130
MaybeError::None
129131
}
132+
133+
#[no_mangle]
134+
pub unsafe extern "C" fn ddog_sidecar_telemetry_register_metric_buffer(
135+
buffer: &mut SidecarActionsBuffer,
136+
metric_name: CharSlice,
137+
) {
138+
139+
buffer.buffer.push(SidecarAction::RegisterTelemetryMetric(MetricContext {
140+
name: metric_name.to_utf8_lossy().into_owned(),
141+
namespace: data::metrics::MetricNamespace::Tracers,
142+
metric_type: data::metrics::MetricType::Count,
143+
tags: Vec::default(),
144+
common: false,
145+
}));
146+
}
147+
148+
#[no_mangle]
149+
pub unsafe extern "C" fn ddog_sidecar_telemetry_add_span_metric_point_buffer(
150+
buffer: &mut SidecarActionsBuffer,
151+
metric_name: CharSlice,
152+
metric_value: f64,
153+
integration_name: CharSlice,
154+
) {
155+
let mut tags: Vec<Tag> = Vec::default();
156+
if integration_name.len() > 0 {
157+
tags.push(Tag::new("integration_name", integration_name.to_utf8_lossy().into_owned()).unwrap())
158+
}
159+
160+
buffer.buffer.push(SidecarAction::AddTelemetryMetricPoint((
161+
metric_name.to_utf8_lossy().into_owned(),
162+
metric_value,
163+
tags,
164+
)));
165+
}

ext/ddtrace.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ static void ddtrace_activate(void) {
420420
zai_hook_rinit();
421421
zai_interceptor_activate();
422422
zai_uhook_rinit();
423+
ddtrace_telemetry_rinit();
423424
zend_hash_init(&DDTRACE_G(traced_spans), 8, unused, NULL, 0);
424425
zend_hash_init(&DDTRACE_G(tracestate_unknown_dd_keys), 8, unused, NULL, 0);
425426

@@ -1403,6 +1404,8 @@ static PHP_RSHUTDOWN_FUNCTION(ddtrace) {
14031404
}
14041405

14051406
dd_finalize_telemetry();
1407+
ddtrace_telemetry_rshutdown();
1408+
14061409
if (DDTRACE_G(last_flushed_root_service_name)) {
14071410
zend_string_release(DDTRACE_G(last_flushed_root_service_name));
14081411
DDTRACE_G(last_flushed_root_service_name) = NULL;
@@ -1956,6 +1959,21 @@ PHP_FUNCTION(DDTrace_Testing_trigger_error) {
19561959
}
19571960
}
19581961

1962+
PHP_FUNCTION(DDTrace_Internal_add_span_flag) {
1963+
zend_object *span;
1964+
zend_long flag;
1965+
1966+
ZEND_PARSE_PARAMETERS_START(2, 2)
1967+
Z_PARAM_OBJ_OF_CLASS_EX(span, ddtrace_ce_span_data, 0, 1)
1968+
Z_PARAM_LONG(flag)
1969+
ZEND_PARSE_PARAMETERS_END();
1970+
1971+
ddtrace_span_data *span_data = OBJ_SPANDATA(span);
1972+
span_data->flags |= (uint8_t)flag;
1973+
1974+
RETURN_NULL();
1975+
}
1976+
19591977
PHP_FUNCTION(ddtrace_init) {
19601978
if (DDTRACE_G(request_init_hook_loaded) == 1) {
19611979
RETURN_FALSE;

ext/ddtrace.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ ZEND_BEGIN_MODULE_GLOBALS(ddtrace)
106106
zend_string *last_flushed_root_service_name;
107107
zend_string *last_flushed_root_env_name;
108108

109+
HashTable telemetry_spans_created_per_integration;
110+
109111
HashTable uhook_active_hooks;
110112
HashTable uhook_closure_hooks;
111113
ZEND_END_MODULE_GLOBALS(ddtrace)

ext/ddtrace.stub.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,30 @@ function set_blocking_function(\DDTrace\RootSpanData $span, callable $blockingFu
668668
function trigger_error(string $message, int $errorType): void {}
669669
}
670670

671+
namespace DDTrace\Internal {
672+
/**
673+
* @var int
674+
* @cvalue DDTRACE_SPAN_FLAG_OPENTELEMETRY
675+
*/
676+
const SPAN_FLAG_OPENTELEMETRY = UNKNOWN;
677+
678+
/**
679+
* @var int
680+
* @cvalue DDTRACE_SPAN_FLAG_OPENTRACING
681+
*/
682+
const SPAN_FLAG_OPENTRACING = UNKNOWN;
683+
684+
/**
685+
* Adds a flag to a span.
686+
*
687+
* @internal
688+
*
689+
* @param \DDTrace\SpanData $span the span to flag
690+
* @param int $flag the flag to add to the span
691+
*/
692+
function add_span_flag(\DDTrace\SpanData $span, int $flag): void {}
693+
}
694+
671695
namespace {
672696

673697
/**

ext/ddtrace_arginfo.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 7fec613751ec101cba339b6dfa3a72fbaf38074f */
2+
* Stub hash: 1271064f2b0fcdc3d20e2f3d6c780607b300c5f9 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_trace_method, 0, 3, _IS_BOOL, 0)
55
ZEND_ARG_TYPE_INFO(0, className, IS_STRING, 0)
@@ -165,6 +165,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_Testing_trigger_error, 0
165165
ZEND_ARG_TYPE_INFO(0, errorType, IS_LONG, 0)
166166
ZEND_END_ARG_INFO()
167167

168+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_DDTrace_Internal_add_span_flag, 0, 2, IS_VOID, 0)
169+
ZEND_ARG_OBJ_INFO(0, span, DDTrace\\SpanData, 0)
170+
ZEND_ARG_TYPE_INFO(0, flag, IS_LONG, 0)
171+
ZEND_END_ARG_INFO()
172+
168173
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dd_trace_env_config, 0, 1, IS_MIXED, 0)
169174
ZEND_ARG_TYPE_INFO(0, envName, IS_STRING, 0)
170175
ZEND_END_ARG_INFO()
@@ -326,6 +331,7 @@ ZEND_FUNCTION(DDTrace_UserRequest_notify_start);
326331
ZEND_FUNCTION(DDTrace_UserRequest_notify_commit);
327332
ZEND_FUNCTION(DDTrace_UserRequest_set_blocking_function);
328333
ZEND_FUNCTION(DDTrace_Testing_trigger_error);
334+
ZEND_FUNCTION(DDTrace_Internal_add_span_flag);
329335
ZEND_FUNCTION(dd_trace_env_config);
330336
ZEND_FUNCTION(dd_trace_disable_in_request);
331337
ZEND_FUNCTION(dd_trace_reset);
@@ -409,6 +415,7 @@ static const zend_function_entry ext_functions[] = {
409415
ZEND_NS_FALIAS("DDTrace\\UserRequest", notify_commit, DDTrace_UserRequest_notify_commit, arginfo_DDTrace_UserRequest_notify_commit)
410416
ZEND_NS_FALIAS("DDTrace\\UserRequest", set_blocking_function, DDTrace_UserRequest_set_blocking_function, arginfo_DDTrace_UserRequest_set_blocking_function)
411417
ZEND_NS_FALIAS("DDTrace\\Testing", trigger_error, DDTrace_Testing_trigger_error, arginfo_DDTrace_Testing_trigger_error)
418+
ZEND_NS_FALIAS("DDTrace\\Internal", add_span_flag, DDTrace_Internal_add_span_flag, arginfo_DDTrace_Internal_add_span_flag)
412419
ZEND_FE(dd_trace_env_config, arginfo_dd_trace_env_config)
413420
ZEND_FE(dd_trace_disable_in_request, arginfo_dd_trace_disable_in_request)
414421
ZEND_FE(dd_trace_reset, arginfo_dd_trace_reset)
@@ -479,6 +486,8 @@ static void register_ddtrace_symbols(int module_number)
479486
REGISTER_LONG_CONSTANT("DDTrace\\DBM_PROPAGATION_DISABLED", DD_TRACE_DBM_PROPAGATION_DISABLED, CONST_PERSISTENT);
480487
REGISTER_LONG_CONSTANT("DDTrace\\DBM_PROPAGATION_SERVICE", DD_TRACE_DBM_PROPAGATION_SERVICE, CONST_PERSISTENT);
481488
REGISTER_LONG_CONSTANT("DDTrace\\DBM_PROPAGATION_FULL", DD_TRACE_DBM_PROPAGATION_FULL, CONST_PERSISTENT);
489+
REGISTER_LONG_CONSTANT("DDTrace\\Internal\\SPAN_FLAG_OPENTELEMETRY", DDTRACE_SPAN_FLAG_OPENTELEMETRY, CONST_PERSISTENT);
490+
REGISTER_LONG_CONSTANT("DDTrace\\Internal\\SPAN_FLAG_OPENTRACING", DDTRACE_SPAN_FLAG_OPENTRACING, CONST_PERSISTENT);
482491
REGISTER_STRING_CONSTANT("DD_TRACE_VERSION", PHP_DDTRACE_VERSION, CONST_PERSISTENT);
483492
REGISTER_LONG_CONSTANT("DD_TRACE_PRIORITY_SAMPLING_AUTO_KEEP", PRIORITY_SAMPLING_AUTO_KEEP, CONST_PERSISTENT);
484493
REGISTER_LONG_CONSTANT("DD_TRACE_PRIORITY_SAMPLING_AUTO_REJECT", PRIORITY_SAMPLING_AUTO_REJECT, CONST_PERSISTENT);

ext/span.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <components/log/log.h>
1313
#include "random.h"
1414
#include "serializer.h"
15+
#include "telemetry.h"
1516
#include "ext/standard/php_string.h"
1617
#include <hook/hook.h>
1718
#include "user_request.h"
@@ -553,6 +554,10 @@ void ddtrace_close_span(ddtrace_span_data *span) {
553554
ddtrace_switch_span_stack(span->stack);
554555
}
555556

557+
// Telemetry: increment the spans_created counter
558+
// Must be done at closing because we need to read the "component" span's meta which is not available at creation
559+
ddtrace_telemetry_inc_spans_created(span);
560+
556561
ddtrace_close_stack_userland_spans_until(span);
557562

558563
ddtrace_close_top_span_without_stack_swap(span);

ext/span.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
#define DDTRACE_DROPPED_SPAN (-1ull)
1414
#define DDTRACE_SILENTLY_DROPPED_SPAN (-2ull)
1515

16+
#define DDTRACE_SPAN_FLAG_OPENTELEMETRY (1 << 0)
17+
#define DDTRACE_SPAN_FLAG_OPENTRACING (1 << 1)
18+
1619
struct ddtrace_span_stack;
1720

1821
enum ddtrace_span_dataype {
@@ -72,6 +75,7 @@ struct ddtrace_span_data {
7275
uint64_t start;
7376
uint64_t duration_start;
7477
uint64_t duration;
78+
uint8_t flags;
7579
enum ddtrace_span_dataype type : 8;
7680
bool notify_user_req_end;
7781
struct ddtrace_span_data *next;

0 commit comments

Comments
 (0)