Skip to content

Commit 0b94771

Browse files
committed
perf(sandbox): keep envd logging out of journald
envd's zerolog stdout writer is now gated behind a new -verbose flag (default off), so production envd inside FC no longer writes anything to stdout — journald stays clean of per-request debug events. The HTTP exporter still ships full debug to the orchestrator regardless. A journald drop-in caps the rest of the in-VM journal at Storage=persistent / SystemMaxUse=8M / MaxLevelStore=warning so other systemd services can't grow it without bound either. handler.go's "error reading from pty/stdout/stderr" messages were on raw stderr but are about envd-handled user processes, not envd internals; they now flow through the zerolog logger.
1 parent dbef5ef commit 0b94771

8 files changed

Lines changed: 28 additions & 33 deletions

File tree

packages/envd/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ start-docker:
4646
-p 8001:8001 \
4747
--rm \
4848
-i envd-debug \
49-
/usr/bin/envd -isnotfc
49+
/usr/bin/envd -isnotfc -verbose
5050

5151
build-and-upload:
5252
make build

packages/envd/internal/logs/exporter/exporter.go

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ package exporter
33
import (
44
"bytes"
55
"context"
6-
"fmt"
76
"log"
87
"net/http"
9-
"os"
108
"sync"
119
"time"
1210

@@ -18,7 +16,6 @@ const ExporterTimeout = 10 * time.Second
1816
type HTTPExporter struct {
1917
client http.Client
2018
logs [][]byte
21-
isNotFC bool
2219
mmdsOpts *host.MMDSOpts
2320

2421
// Concurrency coordination
@@ -28,13 +25,12 @@ type HTTPExporter struct {
2825
startOnce sync.Once
2926
}
3027

31-
func NewHTTPLogsExporter(ctx context.Context, isNotFC bool, mmdsChan <-chan *host.MMDSOpts) *HTTPExporter {
28+
func NewHTTPLogsExporter(ctx context.Context, mmdsChan <-chan *host.MMDSOpts) *HTTPExporter {
3229
exporter := &HTTPExporter{
3330
client: http.Client{
3431
Timeout: ExporterTimeout,
3532
},
3633
triggers: make(chan struct{}, 1),
37-
isNotFC: isNotFC,
3834
startOnce: sync.Once{},
3935
mmdsOpts: &host.MMDSOpts{
4036
SandboxID: "unknown",
@@ -69,10 +65,6 @@ func (w *HTTPExporter) sendInstanceLogs(ctx context.Context, logs []byte, addres
6965
return nil
7066
}
7167

72-
func printLog(logs []byte) {
73-
fmt.Fprintf(os.Stdout, "%v", string(logs))
74-
}
75-
7668
func (w *HTTPExporter) listenForMMDSOptsAndStart(ctx context.Context, mmdsChan <-chan *host.MMDSOpts) {
7769
for {
7870
select {
@@ -102,32 +94,20 @@ func (w *HTTPExporter) start(ctx context.Context) {
10294
continue
10395
}
10496

105-
if w.isNotFC {
106-
for _, log := range logs {
107-
fmt.Fprintf(os.Stdout, "%v", string(log))
108-
}
109-
110-
continue
111-
}
112-
11397
for _, logLine := range logs {
11498
w.mmdsLock.RLock()
11599
logLineWithOpts, err := w.mmdsOpts.AddOptsToJSON(logLine)
116100
w.mmdsLock.RUnlock()
117101
if err != nil {
118102
log.Printf("error adding instance logging options (%+v) to JSON (%+v) with logs : %v\n", w.mmdsOpts, logLine, err)
119103

120-
printLog(logLine)
121-
122104
continue
123105
}
124106

125107
err = w.sendInstanceLogs(ctx, logLineWithOpts, w.mmdsOpts.LogsCollectorAddress)
126108
if err != nil {
127109
log.Printf("error sending instance logs: %+v", err)
128110

129-
printLog(logLine)
130-
131111
continue
132112
}
133113
}

packages/envd/internal/logs/logger.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,17 @@ import (
1212
"github.com/e2b-dev/infra/packages/envd/internal/logs/exporter"
1313
)
1414

15-
func NewLogger(ctx context.Context, isNotFC bool, mmdsChan <-chan *host.MMDSOpts) *zerolog.Logger {
15+
func NewLogger(ctx context.Context, isFC bool, verbose bool, mmdsChan <-chan *host.MMDSOpts) *zerolog.Logger {
1616
zerolog.TimestampFieldName = "timestamp"
1717
zerolog.TimeFieldFormat = time.RFC3339Nano
1818

1919
exporters := []io.Writer{}
2020

21-
if isNotFC {
21+
if isFC {
22+
exporters = append(exporters, exporter.NewHTTPLogsExporter(ctx, mmdsChan))
23+
}
24+
if verbose {
2225
exporters = append(exporters, os.Stdout)
23-
} else {
24-
exporters = append(exporters, exporter.NewHTTPLogsExporter(ctx, isNotFC, mmdsChan), os.Stdout)
2526
}
2627

2728
l := zerolog.

packages/envd/internal/services/process/handler/handler.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ func New(
221221
}
222222

223223
if readErr != nil {
224-
fmt.Fprintf(os.Stderr, "error reading from pty: %s\n", readErr)
224+
logger.Error().Err(readErr).Msg("error reading from pty")
225225

226226
break
227227
}
@@ -269,7 +269,7 @@ func New(
269269
}
270270

271271
if readErr != nil {
272-
fmt.Fprintf(os.Stderr, "error reading from stdout: %s\n", readErr)
272+
logger.Error().Err(readErr).Msg("error reading from stdout")
273273

274274
break
275275
}
@@ -313,7 +313,7 @@ func New(
313313
}
314314

315315
if readErr != nil {
316-
fmt.Fprintf(os.Stderr, "error reading from stderr: %s\n", readErr)
316+
logger.Error().Err(readErr).Msg("error reading from stderr")
317317

318318
break
319319
}

packages/envd/main.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,15 @@ var (
5656
versionFlag bool
5757
commitFlag bool
5858
cgroupRoot string
59+
verbose bool
5960
)
6061

6162
func parseFlags() {
6263
flag.BoolVar(
6364
&isNotFC,
6465
"isnotfc",
6566
false,
66-
"isNotFCmode prints all logs to stdout",
67+
"run outside of Firecracker (skips MMDS poll and HTTP log exporter)",
6768
)
6869

6970
flag.BoolVar(
@@ -94,6 +95,13 @@ func parseFlags() {
9495
"cgroup root directory",
9596
)
9697

98+
flag.BoolVar(
99+
&verbose,
100+
"verbose",
101+
false,
102+
"write envd logs to stdout",
103+
)
104+
97105
flag.Parse()
98106
}
99107

@@ -159,7 +167,7 @@ func main() {
159167
go host.PollForMMDSOpts(ctx, mmdsChan, defaults.EnvVars)
160168
}
161169

162-
l := logs.NewLogger(ctx, isNotFC, mmdsChan)
170+
l := logs.NewLogger(ctx, !isNotFC, verbose, mmdsChan)
163171

164172
m := chi.NewRouter()
165173

packages/envd/pkg/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package pkg
22

3-
const Version = "0.5.20"
3+
const Version = "0.5.21"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{- /*gotype:github.com/e2b-dev/infra/packages/orchestrator/pkg/template/build/core/rootfs.templateModel*/ -}}
2+
{{ .WriteFile "etc/systemd/journald.conf.d/e2b.conf" 0o644 }}
3+
4+
[Journal]
5+
Storage=persistent
6+
SystemMaxUse=8M

packages/orchestrator/pkg/template/build/core/rootfs/rootfs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestAdditionalOCILayers(t *testing.T) {
9090

9191
keysIter := maps.Keys(actualFiles)
9292
keys := slices.Collect(keysIter)
93-
assert.Len(t, keys, 13)
93+
assert.Len(t, keys, 14)
9494
assert.Equal(t, "e2b.local", actualFiles["etc/hostname"])
9595
assert.Equal(t, "nameserver 8.8.8.8", actualFiles["etc/resolv.conf"])
9696

0 commit comments

Comments
 (0)