From 5d5f32779dd6ac688da0d5bd95d2577c7ac3a2c8 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Wed, 4 Feb 2026 17:26:48 +0100 Subject: [PATCH 01/12] chore: add supported-configurations v2 This adds the supported-configurations.json to php. That file is auto generated from configuration.h. As long as they are in sync, things will work easily. The validation step verifies in the CI if the file got updated or not and would fail, if a change was added without committing. The one pipeline CI checks are added as well to make sure new configurations are added to the central repository before the PR that adds the config lands. --- .../supported_configurations_sync.yml | 29 + .gitlab-ci.yml | 16 + metadata/supported-configurations.json | 2436 +++++++++++++++++ tooling/generate-supported-configurations.py | 566 ++++ 4 files changed, 3047 insertions(+) create mode 100644 .github/workflows/supported_configurations_sync.yml create mode 100644 metadata/supported-configurations.json create mode 100644 tooling/generate-supported-configurations.py diff --git a/.github/workflows/supported_configurations_sync.yml b/.github/workflows/supported_configurations_sync.yml new file mode 100644 index 0000000000..a0a01d6fe0 --- /dev/null +++ b/.github/workflows/supported_configurations_sync.yml @@ -0,0 +1,29 @@ +name: Validate supported configurations + +on: + pull_request: + push: + +jobs: + validate-supported-configurations: + name: validate supported configurations + runs-on: ubuntu-24.04 + permissions: + contents: read + + steps: + - name: Checkout + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + clean: true + + - name: Verify supported configurations are in sync + run: | + python3 tooling/generate-supported-configurations.py + + if ! git diff --exit-code -- metadata/supported-configurations.json ext/configuration.h; then + echo "ERROR: @metadata/supported-configurations.json and @ext/configuration.h got out of sync. Please run tooling/generate-supported-configurations.py locally." + git --no-pager diff -- metadata/supported-configurations.json ext/configuration.h + exit 1 + fi diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index abc0ce9358..2a39661549 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ stages: - build - tests + - shared-pipeline - deploy - ci-build @@ -17,6 +18,7 @@ include: - project: DataDog/apm-reliability/libdatadog-build ref: 5826819695d93286569e70ed087ae6bf906ce2c3 file: templates/ci_authenticated_job.yml + - local: .gitlab/one-pipeline.locked.yml - local: .gitlab/ci-images.yml generate-templates: @@ -95,3 +97,17 @@ package-trigger: GIT_SUBMODULE_PATHS: libdatadog appsec/third_party/cpp-base64 appsec/third_party/libddwaf appsec/third_party/msgpack-c NIGHTLY_BUILD: $NIGHTLY_BUILD RELIABILITY_ENV_BRANCH: $RELIABILITY_ENV_BRANCH + +validate_supported_configurations_v2_local_file: + extends: .validate_supported_configurations_v2_local_file + variables: + LOCAL_JSON_PATH: "metadata/supported-configurations.json" + BACKFILLED: "false" + +update_central_configurations_version_range_v2: + extends: .update_central_configurations_version_range_v2 + variables: + LOCAL_REPO_NAME: "dd-trace-php" + LOCAL_JSON_PATH: "metadata/supported-configurations.json" + LANGUAGE_NAME: "php" + MULTIPLE_RELEASE_LINES: "false" diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json new file mode 100644 index 0000000000..9d9a70b14e --- /dev/null +++ b/metadata/supported-configurations.json @@ -0,0 +1,2436 @@ +{ + "version": "2", + "supportedConfigurations": { + "DD_AGENT_HOST": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_API_KEY": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_APM_TRACING_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_APPSEC_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_APPSEC_RASP_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_APPSEC_SCA_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_AUTOFINISH_SPANS": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_AUTOLOAD_NO_COMPILE": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_CODE_ORIGIN_FOR_SPANS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_CODE_ORIGIN_MAX_USER_FRAMES": [ + { + "version": "A", + "type": "int", + "default": "8", + "aliases": [] + } + ], + "DD_CRASHTRACKING_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_DBM_PROPAGATION_MODE": [ + { + "version": "A", + "type": "int", + "default": "disabled", + "aliases": [] + } + ], + "DD_DISTRIBUTED_TRACING": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_DOGSTATSD_HOST": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_DOGSTATSD_PORT": [ + { + "version": "A", + "type": "string", + "default": "8125", + "aliases": [] + } + ], + "DD_DOGSTATSD_URL": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_DYNAMIC_INSTRUMENTATION_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_DYNAMIC_INSTRUMENTATION_REDACTED_TYPES": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_ENV": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_EXCEPTION_REPLAY_CAPTURE_INTERVAL_SECONDS": [ + { + "version": "A", + "type": "int", + "default": "3600", + "aliases": [] + } + ], + "DD_EXCEPTION_REPLAY_CAPTURE_MAX_FRAMES": [ + { + "version": "A", + "type": "int", + "default": "-1", + "aliases": [] + } + ], + "DD_EXCEPTION_REPLAY_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_GIT_COMMIT_SHA": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_GIT_REPOSITORY_URL": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_HOSTNAME": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_HTTP_SERVER_ROUTE_BASED_NAMING": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_INJECT_FORCE": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_INSTRUMENTATION_TELEMETRY_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_INTEGRATION_METRICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_LOG_BACKTRACE": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_METRICS_OTEL_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_OPENAI_LOGS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_OPENAI_LOG_PROMPT_COMPLETION_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "0.1", + "aliases": [] + } + ], + "DD_OPENAI_METRICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_OPENAI_SERVICE": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_OPENAI_SPAN_CHAR_LIMIT": [ + { + "version": "A", + "type": "int", + "default": "128", + "aliases": [] + } + ], + "DD_OPENAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1.0", + "aliases": [] + } + ], + "DD_REMOTE_CONFIG_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS": [ + { + "version": "A", + "type": "decimal", + "default": "5", + "aliases": [] + } + ], + "DD_SERVICE": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_SERVICE_MAPPING": [ + { + "version": "A", + "type": "map", + "default": "", + "aliases": [] + } + ], + "DD_SPAN_SAMPLING_RULES": [ + { + "version": "A", + "type": "map", + "default": "[]", + "aliases": [] + } + ], + "DD_SPAN_SAMPLING_RULES_FILE": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TAGS": [ + { + "version": "A", + "type": "map", + "default": "", + "aliases": [] + } + ], + "DD_TELEMETRY_HEARTBEAT_INTERVAL": [ + { + "version": "A", + "type": "int", + "default": "60", + "aliases": [] + } + ], + "DD_TELEMETRY_LOG_COLLECTION_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_AGENTLESS": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_AGENT_CONNECT_TIMEOUT": [ + { + "version": "A", + "type": "int", + "default": "100", + "aliases": [] + } + ], + "DD_TRACE_AGENT_DEBUG_VERBOSE_CURL": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_AGENT_FLUSH_AFTER_N_REQUESTS": [ + { + "version": "A", + "type": "int", + "default": "0", + "aliases": [] + } + ], + "DD_TRACE_AGENT_FLUSH_INTERVAL": [ + { + "version": "A", + "type": "int", + "default": "1001", + "aliases": [] + } + ], + "DD_TRACE_AGENT_MAX_PAYLOAD_SIZE": [ + { + "version": "A", + "type": "int", + "default": "52428800", + "aliases": [] + } + ], + "DD_TRACE_AGENT_PORT": [ + { + "version": "A", + "type": "int", + "default": "0", + "aliases": [] + } + ], + "DD_TRACE_AGENT_RETRIES": [ + { + "version": "A", + "type": "int", + "default": "0", + "aliases": [] + } + ], + "DD_TRACE_AGENT_STACK_BACKLOG": [ + { + "version": "A", + "type": "int", + "default": "12", + "aliases": [] + } + ], + "DD_TRACE_AGENT_STACK_INITIAL_SIZE": [ + { + "version": "A", + "type": "int", + "default": "131072", + "aliases": [] + } + ], + "DD_TRACE_AGENT_TEST_SESSION_TOKEN": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_AGENT_TIMEOUT": [ + { + "version": "A", + "type": "int", + "default": "500", + "aliases": [] + } + ], + "DD_TRACE_AGENT_URL": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_AMQP_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_AMQP_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_AMQP_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_AMQP_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_AMQP_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_APPEND_TRACE_IDS_TO_LOGS": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_AUTO_FLUSH_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_BAGGAGE_MAX_BYTES": [ + { + "version": "A", + "type": "int", + "default": "8192", + "aliases": [] + } + ], + "DD_TRACE_BAGGAGE_MAX_ITEMS": [ + { + "version": "A", + "type": "int", + "default": "64", + "aliases": [] + } + ], + "DD_TRACE_BAGGAGE_TAG_KEYS": [ + { + "version": "A", + "type": "array", + "default": "user.id,session.id,account.id", + "aliases": [] + } + ], + "DD_TRACE_BETA_HIGH_MEMORY_PRESSURE_PERCENT": [ + { + "version": "A", + "type": "int", + "default": "80", + "aliases": [] + } + ], + "DD_TRACE_BGS_CONNECT_TIMEOUT": [ + { + "version": "A", + "type": "int", + "default": "2000", + "aliases": [] + } + ], + "DD_TRACE_BGS_TIMEOUT": [ + { + "version": "A", + "type": "int", + "default": "5000", + "aliases": [] + } + ], + "DD_TRACE_BUFFER_SIZE": [ + { + "version": "A", + "type": "int", + "default": "2097152", + "aliases": [] + } + ], + "DD_TRACE_CAKEPHP_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_CAKEPHP_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_CAKEPHP_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_CAKEPHP_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_CAKEPHP_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_CLIENT_IP_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_CLIENT_IP_HEADER": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_CLI_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_CODEIGNITER_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_CODEIGNITER_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_CODEIGNITER_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_CODEIGNITER_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_CODEIGNITER_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_CURL_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_CURL_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_CURL_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_CURL_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_CURL_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_DB_CLIENT_SPLIT_BY_INSTANCE": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_DEBUG": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_DEBUG_CURL_OUTPUT": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_DEBUG_PRNG_SEED": [ + { + "version": "A", + "type": "int", + "default": "-1", + "aliases": [] + } + ], + "DD_TRACE_DRUPAL_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_DRUPAL_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_DRUPAL_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_DRUPAL_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_DRUPAL_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_ELASTICSEARCH_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_ELASTICSEARCH_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_ELASTICSEARCH_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_ELOQUENT_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_ELOQUENT_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_ELOQUENT_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_ELOQUENT_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_ELOQUENT_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_EXEC_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_EXEC_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_EXEC_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_EXEC_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_EXEC_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_FILESYSTEM_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_FILESYSTEM_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_FILESYSTEM_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_FILESYSTEM_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_FILESYSTEM_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_FLUSH_COLLECT_CYCLES": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_FORCE_FLUSH_ON_SHUTDOWN": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_FORCE_FLUSH_ON_SIGINT": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_FORCE_FLUSH_ON_SIGTERM": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_FORKED_PROCESS": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_FRANKENPHP_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_FRANKENPHP_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_FRANKENPHP_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_FRANKENPHP_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_FRANKENPHP_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_GENERATE_ROOT_SPAN": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_GIT_METADATA_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_GOOGLESPANNER_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_GOOGLESPANNER_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_GOOGLESPANNER_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_GOOGLESPANNER_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_GOOGLESPANNER_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_GUZZLE_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_GUZZLE_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_GUZZLE_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_GUZZLE_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_GUZZLE_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_HEADER_TAGS": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_HEALTH_METRICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_HEALTH_METRICS_HEARTBEAT_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "0.001", + "aliases": [] + } + ], + "DD_TRACE_HOOK_LIMIT": [ + { + "version": "A", + "type": "int", + "default": "100", + "aliases": [] + } + ], + "DD_TRACE_HTTPSTREAM_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_HTTPSTREAM_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_HTTPSTREAM_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_HTTPSTREAM_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_HTTPSTREAM_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES": [ + { + "version": "A", + "type": "array", + "default": "500-599", + "aliases": [] + } + ], + "DD_TRACE_HTTP_CLIENT_SPLIT_BY_DOMAIN": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_HTTP_POST_DATA_PARAM_ALLOWED": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_HTTP_SERVER_ERROR_STATUSES": [ + { + "version": "A", + "type": "array", + "default": "500-599", + "aliases": [] + } + ], + "DD_TRACE_HTTP_URL_QUERY_PARAM_ALLOWED": [ + { + "version": "A", + "type": "array", + "default": "*", + "aliases": [] + } + ], + "DD_TRACE_IGNORE_AGENT_SAMPLING_RATES": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_KAFKA_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_KAFKA_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_KAFKA_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_KAFKA_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_KAFKA_DISTRIBUTED_TRACING": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_KAFKA_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_LAMINAS_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_LAMINAS_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_LAMINAS_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_LAMINAS_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_LAMINAS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_LARAVELQUEUE_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_LARAVELQUEUE_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_LARAVELQUEUE_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_LARAVELQUEUE_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_LARAVELQUEUE_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_LARAVEL_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_LARAVEL_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_LARAVEL_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_LARAVEL_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_LARAVEL_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_LARAVEL_QUEUE_DISTRIBUTED_TRACING": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_LOGS_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_LOGS_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_LOGS_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_LOGS_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_LOGS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [ + "DD_LOGS_INJECTION" + ] + } + ], + "DD_TRACE_LOG_FILE": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_LOG_LEVEL": [ + { + "version": "A", + "type": "string", + "default": "error", + "aliases": [] + } + ], + "DD_TRACE_LUMEN_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_LUMEN_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_LUMEN_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_LUMEN_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_LUMEN_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MAGENTO_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_MAGENTO_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_MAGENTO_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_MAGENTO_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_MAGENTO_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MEASURE_COMPILE_TIME": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MEASURE_PEAK_MEMORY_USAGE": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MEMCACHED_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_MEMCACHED_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_MEMCACHED_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_MEMCACHED_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_MEMCACHED_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MEMCACHED_OBFUSCATION": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MEMCACHE_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_MEMCACHE_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_MEMCACHE_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_MEMCACHE_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_MEMCACHE_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MEMORY_LIMIT": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_MONGODB_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_MONGODB_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_MONGODB_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_MONGODB_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_MONGODB_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MONGODB_OBFUSCATION": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MONGO_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_MONGO_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_MONGO_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_MONGO_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_MONGO_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_MYSQLI_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_MYSQLI_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_MYSQLI_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_MYSQLI_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_MYSQLI_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_NETTE_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_NETTE_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_NETTE_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_NETTE_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_NETTE_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": [ + { + "version": "A", + "type": "string", + "default": "(?i)(?:(?:\"|%22)?)(?:(?:old[-_]?|new[-_]?)?p(?:ass)?w(?:or)?d(?:1|2)?|pass(?:[-_]?phrase)?|secret|(?:api[-_]?|private[-_]?|public[-_]?|access[-_]?|secret[-_]?|app(?:lication)?[-_]?)key(?:[-_]?id)?|token|consumer[-_]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\\s|%20)*(?:=|%3D)[^&]+|(?:\"|%22)(?:\\s|%20)*(?::|%3A)(?:\\s|%20)*(?:\"|%22)(?:%2[^2]|%[^2]|[^\"%])+(?:\"|%22))|(?:bearer(?:\\s|%20)+[a-z0-9._\\-]+|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\\w=-]|%3D)+\\.ey[I-L](?:[\\w=-]|%3D)+(?:\\.(?:[\\w.+/=-]|%3D|%2F|%2B)+)?|-{5}BEGIN(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY-{5}[^\\-]+-{5}END(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY(?:-{5})?(?:\\n|%0A)?|(?:ssh-(?:rsa|dss)|ecdsa-[a-z0-9]+-[a-z0-9]+)(?:\\s|%20|%09)+(?:[a-z0-9/.+]|%2F|%5C|%2B){100,}(?:=|%3D)*(?:(?:\\s|%20|%09)+[a-z0-9._-]+)?)", + "aliases": [] + } + ], + "DD_TRACE_ONCE_LOGS": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_OPENAI_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_OPENAI_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_OPENAI_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_OPENAI_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_OPENAI_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_OTEL_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_PCNTL_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_PCNTL_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_PCNTL_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_PCNTL_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_PCNTL_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_PDO_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_PDO_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_PDO_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_PDO_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_PDO_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_PEER_SERVICE_MAPPING": [ + { + "version": "A", + "type": "map", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_PHPREDIS_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_PHPREDIS_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_PHPREDIS_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_PHPREDIS_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_PHPREDIS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_PREDIS_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_PREDIS_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_PREDIS_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_PREDIS_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_PREDIS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_PROPAGATE_SERVICE": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_PROPAGATE_USER_ID_DEFAULT": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_PROPAGATION_STYLE": [ + { + "version": "A", + "type": "array", + "default": "datadog,tracecontext,baggage", + "aliases": [] + } + ], + "DD_TRACE_PROPAGATION_STYLE_EXTRACT": [ + { + "version": "A", + "type": "array", + "default": "datadog,tracecontext,B3,B3 single header,baggage", + "aliases": [] + } + ], + "DD_TRACE_PROPAGATION_STYLE_INJECT": [ + { + "version": "A", + "type": "array", + "default": "datadog,tracecontext,baggage", + "aliases": [] + } + ], + "DD_TRACE_PSR18_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_PSR18_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_PSR18_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_PSR18_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_PSR18_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_RATCHET_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_RATCHET_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_RATCHET_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_RATCHET_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_RATCHET_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_RATE_LIMIT": [ + { + "version": "A", + "type": "int", + "default": "100", + "aliases": [] + } + ], + "DD_TRACE_REDIS_CLIENT_SPLIT_BY_HOST": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_REMOVE_AUTOINSTRUMENTATION_ORPHANS": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_REMOVE_ROOT_SPAN_LARAVEL_QUEUE": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_REMOVE_ROOT_SPAN_SYMFONY_MESSENGER": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_REPORT_HOSTNAME": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_RESOURCE_RENAMING_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_RESOURCE_URI_FRAGMENT_REGEX": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_RESOURCE_URI_MAPPING_INCOMING": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_RESOURCE_URI_MAPPING_OUTGOING": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_RESOURCE_URI_QUERY_PARAM_ALLOWED": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_RETAIN_THREAD_CAPABILITIES": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_ROADRUNNER_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_ROADRUNNER_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_ROADRUNNER_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_ROADRUNNER_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_ROADRUNNER_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "-1", + "aliases": [] + } + ], + "DD_TRACE_SAMPLING_RULES": [ + { + "version": "A", + "type": "map", + "default": "[]", + "aliases": [] + } + ], + "DD_TRACE_SAMPLING_RULES_FORMAT": [ + { + "version": "A", + "type": "int", + "default": "glob", + "aliases": [] + } + ], + "DD_TRACE_SHUTDOWN_TIMEOUT": [ + { + "version": "A", + "type": "int", + "default": "5000", + "aliases": [] + } + ], + "DD_TRACE_SIDECAR_TRACE_SENDER": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_SLIM_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_SLIM_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_SLIM_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_SLIM_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_SLIM_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SOURCES_PATH": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_SPANS_LIMIT": [ + { + "version": "A", + "type": "int", + "default": "1000", + "aliases": [] + } + ], + "DD_TRACE_SQLSRV_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_SQLSRV_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_SQLSRV_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_SQLSRV_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_SQLSRV_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_STARTUP_LOGS": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SWOOLE_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_SWOOLE_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_SWOOLE_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_SWOOLE_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_SWOOLE_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SYMFONYMESSENGER_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_SYMFONYMESSENGER_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_SYMFONYMESSENGER_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_SYMFONYMESSENGER_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_SYMFONYMESSENGER_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SYMFONY_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_SYMFONY_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_SYMFONY_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_SYMFONY_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_SYMFONY_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SYMFONY_HTTP_ROUTE": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SYMFONY_MESSENGER_DISTRIBUTED_TRACING": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_SYMFONY_MESSENGER_MIDDLEWARES": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], + "DD_TRACE_TRACED_INTERNAL_FUNCTIONS": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_URL_AS_RESOURCE_NAMES_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WARN_LEGACY_DD_TRACE": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WEBSOCKET_MESSAGES_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WEB_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_WEB_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_WEB_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_WEB_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_WEB_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WORDPRESS_ADDITIONAL_ACTIONS": [ + { + "version": "A", + "type": "array", + "default": "", + "aliases": [] + } + ], + "DD_TRACE_WORDPRESS_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_WORDPRESS_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_WORDPRESS_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_WORDPRESS_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_WORDPRESS_CALLBACKS": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_WORDPRESS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH": [ + { + "version": "A", + "type": "int", + "default": "512", + "aliases": [] + } + ], + "DD_TRACE_YII_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_YII_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_YII_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_YII_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_YII_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_TRACE_ZENDFRAMEWORK_ANALYTICS_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [ + "DD_ZENDFRAMEWORK_ANALYTICS_ENABLED" + ] + } + ], + "DD_TRACE_ZENDFRAMEWORK_ANALYTICS_SAMPLE_RATE": [ + { + "version": "A", + "type": "decimal", + "default": "1", + "aliases": [ + "DD_ZENDFRAMEWORK_ANALYTICS_SAMPLE_RATE" + ] + } + ], + "DD_TRACE_ZENDFRAMEWORK_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "true", + "aliases": [] + } + ], + "DD_VERSION": [ + { + "version": "A", + "type": "string", + "default": "", + "aliases": [] + } + ] + }, + "deprecations": {} +} diff --git a/tooling/generate-supported-configurations.py b/tooling/generate-supported-configurations.py new file mode 100644 index 0000000000..f7acf11d3f --- /dev/null +++ b/tooling/generate-supported-configurations.py @@ -0,0 +1,566 @@ +#!/usr/bin/env python3 + +import codecs +import json +import os +import re +import sys +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[1] +CONFIG_PATH = REPO_ROOT / "ext" / "configuration.h" +INTEGRATIONS_PATH = REPO_ROOT / "ext" / "integrations" / "integrations.h" +OUTPUT_PATH = REPO_ROOT / "metadata" / "supported-configurations.json" + + +def read_file(path: Path) -> str: + try: + return path.read_text(encoding="utf-8") + except OSError: + print(f"Error: failed to read {path}", file=sys.stderr) + raise SystemExit(1) + + +def normalize_line_endings(contents: str) -> str: + return contents.replace("\r\n", "\n") + + +def strip_line_continuations(contents: str) -> str: + return re.sub(r"\\\r?\n", "", contents) + + +def eval_condition(expr: str, defines: dict, defined: set) -> bool: + expr = expr.strip() + if not expr: + return False + + expr = re.sub( + r"\bdefined\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)", + lambda m: "1" if m.group(1) in defined else "0", + expr, + ) + expr = expr.replace("&&", " and ").replace("||", " or ") + expr = re.sub(r"!\s*(?!=)", " not ", expr) + + def replace_ident(match: re.Match) -> str: + name = match.group(0) + if name in ("and", "or", "not"): + return name + if name == "true": + return "1" + if name == "false": + return "0" + if name in defines: + value = str(defines[name]).strip() + if value == "true": + return "1" + if value == "false": + return "0" + if re.fullmatch(r"-?\d+", value): + return value + return "0" + + expr = re.sub(r"\b[A-Za-z_][A-Za-z0-9_]*\b", replace_ident, expr) + + try: + return bool(eval(expr, {"__builtins__": {}}, {})) + except Exception: + return False + + +def preprocess_defines(contents: str, predefined_defines: dict, predefined_defined: set): + defines = dict(predefined_defines) + defined = set(predefined_defined) + macro_bodies = {} + + lines = normalize_line_endings(strip_line_continuations(contents)).split("\n") + stack = [] + active = True + + for line in lines: + trimmed = line.strip() + if not trimmed: + continue + + if re.match(r"^#\s*if\s+", trimmed): + condition = re.sub(r"^#\s*if\s+", "", trimmed) + cond_value = eval_condition(condition, defines, defined) + stack.append({"parent_active": active, "matched": cond_value, "active": cond_value}) + active = active and cond_value + continue + + match = re.match(r"^#\s*ifdef\s+([A-Za-z_][A-Za-z0-9_]*)$", trimmed) + if match: + cond_value = match.group(1) in defined + stack.append({"parent_active": active, "matched": cond_value, "active": cond_value}) + active = active and cond_value + continue + + match = re.match(r"^#\s*ifndef\s+([A-Za-z_][A-Za-z0-9_]*)$", trimmed) + if match: + cond_value = match.group(1) not in defined + stack.append({"parent_active": active, "matched": cond_value, "active": cond_value}) + active = active and cond_value + continue + + match = re.match(r"^#\s*elif\s+", trimmed) + if match and stack: + condition = re.sub(r"^#\s*elif\s+", "", trimmed) + state = stack.pop() + if not state["parent_active"] or state["matched"]: + state["active"] = False + else: + cond_value = eval_condition(condition, defines, defined) + state["active"] = cond_value + state["matched"] = cond_value + stack.append(state) + active = state["parent_active"] and state["active"] + continue + + if re.match(r"^#\s*else\b", trimmed): + if stack: + state = stack.pop() + if not state["parent_active"] or state["matched"]: + state["active"] = False + else: + state["active"] = True + state["matched"] = True + stack.append(state) + active = state["parent_active"] and state["active"] + continue + + if re.match(r"^#\s*endif\b", trimmed): + if stack: + state = stack.pop() + active = state["parent_active"] + continue + + if not active: + continue + + if re.match(r"^#\s*define\s+[A-Za-z_][A-Za-z0-9_]*\(", trimmed): + continue + + match = re.match(r"^#\s*define\s+(DD_CONFIGURATION(?:_ALL)?)\s+(.*)$", trimmed) + if match: + macro_bodies[match.group(1)] = match.group(2).strip() + continue + + match = re.match(r"^#\s*define\s+([A-Za-z_][A-Za-z0-9_]*)\s+(.*)$", trimmed) + if match: + name = match.group(1) + if not name.startswith("DD_CONFIGURATION"): + defines[name] = match.group(2).strip() + defined.add(name) + continue + + match = re.match(r"^#\s*undef\s+([A-Za-z_][A-Za-z0-9_]*)$", trimmed) + if match: + name = match.group(1) + defines.pop(name, None) + defined.discard(name) + + return defines, defined, macro_bodies + + +def extract_macro_calls(body: str, call_name: str) -> list: + calls = [] + needle = f"{call_name}(" + length = len(body) + offset = 0 + + while True: + pos = body.find(needle, offset) + if pos == -1: + break + i = pos + len(needle) + depth = 1 + in_string = False + escape = False + while i < length and depth > 0: + ch = body[i] + if in_string: + if escape: + escape = False + elif ch == "\\": + escape = True + elif ch == '"': + in_string = False + else: + if ch == '"': + in_string = True + elif ch == "(": + depth += 1 + elif ch == ")": + depth -= 1 + i += 1 + if depth != 0: + break + calls.append(body[pos + len(needle) : i - 1]) + offset = i + + return calls + + +def split_args(arg_string: str) -> list: + args = [] + current = [] + depth = 0 + in_string = False + escape = False + + for ch in arg_string: + if in_string: + current.append(ch) + if escape: + escape = False + elif ch == "\\": + escape = True + elif ch == '"': + in_string = False + continue + + if ch == '"': + in_string = True + current.append(ch) + continue + + if ch == "(": + depth += 1 + current.append(ch) + continue + + if ch == ")": + depth = max(0, depth - 1) + current.append(ch) + continue + + if ch == "," and depth == 0: + args.append("".join(current).strip()) + current = [] + continue + + current.append(ch) + + tail = "".join(current).strip() + if tail: + args.append(tail) + + return args + + +def unescape_c_string(token: str): + token = token.strip() + if len(token) < 2 or token[0] != '"' or token[-1] != '"': + return None + inner = token[1:-1] + try: + return codecs.decode(inner, "unicode_escape") + except Exception: + return inner + + +def resolve_macro_value(name: str, defines: dict): + if name not in defines: + return None + value = str(defines[name]).strip() + string_value = unescape_c_string(value) + return string_value if string_value is not None else value + + +def resolve_token_string(token: str, defines: dict): + token = token.strip() + if token in ("NULL", "null"): + return None + string_value = unescape_c_string(token) + if string_value is not None: + return string_value + + match = re.match(r"^DD_CFG_EXPSTR\((.+)\)$", token) + if match: + inner = match.group(1).strip() + macro_value = resolve_macro_value(inner, defines) + return macro_value if macro_value is not None else inner + + match = re.match(r"^DD_CFG_STR\((.+)\)$", token) + if match: + return match.group(1).strip() + + if token in defines: + return resolve_macro_value(token, defines) + + return token + + +def resolve_default_token(token: str, defines: dict): + value = resolve_token_string(token, defines) + if value is None: + return None + return str(value) + + +def resolve_alias_token(token: str, defines: dict): + value = resolve_token_string(token, defines) + if value is None: + return None + return str(value) + + +def normalize_aliases(aliases: list, canonical: str) -> list: + filtered = {} + for alias in aliases: + if alias is None: + continue + alias = alias.strip() + if not alias or alias == canonical: + continue + filtered[alias] = True + result = sorted(filtered.keys()) + return result + + +def map_type(type_name: str) -> str: + type_name = type_name.strip() + match = re.match(r"^CUSTOM\((.+)\)$", type_name) + if match: + type_name = match.group(1).strip() + + if type_name == "BOOL": + return "boolean" + if type_name == "STRING": + return "string" + if type_name == "INT": + return "int" + if type_name == "DOUBLE": + return "decimal" + if type_name in ("MAP", "JSON", "SET_OR_MAP_LOWERCASE"): + return "map" + if type_name in ("SET", "SET_LOWERCASE"): + return "array" + return "string" + + +def entry_from_config(type_name: str, name: str, default_token: str, aliases: list, defines: dict) -> dict: + return { + "version": "A", + "type": map_type(type_name), + "default": resolve_default_token(default_token, defines), + "aliases": normalize_aliases(aliases, name), + } + + +def parse_config_macro_entries(macro_body: str, defines: dict) -> dict: + entries = {} + for call_args in extract_macro_calls(macro_body, "CONFIG"): + args = split_args(call_args) + if len(args) < 3: + continue + type_name, name, default_token = args[0], args[1], args[2] + entries[name] = entry_from_config(type_name, name, default_token, [], defines) + + for call_args in extract_macro_calls(macro_body, "CALIAS"): + args = split_args(call_args) + if len(args) < 4: + continue + type_name, name, default_token, aliases_arg = args[0], args[1], args[2], args[3] + aliases = [] + match = re.match(r"^CALIASES\((.*)\)$", aliases_arg.strip()) + if match: + for alias_token in split_args(match.group(1)): + aliases.append(resolve_alias_token(alias_token, defines)) + entries[name] = entry_from_config(type_name, name, default_token, aliases, defines) + + return entries + + +def parse_integrations(defines: dict) -> dict: + contents = read_file(INTEGRATIONS_PATH) + contents = normalize_line_endings(strip_line_continuations(contents)) + macro_body = None + + for line in contents.split("\n"): + trimmed = line.strip() + match = re.match(r"^#\s*define\s+DD_INTEGRATIONS\s+(.*)$", trimmed) + if match: + macro_body = match.group(1).strip() + break + + if macro_body is None: + return {} + + integrations = {} + for call_args in extract_macro_calls(macro_body, "INTEGRATION_CUSTOM_ENABLED"): + args = split_args(call_args) + if not args: + continue + integrations[args[0]] = [args[0]] + + for call_args in extract_macro_calls(macro_body, "INTEGRATION"): + args = split_args(call_args) + if not args: + continue + integrations[args[0]] = args + + entries = {} + analytics_default = resolve_default_token( + "DD_CFG_EXPSTR(DD_INTEGRATION_ANALYTICS_ENABLED_DEFAULT)", defines + ) + sample_rate_default = resolve_default_token( + "DD_CFG_EXPSTR(DD_INTEGRATION_ANALYTICS_SAMPLE_RATE_DEFAULT)", defines + ) + + for integration_id, args in integrations.items(): + extra_args = args[1:] + default_token = '"true"' + aliases = [] + if len(extra_args) >= 2: + default_token = extra_args[1] + for extra in extra_args[2:]: + match = re.match(r"^CALIASES\((.*)\)$", extra.strip()) + if match: + for alias_token in split_args(match.group(1)): + aliases.append(resolve_alias_token(alias_token, defines)) + + name = f"DD_TRACE_{integration_id}_ENABLED" + entries[name] = entry_from_config("BOOL", name, default_token, aliases, defines) + + analytics_name = f"DD_TRACE_{integration_id}_ANALYTICS_ENABLED" + analytics_alias = f"DD_{integration_id}_ANALYTICS_ENABLED" + entries[analytics_name] = entry_from_config( + "BOOL", analytics_name, analytics_default, [analytics_alias], defines + ) + + sample_rate_name = f"DD_TRACE_{integration_id}_ANALYTICS_SAMPLE_RATE" + sample_rate_alias = f"DD_{integration_id}_ANALYTICS_SAMPLE_RATE" + entries[sample_rate_name] = entry_from_config( + "DOUBLE", sample_rate_name, sample_rate_default, [sample_rate_alias], defines + ) + + return entries + + +def build_defines(): + defines = {} + defined = set() + + php_version = os.getenv("PHP_VERSION_ID", "0").strip() + if php_version: + defines["PHP_VERSION_ID"] = php_version + defined.add("PHP_VERSION_ID") + + if sys.platform.startswith("win") or os.getenv("DDTRACE_DEFINE__WIN32") == "1": + defines["_WIN32"] = "1" + defined.add("_WIN32") + + if os.getenv("DDTRACE_DEFINE__BUILD_FROM_PECL_") == "1": + defines["_BUILD_FROM_PECL_"] = "1" + defined.add("_BUILD_FROM_PECL_") + + if os.getenv("DDTRACE_DEFINE__SANITIZE_ADDRESS__") == "1": + defines["__SANITIZE_ADDRESS__"] = "1" + defined.add("__SANITIZE_ADDRESS__") + + return defines, defined + + +def merge_supported_configurations(output: dict, generated: dict): + output.setdefault("supportedConfigurations", {}) + output.setdefault("deprecations", {}) + output.setdefault("version", "2") + + existing_supported = output.get("supportedConfigurations", {}) + new_supported = {} + for name, entry_list in generated.items(): + generated_entry = entry_list[0] + existing_entries = existing_supported.get(name, []) + if not isinstance(existing_entries, list): + existing_entries = [] + updated = False + for idx, existing_entry in enumerate(existing_entries): + if isinstance(existing_entry, dict) and existing_entry.get("version") == "A": + existing_entries[idx] = generated_entry + updated = True + break + if not updated: + existing_entries.append(generated_entry) + new_supported[name] = existing_entries + + output["supportedConfigurations"] = {k: new_supported[k] for k in sorted(new_supported)} + + for name, entries in output["supportedConfigurations"].items(): + if not isinstance(entries, list): + continue + for entry in entries: + if isinstance(entry, dict) and isinstance(entry.get("aliases"), list): + entry["aliases"] = normalize_aliases(entry["aliases"], name) + + +def main(): + try: + if not CONFIG_PATH.exists(): + print(f"Error: configuration header not found at {CONFIG_PATH}", file=sys.stderr) + return 1 + if not INTEGRATIONS_PATH.exists(): + print(f"Error: integrations header not found at {INTEGRATIONS_PATH}", file=sys.stderr) + return 1 + + config_contents = read_file(CONFIG_PATH) + predefined_defines, predefined_defined = build_defines() + defines, defined, macro_bodies = preprocess_defines( + config_contents, predefined_defines, predefined_defined + ) + + if "DD_CONFIGURATION_ALL" not in macro_bodies and "DD_CONFIGURATION" not in macro_bodies: + print("Error: no DD_CONFIGURATION macros found in configuration header", file=sys.stderr) + return 1 + + entries = {} + if "DD_CONFIGURATION_ALL" in macro_bodies: + entries.update(parse_config_macro_entries(macro_bodies["DD_CONFIGURATION_ALL"], defines)) + if "DD_CONFIGURATION" in macro_bodies: + entries.update(parse_config_macro_entries(macro_bodies["DD_CONFIGURATION"], defines)) + + entries.update(parse_integrations(defines)) + + supported = {} + for name, entry in entries.items(): + if not name.startswith("DD_"): + continue + supported[name] = [entry] + + if not supported: + print("Error: no supported configurations were generated", file=sys.stderr) + return 1 + + sorted_supported = {k: supported[k] for k in sorted(supported)} + output = { + "version": "2", + "supportedConfigurations": sorted_supported, + "deprecations": {}, + } + + if OUTPUT_PATH.exists(): + try: + existing = json.loads(OUTPUT_PATH.read_text(encoding="utf-8")) + except json.JSONDecodeError: + print(f"Error: existing {OUTPUT_PATH} is not valid JSON", file=sys.stderr) + return 1 + if isinstance(existing, dict): + output = existing + merge_supported_configurations(output, sorted_supported) + else: + merge_supported_configurations(output, sorted_supported) + + OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True) + json_text = json.dumps(output, indent=2) + OUTPUT_PATH.write_text(json_text + "\n", encoding="utf-8") + print(f"Wrote supported configurations to {OUTPUT_PATH}") + return 0 + except OSError as exc: + print(f"Error: {exc}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) From 63f38bbc927e13f02c47c8dfd8eec0005efb4621 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Wed, 4 Feb 2026 21:06:50 +0100 Subject: [PATCH 02/12] fixup! --- .../supported_configurations_sync.yml | 1 - metadata/supported-configurations.json | 1151 +++++++---------- tooling/generate-supported-configurations.py | 23 +- 3 files changed, 496 insertions(+), 679 deletions(-) diff --git a/.github/workflows/supported_configurations_sync.yml b/.github/workflows/supported_configurations_sync.yml index a0a01d6fe0..547b179754 100644 --- a/.github/workflows/supported_configurations_sync.yml +++ b/.github/workflows/supported_configurations_sync.yml @@ -1,7 +1,6 @@ name: Validate supported configurations on: - pull_request: push: jobs: diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 9d9a70b14e..52439ec2bf 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -3,511 +3,448 @@ "supportedConfigurations": { "DD_AGENT_HOST": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_API_KEY": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_APM_TRACING_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_APPSEC_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_APPSEC_RASP_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_APPSEC_SCA_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_AUTOFINISH_SPANS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_AUTOLOAD_NO_COMPILE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_CODE_ORIGIN_FOR_SPANS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_CODE_ORIGIN_MAX_USER_FRAMES": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "8", - "aliases": [] + "default": "8" } ], "DD_CRASHTRACKING_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_DBM_PROPAGATION_MODE": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "disabled", - "aliases": [] + "default": "disabled" } ], "DD_DISTRIBUTED_TRACING": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_DOGSTATSD_HOST": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_DOGSTATSD_PORT": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "8125", - "aliases": [] + "default": "8125" } ], "DD_DOGSTATSD_URL": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_DYNAMIC_INSTRUMENTATION_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_DYNAMIC_INSTRUMENTATION_REDACTED_TYPES": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_ENV": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_EXCEPTION_REPLAY_CAPTURE_INTERVAL_SECONDS": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "3600", - "aliases": [] + "default": "3600" } ], "DD_EXCEPTION_REPLAY_CAPTURE_MAX_FRAMES": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "-1", - "aliases": [] + "default": "-1" } ], "DD_EXCEPTION_REPLAY_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_GIT_COMMIT_SHA": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_GIT_REPOSITORY_URL": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_HOSTNAME": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_HTTP_SERVER_ROUTE_BASED_NAMING": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_INJECT_FORCE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_INSTRUMENTATION_TELEMETRY_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_INTEGRATION_METRICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_LOG_BACKTRACE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_METRICS_OTEL_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_OPENAI_LOGS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_OPENAI_LOG_PROMPT_COMPLETION_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", - "default": "0.1", - "aliases": [] + "default": "0.1" } ], "DD_OPENAI_METRICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_OPENAI_SERVICE": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_OPENAI_SPAN_CHAR_LIMIT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "128", - "aliases": [] + "default": "128" } ], "DD_OPENAI_SPAN_PROMPT_COMPLETION_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", - "default": "1.0", - "aliases": [] + "default": "1.0" } ], "DD_REMOTE_CONFIG_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS": [ { - "version": "A", + "implementation": "A", "type": "decimal", - "default": "5", - "aliases": [] + "default": "5" } ], "DD_SERVICE": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_SERVICE_MAPPING": [ { - "version": "A", + "implementation": "A", "type": "map", - "default": "", - "aliases": [] + "default": "" } ], "DD_SPAN_SAMPLING_RULES": [ { - "version": "A", + "implementation": "A", "type": "map", - "default": "[]", - "aliases": [] + "default": "[]" } ], "DD_SPAN_SAMPLING_RULES_FILE": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TAGS": [ { - "version": "A", + "implementation": "A", "type": "map", - "default": "", - "aliases": [] + "default": "" } ], "DD_TELEMETRY_HEARTBEAT_INTERVAL": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "60", - "aliases": [] + "default": "60" } ], "DD_TELEMETRY_LOG_COLLECTION_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_AGENTLESS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_AGENT_CONNECT_TIMEOUT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "100", - "aliases": [] + "default": "100" } ], "DD_TRACE_AGENT_DEBUG_VERBOSE_CURL": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_AGENT_FLUSH_AFTER_N_REQUESTS": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "0", - "aliases": [] + "default": "0" } ], "DD_TRACE_AGENT_FLUSH_INTERVAL": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "1001", - "aliases": [] + "default": "1001" } ], "DD_TRACE_AGENT_MAX_PAYLOAD_SIZE": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "52428800", - "aliases": [] + "default": "52428800" } ], "DD_TRACE_AGENT_PORT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "0", - "aliases": [] + "default": "0" } ], "DD_TRACE_AGENT_RETRIES": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "0", - "aliases": [] + "default": "0" } ], "DD_TRACE_AGENT_STACK_BACKLOG": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "12", - "aliases": [] + "default": "12" } ], "DD_TRACE_AGENT_STACK_INITIAL_SIZE": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "131072", - "aliases": [] + "default": "131072" } ], "DD_TRACE_AGENT_TEST_SESSION_TOKEN": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_AGENT_TIMEOUT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "500", - "aliases": [] + "default": "500" } ], "DD_TRACE_AGENT_URL": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_AMQP_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -517,7 +454,7 @@ ], "DD_TRACE_AMQP_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -527,95 +464,84 @@ ], "DD_TRACE_AMQP_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_APPEND_TRACE_IDS_TO_LOGS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_AUTO_FLUSH_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_BAGGAGE_MAX_BYTES": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "8192", - "aliases": [] + "default": "8192" } ], "DD_TRACE_BAGGAGE_MAX_ITEMS": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "64", - "aliases": [] + "default": "64" } ], "DD_TRACE_BAGGAGE_TAG_KEYS": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "user.id,session.id,account.id", - "aliases": [] + "default": "user.id,session.id,account.id" } ], "DD_TRACE_BETA_HIGH_MEMORY_PRESSURE_PERCENT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "80", - "aliases": [] + "default": "80" } ], "DD_TRACE_BGS_CONNECT_TIMEOUT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "2000", - "aliases": [] + "default": "2000" } ], "DD_TRACE_BGS_TIMEOUT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "5000", - "aliases": [] + "default": "5000" } ], "DD_TRACE_BUFFER_SIZE": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "2097152", - "aliases": [] + "default": "2097152" } ], "DD_TRACE_CAKEPHP_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -625,7 +551,7 @@ ], "DD_TRACE_CAKEPHP_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -635,39 +561,35 @@ ], "DD_TRACE_CAKEPHP_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_CLIENT_IP_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_CLIENT_IP_HEADER": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_CLI_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_CODEIGNITER_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -677,7 +599,7 @@ ], "DD_TRACE_CODEIGNITER_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -687,15 +609,14 @@ ], "DD_TRACE_CODEIGNITER_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_CURL_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -705,7 +626,7 @@ ], "DD_TRACE_CURL_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -715,47 +636,42 @@ ], "DD_TRACE_CURL_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_DB_CLIENT_SPLIT_BY_INSTANCE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_DEBUG": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_DEBUG_CURL_OUTPUT": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_DEBUG_PRNG_SEED": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "-1", - "aliases": [] + "default": "-1" } ], "DD_TRACE_DRUPAL_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -765,7 +681,7 @@ ], "DD_TRACE_DRUPAL_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -775,15 +691,14 @@ ], "DD_TRACE_DRUPAL_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_ELASTICSEARCH_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -793,7 +708,7 @@ ], "DD_TRACE_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -803,15 +718,14 @@ ], "DD_TRACE_ELASTICSEARCH_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_ELOQUENT_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -821,7 +735,7 @@ ], "DD_TRACE_ELOQUENT_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -831,23 +745,21 @@ ], "DD_TRACE_ELOQUENT_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_EXEC_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -857,7 +769,7 @@ ], "DD_TRACE_EXEC_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -867,15 +779,14 @@ ], "DD_TRACE_EXEC_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_FILESYSTEM_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -885,7 +796,7 @@ ], "DD_TRACE_FILESYSTEM_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -895,55 +806,49 @@ ], "DD_TRACE_FILESYSTEM_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_FLUSH_COLLECT_CYCLES": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_FORCE_FLUSH_ON_SHUTDOWN": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_FORCE_FLUSH_ON_SIGINT": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_FORCE_FLUSH_ON_SIGTERM": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_FORKED_PROCESS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_FRANKENPHP_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -953,7 +858,7 @@ ], "DD_TRACE_FRANKENPHP_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -963,31 +868,28 @@ ], "DD_TRACE_FRANKENPHP_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_GENERATE_ROOT_SPAN": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_GIT_METADATA_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_GOOGLESPANNER_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -997,7 +899,7 @@ ], "DD_TRACE_GOOGLESPANNER_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1007,15 +909,14 @@ ], "DD_TRACE_GOOGLESPANNER_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_GUZZLE_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1025,7 +926,7 @@ ], "DD_TRACE_GUZZLE_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1035,47 +936,42 @@ ], "DD_TRACE_GUZZLE_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_HEADER_TAGS": [ { - "version": "A", - "type": "array", - "default": "", - "aliases": [] + "implementation": "A", + "type": "map", + "default": "" } ], "DD_TRACE_HEALTH_METRICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_HEALTH_METRICS_HEARTBEAT_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", - "default": "0.001", - "aliases": [] + "default": "0.001" } ], "DD_TRACE_HOOK_LIMIT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "100", - "aliases": [] + "default": "100" } ], "DD_TRACE_HTTPSTREAM_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1085,7 +981,7 @@ ], "DD_TRACE_HTTPSTREAM_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1095,71 +991,63 @@ ], "DD_TRACE_HTTPSTREAM_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "500-599", - "aliases": [] + "default": "500-599" } ], "DD_TRACE_HTTP_CLIENT_SPLIT_BY_DOMAIN": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_HTTP_POST_DATA_PARAM_ALLOWED": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_HTTP_SERVER_ERROR_STATUSES": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "500-599", - "aliases": [] + "default": "500-599" } ], "DD_TRACE_HTTP_URL_QUERY_PARAM_ALLOWED": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "*", - "aliases": [] + "default": "*" } ], "DD_TRACE_IGNORE_AGENT_SAMPLING_RATES": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_KAFKA_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1169,7 +1057,7 @@ ], "DD_TRACE_KAFKA_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1179,23 +1067,21 @@ ], "DD_TRACE_KAFKA_DISTRIBUTED_TRACING": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_KAFKA_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_LAMINAS_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1205,7 +1091,7 @@ ], "DD_TRACE_LAMINAS_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1215,15 +1101,14 @@ ], "DD_TRACE_LAMINAS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_LARAVELQUEUE_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1233,7 +1118,7 @@ ], "DD_TRACE_LARAVELQUEUE_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1243,15 +1128,14 @@ ], "DD_TRACE_LARAVELQUEUE_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_LARAVEL_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1261,7 +1145,7 @@ ], "DD_TRACE_LARAVEL_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1271,23 +1155,21 @@ ], "DD_TRACE_LARAVEL_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_LARAVEL_QUEUE_DISTRIBUTED_TRACING": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_LOGS_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1297,7 +1179,7 @@ ], "DD_TRACE_LOGS_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1307,7 +1189,7 @@ ], "DD_TRACE_LOGS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "true", "aliases": [ @@ -1317,23 +1199,21 @@ ], "DD_TRACE_LOG_FILE": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_LOG_LEVEL": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "error", - "aliases": [] + "default": "error" } ], "DD_TRACE_LUMEN_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1343,7 +1223,7 @@ ], "DD_TRACE_LUMEN_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1353,15 +1233,14 @@ ], "DD_TRACE_LUMEN_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MAGENTO_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1371,7 +1250,7 @@ ], "DD_TRACE_MAGENTO_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1381,31 +1260,28 @@ ], "DD_TRACE_MAGENTO_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MEASURE_COMPILE_TIME": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MEASURE_PEAK_MEMORY_USAGE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MEMCACHED_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1415,7 +1291,7 @@ ], "DD_TRACE_MEMCACHED_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1425,23 +1301,21 @@ ], "DD_TRACE_MEMCACHED_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MEMCACHED_OBFUSCATION": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MEMCACHE_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1451,7 +1325,7 @@ ], "DD_TRACE_MEMCACHE_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1461,23 +1335,21 @@ ], "DD_TRACE_MEMCACHE_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MEMORY_LIMIT": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_MONGODB_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1487,7 +1359,7 @@ ], "DD_TRACE_MONGODB_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1497,23 +1369,21 @@ ], "DD_TRACE_MONGODB_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MONGODB_OBFUSCATION": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MONGO_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1523,7 +1393,7 @@ ], "DD_TRACE_MONGO_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1533,15 +1403,14 @@ ], "DD_TRACE_MONGO_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_MYSQLI_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1551,7 +1420,7 @@ ], "DD_TRACE_MYSQLI_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1561,15 +1430,14 @@ ], "DD_TRACE_MYSQLI_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_NETTE_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1579,7 +1447,7 @@ ], "DD_TRACE_NETTE_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1589,31 +1457,28 @@ ], "DD_TRACE_NETTE_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "(?i)(?:(?:\"|%22)?)(?:(?:old[-_]?|new[-_]?)?p(?:ass)?w(?:or)?d(?:1|2)?|pass(?:[-_]?phrase)?|secret|(?:api[-_]?|private[-_]?|public[-_]?|access[-_]?|secret[-_]?|app(?:lication)?[-_]?)key(?:[-_]?id)?|token|consumer[-_]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\\s|%20)*(?:=|%3D)[^&]+|(?:\"|%22)(?:\\s|%20)*(?::|%3A)(?:\\s|%20)*(?:\"|%22)(?:%2[^2]|%[^2]|[^\"%])+(?:\"|%22))|(?:bearer(?:\\s|%20)+[a-z0-9._\\-]+|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\\w=-]|%3D)+\\.ey[I-L](?:[\\w=-]|%3D)+(?:\\.(?:[\\w.+/=-]|%3D|%2F|%2B)+)?|-{5}BEGIN(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY-{5}[^\\-]+-{5}END(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY(?:-{5})?(?:\\n|%0A)?|(?:ssh-(?:rsa|dss)|ecdsa-[a-z0-9]+-[a-z0-9]+)(?:\\s|%20|%09)+(?:[a-z0-9/.+]|%2F|%5C|%2B){100,}(?:=|%3D)*(?:(?:\\s|%20|%09)+[a-z0-9._-]+)?)", - "aliases": [] + "default": "(?i)(?:(?:\"|%22)?)(?:(?:old[-_]?|new[-_]?)?p(?:ass)?w(?:or)?d(?:1|2)?|pass(?:[-_]?phrase)?|secret|(?:api[-_]?|private[-_]?|public[-_]?|access[-_]?|secret[-_]?|app(?:lication)?[-_]?)key(?:[-_]?id)?|token|consumer[-_]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\\s|%20)*(?:=|%3D)[^&]+|(?:\"|%22)(?:\\s|%20)*(?::|%3A)(?:\\s|%20)*(?:\"|%22)(?:%2[^2]|%[^2]|[^\"%])+(?:\"|%22))|(?:bearer(?:\\s|%20)+[a-z0-9._\\-]+|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\\w=-]|%3D)+\\.ey[I-L](?:[\\w=-]|%3D)+(?:\\.(?:[\\w.+/=-]|%3D|%2F|%2B)+)?|-{5}BEGIN(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY-{5}[^\\-]+-{5}END(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY(?:-{5})?(?:\\n|%0A)?|(?:ssh-(?:rsa|dss)|ecdsa-[a-z0-9]+-[a-z0-9]+)(?:\\s|%20|%09)+(?:[a-z0-9/.+]|%2F|%5C|%2B){100,}(?:=|%3D)*(?:(?:\\s|%20|%09)+[a-z0-9._-]+)?)" } ], "DD_TRACE_ONCE_LOGS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_OPENAI_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1623,7 +1488,7 @@ ], "DD_TRACE_OPENAI_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1633,23 +1498,21 @@ ], "DD_TRACE_OPENAI_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_OTEL_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_PCNTL_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1659,7 +1522,7 @@ ], "DD_TRACE_PCNTL_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1669,15 +1532,14 @@ ], "DD_TRACE_PCNTL_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_PDO_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1687,7 +1549,7 @@ ], "DD_TRACE_PDO_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1697,31 +1559,28 @@ ], "DD_TRACE_PDO_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_PEER_SERVICE_MAPPING": [ { - "version": "A", + "implementation": "A", "type": "map", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_PHPREDIS_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1731,7 +1590,7 @@ ], "DD_TRACE_PHPREDIS_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1741,15 +1600,14 @@ ], "DD_TRACE_PHPREDIS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_PREDIS_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1759,7 +1617,7 @@ ], "DD_TRACE_PREDIS_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1769,55 +1627,49 @@ ], "DD_TRACE_PREDIS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_PROPAGATE_SERVICE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_PROPAGATE_USER_ID_DEFAULT": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_PROPAGATION_STYLE": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "datadog,tracecontext,baggage", - "aliases": [] + "default": "datadog,tracecontext,baggage" } ], "DD_TRACE_PROPAGATION_STYLE_EXTRACT": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "datadog,tracecontext,B3,B3 single header,baggage", - "aliases": [] + "default": "datadog,tracecontext,B3,B3 single header,baggage" } ], "DD_TRACE_PROPAGATION_STYLE_INJECT": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "datadog,tracecontext,baggage", - "aliases": [] + "default": "datadog,tracecontext,baggage" } ], "DD_TRACE_PSR18_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1827,7 +1679,7 @@ ], "DD_TRACE_PSR18_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1837,15 +1689,14 @@ ], "DD_TRACE_PSR18_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_RATCHET_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1855,7 +1706,7 @@ ], "DD_TRACE_RATCHET_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -1865,127 +1716,112 @@ ], "DD_TRACE_RATCHET_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_RATE_LIMIT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "100", - "aliases": [] + "default": "100" } ], "DD_TRACE_REDIS_CLIENT_SPLIT_BY_HOST": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_REMOVE_AUTOINSTRUMENTATION_ORPHANS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_REMOVE_ROOT_SPAN_LARAVEL_QUEUE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_REMOVE_ROOT_SPAN_SYMFONY_MESSENGER": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_REPORT_HOSTNAME": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_RESOURCE_RENAMING_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_RESOURCE_URI_FRAGMENT_REGEX": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_RESOURCE_URI_MAPPING_INCOMING": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_RESOURCE_URI_MAPPING_OUTGOING": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_RESOURCE_URI_QUERY_PARAM_ALLOWED": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_RETAIN_THREAD_CAPABILITIES": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_ROADRUNNER_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -1995,7 +1831,7 @@ ], "DD_TRACE_ROADRUNNER_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2005,55 +1841,49 @@ ], "DD_TRACE_ROADRUNNER_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", - "default": "-1", - "aliases": [] + "default": "-1" } ], "DD_TRACE_SAMPLING_RULES": [ { - "version": "A", + "implementation": "A", "type": "map", - "default": "[]", - "aliases": [] + "default": "[]" } ], "DD_TRACE_SAMPLING_RULES_FORMAT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "glob", - "aliases": [] + "default": "glob" } ], "DD_TRACE_SHUTDOWN_TIMEOUT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "5000", - "aliases": [] + "default": "5000" } ], "DD_TRACE_SIDECAR_TRACE_SENDER": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_SLIM_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2063,7 +1893,7 @@ ], "DD_TRACE_SLIM_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2073,31 +1903,28 @@ ], "DD_TRACE_SLIM_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SOURCES_PATH": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_SPANS_LIMIT": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "1000", - "aliases": [] + "default": "1000" } ], "DD_TRACE_SQLSRV_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2107,7 +1934,7 @@ ], "DD_TRACE_SQLSRV_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2117,23 +1944,21 @@ ], "DD_TRACE_SQLSRV_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_STARTUP_LOGS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SWOOLE_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2143,7 +1968,7 @@ ], "DD_TRACE_SWOOLE_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2153,15 +1978,14 @@ ], "DD_TRACE_SWOOLE_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SYMFONYMESSENGER_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2171,7 +1995,7 @@ ], "DD_TRACE_SYMFONYMESSENGER_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2181,15 +2005,14 @@ ], "DD_TRACE_SYMFONYMESSENGER_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SYMFONY_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2199,7 +2022,7 @@ ], "DD_TRACE_SYMFONY_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2209,87 +2032,77 @@ ], "DD_TRACE_SYMFONY_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SYMFONY_HTTP_ROUTE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SYMFONY_MESSENGER_DISTRIBUTED_TRACING": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_SYMFONY_MESSENGER_MIDDLEWARES": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "false", - "aliases": [] + "default": "false" } ], "DD_TRACE_TRACED_INTERNAL_FUNCTIONS": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_URL_AS_RESOURCE_NAMES_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WARN_LEGACY_DD_TRACE": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WEBSOCKET_MESSAGES_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WEB_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2299,7 +2112,7 @@ ], "DD_TRACE_WEB_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2309,23 +2122,21 @@ ], "DD_TRACE_WEB_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WORDPRESS_ADDITIONAL_ACTIONS": [ { - "version": "A", + "implementation": "A", "type": "array", - "default": "", - "aliases": [] + "default": "" } ], "DD_TRACE_WORDPRESS_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2335,7 +2146,7 @@ ], "DD_TRACE_WORDPRESS_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2345,31 +2156,28 @@ ], "DD_TRACE_WORDPRESS_CALLBACKS": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_WORDPRESS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH": [ { - "version": "A", + "implementation": "A", "type": "int", - "default": "512", - "aliases": [] + "default": "512" } ], "DD_TRACE_YII_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2379,7 +2187,7 @@ ], "DD_TRACE_YII_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2389,15 +2197,14 @@ ], "DD_TRACE_YII_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_TRACE_ZENDFRAMEWORK_ANALYTICS_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", "default": "false", "aliases": [ @@ -2407,7 +2214,7 @@ ], "DD_TRACE_ZENDFRAMEWORK_ANALYTICS_SAMPLE_RATE": [ { - "version": "A", + "implementation": "A", "type": "decimal", "default": "1", "aliases": [ @@ -2417,18 +2224,16 @@ ], "DD_TRACE_ZENDFRAMEWORK_ENABLED": [ { - "version": "A", + "implementation": "A", "type": "boolean", - "default": "true", - "aliases": [] + "default": "true" } ], "DD_VERSION": [ { - "version": "A", + "implementation": "A", "type": "string", - "default": "", - "aliases": [] + "default": "" } ] }, diff --git a/tooling/generate-supported-configurations.py b/tooling/generate-supported-configurations.py index f7acf11d3f..5c567d6bea 100644 --- a/tooling/generate-supported-configurations.py +++ b/tooling/generate-supported-configurations.py @@ -342,12 +342,15 @@ def map_type(type_name: str) -> str: def entry_from_config(type_name: str, name: str, default_token: str, aliases: list, defines: dict) -> dict: - return { - "version": "A", + entry = { + "implementation": "A", "type": map_type(type_name), "default": resolve_default_token(default_token, defines), - "aliases": normalize_aliases(aliases, name), } + normalized_aliases = normalize_aliases(aliases, name) + if normalized_aliases: + entry["aliases"] = normalized_aliases + return entry def parse_config_macro_entries(macro_body: str, defines: dict) -> dict: @@ -476,9 +479,15 @@ def merge_supported_configurations(output: dict, generated: dict): existing_entries = existing_supported.get(name, []) if not isinstance(existing_entries, list): existing_entries = [] + normalized_entries = [] + for existing_entry in existing_entries: + if isinstance(existing_entry, dict) and "implementation" not in existing_entry and "version" in existing_entry: + existing_entry["implementation"] = existing_entry.pop("version") + normalized_entries.append(existing_entry) + existing_entries = normalized_entries updated = False for idx, existing_entry in enumerate(existing_entries): - if isinstance(existing_entry, dict) and existing_entry.get("version") == "A": + if isinstance(existing_entry, dict) and existing_entry.get("implementation") == "A": existing_entries[idx] = generated_entry updated = True break @@ -493,7 +502,11 @@ def merge_supported_configurations(output: dict, generated: dict): continue for entry in entries: if isinstance(entry, dict) and isinstance(entry.get("aliases"), list): - entry["aliases"] = normalize_aliases(entry["aliases"], name) + normalized_aliases = normalize_aliases(entry["aliases"], name) + if normalized_aliases: + entry["aliases"] = normalized_aliases + else: + entry.pop("aliases", None) def main(): From 0843ca35d88af965f26a3c74adda33160d72e5de Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Thu, 12 Feb 2026 10:14:39 +0100 Subject: [PATCH 03/12] fixup! use shell script + handle OTEL_ --- .../supported_configurations_sync.yml | 4 +- metadata/supported-configurations.json | 56 ++ tooling/generate-supported-configurations.py | 579 ------------------ tooling/generate-supported-configurations.sh | 199 ++++++ 4 files changed, 257 insertions(+), 581 deletions(-) delete mode 100644 tooling/generate-supported-configurations.py create mode 100644 tooling/generate-supported-configurations.sh diff --git a/.github/workflows/supported_configurations_sync.yml b/.github/workflows/supported_configurations_sync.yml index 547b179754..50eb481800 100644 --- a/.github/workflows/supported_configurations_sync.yml +++ b/.github/workflows/supported_configurations_sync.yml @@ -19,10 +19,10 @@ jobs: - name: Verify supported configurations are in sync run: | - python3 tooling/generate-supported-configurations.py + bash tooling/generate-supported-configurations.sh if ! git diff --exit-code -- metadata/supported-configurations.json ext/configuration.h; then - echo "ERROR: @metadata/supported-configurations.json and @ext/configuration.h got out of sync. Please run tooling/generate-supported-configurations.py locally." + echo "ERROR: @metadata/supported-configurations.json got out of sync with implemented configurations. Please run tooling/generate-supported-configurations.sh locally." git --no-pager diff -- metadata/supported-configurations.json ext/configuration.h exit 1 fi diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 52439ec2bf..35f166f5cc 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -2235,6 +2235,62 @@ "type": "string", "default": "" } + ], + "OTEL_LOG_LEVEL": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_METRICS_EXPORTER": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_PROPAGATORS": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_RESOURCE_ATTRIBUTES": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_SERVICE_NAME": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_TRACES_EXPORTER": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_TRACES_SAMPLER": [ + { + "implementation": "A", + "type": "string", + "default": null + } + ], + "OTEL_TRACES_SAMPLER_ARG": [ + { + "implementation": "A", + "type": "string", + "default": null + } ] }, "deprecations": {} diff --git a/tooling/generate-supported-configurations.py b/tooling/generate-supported-configurations.py deleted file mode 100644 index 5c567d6bea..0000000000 --- a/tooling/generate-supported-configurations.py +++ /dev/null @@ -1,579 +0,0 @@ -#!/usr/bin/env python3 - -import codecs -import json -import os -import re -import sys -from pathlib import Path - - -REPO_ROOT = Path(__file__).resolve().parents[1] -CONFIG_PATH = REPO_ROOT / "ext" / "configuration.h" -INTEGRATIONS_PATH = REPO_ROOT / "ext" / "integrations" / "integrations.h" -OUTPUT_PATH = REPO_ROOT / "metadata" / "supported-configurations.json" - - -def read_file(path: Path) -> str: - try: - return path.read_text(encoding="utf-8") - except OSError: - print(f"Error: failed to read {path}", file=sys.stderr) - raise SystemExit(1) - - -def normalize_line_endings(contents: str) -> str: - return contents.replace("\r\n", "\n") - - -def strip_line_continuations(contents: str) -> str: - return re.sub(r"\\\r?\n", "", contents) - - -def eval_condition(expr: str, defines: dict, defined: set) -> bool: - expr = expr.strip() - if not expr: - return False - - expr = re.sub( - r"\bdefined\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)", - lambda m: "1" if m.group(1) in defined else "0", - expr, - ) - expr = expr.replace("&&", " and ").replace("||", " or ") - expr = re.sub(r"!\s*(?!=)", " not ", expr) - - def replace_ident(match: re.Match) -> str: - name = match.group(0) - if name in ("and", "or", "not"): - return name - if name == "true": - return "1" - if name == "false": - return "0" - if name in defines: - value = str(defines[name]).strip() - if value == "true": - return "1" - if value == "false": - return "0" - if re.fullmatch(r"-?\d+", value): - return value - return "0" - - expr = re.sub(r"\b[A-Za-z_][A-Za-z0-9_]*\b", replace_ident, expr) - - try: - return bool(eval(expr, {"__builtins__": {}}, {})) - except Exception: - return False - - -def preprocess_defines(contents: str, predefined_defines: dict, predefined_defined: set): - defines = dict(predefined_defines) - defined = set(predefined_defined) - macro_bodies = {} - - lines = normalize_line_endings(strip_line_continuations(contents)).split("\n") - stack = [] - active = True - - for line in lines: - trimmed = line.strip() - if not trimmed: - continue - - if re.match(r"^#\s*if\s+", trimmed): - condition = re.sub(r"^#\s*if\s+", "", trimmed) - cond_value = eval_condition(condition, defines, defined) - stack.append({"parent_active": active, "matched": cond_value, "active": cond_value}) - active = active and cond_value - continue - - match = re.match(r"^#\s*ifdef\s+([A-Za-z_][A-Za-z0-9_]*)$", trimmed) - if match: - cond_value = match.group(1) in defined - stack.append({"parent_active": active, "matched": cond_value, "active": cond_value}) - active = active and cond_value - continue - - match = re.match(r"^#\s*ifndef\s+([A-Za-z_][A-Za-z0-9_]*)$", trimmed) - if match: - cond_value = match.group(1) not in defined - stack.append({"parent_active": active, "matched": cond_value, "active": cond_value}) - active = active and cond_value - continue - - match = re.match(r"^#\s*elif\s+", trimmed) - if match and stack: - condition = re.sub(r"^#\s*elif\s+", "", trimmed) - state = stack.pop() - if not state["parent_active"] or state["matched"]: - state["active"] = False - else: - cond_value = eval_condition(condition, defines, defined) - state["active"] = cond_value - state["matched"] = cond_value - stack.append(state) - active = state["parent_active"] and state["active"] - continue - - if re.match(r"^#\s*else\b", trimmed): - if stack: - state = stack.pop() - if not state["parent_active"] or state["matched"]: - state["active"] = False - else: - state["active"] = True - state["matched"] = True - stack.append(state) - active = state["parent_active"] and state["active"] - continue - - if re.match(r"^#\s*endif\b", trimmed): - if stack: - state = stack.pop() - active = state["parent_active"] - continue - - if not active: - continue - - if re.match(r"^#\s*define\s+[A-Za-z_][A-Za-z0-9_]*\(", trimmed): - continue - - match = re.match(r"^#\s*define\s+(DD_CONFIGURATION(?:_ALL)?)\s+(.*)$", trimmed) - if match: - macro_bodies[match.group(1)] = match.group(2).strip() - continue - - match = re.match(r"^#\s*define\s+([A-Za-z_][A-Za-z0-9_]*)\s+(.*)$", trimmed) - if match: - name = match.group(1) - if not name.startswith("DD_CONFIGURATION"): - defines[name] = match.group(2).strip() - defined.add(name) - continue - - match = re.match(r"^#\s*undef\s+([A-Za-z_][A-Za-z0-9_]*)$", trimmed) - if match: - name = match.group(1) - defines.pop(name, None) - defined.discard(name) - - return defines, defined, macro_bodies - - -def extract_macro_calls(body: str, call_name: str) -> list: - calls = [] - needle = f"{call_name}(" - length = len(body) - offset = 0 - - while True: - pos = body.find(needle, offset) - if pos == -1: - break - i = pos + len(needle) - depth = 1 - in_string = False - escape = False - while i < length and depth > 0: - ch = body[i] - if in_string: - if escape: - escape = False - elif ch == "\\": - escape = True - elif ch == '"': - in_string = False - else: - if ch == '"': - in_string = True - elif ch == "(": - depth += 1 - elif ch == ")": - depth -= 1 - i += 1 - if depth != 0: - break - calls.append(body[pos + len(needle) : i - 1]) - offset = i - - return calls - - -def split_args(arg_string: str) -> list: - args = [] - current = [] - depth = 0 - in_string = False - escape = False - - for ch in arg_string: - if in_string: - current.append(ch) - if escape: - escape = False - elif ch == "\\": - escape = True - elif ch == '"': - in_string = False - continue - - if ch == '"': - in_string = True - current.append(ch) - continue - - if ch == "(": - depth += 1 - current.append(ch) - continue - - if ch == ")": - depth = max(0, depth - 1) - current.append(ch) - continue - - if ch == "," and depth == 0: - args.append("".join(current).strip()) - current = [] - continue - - current.append(ch) - - tail = "".join(current).strip() - if tail: - args.append(tail) - - return args - - -def unescape_c_string(token: str): - token = token.strip() - if len(token) < 2 or token[0] != '"' or token[-1] != '"': - return None - inner = token[1:-1] - try: - return codecs.decode(inner, "unicode_escape") - except Exception: - return inner - - -def resolve_macro_value(name: str, defines: dict): - if name not in defines: - return None - value = str(defines[name]).strip() - string_value = unescape_c_string(value) - return string_value if string_value is not None else value - - -def resolve_token_string(token: str, defines: dict): - token = token.strip() - if token in ("NULL", "null"): - return None - string_value = unescape_c_string(token) - if string_value is not None: - return string_value - - match = re.match(r"^DD_CFG_EXPSTR\((.+)\)$", token) - if match: - inner = match.group(1).strip() - macro_value = resolve_macro_value(inner, defines) - return macro_value if macro_value is not None else inner - - match = re.match(r"^DD_CFG_STR\((.+)\)$", token) - if match: - return match.group(1).strip() - - if token in defines: - return resolve_macro_value(token, defines) - - return token - - -def resolve_default_token(token: str, defines: dict): - value = resolve_token_string(token, defines) - if value is None: - return None - return str(value) - - -def resolve_alias_token(token: str, defines: dict): - value = resolve_token_string(token, defines) - if value is None: - return None - return str(value) - - -def normalize_aliases(aliases: list, canonical: str) -> list: - filtered = {} - for alias in aliases: - if alias is None: - continue - alias = alias.strip() - if not alias or alias == canonical: - continue - filtered[alias] = True - result = sorted(filtered.keys()) - return result - - -def map_type(type_name: str) -> str: - type_name = type_name.strip() - match = re.match(r"^CUSTOM\((.+)\)$", type_name) - if match: - type_name = match.group(1).strip() - - if type_name == "BOOL": - return "boolean" - if type_name == "STRING": - return "string" - if type_name == "INT": - return "int" - if type_name == "DOUBLE": - return "decimal" - if type_name in ("MAP", "JSON", "SET_OR_MAP_LOWERCASE"): - return "map" - if type_name in ("SET", "SET_LOWERCASE"): - return "array" - return "string" - - -def entry_from_config(type_name: str, name: str, default_token: str, aliases: list, defines: dict) -> dict: - entry = { - "implementation": "A", - "type": map_type(type_name), - "default": resolve_default_token(default_token, defines), - } - normalized_aliases = normalize_aliases(aliases, name) - if normalized_aliases: - entry["aliases"] = normalized_aliases - return entry - - -def parse_config_macro_entries(macro_body: str, defines: dict) -> dict: - entries = {} - for call_args in extract_macro_calls(macro_body, "CONFIG"): - args = split_args(call_args) - if len(args) < 3: - continue - type_name, name, default_token = args[0], args[1], args[2] - entries[name] = entry_from_config(type_name, name, default_token, [], defines) - - for call_args in extract_macro_calls(macro_body, "CALIAS"): - args = split_args(call_args) - if len(args) < 4: - continue - type_name, name, default_token, aliases_arg = args[0], args[1], args[2], args[3] - aliases = [] - match = re.match(r"^CALIASES\((.*)\)$", aliases_arg.strip()) - if match: - for alias_token in split_args(match.group(1)): - aliases.append(resolve_alias_token(alias_token, defines)) - entries[name] = entry_from_config(type_name, name, default_token, aliases, defines) - - return entries - - -def parse_integrations(defines: dict) -> dict: - contents = read_file(INTEGRATIONS_PATH) - contents = normalize_line_endings(strip_line_continuations(contents)) - macro_body = None - - for line in contents.split("\n"): - trimmed = line.strip() - match = re.match(r"^#\s*define\s+DD_INTEGRATIONS\s+(.*)$", trimmed) - if match: - macro_body = match.group(1).strip() - break - - if macro_body is None: - return {} - - integrations = {} - for call_args in extract_macro_calls(macro_body, "INTEGRATION_CUSTOM_ENABLED"): - args = split_args(call_args) - if not args: - continue - integrations[args[0]] = [args[0]] - - for call_args in extract_macro_calls(macro_body, "INTEGRATION"): - args = split_args(call_args) - if not args: - continue - integrations[args[0]] = args - - entries = {} - analytics_default = resolve_default_token( - "DD_CFG_EXPSTR(DD_INTEGRATION_ANALYTICS_ENABLED_DEFAULT)", defines - ) - sample_rate_default = resolve_default_token( - "DD_CFG_EXPSTR(DD_INTEGRATION_ANALYTICS_SAMPLE_RATE_DEFAULT)", defines - ) - - for integration_id, args in integrations.items(): - extra_args = args[1:] - default_token = '"true"' - aliases = [] - if len(extra_args) >= 2: - default_token = extra_args[1] - for extra in extra_args[2:]: - match = re.match(r"^CALIASES\((.*)\)$", extra.strip()) - if match: - for alias_token in split_args(match.group(1)): - aliases.append(resolve_alias_token(alias_token, defines)) - - name = f"DD_TRACE_{integration_id}_ENABLED" - entries[name] = entry_from_config("BOOL", name, default_token, aliases, defines) - - analytics_name = f"DD_TRACE_{integration_id}_ANALYTICS_ENABLED" - analytics_alias = f"DD_{integration_id}_ANALYTICS_ENABLED" - entries[analytics_name] = entry_from_config( - "BOOL", analytics_name, analytics_default, [analytics_alias], defines - ) - - sample_rate_name = f"DD_TRACE_{integration_id}_ANALYTICS_SAMPLE_RATE" - sample_rate_alias = f"DD_{integration_id}_ANALYTICS_SAMPLE_RATE" - entries[sample_rate_name] = entry_from_config( - "DOUBLE", sample_rate_name, sample_rate_default, [sample_rate_alias], defines - ) - - return entries - - -def build_defines(): - defines = {} - defined = set() - - php_version = os.getenv("PHP_VERSION_ID", "0").strip() - if php_version: - defines["PHP_VERSION_ID"] = php_version - defined.add("PHP_VERSION_ID") - - if sys.platform.startswith("win") or os.getenv("DDTRACE_DEFINE__WIN32") == "1": - defines["_WIN32"] = "1" - defined.add("_WIN32") - - if os.getenv("DDTRACE_DEFINE__BUILD_FROM_PECL_") == "1": - defines["_BUILD_FROM_PECL_"] = "1" - defined.add("_BUILD_FROM_PECL_") - - if os.getenv("DDTRACE_DEFINE__SANITIZE_ADDRESS__") == "1": - defines["__SANITIZE_ADDRESS__"] = "1" - defined.add("__SANITIZE_ADDRESS__") - - return defines, defined - - -def merge_supported_configurations(output: dict, generated: dict): - output.setdefault("supportedConfigurations", {}) - output.setdefault("deprecations", {}) - output.setdefault("version", "2") - - existing_supported = output.get("supportedConfigurations", {}) - new_supported = {} - for name, entry_list in generated.items(): - generated_entry = entry_list[0] - existing_entries = existing_supported.get(name, []) - if not isinstance(existing_entries, list): - existing_entries = [] - normalized_entries = [] - for existing_entry in existing_entries: - if isinstance(existing_entry, dict) and "implementation" not in existing_entry and "version" in existing_entry: - existing_entry["implementation"] = existing_entry.pop("version") - normalized_entries.append(existing_entry) - existing_entries = normalized_entries - updated = False - for idx, existing_entry in enumerate(existing_entries): - if isinstance(existing_entry, dict) and existing_entry.get("implementation") == "A": - existing_entries[idx] = generated_entry - updated = True - break - if not updated: - existing_entries.append(generated_entry) - new_supported[name] = existing_entries - - output["supportedConfigurations"] = {k: new_supported[k] for k in sorted(new_supported)} - - for name, entries in output["supportedConfigurations"].items(): - if not isinstance(entries, list): - continue - for entry in entries: - if isinstance(entry, dict) and isinstance(entry.get("aliases"), list): - normalized_aliases = normalize_aliases(entry["aliases"], name) - if normalized_aliases: - entry["aliases"] = normalized_aliases - else: - entry.pop("aliases", None) - - -def main(): - try: - if not CONFIG_PATH.exists(): - print(f"Error: configuration header not found at {CONFIG_PATH}", file=sys.stderr) - return 1 - if not INTEGRATIONS_PATH.exists(): - print(f"Error: integrations header not found at {INTEGRATIONS_PATH}", file=sys.stderr) - return 1 - - config_contents = read_file(CONFIG_PATH) - predefined_defines, predefined_defined = build_defines() - defines, defined, macro_bodies = preprocess_defines( - config_contents, predefined_defines, predefined_defined - ) - - if "DD_CONFIGURATION_ALL" not in macro_bodies and "DD_CONFIGURATION" not in macro_bodies: - print("Error: no DD_CONFIGURATION macros found in configuration header", file=sys.stderr) - return 1 - - entries = {} - if "DD_CONFIGURATION_ALL" in macro_bodies: - entries.update(parse_config_macro_entries(macro_bodies["DD_CONFIGURATION_ALL"], defines)) - if "DD_CONFIGURATION" in macro_bodies: - entries.update(parse_config_macro_entries(macro_bodies["DD_CONFIGURATION"], defines)) - - entries.update(parse_integrations(defines)) - - supported = {} - for name, entry in entries.items(): - if not name.startswith("DD_"): - continue - supported[name] = [entry] - - if not supported: - print("Error: no supported configurations were generated", file=sys.stderr) - return 1 - - sorted_supported = {k: supported[k] for k in sorted(supported)} - output = { - "version": "2", - "supportedConfigurations": sorted_supported, - "deprecations": {}, - } - - if OUTPUT_PATH.exists(): - try: - existing = json.loads(OUTPUT_PATH.read_text(encoding="utf-8")) - except json.JSONDecodeError: - print(f"Error: existing {OUTPUT_PATH} is not valid JSON", file=sys.stderr) - return 1 - if isinstance(existing, dict): - output = existing - merge_supported_configurations(output, sorted_supported) - else: - merge_supported_configurations(output, sorted_supported) - - OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True) - json_text = json.dumps(output, indent=2) - OUTPUT_PATH.write_text(json_text + "\n", encoding="utf-8") - print(f"Wrote supported configurations to {OUTPUT_PATH}") - return 0 - except OSError as exc: - print(f"Error: {exc}", file=sys.stderr) - return 1 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh new file mode 100644 index 0000000000..197bf5740b --- /dev/null +++ b/tooling/generate-supported-configurations.sh @@ -0,0 +1,199 @@ +#!/bin/bash +# Generates metadata/supported-configurations.json from ext/configuration.h +# +# DD_CONFIGURATION vs DD_CONFIGURATION_ALL: +# DD_CONFIGURATION_ALL - The macro that lists all CONFIG/CALIAS entries (lines 99-246 in configuration.h). +# DD_CONFIGURATION - The macro actually used in the C code. On non-Windows it expands to +# DD_TRACE_SIDECAR_TRACE_SENDER + DD_CONFIGURATION_ALL; on Windows it is just +# DD_CONFIGURATION_ALL. We use DD_CONFIGURATION so the preprocessor yields the +# full, platform-appropriate list. +# +set -euo pipefail + +cd "$(dirname "$0")" + +# Maps C config type to JSON schema type. +PHP_CODE=$(cat <<'ENDPHP' +function map_type($raw) { + $raw = trim($raw); + if (preg_match('/^CUSTOM\((.+)\)$/', $raw, $m)) { + $raw = trim($m[1]); + } + $map = [ + 'BOOL' => 'boolean', 'STRING' => 'string', 'INT' => 'int', 'DOUBLE' => 'decimal', + 'MAP' => 'map', 'JSON' => 'map', 'SET_OR_MAP_LOWERCASE' => 'map', + 'SET' => 'array', 'SET_LOWERCASE' => 'array', + ]; + return $map[$raw] ?? 'string'; +} + +function normalize_default($v, $type, $name) { + $v = preg_replace('/\s*ALT\s*$/', '', trim($v)); + if ($v === '"' || $v === '') { + return ''; + } + if (strtoupper($v) === 'NULL') { + return null; + } + if ($type === 'boolean') { + if ($v === '0') return 'false'; + if ($v === '1') return 'true'; + } + if ($name === 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP') { + $v = stripslashes($v); + } + return $v; +} + +function normalize_aliases($aliases, $canonical) { + $out = []; + foreach ($aliases as $a) { + $a = trim(preg_replace('/\s*ALT\s*$/', '', $a)); + if ($a !== '' && $a !== $canonical && $a !== 'ALT') { + $out[$a] = true; + } + } + return array_keys($out); +} + +function normalize_supported_entries($entries, $canonical) { + if (!is_array($entries)) { + return []; + } + $normalized = []; + foreach ($entries as $entry) { + if (!is_array($entry)) { + continue; + } + if (isset($entry["aliases"]) && is_array($entry["aliases"])) { + $aliases = normalize_aliases($entry["aliases"], $canonical); + if (!empty($aliases)) { + sort($aliases); + $entry["aliases"] = $aliases; + } else { + unset($entry["aliases"]); + } + } + $normalized[] = $entry; + } + return $normalized; +} + +$supported = []; +foreach (explode("|NEXT_CONFIG|", file_get_contents("php://stdin")) as $configLine) { + $config = str_getcsv(trim($configLine), ",", '"', '\\'); + if (count($config) < 3) { + continue; + } + [$type, $name, $default] = array_map('trim', array_slice($config, 0, 3)); + $aliases = count($config) > 3 ? array_slice($config, 3) : []; + $mappedType = map_type($type); + $entry = [ + "implementation" => "A", + "type" => $mappedType, + "default" => normalize_default($default, $mappedType, $name), + ]; + $norm = normalize_aliases($aliases, $name); + if (!empty($norm)) { + sort($norm); + $entry["aliases"] = $norm; + } + $supported[$name] = [$entry]; +} + +$otelPath = "../ext/otel_config.c"; +if (file_exists($otelPath)) { + preg_match_all('/ZAI_STRL\("(OTEL_[A-Z0-9_]+)"\)/', file_get_contents($otelPath), $m); + $otelVars = array_unique($m[1]); + sort($otelVars); + foreach ($otelVars as $v) { + if (!isset($supported[$v])) { + $supported[$v] = [["implementation" => "A", "type" => "string", "default" => null]]; + } + } +} + +if (empty($supported)) { + fwrite(STDERR, "Error: no supported configurations were generated\n"); + exit(1); +} +ksort($supported); + +$outputPath = "../metadata/supported-configurations.json"; +$output = [ + "version" => "2", + "supportedConfigurations" => $supported, + "deprecations" => (object)[], +]; +if (file_exists($outputPath)) { + $existing = json_decode(file_get_contents($outputPath), true); + if (is_array($existing)) { + $output["deprecations"] = isset($existing["deprecations"]) && is_array($existing["deprecations"]) + ? (object)$existing["deprecations"] : (object)[]; + $existingSupported = $existing["supportedConfigurations"] ?? []; + $merged = []; + foreach ($supported as $name => $entries) { + $generatedEntry = $entries[0]; + $existingEntries = normalize_supported_entries($existingSupported[$name] ?? [], $name); + $updated = false; + foreach ($existingEntries as $idx => $existingEntry) { + if (($existingEntry["implementation"] ?? null) === "A") { + $existingEntries[$idx] = $generatedEntry; + $updated = true; + break; + } + } + if (!$updated) { + $existingEntries[] = $generatedEntry; + } + $merged[$name] = $existingEntries; + } + ksort($merged); + $output["supportedConfigurations"] = $merged; + } +} else { + $output["supportedConfigurations"] = $supported; +} + +$dir = dirname($outputPath); +if (!is_dir($dir)) { + mkdir($dir, 0755, true); +} +$json = json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); +$json = preg_replace_callback('/^ +/m', function ($m) { + return str_repeat(' ', (int)(strlen($m[0]) / 4)); +}, $json); +file_put_contents($outputPath, $json . "\n"); +echo "Wrote supported configurations to $outputPath\n"; +ENDPHP +) + +cat <../ext/version.h +#ifndef PHP_DDTRACE_VERSION +#define PHP_DDTRACE_VERSION "$(cat "../VERSION")" +#endif +EOT + +PHP_VERSION_ID=${PHP_VERSION_ID:-0} +gcc $(php-config --includes) -I.. -I../ext -I../zend_abstract_interface -I../src/dogstatsd -I../components-rs -x c -E - <= 80300 +#define DD_SIDECAR_TRACE_SENDER_DEFAULT true +#else +#define DD_SIDECAR_TRACE_SENDER_DEFAULT false +#endif +// Do not expand CALIASES() directly, otherwise parameter counting in macros is broken +#define ALTCALIASES(...) ,##__VA_ARGS__ +#define EXPAND(x) x +#define CUSTOM(id) id +#define CONFIG(type, name, default_value, ...) CALIAS(type, name, default_value,) +#define CALIAS(type, name, default_value, aliases, ...) #type, #name, default_value EXPAND(ALT##aliases) |NEXT_CONFIG| + +JSON_CONFIGURATION_MARKER +DD_CONFIGURATION + +CODE From 4bd96f0db4a03f4b61487ab8d56d3cd18cb12600 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Thu, 12 Feb 2026 11:13:10 +0100 Subject: [PATCH 04/12] fixup! --- tooling/generate-supported-configurations.sh | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh index 197bf5740b..f5bc0432cb 100644 --- a/tooling/generate-supported-configurations.sh +++ b/tooling/generate-supported-configurations.sh @@ -1,13 +1,6 @@ #!/bin/bash # Generates metadata/supported-configurations.json from ext/configuration.h # -# DD_CONFIGURATION vs DD_CONFIGURATION_ALL: -# DD_CONFIGURATION_ALL - The macro that lists all CONFIG/CALIAS entries (lines 99-246 in configuration.h). -# DD_CONFIGURATION - The macro actually used in the C code. On non-Windows it expands to -# DD_TRACE_SIDECAR_TRACE_SENDER + DD_CONFIGURATION_ALL; on Windows it is just -# DD_CONFIGURATION_ALL. We use DD_CONFIGURATION so the preprocessor yields the -# full, platform-appropriate list. -# set -euo pipefail cd "$(dirname "$0")" From 321095b72dc0cfcb4a1357be660a29444e64c681 Mon Sep 17 00:00:00 2001 From: Benjamin De Bernardi Date: Thu, 12 Feb 2026 14:45:38 +0100 Subject: [PATCH 05/12] chore: fix implementation and default for multiple keys --- appsec/src/extension/configuration.h | 2 +- ext/configuration.h | 20 +-- metadata/supported-configurations.json | 164 +++++++++---------- tooling/generate-supported-configurations.sh | 9 +- 4 files changed, 100 insertions(+), 95 deletions(-) diff --git a/appsec/src/extension/configuration.h b/appsec/src/extension/configuration.h index 0794b8761d..882e371d5a 100644 --- a/appsec/src/extension/configuration.h +++ b/appsec/src/extension/configuration.h @@ -58,7 +58,7 @@ extern bool runtime_config_first_init; CONFIG(STRING, DD_VERSION, "") \ CONFIG(BOOL, DD_REMOTE_CONFIG_ENABLED, "true") \ CONFIG(CUSTOM(uint32_t), DD_REMOTE_CONFIG_POLL_INTERVAL, "1000", .parser = _parse_uint32) \ - CONFIG(STRING, DD_AGENT_HOST, "") \ + CONFIG(STRING, DD_AGENT_HOST, "localhost") \ CONFIG(INT, DD_TRACE_AGENT_PORT, "0") \ CONFIG(INT, DD_APPSEC_MAX_BODY_BUFF_SIZE, "524288") \ CONFIG(STRING, DD_TRACE_AGENT_URL, "") \ diff --git a/ext/configuration.h b/ext/configuration.h index 8984674f68..0607cacab2 100644 --- a/ext/configuration.h +++ b/ext/configuration.h @@ -51,7 +51,7 @@ enum ddtrace_sampling_rules_format { #define DD_TRACE_AGENT_FLUSH_INTERVAL_VAL 1001 #define DD_INTEGRATION_ANALYTICS_ENABLED_DEFAULT false -#define DD_INTEGRATION_ANALYTICS_SAMPLE_RATE_DEFAULT 1 +#define DD_INTEGRATION_ANALYTICS_SAMPLE_RATE_DEFAULT 1.0 #if PHP_VERSION_ID >= 80300 || defined(_WIN32) #define DD_SIDECAR_TRACE_SENDER_DEFAULT true @@ -100,12 +100,12 @@ enum ddtrace_sampling_rules_format { CONFIG(STRING, DD_TRACE_SOURCES_PATH, DD_DEFAULT_SOURCES_PATH, .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_AUTOLOAD_NO_COMPILE, "false", .ini_change = zai_config_system_ini_change) \ CONFIG(STRING, DD_TRACE_AGENT_URL, "", .ini_change = zai_config_system_ini_change) \ - CONFIG(STRING, DD_AGENT_HOST, "", .ini_change = zai_config_system_ini_change) \ - CONFIG(STRING, DD_DOGSTATSD_URL, "") \ - CONFIG(STRING, DD_DOGSTATSD_HOST, "") \ + CONFIG(STRING, DD_AGENT_HOST, "localhost", .ini_change = zai_config_system_ini_change) \ + CONFIG(STRING, DD_DOGSTATSD_URL, "http://localhost:8125") \ + CONFIG(STRING, DD_DOGSTATSD_HOST, "localhost") \ CONFIG(STRING, DD_API_KEY, "", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_DISTRIBUTED_TRACING, "true") \ - CONFIG(STRING, DD_DOGSTATSD_PORT, "8125") \ + CONFIG(INT, DD_DOGSTATSD_PORT, "8125") \ CONFIG(STRING, DD_ENV, "", .ini_change = ddtrace_alter_dd_env, \ .env_config_fallback = ddtrace_conf_otel_resource_attributes_env) \ CONFIG(BOOL, DD_AUTOFINISH_SPANS, "false") \ @@ -117,7 +117,7 @@ enum ddtrace_sampling_rules_format { CONFIG(CUSTOM(MAP), DD_TAGS, "", \ .env_config_fallback = ddtrace_conf_otel_resource_attributes_tags, \ .parser = dd_parse_tags) \ - CONFIG(INT, DD_TRACE_AGENT_PORT, "0", .ini_change = zai_config_system_ini_change) \ + CONFIG(INT, DD_TRACE_AGENT_PORT, "8126", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_TRACE_ANALYTICS_ENABLED, "false") \ CONFIG(BOOL, DD_TRACE_APPEND_TRACE_IDS_TO_LOGS, "false") \ CONFIG(BOOL, DD_TRACE_AUTO_FLUSH_ENABLED, "false") /* true in CLI */ \ @@ -163,7 +163,7 @@ enum ddtrace_sampling_rules_format { CONFIG(INT, DD_TRACE_RATE_LIMIT, "100", .ini_change = zai_config_system_ini_change) \ CONFIG(DOUBLE, DD_TRACE_SAMPLE_RATE, "-1", .ini_change = ddtrace_alter_DD_TRACE_SAMPLE_RATE, \ .env_config_fallback = ddtrace_conf_otel_sample_rate) \ - CONFIG(JSON, DD_TRACE_SAMPLING_RULES, "[]") \ + CONFIG(JSON, DD_TRACE_SAMPLING_RULES, "[]") \ CONFIG(CUSTOM(INT), DD_TRACE_SAMPLING_RULES_FORMAT, "glob", .parser = dd_parse_sampling_rules_format) \ CONFIG(JSON, DD_SPAN_SAMPLING_RULES, "[]") \ CONFIG(STRING, DD_SPAN_SAMPLING_RULES_FILE, "", .ini_change = ddtrace_alter_sampling_rules_file_config) \ @@ -177,7 +177,7 @@ enum ddtrace_sampling_rules_format { CONFIG(SET_LOWERCASE, DD_TRACE_PROPAGATION_STYLE_INJECT, "datadog,tracecontext,baggage") \ CONFIG(SET_LOWERCASE, DD_TRACE_PROPAGATION_STYLE, "datadog,tracecontext,baggage", \ .env_config_fallback = ddtrace_conf_otel_propagators) \ - CONFIG(SET, DD_TRACE_BAGGAGE_TAG_KEYS, "user.id,session.id,account.id") \ + CONFIG(SET, DD_TRACE_BAGGAGE_TAG_KEYS, "user.id, session.id, account.id") \ CONFIG(BOOL, DD_TRACE_IGNORE_AGENT_SAMPLING_RATES, "false", .ini_change = zai_config_system_ini_change) \ CONFIG(SET, DD_TRACE_TRACED_INTERNAL_FUNCTIONS, "") \ CONFIG(INT, DD_TRACE_AGENT_TIMEOUT, DD_CFG_EXPSTR(DD_TRACE_AGENT_TIMEOUT_VAL), \ @@ -248,7 +248,7 @@ enum ddtrace_sampling_rules_format { CONFIG(BOOL, DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING, "true") \ CONFIG(BOOL, DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES, "true") \ CONFIG(BOOL, DD_INJECT_FORCE, "false", .ini_change = zai_config_system_ini_change) \ - CONFIG(DOUBLE, DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS, "5", .ini_change = zai_config_system_ini_change) \ + CONFIG(DOUBLE, DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS, "5.0", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_REMOTE_CONFIG_ENABLED, "true", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_DYNAMIC_INSTRUMENTATION_ENABLED, "false", .ini_change = ddtrace_alter_dynamic_instrumentation_config) \ CONFIG(SET, DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS, "", .ini_change = zai_config_system_ini_change) \ @@ -257,7 +257,7 @@ enum ddtrace_sampling_rules_format { CONFIG(INT, DD_TRACE_BAGGAGE_MAX_ITEMS, "64") \ CONFIG(INT, DD_TRACE_BAGGAGE_MAX_BYTES, "8192") \ CONFIG(BOOL, DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED, "false") \ - CONFIG(SET, DD_TRACE_HTTP_CLIENT_ERROR_STATUSES, "500-599", .ini_change = zai_config_system_ini_change) \ + CONFIG(SET, DD_TRACE_HTTP_CLIENT_ERROR_STATUSES, "400-499", .ini_change = zai_config_system_ini_change) \ CONFIG(SET, DD_TRACE_HTTP_SERVER_ERROR_STATUSES, "500-599", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_CODE_ORIGIN_FOR_SPANS_ENABLED, "true", .ini_change = ddtrace_alter_DD_CODE_ORIGIN_FOR_SPANS_ENABLED) \ CONFIG(INT, DD_CODE_ORIGIN_MAX_USER_FRAMES, "8") \ diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 35f166f5cc..f2639a5211 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -38,7 +38,7 @@ ], "DD_APPSEC_SCA_ENABLED": [ { - "implementation": "A", + "implementation": "C", "type": "boolean", "default": "false" } @@ -96,13 +96,13 @@ { "implementation": "A", "type": "string", - "default": "" + "default": "localhost" } ], "DD_DOGSTATSD_PORT": [ { "implementation": "A", - "type": "string", + "type": "int", "default": "8125" } ], @@ -110,7 +110,7 @@ { "implementation": "A", "type": "string", - "default": "" + "default": "http://localhost:8125" } ], "DD_DYNAMIC_INSTRUMENTATION_ENABLED": [ @@ -150,7 +150,7 @@ ], "DD_EXCEPTION_REPLAY_CAPTURE_MAX_FRAMES": [ { - "implementation": "A", + "implementation": "C", "type": "int", "default": "-1" } @@ -285,19 +285,19 @@ { "implementation": "A", "type": "decimal", - "default": "5" + "default": "5.0" } ], "DD_SERVICE": [ { - "implementation": "A", + "implementation": "E", "type": "string", "default": "" } ], "DD_SERVICE_MAPPING": [ { - "implementation": "A", + "implementation": "C", "type": "map", "default": "" } @@ -305,7 +305,7 @@ "DD_SPAN_SAMPLING_RULES": [ { "implementation": "A", - "type": "map", + "type": "array", "default": "[]" } ], @@ -325,7 +325,7 @@ ], "DD_TELEMETRY_HEARTBEAT_INTERVAL": [ { - "implementation": "A", + "implementation": "C", "type": "int", "default": "60" } @@ -397,7 +397,7 @@ { "implementation": "A", "type": "int", - "default": "0" + "default": "8126" } ], "DD_TRACE_AGENT_RETRIES": [ @@ -430,7 +430,7 @@ ], "DD_TRACE_AGENT_TIMEOUT": [ { - "implementation": "A", + "implementation": "B", "type": "int", "default": "500" } @@ -456,7 +456,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_AMQP_ANALYTICS_SAMPLE_RATE" ] @@ -471,7 +471,7 @@ ], "DD_TRACE_ANALYTICS_ENABLED": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false" } @@ -508,7 +508,7 @@ { "implementation": "A", "type": "array", - "default": "user.id,session.id,account.id" + "default": "user.id, session.id, account.id" } ], "DD_TRACE_BETA_HIGH_MEMORY_PRESSURE_PERCENT": [ @@ -534,7 +534,7 @@ ], "DD_TRACE_BUFFER_SIZE": [ { - "implementation": "A", + "implementation": "B", "type": "int", "default": "2097152" } @@ -553,7 +553,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_CAKEPHP_ANALYTICS_SAMPLE_RATE" ] @@ -601,7 +601,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_CODEIGNITER_ANALYTICS_SAMPLE_RATE" ] @@ -628,7 +628,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_CURL_ANALYTICS_SAMPLE_RATE" ] @@ -650,7 +650,7 @@ ], "DD_TRACE_DEBUG": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false" } @@ -683,7 +683,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_DRUPAL_ANALYTICS_SAMPLE_RATE" ] @@ -698,7 +698,7 @@ ], "DD_TRACE_ELASTICSEARCH_ANALYTICS_ENABLED": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false", "aliases": [ @@ -710,7 +710,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE" ] @@ -737,7 +737,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_ELOQUENT_ANALYTICS_SAMPLE_RATE" ] @@ -771,7 +771,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_EXEC_ANALYTICS_SAMPLE_RATE" ] @@ -798,7 +798,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_FILESYSTEM_ANALYTICS_SAMPLE_RATE" ] @@ -860,7 +860,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_FRANKENPHP_ANALYTICS_SAMPLE_RATE" ] @@ -901,7 +901,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_GOOGLESPANNER_ANALYTICS_SAMPLE_RATE" ] @@ -928,7 +928,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_GUZZLE_ANALYTICS_SAMPLE_RATE" ] @@ -943,14 +943,14 @@ ], "DD_TRACE_HEADER_TAGS": [ { - "implementation": "A", + "implementation": "B", "type": "map", "default": "" } ], "DD_TRACE_HEALTH_METRICS_ENABLED": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false" } @@ -983,7 +983,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_HTTPSTREAM_ANALYTICS_SAMPLE_RATE" ] @@ -998,7 +998,7 @@ ], "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES": [ { - "implementation": "A", + "implementation": "B", "type": "array", "default": "500-599" } @@ -1019,7 +1019,7 @@ ], "DD_TRACE_HTTP_SERVER_ERROR_STATUSES": [ { - "implementation": "A", + "implementation": "C", "type": "array", "default": "500-599" } @@ -1047,7 +1047,7 @@ ], "DD_TRACE_KAFKA_ANALYTICS_ENABLED": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false", "aliases": [ @@ -1059,7 +1059,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_KAFKA_ANALYTICS_SAMPLE_RATE" ] @@ -1093,7 +1093,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_LAMINAS_ANALYTICS_SAMPLE_RATE" ] @@ -1120,7 +1120,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_LARAVELQUEUE_ANALYTICS_SAMPLE_RATE" ] @@ -1147,7 +1147,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_LARAVEL_ANALYTICS_SAMPLE_RATE" ] @@ -1181,7 +1181,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_LOGS_ANALYTICS_SAMPLE_RATE" ] @@ -1206,7 +1206,7 @@ ], "DD_TRACE_LOG_LEVEL": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "error" } @@ -1225,7 +1225,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_LUMEN_ANALYTICS_SAMPLE_RATE" ] @@ -1252,7 +1252,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_MAGENTO_ANALYTICS_SAMPLE_RATE" ] @@ -1293,7 +1293,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_MEMCACHED_ANALYTICS_SAMPLE_RATE" ] @@ -1327,7 +1327,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_MEMCACHE_ANALYTICS_SAMPLE_RATE" ] @@ -1361,7 +1361,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_MONGODB_ANALYTICS_SAMPLE_RATE" ] @@ -1383,7 +1383,7 @@ ], "DD_TRACE_MONGO_ANALYTICS_ENABLED": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false", "aliases": [ @@ -1395,7 +1395,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_MONGO_ANALYTICS_SAMPLE_RATE" ] @@ -1422,7 +1422,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_MYSQLI_ANALYTICS_SAMPLE_RATE" ] @@ -1449,7 +1449,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_NETTE_ANALYTICS_SAMPLE_RATE" ] @@ -1464,7 +1464,7 @@ ], "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": [ { - "implementation": "A", + "implementation": "E", "type": "string", "default": "(?i)(?:(?:\"|%22)?)(?:(?:old[-_]?|new[-_]?)?p(?:ass)?w(?:or)?d(?:1|2)?|pass(?:[-_]?phrase)?|secret|(?:api[-_]?|private[-_]?|public[-_]?|access[-_]?|secret[-_]?|app(?:lication)?[-_]?)key(?:[-_]?id)?|token|consumer[-_]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\\s|%20)*(?:=|%3D)[^&]+|(?:\"|%22)(?:\\s|%20)*(?::|%3A)(?:\\s|%20)*(?:\"|%22)(?:%2[^2]|%[^2]|[^\"%])+(?:\"|%22))|(?:bearer(?:\\s|%20)+[a-z0-9._\\-]+|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\\w=-]|%3D)+\\.ey[I-L](?:[\\w=-]|%3D)+(?:\\.(?:[\\w.+/=-]|%3D|%2F|%2B)+)?|-{5}BEGIN(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY-{5}[^\\-]+-{5}END(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY(?:-{5})?(?:\\n|%0A)?|(?:ssh-(?:rsa|dss)|ecdsa-[a-z0-9]+-[a-z0-9]+)(?:\\s|%20|%09)+(?:[a-z0-9/.+]|%2F|%5C|%2B){100,}(?:=|%3D)*(?:(?:\\s|%20|%09)+[a-z0-9._-]+)?)" } @@ -1490,7 +1490,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_OPENAI_ANALYTICS_SAMPLE_RATE" ] @@ -1524,7 +1524,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_PCNTL_ANALYTICS_SAMPLE_RATE" ] @@ -1551,7 +1551,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_PDO_ANALYTICS_SAMPLE_RATE" ] @@ -1592,7 +1592,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_PHPREDIS_ANALYTICS_SAMPLE_RATE" ] @@ -1619,7 +1619,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_PREDIS_ANALYTICS_SAMPLE_RATE" ] @@ -1648,21 +1648,21 @@ ], "DD_TRACE_PROPAGATION_STYLE": [ { - "implementation": "A", + "implementation": "D", "type": "array", "default": "datadog,tracecontext,baggage" } ], "DD_TRACE_PROPAGATION_STYLE_EXTRACT": [ { - "implementation": "A", + "implementation": "E", "type": "array", "default": "datadog,tracecontext,B3,B3 single header,baggage" } ], "DD_TRACE_PROPAGATION_STYLE_INJECT": [ { - "implementation": "A", + "implementation": "D", "type": "array", "default": "datadog,tracecontext,baggage" } @@ -1681,7 +1681,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_PSR18_ANALYTICS_SAMPLE_RATE" ] @@ -1708,7 +1708,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_RATCHET_ANALYTICS_SAMPLE_RATE" ] @@ -1833,7 +1833,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_ROADRUNNER_ANALYTICS_SAMPLE_RATE" ] @@ -1848,7 +1848,7 @@ ], "DD_TRACE_SAMPLE_RATE": [ { - "implementation": "A", + "implementation": "D", "type": "decimal", "default": "-1" } @@ -1856,7 +1856,7 @@ "DD_TRACE_SAMPLING_RULES": [ { "implementation": "A", - "type": "map", + "type": "array", "default": "[]" } ], @@ -1895,7 +1895,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_SLIM_ANALYTICS_SAMPLE_RATE" ] @@ -1936,7 +1936,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_SQLSRV_ANALYTICS_SAMPLE_RATE" ] @@ -1951,7 +1951,7 @@ ], "DD_TRACE_STARTUP_LOGS": [ { - "implementation": "A", + "implementation": "C", "type": "boolean", "default": "true" } @@ -1970,7 +1970,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_SWOOLE_ANALYTICS_SAMPLE_RATE" ] @@ -1997,7 +1997,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_SYMFONYMESSENGER_ANALYTICS_SAMPLE_RATE" ] @@ -2024,7 +2024,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_SYMFONY_ANALYTICS_SAMPLE_RATE" ] @@ -2114,7 +2114,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_WEB_ANALYTICS_SAMPLE_RATE" ] @@ -2148,7 +2148,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_WORDPRESS_ANALYTICS_SAMPLE_RATE" ] @@ -2189,7 +2189,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_YII_ANALYTICS_SAMPLE_RATE" ] @@ -2216,7 +2216,7 @@ { "implementation": "A", "type": "decimal", - "default": "1", + "default": "1.0", "aliases": [ "DD_ZENDFRAMEWORK_ANALYTICS_SAMPLE_RATE" ] @@ -2238,14 +2238,14 @@ ], "OTEL_LOG_LEVEL": [ { - "implementation": "A", + "implementation": "C", "type": "string", "default": null } ], "OTEL_METRICS_EXPORTER": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": null } @@ -2254,40 +2254,40 @@ { "implementation": "A", "type": "string", - "default": null + "default": "" } ], "OTEL_RESOURCE_ATTRIBUTES": [ { "implementation": "A", "type": "string", - "default": null + "default": "" } ], "OTEL_SERVICE_NAME": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": null } ], "OTEL_TRACES_EXPORTER": [ { - "implementation": "A", + "implementation": "C", "type": "string", "default": null } ], "OTEL_TRACES_SAMPLER": [ { - "implementation": "A", + "implementation": "C", "type": "string", "default": null } ], "OTEL_TRACES_SAMPLER_ARG": [ { - "implementation": "A", + "implementation": "C", "type": "string", "default": null } diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh index f5bc0432cb..dd01eadec2 100644 --- a/tooling/generate-supported-configurations.sh +++ b/tooling/generate-supported-configurations.sh @@ -14,8 +14,9 @@ function map_type($raw) { } $map = [ 'BOOL' => 'boolean', 'STRING' => 'string', 'INT' => 'int', 'DOUBLE' => 'decimal', - 'MAP' => 'map', 'JSON' => 'map', 'SET_OR_MAP_LOWERCASE' => 'map', + 'MAP' => 'map', 'JSON' => 'array', 'SET_OR_MAP_LOWERCASE' => 'map', 'SET' => 'array', 'SET_LOWERCASE' => 'array', + 'CUSTOM(INT)' => 'string', 'CUSTOM(MAP)' => 'map', ]; return $map[$raw] ?? 'string'; } @@ -26,6 +27,10 @@ function normalize_default($v, $type, $name) { return ''; } if (strtoupper($v) === 'NULL') { + // OTEL env vars are string-typed and use "" (not null) as their "unset" default. + if (strpos($name, 'OTEL_') === 0) { + return ''; + } return null; } if ($type === 'boolean') { @@ -101,7 +106,7 @@ if (file_exists($otelPath)) { sort($otelVars); foreach ($otelVars as $v) { if (!isset($supported[$v])) { - $supported[$v] = [["implementation" => "A", "type" => "string", "default" => null]]; + $supported[$v] = [["implementation" => "A", "type" => "string", "default" => ""]]; } } } From 265130720b6d5696efc363f7a5480e0a9bbe3d8a Mon Sep 17 00:00:00 2001 From: Benjamin De Bernardi Date: Thu, 12 Feb 2026 14:54:52 +0100 Subject: [PATCH 06/12] chore: update script to generate config, keeping same implementation when different of A --- metadata/supported-configurations.json | 16 ++++++++-------- tooling/generate-supported-configurations.sh | 8 ++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index f2639a5211..e7dfb17862 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -5,7 +5,7 @@ { "implementation": "A", "type": "string", - "default": "" + "default": "localhost" } ], "DD_API_KEY": [ @@ -1000,7 +1000,7 @@ { "implementation": "B", "type": "array", - "default": "500-599" + "default": "400-499" } ], "DD_TRACE_HTTP_CLIENT_SPLIT_BY_DOMAIN": [ @@ -2240,14 +2240,14 @@ { "implementation": "C", "type": "string", - "default": null + "default": "" } ], "OTEL_METRICS_EXPORTER": [ { "implementation": "B", "type": "string", - "default": null + "default": "" } ], "OTEL_PROPAGATORS": [ @@ -2268,28 +2268,28 @@ { "implementation": "B", "type": "string", - "default": null + "default": "" } ], "OTEL_TRACES_EXPORTER": [ { "implementation": "C", "type": "string", - "default": null + "default": "" } ], "OTEL_TRACES_SAMPLER": [ { "implementation": "C", "type": "string", - "default": null + "default": "" } ], "OTEL_TRACES_SAMPLER_ARG": [ { "implementation": "C", "type": "string", - "default": null + "default": "" } ] }, diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh index dd01eadec2..010678b14a 100644 --- a/tooling/generate-supported-configurations.sh +++ b/tooling/generate-supported-configurations.sh @@ -141,6 +141,14 @@ if (file_exists($outputPath)) { break; } } + // If the existing JSON uses a different implementation label (e.g. "C", "E"), + // update the entry in-place but preserve that label instead of adding a new "A". + if (!$updated && !empty($existingEntries)) { + $impl = $existingEntries[0]["implementation"] ?? $generatedEntry["implementation"]; + $existingEntries[0] = $generatedEntry; + $existingEntries[0]["implementation"] = $impl; + $updated = true; + } if (!$updated) { $existingEntries[] = $generatedEntry; } From 1387a66128cafce0ca6ec63802a8fe3ef90dbe4b Mon Sep 17 00:00:00 2001 From: Benjamin De Bernardi Date: Thu, 12 Feb 2026 23:53:17 +0100 Subject: [PATCH 07/12] fix: supported-configurations.json have valid version/types/default --- metadata/supported-configurations.json | 36 ++++++++++---------- tooling/generate-supported-configurations.sh | 26 ++++++++++---- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index e7dfb17862..c85e4f23e4 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -10,7 +10,7 @@ ], "DD_API_KEY": [ { - "implementation": "A", + "implementation": "C", "type": "string", "default": "" } @@ -81,7 +81,7 @@ "DD_DBM_PROPAGATION_MODE": [ { "implementation": "A", - "type": "int", + "type": "string", "default": "disabled" } ], @@ -171,21 +171,21 @@ ], "DD_GIT_COMMIT_SHA": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "" } ], "DD_GIT_REPOSITORY_URL": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "" } ], "DD_HOSTNAME": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "" } @@ -290,7 +290,7 @@ ], "DD_SERVICE": [ { - "implementation": "E", + "implementation": "F", "type": "string", "default": "" } @@ -311,7 +311,7 @@ ], "DD_SPAN_SAMPLING_RULES_FILE": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "" } @@ -1315,7 +1315,7 @@ ], "DD_TRACE_MEMCACHE_ANALYTICS_ENABLED": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false", "aliases": [ @@ -1855,7 +1855,7 @@ ], "DD_TRACE_SAMPLING_RULES": [ { - "implementation": "A", + "implementation": "D", "type": "array", "default": "[]" } @@ -1863,7 +1863,7 @@ "DD_TRACE_SAMPLING_RULES_FORMAT": [ { "implementation": "A", - "type": "int", + "type": "string", "default": "glob" } ], @@ -2238,56 +2238,56 @@ ], "OTEL_LOG_LEVEL": [ { - "implementation": "C", + "implementation": "E", "type": "string", "default": "" } ], "OTEL_METRICS_EXPORTER": [ { - "implementation": "B", + "implementation": "D", "type": "string", "default": "" } ], "OTEL_PROPAGATORS": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "" } ], "OTEL_RESOURCE_ATTRIBUTES": [ { - "implementation": "A", + "implementation": "B", "type": "string", "default": "" } ], "OTEL_SERVICE_NAME": [ { - "implementation": "B", + "implementation": "C", "type": "string", "default": "" } ], "OTEL_TRACES_EXPORTER": [ { - "implementation": "C", + "implementation": "E", "type": "string", "default": "" } ], "OTEL_TRACES_SAMPLER": [ { - "implementation": "C", + "implementation": "D", "type": "string", "default": "" } ], "OTEL_TRACES_SAMPLER_ARG": [ { - "implementation": "C", + "implementation": "E", "type": "string", "default": "" } diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh index 010678b14a..f107ca50f1 100644 --- a/tooling/generate-supported-configurations.sh +++ b/tooling/generate-supported-configurations.sh @@ -6,11 +6,24 @@ set -euo pipefail cd "$(dirname "$0")" # Maps C config type to JSON schema type. -PHP_CODE=$(cat <<'ENDPHP' +PHP_CODE_FILE=$(mktemp "${TMPDIR:-/tmp}/ddtrace-supported-configurations.XXXXXX.php") +trap 'rm -f "$PHP_CODE_FILE"' EXIT + +cat >"$PHP_CODE_FILE" <<'ENDPHP' + 'boolean', 'STRING' => 'string', 'INT' => 'int', 'DOUBLE' => 'decimal', @@ -172,7 +185,6 @@ $json = preg_replace_callback('/^ +/m', function ($m) { file_put_contents($outputPath, $json . "\n"); echo "Wrote supported configurations to $outputPath\n"; ENDPHP -) cat <../ext/version.h #ifndef PHP_DDTRACE_VERSION @@ -181,7 +193,7 @@ cat <../ext/version.h EOT PHP_VERSION_ID=${PHP_VERSION_ID:-0} -gcc $(php-config --includes) -I.. -I../ext -I../zend_abstract_interface -I../src/dogstatsd -I../components-rs -x c -E - < Date: Thu, 12 Feb 2026 23:54:54 +0100 Subject: [PATCH 08/12] ci: update one-pipeline, mark BACKFILLED as true --- .gitlab-ci.yml | 2 +- .gitlab/one-pipeline.locked.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2a39661549..b44876cb6b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -102,7 +102,7 @@ validate_supported_configurations_v2_local_file: extends: .validate_supported_configurations_v2_local_file variables: LOCAL_JSON_PATH: "metadata/supported-configurations.json" - BACKFILLED: "false" + BACKFILLED: "true" update_central_configurations_version_range_v2: extends: .update_central_configurations_version_range_v2 diff --git a/.gitlab/one-pipeline.locked.yml b/.gitlab/one-pipeline.locked.yml index bae6030153..3e1f1a6259 100644 --- a/.gitlab/one-pipeline.locked.yml +++ b/.gitlab/one-pipeline.locked.yml @@ -1,4 +1,4 @@ # DO NOT EDIT THIS FILE MANUALLY # This file is auto-generated by automation. include: - - remote: https://gitlab-templates.ddbuild.io/libdatadog/one-pipeline/ca/c6ea92df19738f28d6e7c3e4fea86d030fa801ac3361427d6acb6f99a917c28a/one-pipeline.yml + - remote: https://gitlab-templates.ddbuild.io/libdatadog/one-pipeline/ca/f14ac28614630d12bcfe6cba4fd8d72dce142c62ff0b053ba7c323622104ebd7/one-pipeline.yml From bdfdf1255b9ec6cbdbd61661d270283163ce30c9 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Fri, 13 Feb 2026 18:22:20 +0100 Subject: [PATCH 09/12] Handle appsec and profiler configs and fix default handling Also move github script to gitlab --- .../supported_configurations_sync.yml | 28 -- .gitlab/generate-shared.php | 13 + ext/auto_flush.c | 2 +- ext/configuration.h | 24 +- ext/dogstatsd.c | 14 +- metadata/supported-configurations.json | 314 ++++++++++++++++++ tooling/generate-supported-configurations.sh | 171 +++++++++- 7 files changed, 511 insertions(+), 55 deletions(-) delete mode 100644 .github/workflows/supported_configurations_sync.yml diff --git a/.github/workflows/supported_configurations_sync.yml b/.github/workflows/supported_configurations_sync.yml deleted file mode 100644 index 50eb481800..0000000000 --- a/.github/workflows/supported_configurations_sync.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Validate supported configurations - -on: - push: - -jobs: - validate-supported-configurations: - name: validate supported configurations - runs-on: ubuntu-24.04 - permissions: - contents: read - - steps: - - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - with: - fetch-depth: 0 - clean: true - - - name: Verify supported configurations are in sync - run: | - bash tooling/generate-supported-configurations.sh - - if ! git diff --exit-code -- metadata/supported-configurations.json ext/configuration.h; then - echo "ERROR: @metadata/supported-configurations.json got out of sync with implemented configurations. Please run tooling/generate-supported-configurations.sh locally." - git --no-pager diff -- metadata/supported-configurations.json ext/configuration.h - exit 1 - fi diff --git a/.gitlab/generate-shared.php b/.gitlab/generate-shared.php index bc7a669b79..db364b0e8c 100644 --- a/.gitlab/generate-shared.php +++ b/.gitlab/generate-shared.php @@ -116,6 +116,19 @@ - artifacts when: "always" +"Config Verification Test": + tags: [ "arch:amd64" ] + stage: test + needs: [] + image: "registry.ddbuild.io/images/mirror/datadog/dd-trace-ci:php-${PHP_MAJOR_MINOR}_bookworm-6" + script: + - bash tooling/generate-supported-configurations.sh + - if ! git diff --exit-code -- metadata/supported-configurations.json ext/configuration.h; then + echo "ERROR: @metadata/supported-configurations.json got out of sync with implemented configurations. Please run tooling/generate-supported-configurations.sh locally." + git --no-pager diff -- metadata/supported-configurations.json ext/configuration.h + exit 1 + fi + 0) { + if (ZSTR_LEN(hostname) > 0 && zai_config_memoized_entries[DDTRACE_CONFIG_DD_AGENT_HOST].name_index != ZAI_CONFIG_ORIGIN_DEFAULT) { bool isIPv6 = memchr(ZSTR_VAL(hostname), ':', ZSTR_LEN(hostname)); int64_t port = get_global_DD_TRACE_AGENT_PORT(); diff --git a/ext/configuration.h b/ext/configuration.h index 0607cacab2..97b9787560 100644 --- a/ext/configuration.h +++ b/ext/configuration.h @@ -100,12 +100,12 @@ enum ddtrace_sampling_rules_format { CONFIG(STRING, DD_TRACE_SOURCES_PATH, DD_DEFAULT_SOURCES_PATH, .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_AUTOLOAD_NO_COMPILE, "false", .ini_change = zai_config_system_ini_change) \ CONFIG(STRING, DD_TRACE_AGENT_URL, "", .ini_change = zai_config_system_ini_change) \ - CONFIG(STRING, DD_AGENT_HOST, "localhost", .ini_change = zai_config_system_ini_change) \ - CONFIG(STRING, DD_DOGSTATSD_URL, "http://localhost:8125") \ - CONFIG(STRING, DD_DOGSTATSD_HOST, "localhost") \ + CONFIG(STRING, DD_AGENT_HOST, "localhost", .ini_change = zai_config_system_ini_change) \ + CONFIG(STRING, DD_DOGSTATSD_URL, "http://localhost:8125") \ + CONFIG(STRING, DD_DOGSTATSD_HOST, "localhost") \ CONFIG(STRING, DD_API_KEY, "", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_DISTRIBUTED_TRACING, "true") \ - CONFIG(INT, DD_DOGSTATSD_PORT, "8125") \ + CONFIG(INT, DD_DOGSTATSD_PORT, "8125") \ CONFIG(STRING, DD_ENV, "", .ini_change = ddtrace_alter_dd_env, \ .env_config_fallback = ddtrace_conf_otel_resource_attributes_env) \ CONFIG(BOOL, DD_AUTOFINISH_SPANS, "false") \ @@ -114,10 +114,10 @@ enum ddtrace_sampling_rules_format { CONFIG(STRING, DD_SERVICE, "", .ini_change = ddtrace_alter_dd_service, \ .env_config_fallback = ddtrace_conf_otel_service_name) \ CONFIG(MAP, DD_SERVICE_MAPPING, "") \ - CONFIG(CUSTOM(MAP), DD_TAGS, "", \ + CONFIG(CUSTOM(MAP), DD_TAGS, "", \ .env_config_fallback = ddtrace_conf_otel_resource_attributes_tags, \ - .parser = dd_parse_tags) \ - CONFIG(INT, DD_TRACE_AGENT_PORT, "8126", .ini_change = zai_config_system_ini_change) \ + .parser = dd_parse_tags) \ + CONFIG(INT, DD_TRACE_AGENT_PORT, "8126", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_TRACE_ANALYTICS_ENABLED, "false") \ CONFIG(BOOL, DD_TRACE_APPEND_TRACE_IDS_TO_LOGS, "false") \ CONFIG(BOOL, DD_TRACE_AUTO_FLUSH_ENABLED, "false") /* true in CLI */ \ @@ -163,7 +163,7 @@ enum ddtrace_sampling_rules_format { CONFIG(INT, DD_TRACE_RATE_LIMIT, "100", .ini_change = zai_config_system_ini_change) \ CONFIG(DOUBLE, DD_TRACE_SAMPLE_RATE, "-1", .ini_change = ddtrace_alter_DD_TRACE_SAMPLE_RATE, \ .env_config_fallback = ddtrace_conf_otel_sample_rate) \ - CONFIG(JSON, DD_TRACE_SAMPLING_RULES, "[]") \ + CONFIG(JSON, DD_TRACE_SAMPLING_RULES, "[]") \ CONFIG(CUSTOM(INT), DD_TRACE_SAMPLING_RULES_FORMAT, "glob", .parser = dd_parse_sampling_rules_format) \ CONFIG(JSON, DD_SPAN_SAMPLING_RULES, "[]") \ CONFIG(STRING, DD_SPAN_SAMPLING_RULES_FILE, "", .ini_change = ddtrace_alter_sampling_rules_file_config) \ @@ -177,7 +177,7 @@ enum ddtrace_sampling_rules_format { CONFIG(SET_LOWERCASE, DD_TRACE_PROPAGATION_STYLE_INJECT, "datadog,tracecontext,baggage") \ CONFIG(SET_LOWERCASE, DD_TRACE_PROPAGATION_STYLE, "datadog,tracecontext,baggage", \ .env_config_fallback = ddtrace_conf_otel_propagators) \ - CONFIG(SET, DD_TRACE_BAGGAGE_TAG_KEYS, "user.id, session.id, account.id") \ + CONFIG(SET, DD_TRACE_BAGGAGE_TAG_KEYS, "user.id, session.id, account.id") \ CONFIG(BOOL, DD_TRACE_IGNORE_AGENT_SAMPLING_RATES, "false", .ini_change = zai_config_system_ini_change) \ CONFIG(SET, DD_TRACE_TRACED_INTERNAL_FUNCTIONS, "") \ CONFIG(INT, DD_TRACE_AGENT_TIMEOUT, DD_CFG_EXPSTR(DD_TRACE_AGENT_TIMEOUT_VAL), \ @@ -190,7 +190,7 @@ enum ddtrace_sampling_rules_format { CONFIG(BOOL, DD_TRACE_GENERATE_ROOT_SPAN, "true", .ini_change = ddtrace_span_alter_root_span_config) \ CONFIG(INT, DD_TRACE_SPANS_LIMIT, "1000") \ CONFIG(BOOL, DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED, "true") \ - CONFIG(BOOL, DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED, "true") \ + CONFIG(BOOL, DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED, "true") \ CONFIG(INT, DD_TRACE_BGS_CONNECT_TIMEOUT, DD_CFG_EXPSTR(DD_TRACE_BGS_CONNECT_TIMEOUT_VAL), \ .ini_change = zai_config_system_ini_change) \ CONFIG(INT, DD_TRACE_BGS_TIMEOUT, DD_CFG_EXPSTR(DD_TRACE_BGS_TIMEOUT_VAL), \ @@ -248,8 +248,8 @@ enum ddtrace_sampling_rules_format { CONFIG(BOOL, DD_TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING, "true") \ CONFIG(BOOL, DD_TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES, "true") \ CONFIG(BOOL, DD_INJECT_FORCE, "false", .ini_change = zai_config_system_ini_change) \ - CONFIG(DOUBLE, DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS, "5.0", .ini_change = zai_config_system_ini_change) \ - CONFIG(BOOL, DD_REMOTE_CONFIG_ENABLED, "true", .ini_change = zai_config_system_ini_change) \ + CONFIG(DOUBLE, DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS, "5.0", .ini_change = zai_config_system_ini_change) \ + CONFIG(BOOL, DD_REMOTE_CONFIG_ENABLED, "true", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_DYNAMIC_INSTRUMENTATION_ENABLED, "false", .ini_change = ddtrace_alter_dynamic_instrumentation_config) \ CONFIG(SET, DD_DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS, "", .ini_change = zai_config_system_ini_change) \ CONFIG(BOOL, DD_APM_TRACING_ENABLED, "true") \ diff --git a/ext/dogstatsd.c b/ext/dogstatsd.c index 2560214f24..5a00903926 100644 --- a/ext/dogstatsd.c +++ b/ext/dogstatsd.c @@ -9,13 +9,17 @@ ZEND_EXTERN_MODULE_GLOBALS(ddtrace); char *ddtrace_dogstatsd_url(void) { zend_string *url = get_DD_DOGSTATSD_URL(); - if (ZSTR_LEN(url) > 0) { + if (ZSTR_LEN(url) > 0 && zai_config_memoized_entries[DDTRACE_CONFIG_DD_DOGSTATSD_URL].name_index != ZAI_CONFIG_ORIGIN_DEFAULT) { return zend_strndup(ZSTR_VAL(url), ZSTR_LEN(url) + 1); } zend_string *hostname = get_DD_DOGSTATSD_HOST(); - if (ZSTR_LEN(hostname) == 0) { - hostname = get_global_DD_AGENT_HOST(); + if (ZSTR_LEN(hostname) == 0 || zai_config_memoized_entries[DDTRACE_CONFIG_DD_DOGSTATSD_HOST].name_index == ZAI_CONFIG_ORIGIN_DEFAULT) { + if (zai_config_memoized_entries[DDTRACE_CONFIG_DD_AGENT_HOST].name_index == ZAI_CONFIG_ORIGIN_DEFAULT) { + hostname = ZSTR_EMPTY_ALLOC(); + } else { + hostname = get_global_DD_AGENT_HOST(); + } } if (ZSTR_LEN(hostname) > 7 && strncmp(ZSTR_VAL(hostname), "unix://", 7) == 0) { @@ -25,7 +29,7 @@ char *ddtrace_dogstatsd_url(void) { if (ZSTR_LEN(hostname) > 0) { bool isIPv6 = memchr(ZSTR_VAL(hostname), ':', ZSTR_LEN(hostname)); - int port = atoi(ZSTR_VAL(get_DD_DOGSTATSD_PORT())); + int port = get_DD_DOGSTATSD_PORT(); if (port <= 0 || port > 65535) { port = 8125; } @@ -39,7 +43,7 @@ char *ddtrace_dogstatsd_url(void) { } int64_t port = get_global_DD_TRACE_AGENT_PORT(); - if (port <= 0 || port > 65535) { + if (port <= 0 || port > 65535 || zai_config_memoized_entries[DDTRACE_CONFIG_DD_TRACE_AGENT_PORT].name_index == ZAI_CONFIG_ORIGIN_DEFAULT) { port = 8125; } char *formatted_url; diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index c85e4f23e4..4ec51f4da6 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -15,6 +15,20 @@ "default": "" } ], + "DD_API_SECURITY_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "true" + } + ], + "DD_API_SECURITY_SAMPLE_DELAY": [ + { + "implementation": "A", + "type": "decimal", + "default": "30.0" + } + ], "DD_APM_TRACING_ENABLED": [ { "implementation": "A", @@ -22,6 +36,30 @@ "default": "true" } ], + "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "true" + } + ], + "DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE": [ + { + "implementation": "D", + "type": "string", + "default": "ident", + "aliases": [ + "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING" + ] + } + ], + "DD_APPSEC_CLI_START_ON_RINIT": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], "DD_APPSEC_ENABLED": [ { "implementation": "A", @@ -29,6 +67,111 @@ "default": "false" } ], + "DD_APPSEC_EXTRA_HEADERS": [ + { + "implementation": "A", + "type": "array", + "default": "" + } + ], + "DD_APPSEC_HELPER_LAUNCH": [ + { + "implementation": "A", + "type": "boolean", + "default": "true" + } + ], + "DD_APPSEC_HELPER_LOG_FILE": [ + { + "implementation": "A", + "type": "string", + "default": "/dev/null" + } + ], + "DD_APPSEC_HELPER_LOG_LEVEL": [ + { + "implementation": "A", + "type": "string", + "default": "info" + } + ], + "DD_APPSEC_HELPER_PATH": [ + { + "implementation": "A", + "type": "string", + "default": "/opt/datadog-php/" + } + ], + "DD_APPSEC_HELPER_RUNTIME_PATH": [ + { + "implementation": "A", + "type": "string", + "default": "/tmp" + } + ], + "DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML": [ + { + "implementation": "C", + "type": "string", + "default": "" + } + ], + "DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON": [ + { + "implementation": "C", + "type": "string", + "default": "" + } + ], + "DD_APPSEC_LOG_FILE": [ + { + "implementation": "A", + "type": "string", + "default": "php_error_reporting" + } + ], + "DD_APPSEC_LOG_LEVEL": [ + { + "implementation": "A", + "type": "string", + "default": "warn" + } + ], + "DD_APPSEC_MAX_BODY_BUFF_SIZE": [ + { + "implementation": "A", + "type": "int", + "default": "524288" + } + ], + "DD_APPSEC_MAX_STACK_TRACES": [ + { + "implementation": "A", + "type": "int", + "default": "2" + } + ], + "DD_APPSEC_MAX_STACK_TRACE_DEPTH": [ + { + "implementation": "A", + "type": "int", + "default": "32" + } + ], + "DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP": [ + { + "implementation": "B", + "type": "string", + "default": "(?i)pass|pw(?:or)?d|secret|(?:api|private|public|access)[_-]?key|token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)|bearer|authorization|jsessionid|phpsessid|asp\\.net[_-]sessionid|sid|jwt" + } + ], + "DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP": [ + { + "implementation": "B", + "type": "string", + "default": "(?i)(?:p(?:ass)?w(?:or)?d|pass(?:[_-]?phrase)?|secret(?:[_-]?key)?|(?:(?:api|private|public|access)[_-]?)key(?:[_-]?id)?|(?:(?:auth|access|id|refresh)[_-]?)?token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?|jsessionid|phpsessid|asp\\.net(?:[_-]|-)sessionid|sid|jwt)(?:\\s*=([^;&]+)|\"\\s*:\\s*(\"[^\"]+\"|\\d+))|bearer\\s+([a-z0-9\\._\\-]+)|token\\s*:\\s*([a-z0-9]{13})|gh[opsu]_([0-9a-zA-Z]{36})|ey[I-L][\\w=-]+\\.(ey[I-L][\\w=-]+(?:\\.[\\w.+\\/=-]+)?)|[\\-]{5}BEGIN[a-z\\s]+PRIVATE\\sKEY[\\-]{5}([^\\-]+)[\\-]{5}END[a-z\\s]+PRIVATE\\sKEY|ssh-rsa\\s*([a-z0-9\\/\\.+]{100,})" + } + ], "DD_APPSEC_RASP_ENABLED": [ { "implementation": "A", @@ -36,6 +179,13 @@ "default": "true" } ], + "DD_APPSEC_RULES": [ + { + "implementation": "C", + "type": "string", + "default": "" + } + ], "DD_APPSEC_SCA_ENABLED": [ { "implementation": "C", @@ -43,6 +193,55 @@ "default": "false" } ], + "DD_APPSEC_STACK_TRACE_ENABLED": [ + { + "implementation": "B", + "type": "boolean", + "default": "true" + } + ], + "DD_APPSEC_TESTING": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_APPSEC_TESTING_ABORT_RINIT": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_APPSEC_TESTING_HELPER_METRICS": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_APPSEC_TESTING_RAW_BODY": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_APPSEC_TRACE_RATE_LIMIT": [ + { + "implementation": "A", + "type": "int", + "default": "100" + } + ], + "DD_APPSEC_WAF_TIMEOUT": [ + { + "implementation": "D", + "type": "int", + "default": "10000" + } + ], "DD_AUTOFINISH_SPANS": [ { "implementation": "A", @@ -169,6 +368,13 @@ "default": "false" } ], + "DD_EXTRA_SERVICES": [ + { + "implementation": "A", + "type": "array", + "default": "" + } + ], "DD_GIT_COMMIT_SHA": [ { "implementation": "B", @@ -274,6 +480,107 @@ "default": "1.0" } ], + "DD_PROFILING_ALLOCATION_ENABLED": [ + { + "implementation": "B", + "type": "boolean", + "default": "true" + } + ], + "DD_PROFILING_ALLOCATION_SAMPLING_DISTANCE": [ + { + "implementation": "A", + "type": "int", + "default": "4194304" + } + ], + "DD_PROFILING_ENABLED": [ + { + "implementation": "D", + "type": "boolean", + "default": "true" + } + ], + "DD_PROFILING_ENDPOINT_COLLECTION_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "true" + } + ], + "DD_PROFILING_EXCEPTION_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "true" + } + ], + "DD_PROFILING_EXCEPTION_MESSAGE_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_PROFILING_EXCEPTION_SAMPLING_DISTANCE": [ + { + "implementation": "A", + "type": "int", + "default": "100" + } + ], + "DD_PROFILING_EXPERIMENTAL_CPU_TIME_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "true", + "aliases": [ + "DD_PROFILING_EXPERIMENTAL_CPU_ENABLED" + ] + } + ], + "DD_PROFILING_EXPERIMENTAL_FEATURES_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_PROFILING_EXPERIMENTAL_IO_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], + "DD_PROFILING_LOG_LEVEL": [ + { + "implementation": "A", + "type": "string", + "default": "off" + } + ], + "DD_PROFILING_OUTPUT_PPROF": [ + { + "implementation": "A", + "type": "string", + "default": "" + } + ], + "DD_PROFILING_TIMELINE_ENABLED": [ + { + "implementation": "A", + "type": "boolean", + "default": "true" + } + ], + "DD_PROFILING_WALLTIME_ENABLED": [ + { + "implementation": "B", + "type": "boolean", + "default": "true" + } + ], "DD_REMOTE_CONFIG_ENABLED": [ { "implementation": "A", @@ -281,6 +588,13 @@ "default": "true" } ], + "DD_REMOTE_CONFIG_POLL_INTERVAL": [ + { + "implementation": "A", + "type": "int", + "default": "1000" + } + ], "DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS": [ { "implementation": "A", diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh index f107ca50f1..56821d931b 100644 --- a/tooling/generate-supported-configurations.sh +++ b/tooling/generate-supported-configurations.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Generates metadata/supported-configurations.json from ext/configuration.h +# Generates metadata/supported-configurations.json from config definitions. # set -euo pipefail @@ -20,6 +20,9 @@ function map_type($raw) { if ($inner === 'INT') { return 'string'; } + if ($inner === 'uint32_t' || $inner === 'uint64_t') { + return 'int'; + } if ($inner === 'MAP') { return 'map'; } @@ -29,6 +32,7 @@ function map_type($raw) { 'BOOL' => 'boolean', 'STRING' => 'string', 'INT' => 'int', 'DOUBLE' => 'decimal', 'MAP' => 'map', 'JSON' => 'array', 'SET_OR_MAP_LOWERCASE' => 'map', 'SET' => 'array', 'SET_LOWERCASE' => 'array', + 'uint32_t' => 'int', 'uint64_t' => 'int', 'CUSTOM(INT)' => 'string', 'CUSTOM(MAP)' => 'map', ]; return $map[$raw] ?? 'string'; @@ -50,7 +54,9 @@ function normalize_default($v, $type, $name) { if ($v === '0') return 'false'; if ($v === '1') return 'true'; } - if ($name === 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP') { + // C-preprocessed string defaults keep one extra escaping layer. + // Normalize all string-typed defaults consistently. + if ($type === 'string') { $v = stripslashes($v); } return $v; @@ -90,6 +96,142 @@ function normalize_supported_entries($entries, $canonical) { return $normalized; } +function add_supported_entry(&$supported, $name, $entry) { + // Keep the first-seen source as canonical for duplicate names. + if (!isset($supported[$name])) { + $supported[$name] = [$entry]; + } +} + +function map_rust_type($rawType, $parser) { + $map = [ + 'ZAI_CONFIG_TYPE_BOOL' => 'boolean', + 'ZAI_CONFIG_TYPE_STRING' => 'string', + 'ZAI_CONFIG_TYPE_INT' => 'int', + 'ZAI_CONFIG_TYPE_DOUBLE' => 'decimal', + 'ZAI_CONFIG_TYPE_MAP' => 'map', + 'ZAI_CONFIG_TYPE_JSON' => 'array', + 'ZAI_CONFIG_TYPE_SET' => 'array', + 'ZAI_CONFIG_TYPE_SET_LOWERCASE' => 'array', + 'ZAI_CONFIG_TYPE_SET_OR_MAP_LOWERCASE' => 'map', + ]; + if (isset($map[$rawType])) { + return $map[$rawType]; + } + if ($rawType === 'ZAI_CONFIG_TYPE_CUSTOM') { + if ($parser === 'parse_profiling_enabled') { + return 'boolean'; + } + if ($parser === 'parse_sampling_distance_filter') { + return 'int'; + } + return 'string'; + } + return 'string'; +} + +function parse_rust_default($raw) { + $raw = trim(preg_replace('/\/\/.*$/', '', $raw)); + if ($raw === 'ZaiStr::new()') { + return ''; + } + if (preg_match('/ZaiStr::literal\(b"((?:\\\\.|[^"\\\\])*)\\\\0"\)/', $raw, $m)) { + return stripcslashes($m[1]); + } + return ''; +} + +function extract_rust_alias_groups($source) { + $groups = []; + if (preg_match_all('/const\s+([A-Z0-9_]+)\s*:\s*&\[ZaiStr\]\s*=\s*unsafe\s*\{\s*&\[(.*?)\]\s*\};/s', $source, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $aliases = []; + if (preg_match_all('/ZaiStr::literal\(b"((?:\\\\.|[^"\\\\])*)\\\\0"\)/', $match[2], $aliasMatches)) { + foreach ($aliasMatches[1] as $alias) { + $aliases[] = stripcslashes($alias); + } + } + $groups[$match[1]] = $aliases; + } + } + return $groups; +} + +function extract_rust_env_var_names($source) { + $names = []; + if (preg_match_all('/([A-Za-z0-9_]+)\s*=>\s*b"([A-Z0-9_]+)\\\\0"/', $source, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $names[$match[1]] = $match[2]; + } + } + return $names; +} + +function add_rust_profiling_configurations(&$supported, $path) { + if (!file_exists($path)) { + return; + } + $source = file_get_contents($path); + if ($source === false || $source === '') { + return; + } + + $envVarByConfigId = extract_rust_env_var_names($source); + if (empty($envVarByConfigId)) { + return; + } + $aliasesByConstName = extract_rust_alias_groups($source); + + if (!preg_match_all('/zai_config_entry\s*\{(.*?)\n\s*},/s', $source, $entryMatches, PREG_SET_ORDER)) { + return; + } + + foreach ($entryMatches as $entryMatch) { + $entryBlock = $entryMatch[1]; + if (!preg_match('/name:\s*([A-Za-z0-9_]+)\.env_var_name\(\),/', $entryBlock, $nameMatch)) { + continue; + } + $configId = $nameMatch[1]; + if (!isset($envVarByConfigId[$configId])) { + continue; + } + $name = $envVarByConfigId[$configId]; + + if (!preg_match('/type_:\s*(ZAI_CONFIG_TYPE_[A-Z_]+),/', $entryBlock, $typeMatch)) { + continue; + } + if (!preg_match('/default_encoded_value:\s*([^\n]+),/', $entryBlock, $defaultMatch)) { + continue; + } + + $parser = ''; + if (preg_match('/parser:\s*([^\n,]+),/', $entryBlock, $parserMatch)) { + $parserRaw = trim($parserMatch[1]); + if (preg_match('/Some\(([^)]+)\)/', $parserRaw, $parserNameMatch)) { + $parser = trim($parserNameMatch[1]); + } + } + + $aliases = []; + if (preg_match('/aliases:\s*([A-Z0-9_]+)\.as_ptr\(\),/', $entryBlock, $aliasesMatch)) { + $aliases = $aliasesByConstName[$aliasesMatch[1]] ?? []; + } + + $mappedType = map_rust_type(trim($typeMatch[1]), $parser); + $entry = [ + "implementation" => "A", + "type" => $mappedType, + "default" => normalize_default(parse_rust_default($defaultMatch[1]), $mappedType, $name), + ]; + $normAliases = normalize_aliases($aliases, $name); + if (!empty($normAliases)) { + sort($normAliases); + $entry["aliases"] = $normAliases; + } + add_supported_entry($supported, $name, $entry); + } +} + $supported = []; foreach (explode("|NEXT_CONFIG|", file_get_contents("php://stdin")) as $configLine) { $config = str_getcsv(trim($configLine), ",", '"', '\\'); @@ -109,7 +251,7 @@ foreach (explode("|NEXT_CONFIG|", file_get_contents("php://stdin")) as $configLi sort($norm); $entry["aliases"] = $norm; } - $supported[$name] = [$entry]; + add_supported_entry($supported, $name, $entry); } $otelPath = "../ext/otel_config.c"; @@ -118,12 +260,13 @@ if (file_exists($otelPath)) { $otelVars = array_unique($m[1]); sort($otelVars); foreach ($otelVars as $v) { - if (!isset($supported[$v])) { - $supported[$v] = [["implementation" => "A", "type" => "string", "default" => ""]]; - } + add_supported_entry($supported, $v, ["implementation" => "A", "type" => "string", "default" => ""]); } } +$profilingPath = "../profiling/src/config.rs"; +add_rust_profiling_configurations($supported, $profilingPath); + if (empty($supported)) { fwrite(STDERR, "Error: no supported configurations were generated\n"); exit(1); @@ -193,8 +336,11 @@ cat <../ext/version.h EOT PHP_VERSION_ID=${PHP_VERSION_ID:-0} -gcc $(php-config --includes) -I.. -I../ext -I../zend_abstract_interface -I../src/dogstatsd -I../components-rs -x c -E - < Date: Fri, 13 Feb 2026 18:24:04 +0100 Subject: [PATCH 10/12] chore: remove unused configuration --- appsec/src/extension/configuration.h | 1 - metadata/supported-configurations.json | 7 ------- 2 files changed, 8 deletions(-) diff --git a/appsec/src/extension/configuration.h b/appsec/src/extension/configuration.h index 882e371d5a..9696e69ef6 100644 --- a/appsec/src/extension/configuration.h +++ b/appsec/src/extension/configuration.h @@ -57,7 +57,6 @@ extern bool runtime_config_first_init; CONFIG(STRING, DD_ENV, "") \ CONFIG(STRING, DD_VERSION, "") \ CONFIG(BOOL, DD_REMOTE_CONFIG_ENABLED, "true") \ - CONFIG(CUSTOM(uint32_t), DD_REMOTE_CONFIG_POLL_INTERVAL, "1000", .parser = _parse_uint32) \ CONFIG(STRING, DD_AGENT_HOST, "localhost") \ CONFIG(INT, DD_TRACE_AGENT_PORT, "0") \ CONFIG(INT, DD_APPSEC_MAX_BODY_BUFF_SIZE, "524288") \ diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index 4ec51f4da6..0ec7e445c8 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -588,13 +588,6 @@ "default": "true" } ], - "DD_REMOTE_CONFIG_POLL_INTERVAL": [ - { - "implementation": "A", - "type": "int", - "default": "1000" - } - ], "DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS": [ { "implementation": "A", From fed4c86f4e3547620496c7fd39751249a085110e Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 16 Feb 2026 18:46:44 +0100 Subject: [PATCH 11/12] Simplify some redundant handling / improve ALT stripping Signed-off-by: Bob Weinand --- tooling/generate-supported-configurations.sh | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) mode change 100644 => 100755 tooling/generate-supported-configurations.sh diff --git a/tooling/generate-supported-configurations.sh b/tooling/generate-supported-configurations.sh old mode 100644 new mode 100755 index 56821d931b..1f4e4381e6 --- a/tooling/generate-supported-configurations.sh +++ b/tooling/generate-supported-configurations.sh @@ -20,9 +20,6 @@ function map_type($raw) { if ($inner === 'INT') { return 'string'; } - if ($inner === 'uint32_t' || $inner === 'uint64_t') { - return 'int'; - } if ($inner === 'MAP') { return 'map'; } @@ -33,16 +30,11 @@ function map_type($raw) { 'MAP' => 'map', 'JSON' => 'array', 'SET_OR_MAP_LOWERCASE' => 'map', 'SET' => 'array', 'SET_LOWERCASE' => 'array', 'uint32_t' => 'int', 'uint64_t' => 'int', - 'CUSTOM(INT)' => 'string', 'CUSTOM(MAP)' => 'map', ]; return $map[$raw] ?? 'string'; } function normalize_default($v, $type, $name) { - $v = preg_replace('/\s*ALT\s*$/', '', trim($v)); - if ($v === '"' || $v === '') { - return ''; - } if (strtoupper($v) === 'NULL') { // OTEL env vars are string-typed and use "" (not null) as their "unset" default. if (strpos($name, 'OTEL_') === 0) { @@ -65,8 +57,7 @@ function normalize_default($v, $type, $name) { function normalize_aliases($aliases, $canonical) { $out = []; foreach ($aliases as $a) { - $a = trim(preg_replace('/\s*ALT\s*$/', '', $a)); - if ($a !== '' && $a !== $canonical && $a !== 'ALT') { + if ($a !== '' && $a !== $canonical) { $out[$a] = true; } } @@ -103,6 +94,7 @@ function add_supported_entry(&$supported, $name, $entry) { } } +// temporary solution until we merge configs function map_rust_type($rawType, $parser) { $map = [ 'ZAI_CONFIG_TYPE_BOOL' => 'boolean', @@ -352,6 +344,7 @@ extract_c_supported_configurations() { #endif // Do not expand CALIASES() directly, otherwise parameter counting in macros is broken. #define ALTCALIASES(...) ,##__VA_ARGS__ +#define ALT #define EXPAND(x) x #define CUSTOM(id) id // Preserve the literal config type tokens (e.g. CUSTOM(INT)) so the generator can From 15ec1f8de32dba85cf2fe9161381c3545cc1ada1 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 16 Feb 2026 18:48:09 +0100 Subject: [PATCH 12/12] Fix test Signed-off-by: Bob Weinand --- tests/ext/read_c_configuration.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ext/read_c_configuration.phpt b/tests/ext/read_c_configuration.phpt index 1104a95b5d..575a961b30 100644 --- a/tests/ext/read_c_configuration.phpt +++ b/tests/ext/read_c_configuration.phpt @@ -21,7 +21,7 @@ echo PHP_EOL; ?> --EXPECT-- some_known_host -0 +8126 FALSE FALSE 9999