github.com/grafana/synthetic-monitoring-agent@v0.64.2/internal/prober/scripted/scripted.go (about) 1 package scripted 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 = "scripted" 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.Scripted == nil { 37 return p, errUnsupportedCheck 38 } 39 40 p.module = Module{ 41 Prober: sm.CheckTypeScripted.String(), 42 Script: k6runner.Script{ 43 Script: check.Settings.Scripted.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 p.logger.Debug(). 88 Str("target", target). 89 Bool("secretStoreIsConfigured", secretStore.IsConfigured()). 90 Str("secretStoreUrl", secretStore.Url). 91 Bool("hasSecretStoreToken", secretStore.Token != ""). 92 Msg("secret store retrieved for scripted probe") 93 94 success, duration, err := p.processor.Run(ctx, registry, logger, p.logger, secretStore, executionID) 95 if err != nil { 96 p.logger.Error().Err(err).Msg("running probe") 97 return false, 0 98 } 99 100 return success, duration.Seconds() 101 } 102 103 func newCredentialsRetriever(provider secrets.SecretProvider, tenantID model.GlobalID, logger zerolog.Logger) func(context.Context) (k6runner.SecretStore, error) { 104 return func(ctx context.Context) (k6runner.SecretStore, error) { 105 var store k6runner.SecretStore 106 107 logger.Debug(). 108 Int64("tenantId", int64(tenantID)). 109 Msg("credentials retriever: getting secret credentials") 110 111 credentials, err := provider.GetSecretCredentials(ctx, tenantID) 112 if err != nil { 113 logger.Error(). 114 Err(err). 115 Int64("tenantId", int64(tenantID)). 116 Msg("credentials retriever: failed to get secret credentials") 117 118 return store, err 119 } 120 121 if credentials != nil { 122 store = k6runner.SecretStore{ 123 Url: credentials.Url, 124 Token: credentials.Token, 125 } 126 logger.Debug(). 127 Int64("tenantId", int64(tenantID)). 128 Str("secretStoreUrl", credentials.Url). 129 Bool("hasSecretStoreToken", credentials.Token != ""). 130 Float64("secretStoreExpiry", credentials.Expiry). 131 Msg("credentials retriever: secret store configured") 132 } else { 133 logger.Debug(). 134 Int64("tenantId", int64(tenantID)). 135 Msg("credentials retriever: no secret store configuration") 136 } 137 138 return store, nil 139 } 140 }