Skip to content

Introduce opentelemetry in rewatch and setup new test infrastructure#8241

Draft
nojaf wants to merge 4 commits intorescript-lang:masterfrom
nojaf:migrate-rewatch-tests
Draft

Introduce opentelemetry in rewatch and setup new test infrastructure#8241
nojaf wants to merge 4 commits intorescript-lang:masterfrom
nojaf:migrate-rewatch-tests

Conversation

@nojaf
Copy link
Member

@nojaf nojaf commented Feb 5, 2026

This is a subset of #8231.

I wish to introduce open telemetry in Rewatch and migrate the bash tests to a new test suite.

The new tests would look like:

describe("build", () => {
  it("builds all packages from root", () =>
    runRewatchTest(async ({ cli }) => {
      await cli.build();
    }));
});

Where we capture all telemetry traces produced inside runRewatchTest and extract a deterministic snapshot of this:

// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html

exports[`build > builds all packages from root 1`] = `
[
  "rewatch.build[working_dir=.]",
  "  initialize_build",
  "    packages.make",
  "      build.load_package_sources[package=@rewatch-test/app]",
  "      build.load_package_sources[package=@rewatch-test/library]",
  "      build.load_package_sources[package=rewatch-test-fixture]",
  "    packages.parse_packages",
  "    clean.cleanup_previous_build",
  "  incremental_build[module_count=3]",
  "    build.parse[dirty_modules=3]",
  "    build.compile",
  "      build.compile_wave[file_count=1]",
  "        build.compile_file[module=Library]",
  "      build.compile_wave[file_count=1]",
  "        build.compile_file[module=App]",
  "      build.compile_wave[file_count=1]",
  "        build.compile_file[module=Root]",
]
`;

With this telemetry we can easily update snapshots and assert all still works as expected.
By using Vitest we also have a proper test runner, so can run individual tests.
All tests also run in a sandbox folder in the /tmp, we they cannot interfere with each other.
And they can run in parallel.

The goal is too replace and remove the existing bash tests.

@pkg-pr-new
Copy link

pkg-pr-new bot commented Feb 6, 2026

Open in StackBlitz

rescript

npm i https://pkg.pr.new/rescript-lang/rescript@8241

@rescript/darwin-arm64

npm i https://pkg.pr.new/rescript-lang/rescript/@rescript/darwin-arm64@8241

@rescript/darwin-x64

npm i https://pkg.pr.new/rescript-lang/rescript/@rescript/darwin-x64@8241

@rescript/linux-arm64

npm i https://pkg.pr.new/rescript-lang/rescript/@rescript/linux-arm64@8241

@rescript/linux-x64

npm i https://pkg.pr.new/rescript-lang/rescript/@rescript/linux-x64@8241

@rescript/runtime

npm i https://pkg.pr.new/rescript-lang/rescript/@rescript/runtime@8241

@rescript/win32-x64

npm i https://pkg.pr.new/rescript-lang/rescript/@rescript/win32-x64@8241

commit: 9ba38d7

@nojaf nojaf force-pushed the migrate-rewatch-tests branch 2 times, most recently from 6fc10da to 0ce96cc Compare February 6, 2026 10:45
nojaf added 4 commits February 6, 2026 11:48
Add optional OTLP tracing export to rewatch, controlled by the
OTEL_EXPORTER_OTLP_ENDPOINT environment variable. When set, rewatch
exports spans via HTTP OTLP; when unset, tracing is a no-op.

Instrument key build system functions (initialize_build, incremental_build,
compile, parse, clean, format, packages) with tracing spans and attributes
such as module counts and package names.

Restructure main.rs to support telemetry lifecycle (init/flush/shutdown)
and fix show_progress to use >= LevelFilter::Info so -v/-vv don't
suppress progress messages. Also print 'Finished compilation' in
plain_output mode during watch full rebuilds.

Introduce a new Vitest-based test infrastructure in tests/rewatch_tests/
that replaces the bash integration tests. Tests spawn rewatch with an
OTLP endpoint pointing to an in-process HTTP receiver, collect spans,
and snapshot the resulting span tree for deterministic assertions.

Update CI, Makefile, and scripts/test.js to use the new test runner.
When stdin is a pipe (not a TTY), spawn a background thread that
monitors for EOF. This allows a parent process (such as the test
harness) to signal a graceful shutdown by closing stdin, without
relying on signals or lock file removal.
Add mtime and content-hash based deduplication to filter out phantom
and duplicate file system events. Normalize event kinds from atomic
writes (temp file + rename) so they are treated as content modifications
rather than create/remove cycles that trigger unnecessary full rebuilds.

This fixes issues on macOS (Create events from atomic writes), Linux
(duplicate inotify IN_MODIFY events), and Windows (Remove+Rename
sequences from atomic writes).
On Windows, bsc writes CRLF to stdout in text mode. When the original
source file uses LF line endings, the formatted output would introduce
unwanted CRLF conversions. Detect the original file's line ending style
and normalize the formatted output to match.
@nojaf nojaf force-pushed the migrate-rewatch-tests branch from 0ce96cc to 9ba38d7 Compare February 6, 2026 10:48
@nojaf
Copy link
Member Author

nojaf commented Feb 6, 2026

@rolandpeelen and @jfrolich this is already a good first carve out worth reviewing.

Changes to rewatch are minimal but I need some small fixes for the new test suite.
As I mentioned with passion: I want to get rid of the rewatch bash tests, so I will be fixing what I need in this PR. Will try do have a somewhat clean git history so it is easy to review.

Next steps would be to port more tests, but you can already take a look at the rewatch changes.

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