Skip to content

feat(telemetry): include org_id in heartbeat payload (v9.1 #2277)#181

Merged
saurabhjain1592 merged 1 commit into
mainfrom
feat/v91-org-id-telemetry-payload
May 21, 2026
Merged

feat(telemetry): include org_id in heartbeat payload (v9.1 #2277)#181
saurabhjain1592 merged 1 commit into
mainfrom
feat/v91-org-id-telemetry-payload

Conversation

@saurabhjain1592
Copy link
Copy Markdown
Member

Summary

Adds an org_id field to the Java SDK telemetry heartbeat payload, in parity with the platform's startup_telemetry.go emitter (Epic #2230, Issue #2277). Sister PR to axonflow-sdk-go (merged), axonflow-sdk-python#198, axonflow-sdk-typescript#231, and follow-on PRs on Rust + 4 plugins.

Two sources, precedence order:

  1. ORG_ID env var when set — operator's configured value on self-hosted, or cs_<uuid> tenant identifier on Community SaaS.
  2. local-dev-org sentinel when unset.

DoD

  • Code: TelemetryReporter.buildPayload populates org_id via new telemetryOrgId() helper
  • Public API: TelemetryReporter.ORG_ID_LOCAL_DEV_SENTINEL constant exposed
  • Unit tests: telemetryOrgId helper × 4 cases (env wins, sentinel, empty, cs_)
  • Unit tests: buildPayload includes org_id on wire × 3 cases (decode + wire-literal)
  • Functional E2E: WireMock-driven × 2 cases (real HTTP through SDK's outbound stack)
  • Runtime proof: runtime-e2e/v91_org_id_telemetry/V91OrgIdTelemetryTest.java + README
  • CHANGELOG entry under [Unreleased] (no version bump per scope)
  • Wording sweep: log line, JavaDoc on TelemetryReporter.sendPingNow + HeartbeatState
  • mvn test -Dtest=TelemetryReporterTest: 27 passed, 0 failed

R2 captured wire bodies

ORG_ID=acme-corp:
{"telemetry_type":"sdk","sdk":"java", ... ,"org_id":"acme-corp"}

ORG_ID unset:
{"telemetry_type":"sdk","sdk":"java", ... ,"org_id":"local-dev-org"}

ORG_ID=cs_f29e9c5c-5c5b-4e0d-8e0d-aabbccddeeff:
{"telemetry_type":"sdk","sdk":"java", ... ,"org_id":"cs_f29e9c5c-..."}

(Captured via in-process com.sun.net.httpserver.HttpServer.)

Test plan

  • CI green
  • DCO trailer present
  • Commit Lint passes

Refs: getaxonflow/axonflow-enterprise#2230
Refs: getaxonflow/axonflow-enterprise#2277

Brings Java SDK telemetry up to parity with the platform's
startup_telemetry.go emitter. Every heartbeat body now identifies
which deployment-organization emitted it via an org_id field on the
wire.

Two sources, precedence order:
1. ORG_ID env var when set (operator's explicit configuration on
   self-hosted; the cs_<uuid> tenant identifier on Community SaaS).
2. local-dev-org sentinel when unset.

Always emitted via TelemetryReporter.telemetryOrgId(). Receiver at
ee/platform/checkpoint-service/pkg/telemetry/telemetry.go:454 carries
omitempty for backward compat against pre-v9.1 SDKs.

Tests added (TelemetryReporterTest.java, 9 new @test methods):
- telemetryOrgId helper — 4 cases (env wins, sentinel, empty falls
  through, cs_<uuid> passes through). Uses junit-pioneer
  @SetEnvironmentVariable / @ClearEnvironmentVariable for in-process
  env mutation (deps already in pom.xml).
- buildPayload includes org_id on wire — 3 cases with JsonNode decode
  AND wire-literal substring assertion. Defends against tag-removal
  mutations.
- WireMock-driven functional E2E — 2 cases prove org_id arrives at the
  receiver over real HTTP through the SDK's outbound stack.

27 of 27 tests in TelemetryReporterTest pass (18 prior + 9 new).

Runtime proof at runtime-e2e/v91_org_id_telemetry/V91OrgIdTelemetryTest.java
— in-process com.sun.net.httpserver.HttpServer consumes the SDK's
real telemetry POST, parses the JSON body, asserts org_id. Three modes
exercised at PR time:
- ORG_ID=acme-corp     → org_id:"acme-corp"     PASS
- unset ORG_ID         → org_id:"local-dev-org" PASS
- ORG_ID=cs_<uuid>     → org_id:"cs_<uuid>"     PASS

Companion wording sweep alongside the new field:
- TelemetryReporter log line "anonymous telemetry enabled" → "telemetry
  enabled" — the operator-supplied ORG_ID on self-hosted is not
  anonymized.
- HeartbeatState JavaDoc softened similarly.
- TelemetryReporter.sendPingNow JavaDoc softened.

CHANGELOG.md [Unreleased] expanded with org_id Added bullet + the
log-wording change under Changed.

Sister PRs across the other 4 SDKs and 4 plugins land in the same
session. Privacy.html update landed first on axonflow-landing main:
see axonflow-landing#129 (merged 2026-05-21).

Refs: getaxonflow/axonflow-enterprise#2230 (Epic v9 identity)
Refs: getaxonflow/axonflow-enterprise#2277 (v9.1 SDK + plugin org_id)
Signed-off-by: Saurabh Jain <saurabh.jain@getaxonflow.com>
@saurabhjain1592 saurabhjain1592 merged commit 5334fd3 into main May 21, 2026
18 checks passed
@saurabhjain1592 saurabhjain1592 deleted the feat/v91-org-id-telemetry-payload branch May 21, 2026 12:58
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