Skip to content
This repository was archived by the owner on Jan 30, 2025. It is now read-only.

Commit 0b8546d

Browse files
authored
Merge pull request #620 from grafana/add/log-default-opts-override
Log when a launch option is set to null
2 parents 4405489 + 79969b3 commit 0b8546d

File tree

9 files changed

+62
-44
lines changed

9 files changed

+62
-44
lines changed

chromium/browser_type.go

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"os"
99
"os/exec"
1010
"path/filepath"
11-
"regexp"
1211
"runtime"
1312
"sort"
1413
"strings"
@@ -42,6 +41,7 @@ type BrowserType struct {
4241
execPath string // path to the Chromium executable
4342
storage *storage.Dir // stores temporary data for the extension and user
4443
randSrc *rand.Rand
44+
logger *log.Logger
4545
}
4646

4747
// NewBrowserType registers our custom k6 metrics, creates method mappings on
@@ -126,8 +126,14 @@ func (b *BrowserType) initContext() context.Context {
126126
// which can be used for controlling the Chrome browser.
127127
func (b *BrowserType) Launch(opts goja.Value) api.Browser {
128128
ctx := b.initContext()
129+
130+
var err error
131+
if b.logger, err = makeLogger(ctx); err != nil {
132+
k6ext.Panic(ctx, "setting up logger: %w", err)
133+
}
134+
129135
launchOpts := common.NewLaunchOptions()
130-
if err := launchOpts.Parse(ctx, opts); err != nil {
136+
if err := launchOpts.Parse(ctx, opts, b.logger); err != nil {
131137
k6ext.Panic(ctx, "parsing launch options: %w", err)
132138
}
133139
ctx = common.WithLaunchOptions(ctx, launchOpts)
@@ -145,16 +151,17 @@ func (b *BrowserType) Launch(opts goja.Value) api.Browser {
145151
}
146152

147153
func (b *BrowserType) launch(ctx context.Context, opts *common.LaunchOptions) (*common.Browser, error) {
154+
if err := b.logger.SetCategoryFilter(opts.LogCategoryFilter); err != nil {
155+
return nil, fmt.Errorf("%w", err)
156+
}
157+
if opts.Debug {
158+
_ = b.logger.SetLevel("debug")
159+
}
160+
148161
envs := make([]string, 0, len(opts.Env))
149162
for k, v := range opts.Env {
150163
envs = append(envs, fmt.Sprintf("%s=%s", k, v))
151164
}
152-
153-
logger, err := makeLogger(ctx, opts)
154-
if err != nil {
155-
return nil, fmt.Errorf("setting up logger: %w", err)
156-
}
157-
158165
var (
159166
flags = prepareFlags(opts, &(b.vu.State()).Options)
160167
dataDir = b.storage
@@ -167,7 +174,7 @@ func (b *BrowserType) launch(ctx context.Context, opts *common.LaunchOptions) (*
167174
go func(c context.Context) {
168175
defer func() {
169176
if err := dataDir.Cleanup(); err != nil {
170-
logger.Errorf("BrowserType:Launch", "cleaning up the user data directory: %v", err)
177+
b.logger.Errorf("BrowserType:Launch", "cleaning up the user data directory: %v", err)
171178
}
172179
}()
173180
// There's a small chance that this might be called
@@ -178,12 +185,12 @@ func (b *BrowserType) launch(ctx context.Context, opts *common.LaunchOptions) (*
178185
<-c.Done()
179186
}(ctx)
180187

181-
browserProc, err := b.allocate(ctx, opts, flags, envs, dataDir, logger)
188+
browserProc, err := b.allocate(ctx, opts, flags, envs, dataDir, b.logger)
182189
if browserProc == nil {
183190
return nil, fmt.Errorf("launching browser: %w", err)
184191
}
185192

186-
browserProc.AttachLogger(logger)
193+
browserProc.AttachLogger(b.logger)
187194

188195
// If this context is cancelled we'll initiate an extension wide
189196
// cancellation and shutdown.
@@ -194,7 +201,7 @@ func (b *BrowserType) launch(ctx context.Context, opts *common.LaunchOptions) (*
194201
browserCtx = k6ext.WithProcessID(browserCtx, browserProc.Pid())
195202
b.Ctx = browserCtx
196203
browser, err := common.NewBrowser(browserCtx, browserCtxCancel,
197-
browserProc, opts, logger)
204+
browserProc, opts, b.logger)
198205
if err != nil {
199206
return nil, fmt.Errorf("launching browser: %w", err)
200207
}
@@ -371,17 +378,11 @@ func setFlagsFromK6Options(flags map[string]any, k6opts *k6lib.Options) {
371378
}
372379

373380
// makeLogger makes and returns an extension wide logger.
374-
func makeLogger(ctx context.Context, launchOpts *common.LaunchOptions) (*log.Logger, error) {
381+
func makeLogger(ctx context.Context) (*log.Logger, error) {
375382
var (
376-
k6Logger = k6ext.GetVU(ctx).State().Logger
377-
reCategoryFilter, _ = regexp.Compile(launchOpts.LogCategoryFilter)
378-
logger = log.New(k6Logger, common.GetIterationID(ctx), launchOpts.Debug, reCategoryFilter)
383+
k6Logger = k6ext.GetVU(ctx).State().Logger
384+
logger = log.New(k6Logger, common.GetIterationID(ctx))
379385
)
380-
381-
// set the log level from the launch options (usually from a script's options).
382-
if launchOpts.Debug {
383-
_ = logger.SetLevel("debug")
384-
}
385386
if el, ok := os.LookupEnv("XK6_BROWSER_LOG"); ok {
386387
if logger.SetLevel(el) != nil {
387388
return nil, fmt.Errorf(

common/browser_options.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/dop251/goja"
99

1010
"github.com/grafana/xk6-browser/k6ext"
11+
"github.com/grafana/xk6-browser/log"
1112
)
1213

1314
// ProxyOptions allows configuring a proxy server.
@@ -41,28 +42,36 @@ type LaunchPersistentContextOptions struct {
4142

4243
// NewLaunchOptions returns a new LaunchOptions.
4344
func NewLaunchOptions() *LaunchOptions {
44-
launchOpts := LaunchOptions{
45+
return &LaunchOptions{
4546
Env: make(map[string]string),
4647
Headless: true,
4748
LogCategoryFilter: ".*",
4849
Timeout: DefaultTimeout,
4950
}
50-
return &launchOpts
5151
}
5252

5353
// Parse parses launch options from a JS object.
54-
func (l *LaunchOptions) Parse(ctx context.Context, opts goja.Value) error { //nolint:cyclop
54+
func (l *LaunchOptions) Parse(ctx context.Context, opts goja.Value, logger *log.Logger) error { //nolint:cyclop
5555
if !gojaValueExists(opts) {
5656
return errors.New("LaunchOptions does not exist in the runtime")
5757
}
5858
var (
59-
rt = k6ext.Runtime(ctx)
60-
o = opts.ToObject(rt)
59+
rt = k6ext.Runtime(ctx)
60+
o = opts.ToObject(rt)
61+
defaults = map[string]any{
62+
"env": l.Env,
63+
"headless": l.Headless,
64+
"logCategoryFilter": l.LogCategoryFilter,
65+
"timeout": l.Timeout,
66+
}
6167
)
6268
for _, k := range o.Keys() {
6369
v := o.Get(k)
6470
if v.Export() == nil {
65-
continue // don't override the defaults on `null``
71+
if dv, ok := defaults[k]; ok {
72+
logger.Warnf("LaunchOptions", "%s was null and set to its default: %v", k, dv)
73+
}
74+
continue
6675
}
6776
var err error
6877
switch k {

common/browser_options_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/stretchr/testify/require"
99

1010
"github.com/grafana/xk6-browser/k6ext/k6test"
11+
"github.com/grafana/xk6-browser/log"
1112
)
1213

1314
func TestBrowserLaunchOptionsParse(t *testing.T) {
@@ -213,7 +214,7 @@ func TestBrowserLaunchOptionsParse(t *testing.T) {
213214
vu = k6test.NewVU(t)
214215
lo = NewLaunchOptions()
215216
)
216-
err := lo.Parse(vu.Context(), vu.ToGojaValue(tt.opts))
217+
err := lo.Parse(vu.Context(), vu.ToGojaValue(tt.opts), log.NewNullLogger())
217218
if tt.err != "" {
218219
require.ErrorContains(t, err, tt.err)
219220
} else {

common/browser_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ func TestBrowserNewPageInContext(t *testing.T) {
2323
}
2424
newTestCase := func(id cdp.BrowserContextID) *testCase {
2525
ctx, cancel := context.WithCancel(context.Background())
26-
b := newBrowser(ctx, cancel, nil, NewLaunchOptions(), log.NewNullLogger())
26+
logger := log.NewNullLogger()
27+
b := newBrowser(ctx, cancel, nil, NewLaunchOptions(), logger)
2728
// set a new browser context in the browser with `id`, so that newPageInContext can find it.
2829
b.contexts[id] = NewBrowserContext(ctx, b, id, nil, nil)
2930
return &testCase{

common/helpers_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@ import (
1010
"github.com/chromedp/cdproto/cdp"
1111
"github.com/chromedp/cdproto/runtime"
1212
"github.com/dop251/goja"
13-
"github.com/sirupsen/logrus"
1413
"github.com/stretchr/testify/require"
1514

1615
"github.com/grafana/xk6-browser/log"
1716
)
1817

1918
func newExecCtx() (*ExecutionContext, context.Context, *goja.Runtime) {
2019
ctx := context.Background()
21-
logger := log.New(logrus.New(), "", false, nil)
20+
logger := log.NewNullLogger()
2221
execCtx := NewExecutionContext(ctx, nil, nil, runtime.ExecutionContextID(123456789), logger)
2322

2423
return execCtx, ctx, goja.New()

common/network_manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func NewNetworkManager(
7474
ctx: ctx,
7575
// TODO: Pass an internal logger instead of basing it on k6's logger?
7676
// See https://github.com/grafana/xk6-browser/issues/54
77-
logger: log.New(state.Logger, GetIterationID(ctx), false, nil),
77+
logger: log.New(state.Logger, GetIterationID(ctx)),
7878
session: s,
7979
parent: parent,
8080
frameManager: fm,

common/network_manager_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func newTestNetworkManager(t *testing.T, k6opts k6lib.Options) (*NetworkManager,
6363
vu.MoveToVUContext()
6464
st := vu.State()
6565
st.Options = k6opts
66-
logger := log.New(st.Logger, "", false, nil)
66+
logger := log.New(st.Logger, "")
6767
nm := &NetworkManager{
6868
ctx: vu.Context(),
6969
logger: logger,

common/response.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func NewHTTPResponse(ctx context.Context, req *Request, resp *network.Response,
7171
ctx: ctx,
7272
// TODO: Pass an internal logger instead of basing it on k6's logger?
7373
// See https://github.com/grafana/xk6-browser/issues/54
74-
logger: log.New(state.Logger, GetIterationID(ctx), false, nil),
74+
logger: log.New(state.Logger, GetIterationID(ctx)),
7575
request: req,
7676
remoteAddress: &RemoteAddress{IPAddress: resp.RemoteIPAddress, Port: resp.RemotePort},
7777
securityDetails: nil,

log/logger.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ type Logger struct {
2020
mu sync.Mutex
2121
lastLogCall int64
2222
iterID string
23-
debugOverride bool
2423
categoryFilter *regexp.Regexp
2524
}
2625

@@ -29,17 +28,14 @@ type Logger struct {
2928
func NewNullLogger() *Logger {
3029
log := logrus.New()
3130
log.SetOutput(ioutil.Discard)
32-
33-
return New(log, "", false, nil)
31+
return New(log, "")
3432
}
3533

3634
// New creates a new logger.
37-
func New(logger *logrus.Logger, iterID string, debugOverride bool, categoryFilter *regexp.Regexp) *Logger {
35+
func New(logger *logrus.Logger, iterID string) *Logger {
3836
return &Logger{
39-
Logger: logger,
40-
iterID: iterID,
41-
debugOverride: debugOverride,
42-
categoryFilter: categoryFilter,
37+
Logger: logger,
38+
iterID: iterID,
4339
}
4440
}
4541

@@ -89,7 +85,7 @@ func (l *Logger) Logf(level logrus.Level, category string, msg string, args ...a
8985
l.lastLogCall = now
9086
}()
9187

92-
if l.categoryFilter != nil && !l.categoryFilter.Match([]byte(category)) {
88+
if l.categoryFilter != nil && !l.categoryFilter.MatchString(category) {
9389
return
9490
}
9591
if l.Logger == nil {
@@ -106,7 +102,7 @@ func (l *Logger) Logf(level logrus.Level, category string, msg string, args ...a
106102
fields["iteration_id"] = l.iterID
107103
}
108104
entry := l.WithFields(fields)
109-
if l.GetLevel() < level && l.debugOverride {
105+
if l.GetLevel() < level {
110106
entry.Printf(msg, args...)
111107
return
112108
}
@@ -165,6 +161,17 @@ func (l *Logger) ConsoleLogFormatterSerializer() *Logger {
165161
}
166162
}
167163

164+
// SetCategoryFilter enables filtering logs by the filter regex.
165+
func (l *Logger) SetCategoryFilter(filter string) (err error) {
166+
if filter == "" {
167+
return nil
168+
}
169+
if l.categoryFilter, err = regexp.Compile(filter); err != nil {
170+
return fmt.Errorf("invalid category filter %q: %w", filter, err)
171+
}
172+
return nil
173+
}
174+
168175
func goRoutineID() int {
169176
var buf [64]byte
170177
n := runtime.Stack(buf[:], false)

0 commit comments

Comments
 (0)