Skip to content

Commit

Permalink
Gate k6 checks on runner being configured
Browse files Browse the repository at this point in the history
This is not necessary because k6 checks won't be actually created unless
the feature flag is enabled, but to avoid issues, prevent the creation
of k6 probers unless the k6 runner is correctly configured.

Signed-off-by: Marcelo E. Magallon <marcelo.magallon@grafana.com>
  • Loading branch information
mem committed Jun 6, 2023
1 parent 7060a2c commit 9e4321b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 19 deletions.
46 changes: 31 additions & 15 deletions cmd/synthetic-monitoring-agent/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,6 @@ func run(args []string, stdout io.Writer) error {
return fmt.Errorf("invalid API token")
}

if err := validateK6URI(*k6URI); err != nil {
return fmt.Errorf("invalid k6 URI: %w", err)
}

baseCtx, cancel := context.WithCancel(context.Background())
defer cancel()

Expand Down Expand Up @@ -117,6 +113,24 @@ func run(args []string, stdout io.Writer) error {
Str("features", features.String()).
Msg("starting")

if features.IsSet(feature.K6) {
newUri, err := validateK6URI(*k6URI)
if err != nil {
*k6URI = ""
zl.Warn().Str("k6URI", *k6URI).Err(err).Msg("invalid k6 URI")
} else if newUri != *k6URI {
*k6URI = newUri
}
} else {
*k6URI = ""
}

if len(*k6URI) > 0 {
zl.Info().Str("k6URI", *k6URI).Msg("enabling k6 checks")
} else {
zl.Info().Msg("disabling k6 checks")
}

promRegisterer := prometheus.NewRegistry()

if err := registerMetrics(promRegisterer); err != nil {
Expand Down Expand Up @@ -172,7 +186,11 @@ func run(args []string, stdout io.Writer) error {
}
defer conn.Close()

k6Runner := k6runner.New(*k6URI)
var k6Runner k6runner.Runner

if features.IsSet(feature.K6) && len(*k6URI) > 0 {
k6Runner = k6runner.New(*k6URI)
}

checksUpdater, err := checks.NewUpdater(checks.UpdaterOptions{
Conn: conn,
Expand Down Expand Up @@ -264,30 +282,28 @@ func stringFromEnv(name string, override string) string {
return os.Getenv(name)
}

func validateK6URI(uri string) error {
func validateK6URI(uri string) (string, error) {
u, err := url.Parse(uri)
if err != nil {
return err
return "", err
}

switch u.Scheme {
case "http", "https":

case "":
if u.Path == "" {
return fmt.Errorf("missing path in %q", uri)
return "", fmt.Errorf("missing path in %q", uri)
}

if false {
_, err := exec.LookPath(u.Path)
if err != nil {
return err
}
uri, err = exec.LookPath(u.Path)
if err != nil {
return "", err
}

default:
return fmt.Errorf("invalid scheme %q", u.Scheme)
return "", fmt.Errorf("invalid scheme %q", u.Scheme)
}

return nil
return uri, nil
}
16 changes: 12 additions & 4 deletions internal/prober/prober.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,20 @@ func (f proberFactory) New(ctx context.Context, logger zerolog.Logger, check sm.
target = check.Target

case sm.CheckTypeK6:
p, err = k6.NewProber(ctx, check, logger, f.runner)
target = check.Target
if f.runner != nil {
p, err = k6.NewProber(ctx, check, logger, f.runner)
target = check.Target
} else {
err = fmt.Errorf("k6 checks are not enabled")
}

case sm.CheckTypeMultiHttp:
p, err = multihttp.NewProber(ctx, check, logger, f.runner)
target = check.Target
if f.runner != nil {
p, err = multihttp.NewProber(ctx, check, logger, f.runner)
target = check.Target
} else {
err = fmt.Errorf("k6 checks are not enabled")
}

default:
return nil, "", fmt.Errorf("unsupported check type")
Expand Down

0 comments on commit 9e4321b

Please sign in to comment.