Skip to content

test(dotnet): enable agentless EVP exposure egress - #7707

Draft
leoromanovsky wants to merge 2 commits into
exec/system-tests-agentless-side-effectsfrom
leo.romanovsky/ffe-agentless-evp-dotnet-enablement-v1
Draft

leoromanovsky wants to merge 2 commits into
exec/system-tests-agentless-side-effectsfrom
leo.romanovsky/ffe-agentless-evp-dotnet-enablement-v1

Conversation

@leoromanovsky

@leoromanovsky leoromanovsky commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Motivation

We are shipping agentless CDN-delivered configuration to make customer deployments simpler. The SDK's core Feature Flags telemetry still needs a reliable network path out of the process: automatically use a compatible running Agent or serverless-init relay when available, and fall back to direct EVP intake when no relay exists.

FFLSDK-195 activates .NET against the shared cross-language contract in #7299 so successful construction cannot mask missing configuration polling or exposure delivery.

Changes

Capability Direct intake serverless-init Agent
Exposures Enabled; exact candidate currently fails Enabled; exact candidate currently fails Existing coverage
Flag evaluations Not emitted yet Not emitted yet Not emitted yet
Shutdown exposure flush Enabled; blocked before flush
  • Activate the poc weblog for the .NET 3.54 development line.
  • Make the .NET runtime PID 1 only for the direct shutdown contract so Docker's SIGTERM reaches the ordinary application lifecycle.
  • Emit the shared structured server-close marker after ASP.NET Core reports ApplicationStopped.

Decisions

  • Target test(ffe): add direct agentless EVP contract #7299 directly; do not depend on another language activation.
  • Keep this draft as an executable product gate. Do not weaken or xfail the contracts: the exact SDK artifact exposes a real missing production dependency.
  • Scope activation to poc. The uds weblog configures an Agent socket at runtime and therefore cannot prove a no-Agent direct topology.
  • Keep this PR exposure-only. The separate flag-evaluation emitter remains owned by FFLSDK-28.
  • Keep the PID 1 and shutdown-marker behavior test-only and opt-in through SYSTEM_TESTS_FFE_SHUTDOWN_FLUSH_ENABLED; all other .NET scenarios retain the existing crash-dump recovery wrapper.
  • Require dd-trace-dotnet#9044 to land or be combined with #9235: #9235 constructs the fallback transport, but current master has no production caller that starts AgentlessConfigurationSource.
  • Keep OTLP out of scope: these contracts validate EVP egress.

Validation

System-tests base: 9c753fbcbdcc6122eed15fd5af827671fbc0771c

System-tests candidate: ccf370de4c3e4dc62aaf09977d2727d063449b05

.NET SDK candidate: 0ac1c3cca2c7423e41bd15b17ab2f543a9c261b3 from dd-trace-dotnet#9235

Candidate artifact: datadog-dotnet-apm-3.54.0.tar.gz, SHA-256 4ad48d2d6890682c4da6a86bd02555f22b93390b425a739177b26c88de3f9c3f, from Azure build 208990.

./format.sh
passed

./run.sh TEST_THE_TEST \
  tests/test_the_test/test_dotnet_direct_evp_activation.py \
  tests/test_the_test/test_manifest.py
34 passed

./build.sh dotnet -w poc
passed
Library: dotnet@3.54.0
Weblog variant: poc

Exact-artifact E2E currently fails before event routing can be exercised:

Direct exposure only:
Timed out waiting for Feature Flags EVP captures: /api/v2/exposures

serverless-init exposure only:
Timed out waiting for Feature Flags EVP captures: /api/v2/exposures

Diagnostic evidence:

  • All five /ffe evaluations returned {"reason":"DEFAULT","value":null,"count":1}.
  • The Agentless UFC mock recorded requests_total: 0; polling never started.
  • Direct intake captured 19 APM telemetry requests and zero exposure requests.
  • The runtime topology was correct: source agentless, API key present, no Agent variables, and dotnet app.dll was PID 1.
  • FeatureFlagsModule constructs FeatureFlagsEvpTransport and ExposureApi, but subscribes only to RCM. AgentlessConfigurationSource.Create(...).Start() has no production caller on the exact candidate's base.

This is a product-stack dependency failure, not a system-test teardown failure. Rebuild the exact combined #9044 + #9235 candidate and rerun direct exposure/shutdown and serverless-init exposure before calling this activation green.

Both system-test commits are GitHub verified=true, reason=valid.

Reviewer checklist

  • Anything but tests/ or manifests/ is modified: request R&P review for the test-only .NET lifecycle hook.
  • No Docker base image is modified.
  • No scenario is added, removed, or renamed.

@github-actions

Copy link
Copy Markdown
Contributor

CODEOWNERS have been resolved as:

tests/test_the_test/test_dotnet_direct_evp_activation.py                @DataDog/system-tests-reviewers
manifests/dotnet.yml                                                    @DataDog/system-tests-reviewers
utils/build/docker/dotnet/weblog/Program.cs                             @DataDog/system-tests-reviewers
utils/build/docker/dotnet/weblog/app.sh                                 @DataDog/system-tests-reviewers

…novsky/ffe-agentless-evp-dotnet-enablement-v1
@datadog-prod-us1-3

datadog-prod-us1-3 Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Pipelines  Tests

⚠️ Warnings

Your PR has failed checks. Please review the issues below and take necessary action before merging.

🚦 24 Pipeline jobs failed

Testing the test | System Tests (dotnet, dev) / End-to-end #13 / poc 13 — ❌ 1 test failed · 🔧 Needs a code fix, caused by this PR

View more details · View in GitHub Actions

❌ pytest.internal[poc] from system_tests_suite
internal error

Traceback (most recent call last):
  File "/home/runner/work/system-tests/system-tests/venv/lib/python3.12/site-packages/_pytest/main.py", line 268, in wrap_session
    session.exitstatus = doit(config, session) or 0
                         ^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/system-tests/system-tests/venv/lib/python3.12/site-packages/_pytest/main.py", line 321, in _main
    config.hook.pytest_collection(session=session)
  File "/home/runner/work/system-tests/system-tests/venv/lib/python3.12/site-packages/pluggy/_hooks.py", line 265, in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
...
DataDog/system-tests | Amazon_Linux_2_arm64.CON: [test-app-java-container]

View more details · View in GitLab

DataDog/system-tests | Amazon_Linux_2_arm64.HOS: [test-app-java]

View more details · View in GitLab

View all 24 failed jobs.

ℹ️ Info

No other issues found (see more)

❄️ No new flaky tests detected

Useful? React with 👍 / 👎

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: ccf370d | Docs | View more details | Give us feedback!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant