github.com/grafana/synthetic-monitoring-agent@v0.64.2/internal/prober/browser/browser.go (about)

     1  package browser
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  
     7  	"github.com/grafana/synthetic-monitoring-agent/internal/secrets"
     8  
     9  	"github.com/grafana/synthetic-monitoring-agent/internal/k6runner"
    10  	"github.com/grafana/synthetic-monitoring-agent/internal/model"
    11  	"github.com/grafana/synthetic-monitoring-agent/internal/prober/logger"
    12  	sm "github.com/grafana/synthetic-monitoring-agent/pkg/pb/synthetic_monitoring"
    13  	"github.com/prometheus/client_golang/prometheus"
    14  	"github.com/rs/zerolog"
    15  )
    16  
    17  const proberName = "browser"
    18  
    19  var errUnsupportedCheck = errors.New("unsupported check")
    20  
    21  type Module struct {
    22  	Prober string
    23  	Script k6runner.Script
    24  }
    25  
    26  type Prober struct {
    27  	logger           zerolog.Logger
    28  	module           Module
    29  	processor        *k6runner.Processor
    30  	secretsRetriever func(context.Context) (k6runner.SecretStore, error)
    31  }
    32  
    33  func NewProber(ctx context.Context, check model.Check, logger zerolog.Logger, runner k6runner.Runner, store secrets.SecretProvider) (Prober, error) {
    34  	var p Prober
    35  
    36  	if check.Settings.Browser == nil {
    37  		return p, errUnsupportedCheck
    38  	}
    39  
    40  	p.module = Module{
    41  		Prober: sm.CheckTypeBrowser.String(),
    42  		Script: k6runner.Script{
    43  			Script: check.Settings.Browser.Script,
    44  			Settings: k6runner.Settings{
    45  				Timeout: check.Timeout,
    46  			},
    47  			CheckInfo: k6runner.CheckInfoFromSM(check),
    48  		},
    49  	}
    50  
    51  	// Set channel manifest to empty string handling potential nils in the check model.
    52  	p.module.Script.K6ChannelManifest = func() string {
    53  		if check.Channels == nil || check.Channels.K6 == nil {
    54  			logger.Warn().
    55  				Object("checkInfo", &p.module.Script.CheckInfo).
    56  				Msg("Channel manifest unexpectedly empty for check. Please select a version for it.")
    57  
    58  			return ""
    59  		}
    60  
    61  		return check.Channels.K6.Manifest
    62  	}()
    63  
    64  	processor, err := k6runner.NewProcessor(p.module.Script, runner)
    65  	if err != nil {
    66  		return p, err
    67  	}
    68  
    69  	p.processor = processor
    70  	p.logger = logger
    71  	p.secretsRetriever = newCredentialsRetriever(store, check.GlobalTenantID(), p.logger)
    72  
    73  	return p, nil
    74  }
    75  
    76  func (p Prober) Name() string {
    77  	return proberName
    78  }
    79  
    80  func (p Prober) Probe(ctx context.Context, target string, registry *prometheus.Registry, logger logger.Logger, executionID string) (bool, float64) {
    81  	secretStore, err := p.secretsRetriever(ctx)
    82  	if err != nil {
    83  		p.logger.Error().Err(err).Msg("failed to retrieve secret store")
    84  		return false, 0
    85  	}
    86  
    87  	success, duration, err := p.processor.Run(ctx, registry, logger, p.logger, secretStore, executionID)
    88  	if err != nil {
    89  		p.logger.Error().Err(err).Msg("running probe")
    90  		return false, 0
    91  	}
    92  
    93  	return success, duration.Seconds()
    94  }
    95  
    96  // TODO(mem): This should probably be in the k6runner package.
    97  func newCredentialsRetriever(provider secrets.SecretProvider, tenantID model.GlobalID, logger zerolog.Logger) func(context.Context) (k6runner.SecretStore, error) {
    98  	return func(ctx context.Context) (k6runner.SecretStore, error) {
    99  		var store k6runner.SecretStore
   100  
   101  		logger.Debug().
   102  			Int64("tenantId", int64(tenantID)).
   103  			Msg("credentials retriever: getting secret credentials")
   104  
   105  		credentials, err := provider.GetSecretCredentials(ctx, tenantID)
   106  		if err != nil {
   107  			logger.Error().
   108  				Err(err).
   109  				Int64("tenantId", int64(tenantID)).
   110  				Msg("credentials retriever: failed to get secret credentials")
   111  
   112  			return store, err
   113  		}
   114  
   115  		if credentials != nil {
   116  			store = k6runner.SecretStore{
   117  				Url:   credentials.Url,
   118  				Token: credentials.Token,
   119  			}
   120  			logger.Debug().
   121  				Int64("tenantId", int64(tenantID)).
   122  				Str("secretStoreUrl", credentials.Url).
   123  				Bool("hasSecretStoreToken", credentials.Token != "").
   124  				Float64("secretStoreExpiry", credentials.Expiry).
   125  				Msg("credentials retriever: secret store configured")
   126  		} else {
   127  			logger.Debug().
   128  				Int64("tenantId", int64(tenantID)).
   129  				Msg("credentials retriever: no secret store configuration")
   130  		}
   131  
   132  		return store, nil
   133  	}
   134  }