diff --git a/packages/clickhouse/migrations/20260223120000_add_sandbox_type_to_host_stats.sql b/packages/clickhouse/migrations/20260223120000_add_sandbox_type_to_host_stats.sql new file mode 100644 index 0000000000..ae6b52a66c --- /dev/null +++ b/packages/clickhouse/migrations/20260223120000_add_sandbox_type_to_host_stats.sql @@ -0,0 +1,19 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE sandbox_host_stats_local + ADD COLUMN IF NOT EXISTS sandbox_type LowCardinality(String) DEFAULT 'sandbox' CODEC (ZSTD(1)); +-- +goose StatementEnd + +-- +goose StatementBegin +ALTER TABLE sandbox_host_stats + ADD COLUMN IF NOT EXISTS sandbox_type LowCardinality(String) DEFAULT 'sandbox' CODEC (ZSTD(1)); +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE sandbox_host_stats_local DROP COLUMN IF EXISTS sandbox_type; +-- +goose StatementEnd + +-- +goose StatementBegin +ALTER TABLE sandbox_host_stats DROP COLUMN IF EXISTS sandbox_type; +-- +goose StatementEnd diff --git a/packages/clickhouse/migrations/20260223120001_add_build_columns_to_metrics_gauge.sql b/packages/clickhouse/migrations/20260223120001_add_build_columns_to_metrics_gauge.sql new file mode 100644 index 0000000000..bd6d2b6be9 --- /dev/null +++ b/packages/clickhouse/migrations/20260223120001_add_build_columns_to_metrics_gauge.sql @@ -0,0 +1,51 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE sandbox_metrics_gauge_local + ADD COLUMN IF NOT EXISTS build_id String DEFAULT '' CODEC (ZSTD(1)), + ADD COLUMN IF NOT EXISTS sandbox_type LowCardinality(String) DEFAULT 'sandbox' CODEC (ZSTD(1)); +-- +goose StatementEnd + +-- +goose StatementBegin +ALTER TABLE sandbox_metrics_gauge + ADD COLUMN IF NOT EXISTS build_id String DEFAULT '' CODEC (ZSTD(1)), + ADD COLUMN IF NOT EXISTS sandbox_type LowCardinality(String) DEFAULT 'sandbox' CODEC (ZSTD(1)); +-- +goose StatementEnd + +-- +goose StatementBegin +ALTER TABLE sandbox_metrics_gauge_mv MODIFY QUERY +SELECT + toDateTime64(TimeUnix, 9) AS timestamp, + Attributes['sandbox_id'] AS sandbox_id, + Attributes['team_id'] AS team_id, + Attributes['build_id'] AS build_id, + Attributes['sandbox_type'] AS sandbox_type, + MetricName AS metric_name, + Value AS value +FROM metrics_gauge +WHERE MetricName LIKE 'e2b.sandbox.%'; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE sandbox_metrics_gauge_mv MODIFY QUERY +SELECT + toDateTime64(TimeUnix, 9) AS timestamp, + Attributes['sandbox_id'] AS sandbox_id, + Attributes['team_id'] AS team_id, + MetricName AS metric_name, + Value AS value +FROM metrics_gauge +WHERE MetricName LIKE 'e2b.sandbox.%'; +-- +goose StatementEnd + +-- +goose StatementBegin +ALTER TABLE sandbox_metrics_gauge_local + DROP COLUMN IF EXISTS build_id, + DROP COLUMN IF EXISTS sandbox_type; +-- +goose StatementEnd + +-- +goose StatementBegin +ALTER TABLE sandbox_metrics_gauge + DROP COLUMN IF EXISTS build_id, + DROP COLUMN IF EXISTS sandbox_type; +-- +goose StatementEnd diff --git a/packages/clickhouse/pkg/hoststats/delivery.go b/packages/clickhouse/pkg/hoststats/delivery.go index a8833b0bcf..bd9697324a 100644 --- a/packages/clickhouse/pkg/hoststats/delivery.go +++ b/packages/clickhouse/pkg/hoststats/delivery.go @@ -31,9 +31,10 @@ const InsertSandboxHostStatQuery = `INSERT INTO sandbox_host_stats cgroup_cpu_user_usec, cgroup_cpu_system_usec, cgroup_memory_usage_bytes, - cgroup_memory_peak_bytes + cgroup_memory_peak_bytes, + sandbox_type ) -VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` type ClickhouseDelivery struct { batcher *batcher.Batcher[SandboxHostStat] @@ -123,6 +124,7 @@ func (c *ClickhouseDelivery) batchInserter(ctx context.Context, stats []SandboxH stat.CgroupCPUSystemUsec, stat.CgroupMemoryUsage, stat.CgroupMemoryPeak, + stat.SandboxType, ) if err != nil { return fmt.Errorf("error appending %d host stat to batch: %w", len(stats), err) diff --git a/packages/clickhouse/pkg/hoststats/hoststats.go b/packages/clickhouse/pkg/hoststats/hoststats.go index dcf0459097..693f1e88df 100644 --- a/packages/clickhouse/pkg/hoststats/hoststats.go +++ b/packages/clickhouse/pkg/hoststats/hoststats.go @@ -31,6 +31,8 @@ type SandboxHostStat struct { CgroupCPUSystemUsec uint64 `ch:"cgroup_cpu_system_usec"` // cumulative, microseconds CgroupMemoryUsage uint64 `ch:"cgroup_memory_usage_bytes"` // current, bytes CgroupMemoryPeak uint64 `ch:"cgroup_memory_peak_bytes"` // lifetime peak, bytes + + SandboxType string `ch:"sandbox_type"` // "sandbox" or "build" } // Delivery is the interface for delivering host stats to storage backend diff --git a/packages/orchestrator/internal/metrics/sandboxes.go b/packages/orchestrator/internal/metrics/sandboxes.go index 501e4dbe8c..82700f286a 100644 --- a/packages/orchestrator/internal/metrics/sandboxes.go +++ b/packages/orchestrator/internal/metrics/sandboxes.go @@ -179,7 +179,7 @@ func (so *SandboxObserver) startObserving() (metric.Registration, error) { return err } - attributes := metric.WithAttributes(attribute.String("sandbox_id", sbx.Runtime.SandboxID), attribute.String("team_id", sbx.Runtime.TeamID)) + attributes := metric.WithAttributes(attribute.String("sandbox_id", sbx.Runtime.SandboxID), attribute.String("team_id", sbx.Runtime.TeamID), attribute.String("build_id", sbx.Runtime.BuildID), attribute.String("sandbox_type", sbx.Runtime.SandboxType.String())) ok, err = utils.IsGTEVersion(sbx.Config.Envd.Version, minEnvVersionForMetricsTimestamp) if err != nil { diff --git a/packages/orchestrator/internal/sandbox/cgroup/manager.go b/packages/orchestrator/internal/sandbox/cgroup/manager.go index 0df5596817..819c3667c3 100644 --- a/packages/orchestrator/internal/sandbox/cgroup/manager.go +++ b/packages/orchestrator/internal/sandbox/cgroup/manager.go @@ -45,7 +45,7 @@ type Stats struct { // whether Start succeeded or failed). Remove() closes the memory.peak FD and // deletes the cgroup directory — it does not release the cgroup directory FD. type CgroupHandle struct { - sandboxID string + cgroupName string path string file *os.File // Open FD to the cgroup directory (nil after ReleaseCgroupFD) memoryPeakFile *os.File // Open FD to memory.peak for per-FD reset (nil after Remove or if not available) @@ -126,7 +126,7 @@ func (h *CgroupHandle) Remove(ctx context.Context) error { } logger.L().Debug(ctx, "removed cgroup for sandbox", - logger.WithSandboxID(h.sandboxID), + zap.String("cgroup_name", h.cgroupName), zap.String("path", h.path)) return nil @@ -141,13 +141,13 @@ func (h *CgroupHandle) Path() string { return h.path } -// SandboxID returns the sandbox ID this cgroup is for -func (h *CgroupHandle) SandboxID() string { +// CgroupName returns the name of the cgroup +func (h *CgroupHandle) CgroupName() string { if h == nil { return "" } - return h.sandboxID + return h.cgroupName } // Manager handles initialization and creation of cgroups @@ -157,10 +157,10 @@ type Manager interface { // Should be called once at orchestrator startup Initialize(ctx context.Context) error - // Create creates a cgroup for a sandbox and returns a handle + // Create creates a cgroup with the given name and returns a handle // The handle provides access to the cgroup's FD, stats, and cleanup // Returns error if cgroup creation fails - Create(ctx context.Context, sandboxID string) (*CgroupHandle, error) + Create(ctx context.Context, cgroupName string) (*CgroupHandle, error) } type managerImpl struct{} @@ -190,8 +190,8 @@ func (m *managerImpl) Initialize(ctx context.Context) error { return nil } -func (m *managerImpl) Create(ctx context.Context, sandboxID string) (*CgroupHandle, error) { - cgroupPath := m.sandboxCgroupPath(sandboxID) +func (m *managerImpl) Create(ctx context.Context, cgroupName string) (*CgroupHandle, error) { + cgroupPath := m.cgroupPath(cgroupName) if err := os.MkdirAll(cgroupPath, 0o755); err != nil { return nil, fmt.Errorf("failed to create cgroup directory: %w", err) @@ -211,14 +211,14 @@ func (m *managerImpl) Create(ctx context.Context, sandboxID string) (*CgroupHand if peakErr != nil { // Not fatal — memory.peak may not exist on older kernels logger.L().Debug(ctx, "failed to open memory.peak", - logger.WithSandboxID(sandboxID), + zap.String("cgroup_name", cgroupName), zap.String("path", memPeakPath), zap.Error(peakErr)) memoryPeakFile = nil } handle := &CgroupHandle{ - sandboxID: sandboxID, + cgroupName: cgroupName, path: cgroupPath, file: file, memoryPeakFile: memoryPeakFile, @@ -226,7 +226,7 @@ func (m *managerImpl) Create(ctx context.Context, sandboxID string) (*CgroupHand } logger.L().Debug(ctx, "created cgroup for sandbox", - logger.WithSandboxID(sandboxID), + zap.String("cgroup_name", cgroupName), zap.String("path", cgroupPath), zap.Int("fd", handle.GetFD())) @@ -304,7 +304,7 @@ func (m *managerImpl) readMemoryPeak(memoryPeakFile *os.File) (uint64, error) { return peakBytes, nil } -// sandboxCgroupPath returns the filesystem path for a sandbox's cgroup -func (m *managerImpl) sandboxCgroupPath(sandboxID string) string { - return filepath.Join(RootCgroupPath, fmt.Sprintf("sbx-%s", sandboxID)) +// cgroupPath returns the filesystem path for a sandbox's cgroup +func (m *managerImpl) cgroupPath(cgroupName string) string { + return filepath.Join(RootCgroupPath, cgroupName) } diff --git a/packages/orchestrator/internal/sandbox/cgroup/manager_test.go b/packages/orchestrator/internal/sandbox/cgroup/manager_test.go index e4c293f464..1fc28ddcc2 100644 --- a/packages/orchestrator/internal/sandbox/cgroup/manager_test.go +++ b/packages/orchestrator/internal/sandbox/cgroup/manager_test.go @@ -75,7 +75,7 @@ func TestCgroupHandleLifecycle(t *testing.T) { require.NotNil(t, handle) defer handle.Remove(ctx) - assert.Equal(t, testSandboxID, handle.SandboxID()) + assert.Equal(t, testSandboxID, handle.CgroupName()) assert.Contains(t, handle.Path(), testSandboxID) assert.Positive(t, handle.GetFD()) @@ -141,7 +141,7 @@ func TestCgroupHandleWithProcessCreation(t *testing.T) { procCgroupPath := fmt.Sprintf("/proc/%d/cgroup", cmd.Process.Pid) cgroupData, err := os.ReadFile(procCgroupPath) require.NoError(t, err) - assert.Contains(t, string(cgroupData), fmt.Sprintf("e2b/sbx-%s", testSandboxID)) + assert.Contains(t, string(cgroupData), fmt.Sprintf("e2b/%s", testSandboxID)) cmd.Process.Kill() cmd.Wait() @@ -292,7 +292,7 @@ func TestStatsParsing(t *testing.T) { t.Parallel() tmpDir := t.TempDir() - cgroupPath := filepath.Join(tmpDir, "sbx-test-parse-sandbox") + cgroupPath := filepath.Join(tmpDir, "test-parse-sandbox") err := os.MkdirAll(cgroupPath, 0o755) require.NoError(t, err) diff --git a/packages/orchestrator/internal/sandbox/fc/process.go b/packages/orchestrator/internal/sandbox/fc/process.go index d16fb92211..dd88f260fa 100644 --- a/packages/orchestrator/internal/sandbox/fc/process.go +++ b/packages/orchestrator/internal/sandbox/fc/process.go @@ -259,6 +259,7 @@ func (p *Process) Create( hugePages bool, options ProcessOptions, txRateLimit TxRateLimiterConfig, + cgroupFD int, ) error { ctx, childSpan := tracer.Start(ctx, "create-fc") defer childSpan.End() @@ -274,7 +275,7 @@ func (p *Process) Create( sbxMetadata, options.Stdout, options.Stderr, - cgroup.NoCgroupFD, + cgroupFD, ) if err != nil { fcStopErr := p.Stop(ctx) diff --git a/packages/orchestrator/internal/sandbox/hoststats.go b/packages/orchestrator/internal/sandbox/hoststats.go index d122e1c1ff..e4ebf17688 100644 --- a/packages/orchestrator/internal/sandbox/hoststats.go +++ b/packages/orchestrator/internal/sandbox/hoststats.go @@ -18,7 +18,6 @@ func initializeHostStatsCollector( ctx context.Context, sbx *Sandbox, fcHandle *fc.Process, - buildID string, runtime RuntimeMetadata, config Config, hostStatsDelivery hoststats.Delivery, @@ -52,10 +51,11 @@ func initializeHostStatsCollector( SandboxID: runtime.SandboxID, ExecutionID: runtime.ExecutionID, TemplateID: runtime.TemplateID, - BuildID: buildID, + BuildID: runtime.BuildID, TeamID: teamID, VCPUCount: config.Vcpu, MemoryMB: config.RamMB, + SandboxType: runtime.SandboxType, }, int32(firecrackerPID), hostStatsDelivery, diff --git a/packages/orchestrator/internal/sandbox/hoststats_collector.go b/packages/orchestrator/internal/sandbox/hoststats_collector.go index 62c8952573..fce3d71fcc 100644 --- a/packages/orchestrator/internal/sandbox/hoststats_collector.go +++ b/packages/orchestrator/internal/sandbox/hoststats_collector.go @@ -39,6 +39,7 @@ type HostStatsMetadata struct { TeamID uuid.UUID VCPUCount int64 MemoryMB int64 + SandboxType SandboxType } func NewHostStatsCollector( @@ -96,6 +97,7 @@ func (h *HostStatsCollector) CollectSample(ctx context.Context) error { FirecrackerCPUSystemTime: times.System, // seconds FirecrackerMemoryRSS: memInfo.RSS, // bytes FirecrackerMemoryVMS: memInfo.VMS, // bytes + SandboxType: h.metadata.SandboxType.String(), } if h.cgroupStats != nil { diff --git a/packages/orchestrator/internal/sandbox/sandbox.go b/packages/orchestrator/internal/sandbox/sandbox.go index 5cc2c35a80..24d72bdf1b 100644 --- a/packages/orchestrator/internal/sandbox/sandbox.go +++ b/packages/orchestrator/internal/sandbox/sandbox.go @@ -95,6 +95,23 @@ type EnvdMetadata struct { Version string } +// SandboxType distinguishes build sandboxes from regular sandboxes. +type SandboxType string + +const ( + SandboxTypeSandbox SandboxType = "sandbox" + SandboxTypeBuild SandboxType = "build" +) + +// String returns the sandbox type as a string, defaulting to "sandbox" if empty. +func (t SandboxType) String() string { + if t == "" { + return string(SandboxTypeSandbox) + } + + return string(t) +} + type RuntimeMetadata struct { TemplateID string SandboxID string @@ -102,6 +119,10 @@ type RuntimeMetadata struct { // TeamID optional, used only for logging TeamID string + + // BuildID is the ID of the associated template build. + BuildID string + SandboxType SandboxType } type Resources struct { @@ -311,6 +332,9 @@ func (f *Factory) CreateSandbox( return nil, err } + cgroupHandle, cgroupFD := createCgroup(ctx, f.cgroupManager, sandboxFiles.SandboxCgroupName(), cleanup) + defer releaseCgroupFD(ctx, cgroupHandle, runtime.SandboxID) + fcHandle, err := fc.NewProcess( ctx, execCtx, @@ -344,6 +368,7 @@ func (f *Factory) CreateSandbox( Ops: fc.TokenBucketConfig(throttleConfig.Ops), Bandwidth: fc.TokenBucketConfig(throttleConfig.Bandwidth), }, + cgroupFD, ) if err != nil { return nil, fmt.Errorf("failed to create FC: %w", err) @@ -371,8 +396,9 @@ func (f *Factory) CreateSandbox( sbx := &Sandbox{ LifecycleID: uuid.NewString(), - Resources: resources, - Metadata: metadata, + Resources: resources, + Metadata: metadata, + cgroupHandle: cgroupHandle, Template: template, config: f.config, @@ -386,11 +412,17 @@ func (f *Factory) CreateSandbox( exit: exit, } - sbx.Checks = NewChecks(sbx, false) + useClickhouseMetrics := f.featureFlags.BoolFlag(ctx, featureflags.MetricsWriteFlag) + sbx.Checks = NewChecks(sbx, useClickhouseMetrics) // Stop the sandbox first if it is still running, otherwise do nothing cleanup.AddPriority(ctx, sbx.Stop) + if f.featureFlags.BoolFlag(execCtx, featureflags.HostStatsEnabled) { + samplingInterval := time.Duration(f.featureFlags.IntFlag(execCtx, featureflags.HostStatsSamplingInterval)) * time.Millisecond + initializeHostStatsCollector(execCtx, sbx, fcHandle, runtime, config, f.hostStatsDelivery, samplingInterval) + } + go func() { defer execSpan.End() @@ -593,7 +625,8 @@ func (f *Factory) ResumeSandbox( } // Create cgroup for sandbox resource accounting - cgroupHandle, cgroupFD := createCgroup(ctx, f.cgroupManager, runtime.SandboxID, cleanup) + cgroupHandle, cgroupFD := createCgroup(ctx, f.cgroupManager, sandboxFiles.SandboxCgroupName(), cleanup) + defer releaseCgroupFD(ctx, cgroupHandle, runtime.SandboxID) fcHandle, fcErr := fc.NewProcess( ctx, @@ -656,15 +689,6 @@ func (f *Factory) ResumeSandbox( }, ) - // Release the cgroup directory FD — the kernel already used it during clone - if cgroupHandle != nil { - if releaseErr := cgroupHandle.ReleaseCgroupFD(); releaseErr != nil { - logger.L().Warn(ctx, "failed to release cgroup directory FD", - logger.WithSandboxID(runtime.SandboxID), - zap.Error(releaseErr)) - } - } - if fcStartErr != nil { return nil, fmt.Errorf("failed to start FC: %w", fcStartErr) } @@ -733,7 +757,7 @@ func (f *Factory) ResumeSandbox( if f.featureFlags.BoolFlag(execCtx, featureflags.HostStatsEnabled) { samplingInterval := time.Duration(f.featureFlags.IntFlag(execCtx, featureflags.HostStatsSamplingInterval)) * time.Millisecond - initializeHostStatsCollector(execCtx, sbx, fcHandle, meta.Template.BuildID, runtime, config, f.hostStatsDelivery, samplingInterval) + initializeHostStatsCollector(execCtx, sbx, fcHandle, runtime, config, f.hostStatsDelivery, samplingInterval) } go sbx.Checks.Start(execCtx) @@ -1087,9 +1111,9 @@ func pauseProcessRootfs( // // Returns the CgroupHandle and the cgroup directory FD to pass to the // Firecracker process. If cgroup accounting is disabled, returns (nil, cgroup.NoCgroupFD). -func createCgroup(ctx context.Context, cgroupManager cgroup.Manager, sandboxID string, cleanup *Cleanup) (*cgroup.CgroupHandle, int) { +func createCgroup(ctx context.Context, cgroupManager cgroup.Manager, cgroupName string, cleanup *Cleanup) (*cgroup.CgroupHandle, int) { ctx, span := tracer.Start(ctx, "sandbox-create-cgroup", trace.WithAttributes( - telemetry.WithSandboxID(sandboxID), + attribute.String("cgroup_name", cgroupName), )) defer span.End() @@ -1097,10 +1121,10 @@ func createCgroup(ctx context.Context, cgroupManager cgroup.Manager, sandboxID s return nil, cgroup.NoCgroupFD } - handle, err := cgroupManager.Create(ctx, sandboxID) + handle, err := cgroupManager.Create(ctx, cgroupName) if err != nil { logger.L().Warn(ctx, "failed to create cgroup, continuing without cgroup accounting", - logger.WithSandboxID(sandboxID), + zap.String("cgroup_name", cgroupName), zap.Error(err)) telemetry.ReportEvent(ctx, "cgroup creation failed, continuing without accounting") @@ -1247,6 +1271,16 @@ func (s *Sandbox) WaitForEnvd( return nil } +func releaseCgroupFD(ctx context.Context, cgroupHandle *cgroup.CgroupHandle, sandboxID string) { + if cgroupHandle != nil { + if releaseErr := cgroupHandle.ReleaseCgroupFD(); releaseErr != nil { + logger.L().Warn(ctx, "failed to release cgroup directory FD", + logger.WithSandboxID(sandboxID), + zap.Error(releaseErr)) + } + } +} + func (f *Factory) GetEnvdInitRequestTimeout(ctx context.Context) time.Duration { envdInitRequestTimeoutMs := f.featureFlags.IntFlag(ctx, featureflags.EnvdInitTimeoutMilliseconds) diff --git a/packages/orchestrator/internal/server/sandboxes.go b/packages/orchestrator/internal/server/sandboxes.go index 83f243a139..a4643dfd52 100644 --- a/packages/orchestrator/internal/server/sandboxes.go +++ b/packages/orchestrator/internal/server/sandboxes.go @@ -170,6 +170,8 @@ func (s *Server) Create(ctx context.Context, req *orchestrator.SandboxCreateRequ SandboxID: req.GetSandbox().GetSandboxId(), ExecutionID: req.GetSandbox().GetExecutionId(), TeamID: req.GetSandbox().GetTeamId(), + BuildID: req.GetSandbox().GetBuildId(), + SandboxType: sandbox.SandboxTypeSandbox, }, req.GetStartTime().AsTime(), req.GetEndTime().AsTime(), @@ -492,6 +494,8 @@ func (s *Server) Checkpoint(ctx context.Context, in *orchestrator.SandboxCheckpo SandboxID: sbx.Runtime.SandboxID, ExecutionID: sbx.Runtime.ExecutionID, TeamID: sbx.Runtime.TeamID, + BuildID: sbx.Runtime.BuildID, + SandboxType: sbx.Runtime.SandboxType, }, sbx.GetStartedAt(), sbx.GetEndAt(), diff --git a/packages/orchestrator/internal/template/build/layer/create_sandbox.go b/packages/orchestrator/internal/template/build/layer/create_sandbox.go index 86a37dc556..c3f6be6a19 100644 --- a/packages/orchestrator/internal/template/build/layer/create_sandbox.go +++ b/packages/orchestrator/internal/template/build/layer/create_sandbox.go @@ -105,6 +105,9 @@ func (cs *CreateSandbox) Sandbox( TemplateID: layerExecutor.Config.TemplateID, SandboxID: config.InstanceBuildPrefix + id.Generate(), ExecutionID: uuid.NewString(), + TeamID: layerExecutor.Config.TeamID, + BuildID: layerExecutor.Template.BuildID, + SandboxType: sandbox.SandboxTypeBuild, }, template, cs.timeout, diff --git a/packages/orchestrator/internal/template/build/layer/resume_sandbox.go b/packages/orchestrator/internal/template/build/layer/resume_sandbox.go index 801300fe29..4f357e7361 100644 --- a/packages/orchestrator/internal/template/build/layer/resume_sandbox.go +++ b/packages/orchestrator/internal/template/build/layer/resume_sandbox.go @@ -39,6 +39,9 @@ func (rs *ResumeSandbox) Sandbox( TemplateID: layerExecutor.Config.TemplateID, SandboxID: config.InstanceBuildPrefix + id.Generate(), ExecutionID: uuid.NewString(), + TeamID: layerExecutor.Config.TeamID, + BuildID: layerExecutor.Template.BuildID, + SandboxType: sandbox.SandboxTypeBuild, }, time.Now(), time.Now().Add(rs.timeout), diff --git a/packages/orchestrator/internal/template/build/phases/base/builder.go b/packages/orchestrator/internal/template/build/phases/base/builder.go index 391e4d93c4..d2442126a5 100644 --- a/packages/orchestrator/internal/template/build/phases/base/builder.go +++ b/packages/orchestrator/internal/template/build/phases/base/builder.go @@ -224,6 +224,9 @@ func (bb *BaseBuilder) buildLayerFromOCI( TemplateID: bb.Config.TemplateID, SandboxID: config.InstanceBuildPrefix + id.Generate(), ExecutionID: uuid.NewString(), + TeamID: bb.Config.TeamID, + BuildID: bb.Template.BuildID, + SandboxType: sandbox.SandboxTypeBuild, }, localTemplate, rootfsPath, diff --git a/packages/shared/pkg/storage/sandbox.go b/packages/shared/pkg/storage/sandbox.go index 89693ba10e..047b0df2a1 100644 --- a/packages/shared/pkg/storage/sandbox.go +++ b/packages/shared/pkg/storage/sandbox.go @@ -62,3 +62,7 @@ func (s *SandboxFiles) SandboxCacheRootfsLinkPath(config Config) string { func (s *SandboxFiles) SandboxMetricsFifoPath() string { return filepath.Join(s.tmpDir, fmt.Sprintf("fc-metrics-%s-%s.fifo", s.SandboxID, s.randomID)) } + +func (s *SandboxFiles) SandboxCgroupName() string { + return fmt.Sprintf("sbx-%s-%s", s.SandboxID, s.randomID) +}