Skip to content

Commit 58ed65d

Browse files
committed
fix(openfeature): lazy-load adapter via separate bridge file (PHP 8.0+ gate)
OpenFeature adapter code uses PHP 8.0+ syntax (match, union types, constructor promotion). Baking it into _files_tracer.php caused the concatenated _generated_tracer.php to fail parsing on PHP 7.x, which cascaded into autoload failures like "add DDTrace\\Transport to bridge/ _files.php" because the whole file aborted before registering earlier classes. Mirror the OpenTelemetry lazy-load pattern: - Move OpenFeature entries from _files_tracer.php into new _files_openfeature.php. - Add openfeature_is_loaded state flag (DDTRACE_G + preload save/restore). - In dd_perform_autoload, match ddtrace\\openfeature\\ before the legacy-tracer branch, gated on PHP_VERSION_ID >= 80000. On 7.x return NULL — the adapter is unavailable but does not break the rest of the tracer. - Wire _generated_openfeature.php into tooling/generation so the compiled bridge exists alongside the non-compiled _files_ fallback.
1 parent b9c5db0 commit 58ed65d

5 files changed

Lines changed: 36 additions & 10 deletions

File tree

ext/autoload_php_files.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ static zend_class_entry *(*dd_prev_autoloader)(zend_string *name, zend_string *l
3232
static zend_bool dd_api_is_preloaded = false;
3333
static zend_bool dd_otel_is_preloaded = false;
3434
static zend_bool dd_legacy_tracer_is_preloaded = false;
35+
static zend_bool dd_openfeature_is_preloaded = false;
3536
#endif
3637

3738
#if PHP_VERSION_ID < 80000
@@ -234,6 +235,21 @@ static zend_class_entry *dd_perform_autoload(zend_string *class_name, zend_strin
234235
return ce;
235236
}
236237
}
238+
// OpenFeature adapter uses PHP 8.0+ syntax (match, union types, constructor
239+
// promotion) so the bridge is only loaded on PHP 8.0+. On 7.x we fall through
240+
// and return NULL, leaving the adapter effectively unavailable.
241+
if (zend_string_starts_with_literal(lc_name, "ddtrace\\openfeature\\")) {
242+
#if PHP_VERSION_ID >= 80000
243+
if (!DDTRACE_G(openfeature_is_loaded)) {
244+
DDTRACE_G(openfeature_is_loaded) = 1;
245+
dd_load_files("openfeature");
246+
}
247+
if ((ce = zend_hash_find_ptr(EG(class_table), lc_name))) {
248+
return ce;
249+
}
250+
#endif
251+
return NULL;
252+
}
237253
if (!DDTRACE_G(legacy_tracer_is_loaded) && !zend_string_starts_with_literal(lc_name, "ddtrace\\integration\\")) {
238254
DDTRACE_G(legacy_tracer_is_loaded) = 1;
239255
dd_load_files("tracer");
@@ -420,13 +436,16 @@ void ddtrace_autoload_rshutdown(void) {
420436
dd_api_is_preloaded = DDTRACE_G(api_is_loaded);
421437
dd_otel_is_preloaded = DDTRACE_G(otel_is_loaded);
422438
dd_legacy_tracer_is_preloaded = DDTRACE_G(legacy_tracer_is_loaded);
439+
dd_openfeature_is_preloaded = DDTRACE_G(openfeature_is_loaded);
423440
} else {
424441
DDTRACE_G(api_is_loaded) = dd_api_is_preloaded;
425442
DDTRACE_G(otel_is_loaded) = dd_otel_is_preloaded;
426443
DDTRACE_G(legacy_tracer_is_loaded) = dd_legacy_tracer_is_preloaded;
444+
DDTRACE_G(openfeature_is_loaded) = dd_openfeature_is_preloaded;
427445
}
428446
#else
429447
DDTRACE_G(api_is_loaded) = 0;
430448
DDTRACE_G(otel_is_loaded) = 0;
449+
DDTRACE_G(openfeature_is_loaded) = 0;
431450
#endif
432451
}

ext/ddtrace.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ ZEND_BEGIN_MODULE_GLOBALS(ddtrace)
108108
zend_bool api_is_loaded;
109109
zend_bool otel_is_loaded;
110110
zend_bool legacy_tracer_is_loaded;
111+
zend_bool openfeature_is_loaded;
111112

112113
uint32_t traces_group_id;
113114
zend_array *additional_global_tags;

src/bridge/_files_openfeature.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
return [
4+
__DIR__ . '/../DDTrace/OpenFeature/ProviderLifecycle.php',
5+
__DIR__ . '/../DDTrace/OpenFeature/BridgeResultMapper.php',
6+
__DIR__ . '/../DDTrace/OpenFeature/EvaluationContextNormalizer.php',
7+
__DIR__ . '/../DDTrace/OpenFeature/ContextFlattener.php',
8+
__DIR__ . '/../DDTrace/OpenFeature/ExposureContext.php',
9+
__DIR__ . '/../DDTrace/OpenFeature/ExposureWriter.php',
10+
__DIR__ . '/../DDTrace/OpenFeature/MetricsCounter.php',
11+
__DIR__ . '/../DDTrace/OpenFeature/DataDogProvider.php',
12+
__DIR__ . '/../DDTrace/OpenFeature/OpenFeatureLifecycleCompatibility.php',
13+
];

src/bridge/_files_tracer.php

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,4 @@
4040
__DIR__ . '/../DDTrace/Propagators/TextMap.php',
4141
__DIR__ . '/../DDTrace/ScopeManager.php',
4242
__DIR__ . '/../DDTrace/Tracer.php',
43-
__DIR__ . '/../DDTrace/OpenFeature/ProviderLifecycle.php',
44-
__DIR__ . '/../DDTrace/OpenFeature/BridgeResultMapper.php',
45-
__DIR__ . '/../DDTrace/OpenFeature/EvaluationContextNormalizer.php',
46-
__DIR__ . '/../DDTrace/OpenFeature/ContextFlattener.php',
47-
__DIR__ . '/../DDTrace/OpenFeature/ExposureContext.php',
48-
__DIR__ . '/../DDTrace/OpenFeature/ExposureWriter.php',
49-
__DIR__ . '/../DDTrace/OpenFeature/MetricsCounter.php',
50-
__DIR__ . '/../DDTrace/OpenFeature/DataDogProvider.php',
51-
__DIR__ . '/../DDTrace/OpenFeature/OpenFeatureLifecycleCompatibility.php',
5243
];

tooling/generation/composer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
"vendor/bin/classpreloader compile --config=../../src/bridge/_files_api.php --output=../../src/bridge/_generated_api.php",
99
"vendor/bin/classpreloader compile --config=../../src/bridge/_files_tracer.php --output=../../src/bridge/_generated_tracer.php",
1010
"vendor/bin/classpreloader compile --config=../../src/bridge/_files_opentelemetry.php --output=../../src/bridge/_generated_opentelemetry.php",
11+
"vendor/bin/classpreloader compile --config=../../src/bridge/_files_openfeature.php --output=../../src/bridge/_generated_openfeature.php",
1112
"sed -i \"s/'[^']\\+bridge\\/\\.\\./__DIR__ . '\\/../g;s/\\s*\\(^\\|\\s\\)\\/\\/.*//g;s/\\/\\*\\([^*]\\|\\*[^/]\\)*\\*\\///g;/\\/\\*/,/\\*\\//d;/^\\s*$/d\" ../../src/bridge/_generated_api.php",
1213
"sed -i \"s/'[^']\\+bridge\\/\\.\\./__DIR__ . '\\/../g;s/\\s*\\(^\\|\\s\\)\\/\\/.*//g;s/\\/\\*\\([^*]\\|\\*[^/]\\)*\\*\\///g;/\\/\\*/,/\\*\\//d;/^\\s*$/d\" ../../src/bridge/_generated_tracer.php",
13-
"sed -i \"s/'[^']\\+bridge\\/\\.\\./__DIR__ . '\\/../g;s/\\s*\\(^\\|\\s\\)\\/\\/.*//g;s/\\/\\*\\([^*]\\|\\*[^/]\\)*\\*\\///g;/\\/\\*/,/\\*\\//d;/^\\s*$/d\" ../../src/bridge/_generated_opentelemetry.php"
14+
"sed -i \"s/'[^']\\+bridge\\/\\.\\./__DIR__ . '\\/../g;s/\\s*\\(^\\|\\s\\)\\/\\/.*//g;s/\\/\\*\\([^*]\\|\\*[^/]\\)*\\*\\///g;/\\/\\*/,/\\*\\//d;/^\\s*$/d\" ../../src/bridge/_generated_opentelemetry.php",
15+
"sed -i \"s/'[^']\\+bridge\\/\\.\\./__DIR__ . '\\/../g;s/\\s*\\(^\\|\\s\\)\\/\\/.*//g;s/\\/\\*\\([^*]\\|\\*[^/]\\)*\\*\\///g;/\\/\\*/,/\\*\\//d;/^\\s*$/d\" ../../src/bridge/_generated_openfeature.php"
1416
],
1517
"verify": "php -r 'require \"../../src/bridge/_files_api.php\"; require \"../../src/bridge/_files_tracer.php\";'"
1618
}

0 commit comments

Comments
 (0)