diff --git a/pkg/beyla/config.go b/pkg/beyla/config.go index ce7c6cea6..c30fefdcd 100644 --- a/pkg/beyla/config.go +++ b/pkg/beyla/config.go @@ -285,17 +285,17 @@ func (c *Config) Enabled(feature Feature) bool { return false } -// SetDebugMode sets the debug mode for Beyla -func (c *Config) SetDebugMode() { - lvl := slog.LevelVar{} - lvl.Set(slog.LevelDebug) - slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ - Level: &lvl, - }))) - c.TracePrinter = debug.TracePrinterText - c.EBPF.BpfDebug = true - if c.NetworkFlows.Enable { - c.NetworkFlows.Print = true +// ExternalLogger sets the logging capabilities of Beyla. +// Used for integrating Beyla with an external logging system (for example Alloy) +// TODO: maybe this method has too many responsibilities, as it affects the global logger. +func (c *Config) ExternalLogger(handler slog.Handler, tracing bool) { + slog.SetDefault(slog.New(handler)) + if tracing { + c.TracePrinter = debug.TracePrinterText + c.EBPF.BpfDebug = true + if c.NetworkFlows.Enable { + c.NetworkFlows.Print = true + } } } diff --git a/pkg/beyla/config_test.go b/pkg/beyla/config_test.go index 0920e2bcb..e496d17b8 100644 --- a/pkg/beyla/config_test.go +++ b/pkg/beyla/config_test.go @@ -3,8 +3,11 @@ package beyla import ( "bytes" "fmt" + "io" + "log/slog" "os" "regexp" + "strings" "testing" "time" @@ -376,6 +379,63 @@ func TestConfig_NetworkImplicitProm(t *testing.T) { assert.True(t, cfg.Enabled(FeatureNetO11y)) // Net o11y should be on } +func TestConfig_ExternalLogger(t *testing.T) { + type testCase struct { + name string + handler func(out io.Writer) slog.Handler + expectedText *regexp.Regexp + expectedCfg Config + tracing bool + networkEnable bool + } + for _, tc := range []testCase{{ + name: "default info log", + handler: func(out io.Writer) slog.Handler { + return slog.NewTextHandler(out, &slog.HandlerOptions{Level: slog.LevelInfo}) + }, + expectedText: regexp.MustCompile( + `^time=\S+ level=INFO msg=information arg=info$`), + }, { + name: "default debug log", + handler: func(out io.Writer) slog.Handler { + return slog.NewTextHandler(out, &slog.HandlerOptions{Level: slog.LevelDebug}) + }, + expectedText: regexp.MustCompile( + `^time=\S+ level=INFO msg=information arg=info +time=\S+ level=DEBUG msg=debug arg=debug$`), + tracing: true, + expectedCfg: Config{ + TracePrinter: debug.TracePrinterText, + EBPF: ebpfcommon.TracerConfig{BpfDebug: true}, + }, + }, { + name: "debug log with network flows", + handler: func(out io.Writer) slog.Handler { + return slog.NewTextHandler(out, &slog.HandlerOptions{Level: slog.LevelDebug}) + }, + networkEnable: true, + expectedText: regexp.MustCompile( + `^time=\S+ level=INFO msg=information arg=info +time=\S+ level=DEBUG msg=debug arg=debug$`), + tracing: true, + expectedCfg: Config{ + TracePrinter: debug.TracePrinterText, + EBPF: ebpfcommon.TracerConfig{BpfDebug: true}, + NetworkFlows: NetworkConfig{Enable: true, Print: true}, + }, + }} { + t.Run(tc.name, func(t *testing.T) { + cfg := Config{NetworkFlows: NetworkConfig{Enable: tc.networkEnable}} + out := &bytes.Buffer{} + cfg.ExternalLogger(tc.handler(out), tc.tracing) + slog.Info("information", "arg", "info") + slog.Debug("debug", "arg", "debug") + assert.Regexp(t, tc.expectedText, strings.TrimSpace(out.String())) + assert.Equal(t, tc.expectedCfg, cfg) + }) + } +} + func loadConfig(t *testing.T, env envMap) *Config { for k, v := range env { require.NoError(t, os.Setenv(k, v))