Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
682a31d
feat(telemetry): add app-extended-heartbeat parametric tests
khanayan123 Feb 18, 2026
36d138b
feat(telemetry): register app-extended-heartbeat tests in manifests
khanayan123 Feb 18, 2026
011f076
fix(manifests): use missing_feature instead of -dev version strings
khanayan123 Feb 24, 2026
736c5cc
simplify(telemetry): reduce app-extended-heartbeat tests to core func…
khanayan123 Feb 24, 2026
10c756f
remove md file
khanayan123 Feb 24, 2026
6be060e
test(manifests): enable Test_ExtendedHeartbeat for Node.js only
khanayan123 Feb 24, 2026
ee72e96
chore(lint): fix linting issues for app-extended-heartbeat tests
khanayan123 Feb 24, 2026
2cf6d0c
test(manifests): enable Test_ExtendedHeartbeat for Java
khanayan123 Feb 25, 2026
0650819
Merge main into ayan.khan/app-extended-heartbeat
khanayan123 Mar 31, 2026
f3e3558
chore: revert pyproject.toml and remove heartbeat interval override
khanayan123 Mar 31, 2026
1939816
fix(telemetry): improve extended heartbeat config assertion logic
khanayan123 Mar 31, 2026
2afc8ef
update tests and manifest file
khanayan123 Mar 31, 2026
f13a0a7
enable python system tests
khanayan123 Mar 31, 2026
6014da1
Merge main into ayan.khan/app-extended-heartbeat
khanayan123 Mar 31, 2026
b8d7d40
Add end-to-end test for app-extended-heartbeat telemetry
khanayan123 Apr 1, 2026
1b11a18
Move extended heartbeat env var to DEFAULT scenario definition
khanayan123 Apr 1, 2026
58f28a8
Remove parametric Test_ExtendedHeartbeat in favor of e2e test
khanayan123 Apr 1, 2026
e5dfac1
Merge branch 'main' into ayan.khan/app-extended-heartbeat
khanayan123 Apr 1, 2026
efab352
Fix ruff formatting: remove trailing blank line
khanayan123 Apr 1, 2026
bb0ca10
Move extended heartbeat test to dedicated scenario
khanayan123 Apr 1, 2026
f3639ff
Set DD_TELEMETRY_HEARTBEAT_INTERVAL=1 in extended heartbeat scenario
khanayan123 Apr 1, 2026
24690ab
Update cpp manifest for extended heartbeat to v2.1.0
khanayan123 Apr 1, 2026
8228995
Fix cpp manifest version for extended heartbeat
khanayan123 Apr 1, 2026
ee40a2d
Fix cpp manifest entries for extended heartbeat
khanayan123 Apr 1, 2026
4dfaa04
enable ruby system tests
khanayan123 Apr 1, 2026
1bfb4b8
fix(telemetry): improve extended heartbeat config assertion logic
khanayan123 Apr 1, 2026
63b9cf4
Revert "fix(telemetry): improve extended heartbeat config assertion l…
khanayan123 Apr 1, 2026
388375a
fix(telemetry): improve extended heartbeat config assertion logic
khanayan123 Apr 1, 2026
5f083a1
Add setup method with sleep to extended heartbeat test
khanayan123 Apr 2, 2026
0c14d55
Fix setup method name and use wait_for for extended heartbeat
khanayan123 Apr 2, 2026
03bca5b
Fix wait_for lambda to handle non-telemetry data safely
khanayan123 Apr 2, 2026
b554ffd
Use time.sleep instead of wait_for in extended heartbeat setup
khanayan123 Apr 2, 2026
7024834
Use tracer_time for ordering extended heartbeat config comparison
khanayan123 Apr 2, 2026
bd71581
Filter telemetry events by runtime_id for extended heartbeat test
khanayan123 Apr 2, 2026
ef468b2
Rework extended heartbeat test to check across all heartbeats
khanayan123 Apr 2, 2026
d27ca17
Simplify extended heartbeat test to check config name presence
khanayan123 Apr 2, 2026
c44e4f3
Remove unnecessary sleep from extended heartbeat setup
khanayan123 Apr 2, 2026
11e4845
Enable extended heartbeat test for next Go release
khanayan123 Apr 2, 2026
d219e87
Revert golang extended heartbeat to missing_feature
khanayan123 Apr 2, 2026
0ed912f
pass golang
khanayan123 Apr 7, 2026
4b9c4ec
Merge branch 'main' into ayan.khan/app-extended-heartbeat
khanayan123 Apr 9, 2026
9d3aa89
Enable extended heartbeat test for next Node.js release
khanayan123 Apr 9, 2026
e9f257e
enable php
khanayan123 Apr 14, 2026
0742b54
Merge branch 'main' into ayan.khan/app-extended-heartbeat
khanayan123 Apr 14, 2026
9477f2c
fix version for golang
khanayan123 Apr 14, 2026
1512829
Mark PHP extended heartbeat as missing_feature
khanayan123 Apr 15, 2026
b55785e
enable php
khanayan123 Apr 22, 2026
ca5ad27
revert
khanayan123 Apr 22, 2026
dca9b64
Merge branch 'main' into ayan.khan/app-extended-heartbeat
khanayan123 Apr 22, 2026
38137fa
Merge branch 'main' into ayan.khan/app-extended-heartbeat
khanayan123 Apr 22, 2026
49f6dc1
Merge branch 'main' into ayan.khan/app-extended-heartbeat
khanayan123 Apr 22, 2026
4f7f76e
Register TELEMETRY_EXTENDED_HEARTBEAT in run-end-to-end workflow
khanayan123 Apr 22, 2026
c78fad7
Mark Test_ExtendedHeartbeat missing_feature where tracers don't yet emit
khanayan123 Apr 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/run-end-to-end.yml
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,9 @@ jobs:
- name: Run TELEMETRY_ENHANCED_CONFIG_REPORTING scenario
if: always() && steps.build.outcome == 'success' && contains(inputs.scenarios, '"TELEMETRY_ENHANCED_CONFIG_REPORTING"')
run: ./run.sh TELEMETRY_ENHANCED_CONFIG_REPORTING
- name: Run TELEMETRY_EXTENDED_HEARTBEAT scenario
if: always() && steps.build.outcome == 'success' && contains(inputs.scenarios, '"TELEMETRY_EXTENDED_HEARTBEAT"')
run: ./run.sh TELEMETRY_EXTENDED_HEARTBEAT
- name: Run TELEMETRY_LOG_GENERATION_DISABLED scenario
if: always() && steps.build.outcome == 'success' && contains(inputs.scenarios, '"TELEMETRY_LOG_GENERATION_DISABLED"')
run: ./run.sh TELEMETRY_LOG_GENERATION_DISABLED
Expand Down
1 change: 1 addition & 0 deletions manifests/cpp_httpd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ manifest:
tests/test_smoke.py::Test_Library::test_receive_request_trace: missing_feature (For some reason, span type is server i/o web)
tests/test_span_events.py: incomplete_test_app (Weblog `/add_event` not implemented)
tests/test_standard_tags.py: irrelevant
tests/test_telemetry.py::Test_ExtendedHeartbeat: missing_feature (httpd-datadog has not received an update of its dd-trace-cpp since app-extended-heartbeat was implemented)
tests/test_telemetry.py::Test_Log_Generation: '>=1.0.3' # Modified by easy win activation script
tests/test_telemetry.py::Test_Log_Generation::test_log_generation_enabled: missing_feature # Created by easy win activation script
tests/test_telemetry.py::Test_MessageBatch: '>=1.0.3' # Modified by easy win activation script
Expand Down
1 change: 1 addition & 0 deletions manifests/cpp_nginx.yml
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,7 @@ manifest:
tests/test_standard_tags.py: irrelevant
tests/test_telemetry.py::Test_APMOnboardingInstallID: '>=1.12.0' # Modified by easy win activation script
tests/test_telemetry.py::Test_DependencyEnable: '>=1.12.0' # Modified by easy win activation script
tests/test_telemetry.py::Test_ExtendedHeartbeat: missing_feature (nginx-datadog has not received an update of its dd-trace-cpp since app-extended-heartbeat was implemented)
tests/test_telemetry.py::Test_Log_Generation: '>=1.12.0' # Modified by easy win activation script
tests/test_telemetry.py::Test_Log_Generation::test_log_generation_enabled: missing_feature # Created by easy win activation script
tests/test_telemetry.py::Test_MessageBatch: '>=1.12.0' # Modified by easy win activation script
Expand Down
1 change: 1 addition & 0 deletions manifests/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1189,6 +1189,7 @@ manifest:
component_version: '>=2.41'
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v2.13.0
tests/test_telemetry.py::Test_DependencyEnable: v2.35.0
tests/test_telemetry.py::Test_ExtendedHeartbeat: missing_feature (extended-heartbeat payload contains configs missing the required `value` field, failing schema validation)
tests/test_telemetry.py::Test_Log_Generation: # Modified by easy win activation script
- weblog_declaration:
'*': missing_feature
Expand Down
1 change: 1 addition & 0 deletions manifests/golang.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1444,6 +1444,7 @@ manifest:
tests/test_standard_tags.py::Test_StandardTagsUrl::test_url_with_sensitive_query_string: missing_feature (tracer did not yet implemented the new version of query parameters obfuscation regex)
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v1.39.0
tests/test_telemetry.py::Test_DependencyEnable: v1.73.0-dev
tests/test_telemetry.py::Test_ExtendedHeartbeat: missing_feature (extended-heartbeat only includes app-started configs, not app-client-configuration-change configs)
tests/test_telemetry.py::Test_Log_Generation: v1.73.0-dev
tests/test_telemetry.py::Test_MessageBatch: v1.73.0-dev
tests/test_telemetry.py::Test_Metric_Generation_Disabled: v1.73.0-dev
Expand Down
4 changes: 4 additions & 0 deletions manifests/java.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4329,6 +4329,10 @@ manifest:
component_version: '>=1.21.0'
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v0.107.1
tests/test_telemetry.py::Test_DependencyEnable: v1.7.0
tests/test_telemetry.py::Test_ExtendedHeartbeat:
- weblog_declaration:
'*': v1.23.0
spring-boot-3-native: missing_feature (no app-started telemetry event captured in native image)
tests/test_telemetry.py::Test_Log_Generation: # Modified by easy win activation script
- weblog_declaration:
'*': missing_feature
Expand Down
3 changes: 3 additions & 0 deletions manifests/nodejs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ refs:
- &ref_5_88_0 '>=5.88.0'
- &ref_5_89_0 '>=5.89.0'
- &ref_5_90_0 '>=5.90.0'
- &ref_5_94_0 '>=5.94.0'
- &ref_5_97_0 '>=5.97.0'
- &ref_5_98_0 '>=5.98.0'
- &ref_5_99_0 '>=5.99.0'
- &ref_6_0_0 '>=6.0.0-pre'
Expand Down Expand Up @@ -2386,6 +2388,7 @@ manifest:
tests/test_standard_tags.py::Test_StandardTagsUrl::test_url_with_sensitive_query_string: missing_feature (tracer did not yet implemented the new version of query parameters obfuscation regex)
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v2.9.0
tests/test_telemetry.py::Test_DependencyEnable: missing_feature
tests/test_telemetry.py::Test_ExtendedHeartbeat: *ref_5_97_0
tests/test_telemetry.py::Test_Log_Generation: # TODO: a lower version might be supported
- weblog_declaration:
'*': missing_feature
Expand Down
1 change: 1 addition & 0 deletions manifests/php.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,7 @@ manifest:
component_version: '>=0.93.0'
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v0.75.0
tests/test_telemetry.py::Test_DependencyEnable: missing_feature
tests/test_telemetry.py::Test_ExtendedHeartbeat: missing_feature (PHP telemetry runs via a sidecar process which does not emit app-extended-heartbeat events yet)
tests/test_telemetry.py::Test_Log_Generation: # TODO: a lower version might be supported
- weblog_declaration:
'*': missing_feature
Expand Down
1 change: 1 addition & 0 deletions manifests/python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2223,6 +2223,7 @@ manifest:
component_version: '>=1.18.0-rc1'
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v1.5.0-rc1
tests/test_telemetry.py::Test_DependencyEnable: v2.8.0
tests/test_telemetry.py::Test_ExtendedHeartbeat: v4.6.5
tests/test_telemetry.py::Test_Log_Generation: # Modified by easy win activation script
- weblog_declaration:
'*': missing_feature
Expand Down
1 change: 1 addition & 0 deletions manifests/ruby.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2111,6 +2111,7 @@ manifest:
uds-sinatra: missing_feature
tests/test_standard_tags.py::Test_StandardTagsUserAgent: v1.8.0
tests/test_telemetry.py::Test_DependencyEnable: v1.4.0
tests/test_telemetry.py::Test_ExtendedHeartbeat: ">2.30.0"
tests/test_telemetry.py::Test_Log_Generation: # Modified by easy win activation script
- weblog_declaration:
'*': missing_feature
Expand Down
50 changes: 50 additions & 0 deletions tests/test_telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -1069,3 +1069,53 @@ def test_telemetry_sca_propagated(self):
f"No telemetry found for {target_service_name} on {target_request_type} with configuration in "
f"{' or '.join(dd_appsec_sca_enabled_names)}"
)


@scenarios.telemetry_extended_heartbeat
@features.app_extended_heartbeat_event
class Test_ExtendedHeartbeat:
"""Test app-extended-heartbeat telemetry event in end-to-end scenario"""

def setup_extended_heartbeat_config_matches(self):
weblog.get("/")

def test_extended_heartbeat_config_matches(self):
"""Test that every config reported in app-started or app-client-configuration-change
was eventually reported by at least one app-extended-heartbeat event.
"""
telemetry_data = list(interfaces.library.get_telemetry_data())

# Collect all config names reported in app-started and config-change events
expected_config_names: set[str] = set()
found_app_started = False

for data in telemetry_data:
request_type = get_request_type(data)
if request_type in ("app-started", "app-client-configuration-change"):
if request_type == "app-started":
found_app_started = True
for c in get_configurations(data) or []:
expected_config_names.add(c["name"])

assert found_app_started, "app-started event not found"

# Collect all config names ever reported across all extended heartbeats
heartbeat_config_names: set[str] = set()
found_extended_hb = False

for data in telemetry_data:
if get_request_type(data) == "app-extended-heartbeat":
found_extended_hb = True
for c in get_configurations(data) or []:
heartbeat_config_names.add(c["name"])

assert found_extended_hb, "app-extended-heartbeat event not found"

# For each expected config, verify it was reported by at least one extended heartbeat.
# Configs may appear in heartbeats before or after they are (re-)reported in
# config-change events (e.g. remote config updates re-report existing configs).
missing = sorted(expected_config_names - heartbeat_config_names)
assert not missing, (
f"{len(missing)} config(s) reported in app-started or config-change but never "
f"included in any app-extended-heartbeat event: {missing}"
)
10 changes: 10 additions & 0 deletions utils/_context/_scenarios/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,16 @@ class _Scenarios:
doc="Test env var `DD_TELEMETRY_METRICS_ENABLED=false`",
scenario_groups=[scenario_groups.telemetry],
)
telemetry_extended_heartbeat = EndToEndScenario(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you need to add this scenario in .github/workflows/run-end-to-end.yml

Copy link
Copy Markdown
Contributor Author

@khanayan123 khanayan123 Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added in 4f7f76e — the TELEMETRY_EXTENDED_HEARTBEAT step is now registered between TELEMETRY_ENHANCED_CONFIG_REPORTING and TELEMETRY_LOG_GENERATION_DISABLED.

"TELEMETRY_EXTENDED_HEARTBEAT",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Wire TELEMETRY_EXTENDED_HEARTBEAT into end-to-end CI

This adds a new TELEMETRY_EXTENDED_HEARTBEAT scenario and binds Test_ExtendedHeartbeat to it, but the end-to-end workflow is not updated to execute that scenario: in .github/workflows/run-end-to-end.yml the telemetry section only runs TELEMETRY_APP_STARTED_PRODUCTS_DISABLED, TELEMETRY_ENHANCED_CONFIG_REPORTING, TELEMETRY_LOG_GENERATION_DISABLED, TELEMETRY_METRIC_GENERATION_DISABLED, and TELEMETRY_DEPENDENCY_LOADED_TEST_FOR_DEPENDENCY_COLLECTION_DISABLED. That means the new test path is effectively untested in CI, so regressions in this feature can merge without detection.

Useful? React with 👍 / 👎.

weblog_env={
"DD_TELEMETRY_HEARTBEAT_INTERVAL": "1",
"DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL": "2",
"_DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL": "2",
},
doc="Test app-extended-heartbeat telemetry event with a shortened interval",
scenario_groups=[scenario_groups.telemetry],
)

# ASM scenarios
appsec_missing_rules = EndToEndScenario(
Expand Down
Loading