Current state
pnpm run test:e2e covers 6 of the 11 shipped adapters:
| Adapter |
e2e |
Note |
| axiom |
✅ |
round-trip when the token has query:read |
| posthog |
✅ |
smoke (write-only API) |
| sentry |
✅ |
smoke (DSN is write-only) |
| better-stack |
✅ |
smoke (source token is write-only) |
| loki |
✅ |
round-trip, local container or Grafana Cloud |
| clickhouse |
✅ |
round-trip, local container or ClickHouse Cloud |
| datadog |
❌ |
|
| hyperdx |
❌ |
|
| otlp |
❌ |
|
| fs |
❌ |
|
These suites are the safety net for "the destination quietly changed its API". Four adapters currently have none.
Suggested order
1. fs — do this one first. Fully local, no secrets, no container. It can be a true round-trip: write events, read the NDJSON back, assert rotation / maxFiles / maxSizePerFile behaviour. Unlike every other suite it can run unconditionally in CI on every PR, not just the nightly cron.
2. otlp — extend the sandbox. Add an otel/opentelemetry-collector service to packages/evlog/test/e2e/docker-compose.yml with a file exporter, then assert the exported records. No account needed, and it validates the OTLP payload shape that hyperdx and posthog (logs mode) both reuse.
3. hyperdx — smoke against the cloud endpoint, or point it at the same local collector since createHyperDXDrain() is a thin mapping onto sendBatchToOTLP().
4. datadog — smoke; the intake API is write-only, so this mirrors the Better Stack suite. Worth asserting the httpStatusCode renaming and the dd.trace_id block survive the wire.
Pattern to follow
test/e2e/loki.e2e.ts and test/e2e/clickhouse.e2e.ts are the round-trip references; test/e2e/better-stack.e2e.ts is the smoke reference. All use describeIfEnv() so a missing endpoint skips with a visible label instead of passing silently, and makeEvent() to tag every event with e2e_run_id / e2e_correlation_id for cleanup.
Adapters with a local container should be wired into sandbox:up / sandbox:e2e so they run without credentials.
Also
.github/workflows/e2e.yml and test/e2e/README.md list the required secrets — both need the new entries.
Current state
pnpm run test:e2ecovers 6 of the 11 shipped adapters:query:readThese suites are the safety net for "the destination quietly changed its API". Four adapters currently have none.
Suggested order
1.
fs— do this one first. Fully local, no secrets, no container. It can be a true round-trip: write events, read the NDJSON back, assert rotation /maxFiles/maxSizePerFilebehaviour. Unlike every other suite it can run unconditionally in CI on every PR, not just the nightly cron.2.
otlp— extend the sandbox. Add anotel/opentelemetry-collectorservice topackages/evlog/test/e2e/docker-compose.ymlwith afileexporter, then assert the exported records. No account needed, and it validates the OTLP payload shape thathyperdxandposthog(logs mode) both reuse.3.
hyperdx— smoke against the cloud endpoint, or point it at the same local collector sincecreateHyperDXDrain()is a thin mapping ontosendBatchToOTLP().4.
datadog— smoke; the intake API is write-only, so this mirrors the Better Stack suite. Worth asserting thehttpStatusCoderenaming and thedd.trace_idblock survive the wire.Pattern to follow
test/e2e/loki.e2e.tsandtest/e2e/clickhouse.e2e.tsare the round-trip references;test/e2e/better-stack.e2e.tsis the smoke reference. All usedescribeIfEnv()so a missing endpoint skips with a visible label instead of passing silently, andmakeEvent()to tag every event withe2e_run_id/e2e_correlation_idfor cleanup.Adapters with a local container should be wired into
sandbox:up/sandbox:e2eso they run without credentials.Also
.github/workflows/e2e.ymlandtest/e2e/README.mdlist the required secrets — both need the new entries.