Skip to content

feat(metrics): record per-snapshot dirty/empty/total bytes at creation#2649

Merged
ValentaTomas merged 8 commits into
mainfrom
feat/snapshot-diff-metrics
May 13, 2026
Merged

feat(metrics): record per-snapshot dirty/empty/total bytes at creation#2649
ValentaTomas merged 8 commits into
mainfrom
feat/snapshot-diff-metrics

Conversation

@ValentaTomas
Copy link
Copy Markdown
Member

@ValentaTomas ValentaTomas commented May 13, 2026

Per-snapshot histograms (full/empty/total bytes + ratio %) recorded inside Sandbox.Pause, attributed by file_type (memfile/rootfs), kind (full/empty), and use_case (pause/build), so we can see how FPR/FPH/reclaim affect snapshot composition and tell pause-time samples from template-build samples apart.

Three histograms recorded once per Pause:
- orchestrator.sandbox.snapshot.diff.bytes
- orchestrator.sandbox.snapshot.diff.ratio_bp (basis points, 10000=100%)
- orchestrator.sandbox.snapshot.total.bytes

Attributes: file_type=memfile|rootfs, kind=dirty|empty, use_case=pause|build.
Use-case lets us split the regular pause path from template-build's
PauseAndUpload so a change to FPR/FPH/reclaim can be evaluated in
isolation per call site.
@cla-bot cla-bot Bot added the cla-signed label May 13, 2026
@cursor
Copy link
Copy Markdown

cursor Bot commented May 13, 2026

PR Summary

Medium Risk
Adds new telemetry emission on snapshot creation and changes the Sandbox.Pause signature, so any missed call site updates or metric/attribute cardinality issues could impact snapshotting paths or observability overhead.

Overview
This PR adds per-snapshot histograms for memfile/rootfs dirty and empty bytes, their ratio (basis points), and total mapped size, recorded during Sandbox.Pause and tagged by file_type, kind, and a new use_case (pause vs build). It also updates all Pause call sites to pass the new useCase argument and wires rootfs post-processing to record these metrics.

Reviewed by Cursor Bugbot for commit 1ab4253. Bugbot is set up for automated code reviews on this repo. Configure here.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 13, 2026

❌ 10 Tests Failed:

Tests completed Failed Passed Skipped
2618 10 2608 7
View the full list of 16 ❄️ flaky test(s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestEgressFirewallExactDomainMatchVsSubdomain

Flake rate in main: 54.36% (Passed 157 times, Failed 187 times)

Stack Traces | 1.17s run time
=== RUN   TestEgressFirewallExactDomainMatchVsSubdomain
=== PAUSE TestEgressFirewallExactDomainMatchVsSubdomain
=== CONT  TestEgressFirewallExactDomainMatchVsSubdomain
Executing command curl in sandbox ipxm8h9pegz796noc7mfd
    sandbox_network_out_test.go:594: Command [curl] output: event:{start:{pid:1304}}
    sandbox_network_out_test.go:594: 
        	Error Trace:	.../api/sandboxes/sandbox_network_out_test.go:67
        	            				.../api/sandboxes/sandbox_network_out_test.go:594
        	Error:      	Received unexpected error:
        	            	failed to execute command curl in sandbox ih1dg8oprfhkbl0mx6hiv: invalid_argument: protocol error: incomplete envelope: unexpected EOF
        	Test:       	TestEgressFirewallExactDomainMatchVsSubdomain
        	Messages:   	Expected curl to exact domain (google.com) to succeed
--- FAIL: TestEgressFirewallExactDomainMatchVsSubdomain (1.17s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestUpdateNetworkConfig

Flake rate in main: 76.44% (Passed 164 times, Failed 532 times)

Stack Traces | 215s run time
=== RUN   TestUpdateNetworkConfig
=== PAUSE TestUpdateNetworkConfig
=== CONT  TestUpdateNetworkConfig
--- FAIL: TestUpdateNetworkConfig (215.23s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false

Flake rate in main: 76.90% (Passed 158 times, Failed 526 times)

Stack Traces | 5.64s run time
=== RUN   TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false
Executing command curl in sandbox ipxm8h9pegz796noc7mfd
    sandbox_network_update_test.go:372: Command [curl] output: event:{start:{pid:1347}}
    sandbox_network_update_test.go:372: Command [curl] output: event:{end:{exit_code:35  exited:true  status:"exit status 35"  error:"exit status 35"}}
Executing command curl in sandbox ipxm8h9pegz796noc7mfd
    sandbox_network_update_test.go:372: Command [curl] output: event:{start:{pid:1348}}
    sandbox_network_update_test.go:372: Command [curl] output: event:{end:{exit_code:35  exited:true  status:"exit status 35"  error:"exit status 35"}}
Executing command curl in sandbox ixv5oxskoojf59hg934dx
    sandbox_network_update_test.go:391: Command [curl] output: event:{start:{pid:1349}}
    sandbox_network_update_test.go:391: Command [curl] output: event:{data:{stdout:"HTTP/2 302 \r\nx-content-type-options: nosniff\r\nlocation: https://dns.google/\r\ndate: Wed, 13 May 2026 21:01:45 GMT\r\ncontent-type: text/html; charset=UTF-8\r\nserver: HTTP server (unknown)\r\ncontent-length: 216\r\nx-xss-protection: 0\r\nx-frame-options: SAMEORIGIN\r\nalt-svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\n\r\n"}}
    sandbox_network_update_test.go:391: Command [curl] output: event:{end:{exited:true  status:"exit status 0"}}
    sandbox_network_update_test.go:391: Command [curl] completed successfully in sandbox ipxm8h9pegz796noc7mfd
    sandbox_network_update_test.go:391: 
        	Error Trace:	.../api/sandboxes/sandbox_network_out_test.go:74
        	            				.../api/sandboxes/sandbox_network_update_test.go:60
        	            				.../api/sandboxes/sandbox_network_update_test.go:391
        	Error:      	An error is expected but got nil.
        	Test:       	TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false
        	Messages:   	https://8.8.8.8 should be blocked
--- FAIL: TestUpdateNetworkConfig/pause_resume_preserves_allow_internet_access_false (5.64s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost

Flake rate in main: 56.80% (Passed 273 times, Failed 359 times)

Stack Traces | 0s run time
=== RUN   TestBindLocalhost
=== PAUSE TestBindLocalhost
=== CONT  TestBindLocalhost
--- FAIL: TestBindLocalhost (0.00s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_0_0_0_0

Flake rate in main: 62.89% (Passed 154 times, Failed 261 times)

Stack Traces | 7.26s run time
=== RUN   TestBindLocalhost/bind_0_0_0_0
=== PAUSE TestBindLocalhost/bind_0_0_0_0
=== CONT  TestBindLocalhost/bind_0_0_0_0
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1252}}
Executing command python in sandbox iaei7ihjs2y5x8j8fgxuq
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_0_0_0_0
        	Messages:   	Unexpected status code 502 for bind address 0.0.0.0
--- FAIL: TestBindLocalhost/bind_0_0_0_0 (7.26s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_127_0_0_1

Flake rate in main: 57.95% (Passed 156 times, Failed 215 times)

Stack Traces | 7.73s run time
=== RUN   TestBindLocalhost/bind_127_0_0_1
=== PAUSE TestBindLocalhost/bind_127_0_0_1
=== CONT  TestBindLocalhost/bind_127_0_0_1
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1252}}
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_127_0_0_1
        	Messages:   	Unexpected status code 502 for bind address 127.0.0.1
--- FAIL: TestBindLocalhost/bind_127_0_0_1 (7.73s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_::

Flake rate in main: 55.93% (Passed 156 times, Failed 198 times)

Stack Traces | 8.55s run time
=== RUN   TestBindLocalhost/bind_::
=== PAUSE TestBindLocalhost/bind_::
=== CONT  TestBindLocalhost/bind_::
Executing command python in sandbox i5kwjnkwle7lgq8q3l779
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1252}}
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_::
        	Messages:   	Unexpected status code 502 for bind address ::
--- FAIL: TestBindLocalhost/bind_:: (8.55s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_::1

Flake rate in main: 64.43% (Passed 154 times, Failed 279 times)

Stack Traces | 7.62s run time
=== RUN   TestBindLocalhost/bind_::1
=== PAUSE TestBindLocalhost/bind_::1
=== CONT  TestBindLocalhost/bind_::1
Executing command /bin/bash in sandbox i76g3n1rduizwu8suwidh
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1252}}
Executing command python in sandbox ihhh1oppf9gmxxllciyqv
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_::1
        	Messages:   	Unexpected status code 502 for bind address ::1
--- FAIL: TestBindLocalhost/bind_::1 (7.62s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestBindLocalhost/bind_localhost

Flake rate in main: 64.27% (Passed 154 times, Failed 277 times)

Stack Traces | 8.92s run time
=== RUN   TestBindLocalhost/bind_localhost
=== PAUSE TestBindLocalhost/bind_localhost
=== CONT  TestBindLocalhost/bind_localhost
Executing command python in sandbox iyenc9fbdl2yseo1vayq5
    localhost_bind_test.go:69: Command [python] output: event:{start:{pid:1252}}
    localhost_bind_test.go:90: 
        	Error Trace:	.../tests/envd/localhost_bind_test.go:90
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 502
        	Test:       	TestBindLocalhost/bind_localhost
        	Messages:   	Unexpected status code 502 for bind address localhost
--- FAIL: TestBindLocalhost/bind_localhost (8.92s)
Executing command python in sandbox iqkzo497657vk021qob6r
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestListDir

Flake rate in main: 53.66% (Passed 196 times, Failed 227 times)

Stack Traces | 0.3s run time
=== RUN   TestListDir
=== PAUSE TestListDir
=== CONT  TestListDir
--- FAIL: TestListDir (0.30s)
Executing command /bin/bash in sandbox iezy5h25cuhigkz6gbivq
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestListDir/depth_0_lists_only_root_directory

Flake rate in main: 57.58% (Passed 154 times, Failed 209 times)

Stack Traces | 0.02s run time
=== RUN   TestListDir/depth_0_lists_only_root_directory
=== PAUSE TestListDir/depth_0_lists_only_root_directory
=== CONT  TestListDir/depth_0_lists_only_root_directory
    filesystem_test.go:97: 
        	Error Trace:	.../tests/envd/filesystem_test.go:97
        	Error:      	Received unexpected error:
        	            	unavailable: 502 Bad Gateway
        	Test:       	TestListDir/depth_0_lists_only_root_directory
--- FAIL: TestListDir/depth_0_lists_only_root_directory (0.02s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestListDir/depth_1_lists_root_directory

Flake rate in main: 57.58% (Passed 154 times, Failed 209 times)

Stack Traces | 0.01s run time
=== RUN   TestListDir/depth_1_lists_root_directory
=== PAUSE TestListDir/depth_1_lists_root_directory
=== CONT  TestListDir/depth_1_lists_root_directory
    filesystem_test.go:97: 
        	Error Trace:	.../tests/envd/filesystem_test.go:97
        	Error:      	Received unexpected error:
        	            	unavailable: 502 Bad Gateway
        	Test:       	TestListDir/depth_1_lists_root_directory
--- FAIL: TestListDir/depth_1_lists_root_directory (0.01s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestListDir/depth_2_lists_first_level_of_subdirectories_(in_this_case_the_root_directory)

Flake rate in main: 57.58% (Passed 154 times, Failed 209 times)

Stack Traces | 0.02s run time
=== RUN   TestListDir/depth_2_lists_first_level_of_subdirectories_(in_this_case_the_root_directory)
=== PAUSE TestListDir/depth_2_lists_first_level_of_subdirectories_(in_this_case_the_root_directory)
=== CONT  TestListDir/depth_2_lists_first_level_of_subdirectories_(in_this_case_the_root_directory)
    filesystem_test.go:97: 
        	Error Trace:	.../tests/envd/filesystem_test.go:97
        	Error:      	Received unexpected error:
        	            	unavailable: 502 Bad Gateway
        	Test:       	TestListDir/depth_2_lists_first_level_of_subdirectories_(in_this_case_the_root_directory)
--- FAIL: TestListDir/depth_2_lists_first_level_of_subdirectories_(in_this_case_the_root_directory) (0.02s)
github.com/e2b-dev/infra/tests/integration/internal/tests/envd::TestListDir/depth_3_lists_all_directories_and_files

Flake rate in main: 57.58% (Passed 154 times, Failed 209 times)

Stack Traces | 0.01s run time
=== RUN   TestListDir/depth_3_lists_all_directories_and_files
=== PAUSE TestListDir/depth_3_lists_all_directories_and_files
=== CONT  TestListDir/depth_3_lists_all_directories_and_files
    filesystem_test.go:97: 
        	Error Trace:	.../tests/envd/filesystem_test.go:97
        	Error:      	Received unexpected error:
        	            	unavailable: 502 Bad Gateway
        	Test:       	TestListDir/depth_3_lists_all_directories_and_files
--- FAIL: TestListDir/depth_3_lists_all_directories_and_files (0.01s)
github.com/e2b-dev/infra/tests/integration/internal/tests/orchestrator::TestSandboxMemoryIntegrity

Flake rate in main: 66.05% (Passed 164 times, Failed 319 times)

Stack Traces | 76.2s run time
=== RUN   TestSandboxMemoryIntegrity
=== PAUSE TestSandboxMemoryIntegrity
=== CONT  TestSandboxMemoryIntegrity
    sandbox_memory_integrity_test.go:26: Build completed successfully
--- FAIL: TestSandboxMemoryIntegrity (76.15s)
github.com/e2b-dev/infra/tests/integration/internal/tests/orchestrator::TestSandboxMemoryIntegrity/tmpfs_hash

Flake rate in main: 67.02% (Passed 154 times, Failed 313 times)

Stack Traces | 23.5s run time
=== RUN   TestSandboxMemoryIntegrity/tmpfs_hash
=== PAUSE TestSandboxMemoryIntegrity/tmpfs_hash
=== CONT  TestSandboxMemoryIntegrity/tmpfs_hash
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{start:{pid:1253}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stdout:"Total memory: 985 MB\nUsed memory before tmpfs mount: 181 MB\nFree memory before tmpfs mount: 803 MB\nMemory to use in integrity test (80% of free, min 64MB): 642 MB\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"642+0 records in\n642+0 records out\n673185792 bytes (673 MB, 642 MiB) copied, 3.4946 s, 193 MB/s\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stdout:"Used memory after tmpfs mount and file fill: 830 MB\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\tCommand being timed: \"dd if=/dev/urandom of=/mnt/testfile bs=1M count=642\"\n\tUser time (seconds): 0.00\n\tSystem time (seconds): 3.45\n\tPercent of CPU this job got: 98%\n\tElapsed (wall clock) time (h:mm:ss or m:ss): 0:03.50\n\tAverage shared text size (kbytes): 0\n\tAverage unshared data size (kbytes): 0\n\tAverage stack size (kbytes): 0\n\tAverage total size (kbytes): 0\n\tMaximum resident set size (kbytes): 2732\n\tAverage resident set size (kbytes): 0\n\tMajor (requiring I/O) page faults: 3\n\tMinor (reclaiming a frame) page faults: 345\n\tVoluntary context switches: 4\n\tInvoluntary context switches: 74\n\tSwaps: 0\n\tFile system inputs: 176\n\tFile system outputs: 0\n\tSocket messages sent: 0\n\tSocket messages received: 0\n\tSignals delivered: 0\n\tPage size (bytes): 4096\n\tExit status: 0\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{end:{exited:true status:"exit status 0"}}
    sandbox_memory_integrity_test.go:70: Command [bash] completed successfully in sandbox i4jzfak41d42q65l8f107
Executing command bash in sandbox i4jzfak41d42q65l8f107 (user: root)
    sandbox_memory_integrity_test.go:74: Command [bash] output: event:{start:{pid:1269}}
    sandbox_memory_integrity_test.go:74: Command [bash] output: event:{data:{stdout:"9d94fc91e8dd46127e5973cc98a595a8221cb249dded32a8db16c641ce22c140\n"}}
    sandbox_memory_integrity_test.go:74: Command [bash] output: event:{end:{exited:true status:"exit status 0"}}
    sandbox_memory_integrity_test.go:74: Command [bash] completed successfully in sandbox i4jzfak41d42q65l8f107
Executing command bash in sandbox i4jzfak41d42q65l8f107 (user: root)
    sandbox_memory_integrity_test.go:99: Command [bash] output: event:{start:{pid:1272}}
    sandbox_memory_integrity_test.go:100: 
        	Error Trace:	.../tests/orchestrator/sandbox_memory_integrity_test.go:100
        	Error:      	Received unexpected error:
        	            	failed to execute command bash in sandbox i4jzfak41d42q65l8f107: invalid_argument: protocol error: incomplete envelope: unexpected EOF
        	Test:       	TestSandboxMemoryIntegrity/tmpfs_hash
--- FAIL: TestSandboxMemoryIntegrity/tmpfs_hash (23.50s)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

The diffStatsFromMetadata function in packages/orchestrator/pkg/sandbox/sandbox.go accesses the Dirty and Empty bitmaps without checking for nil pointers, which could cause a panic if a provider returns metadata with uninitialized bitmaps. Adding explicit nil checks before calling GetCardinality ensures the stats calculation is safe and prevents potential service instability when diff information is incomplete.

Comment thread packages/orchestrator/pkg/sandbox/sandbox.go Outdated
Pass useCase to Sandbox.Pause and have it call recordSnapshotDiff right
after each per-pause DiffMetadata is produced — memfile inside Pause,
rootfs inside pauseProcessRootfs (where the rootfs DiffMetadata lives).
No Snapshot field, no helper struct, no extra return values.
@ValentaTomas ValentaTomas marked this pull request as ready for review May 13, 2026 20:32
Copy link
Copy Markdown

@claude claude Bot left a comment

Choose a reason for hiding this comment

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

⚠️ Code review skipped — your organization has reached its monthly code review spending cap.

An organization admin can view or raise the cap at claude.ai/admin-settings/claude-code. The cap resets at the start of the next billing period.

Once the cap resets or is raised, reopen this pull request to trigger a review.

@ValentaTomas ValentaTomas enabled auto-merge (squash) May 13, 2026 20:32
@ValentaTomas ValentaTomas changed the title feat(metrics): record per-snapshot dirty/empty/total bytes feat(metrics): record per-snapshot dirty/empty/total bytes at creation May 13, 2026
@ValentaTomas
Copy link
Copy Markdown
Member Author

Resolved in 51a1b15237b7a2 (refactor) → just-pushed nil-check. The function gemini flagged (diffStatsFromMetadata) is gone; equivalent path in recordSnapshotDiff now checks dm.Dirty / dm.Empty for nil before GetCardinality().

@ValentaTomas ValentaTomas requested a review from kalyazin May 13, 2026 20:36
@ValentaTomas ValentaTomas assigned bchalios and unassigned tvi and bchalios May 13, 2026
@ValentaTomas ValentaTomas requested a review from bchalios May 13, 2026 20:36
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix prepared a fix for the issue found in the latest run.

  • ✅ Fixed: Wrong use case constant in resume-build tool
    • Changed line 643 from SnapshotUseCasePause to SnapshotUseCaseBuild to correctly classify template build operations in metrics.

Create PR

Or push these changes by commenting:

@cursor push 919a0b87ef
Preview (919a0b87ef)
diff --git a/packages/orchestrator/cmd/resume-build/main.go b/packages/orchestrator/cmd/resume-build/main.go
--- a/packages/orchestrator/cmd/resume-build/main.go
+++ b/packages/orchestrator/cmd/resume-build/main.go
@@ -640,7 +640,7 @@
 
 	// Pause and create snapshot
 	pauseStart := time.Now()
-	snapshot, err := sbx.Pause(ctx, newMeta, sandbox.SnapshotUseCasePause)
+	snapshot, err := sbx.Pause(ctx, newMeta, sandbox.SnapshotUseCaseBuild)
 	pauseDur := time.Since(pauseStart)
 	totalDur := time.Since(t0)

You can send follow-ups to the cloud agent here.

Reviewed by Cursor Bugbot for commit 2fedc0d. Configure here.

Comment thread packages/orchestrator/cmd/resume-build/main.go
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 237b7a2932

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/orchestrator/pkg/sandbox/sandbox.go
Comment thread packages/orchestrator/pkg/sandbox/snapshot_metrics.go Outdated
@ValentaTomas ValentaTomas disabled auto-merge May 13, 2026 20:43
@ValentaTomas ValentaTomas enabled auto-merge (squash) May 13, 2026 20:49
@ValentaTomas ValentaTomas merged commit 4480f61 into main May 13, 2026
53 checks passed
@ValentaTomas ValentaTomas deleted the feat/snapshot-diff-metrics branch May 13, 2026 21:10
ValentaTomas added a commit that referenced this pull request May 13, 2026
#2649)

Per-snapshot histograms (full/empty/total bytes + ratio %) recorded
inside Sandbox.Pause, attributed by file_type (memfile/rootfs), kind
(full/empty), and use_case (pause/build), so we can see how
FPR/FPH/reclaim affect snapshot composition and tell pause-time samples
from template-build samples apart.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants