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 }