Skip to content

Commit 31370e9

Browse files
committed
feat: integrate secret resolution into HTTP prober and agent components
This PR integrates the secret infrastructure from PR #1468 into the HTTP prober and throughout the agent: - HTTP Prober Integration: - Updated HTTP prober to use secret resolution for authentication - Enhanced multihttp script support with secret interpolation - Comprehensive test coverage for secret scenarios - Agent Integration: - Updated main.go to wire up secret providers - Enhanced adhoc, checks, and scraper components with secret support - Updated all test files to handle new secret provider interfaces - Test Updates: - All prober test files updated to implement new SecretProvider interface - Browser, scripted, and multihttp tests enhanced for secret scenarios - Comprehensive test coverage for secret resolution workflows This completes the secret store support feature by integrating the core infrastructure into all agent components.
1 parent e12f9aa commit 31370e9

File tree

15 files changed

+852
-170
lines changed

15 files changed

+852
-170
lines changed

cmd/synthetic-monitoring-agent/main.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,12 @@ func run(args []string, stdout io.Writer) error {
314314

315315
publisher := publisherFactory(ctx, tm, zl.With().Str("subsystem", "publisher").Str("version", config.SelectedPublisher).Logger(), promRegisterer)
316316
limits := limits.NewTenantLimits(tm)
317-
secrets := secrets.NewTenantSecrets(tm, zl.With().Str("subsystem", "secretstore").Logger())
317+
318+
// Create secret provider with caching (60-second TTL)
319+
secretProvider := secrets.NewSecretProvider(tm, 60*time.Second, zl.With().Str("subsystem", "secretstore").Logger())
320+
321+
// Wrap with capability awareness - capabilities will be set after probe registration
322+
capabilityAwareSecretProvider := secrets.NewUpdatableCapabilityAwareSecretProvider(secretProvider)
318323

319324
telemetry := telemetry.NewTelemeter(
320325
ctx, uuid.New().String(), time.Duration(config.TelemetryTimeSpan)*time.Minute,
@@ -335,7 +340,7 @@ func run(args []string, stdout io.Writer) error {
335340
K6Runner: k6Runner,
336341
ScraperFactory: scraper.New,
337342
TenantLimits: limits,
338-
TenantSecrets: secrets,
343+
TenantSecrets: capabilityAwareSecretProvider,
339344
Telemeter: telemetry,
340345
UsageReporter: usageReporter,
341346
})
@@ -356,7 +361,7 @@ func run(args []string, stdout io.Writer) error {
356361
PromRegisterer: promRegisterer,
357362
Features: features,
358363
K6Runner: k6Runner,
359-
TenantSecrets: secrets,
364+
TenantSecrets: capabilityAwareSecretProvider,
360365
})
361366
if err != nil {
362367
return fmt.Errorf("cannot create ad-hoc checks handler: %w", err)

internal/adhoc/adhoc.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ import (
88
"io"
99
"time"
1010

11-
"github.com/grafana/synthetic-monitoring-agent/internal/secrets"
12-
1311
"github.com/prometheus/client_golang/prometheus"
14-
"github.com/prometheus/prometheus/prompb"
12+
prompb "github.com/prometheus/prometheus/prompb"
1513
"github.com/rs/zerolog"
1614
"google.golang.org/grpc"
1715
"google.golang.org/grpc/codes"
@@ -24,6 +22,7 @@ import (
2422
"github.com/grafana/synthetic-monitoring-agent/internal/model"
2523
"github.com/grafana/synthetic-monitoring-agent/internal/prober"
2624
"github.com/grafana/synthetic-monitoring-agent/internal/pusher"
25+
"github.com/grafana/synthetic-monitoring-agent/internal/secrets"
2726
"github.com/grafana/synthetic-monitoring-agent/internal/version"
2827
sm "github.com/grafana/synthetic-monitoring-agent/pkg/pb/synthetic_monitoring"
2928
)
@@ -112,7 +111,7 @@ type HandlerOpts struct {
112111
PromRegisterer prometheus.Registerer
113112
Features feature.Collection
114113
K6Runner k6runner.Runner
115-
TenantSecrets *secrets.TenantSecrets
114+
TenantSecrets secrets.SecretProvider
116115

117116
// these two fields exists so that tests can pass alternate
118117
// implementations, they are unexported so that clients of this

internal/adhoc/adhoc_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,10 @@ func (s testSecretStore) GetSecretCredentials(ctx context.Context, tenantId mode
366366
}, nil
367367
}
368368

369+
func (s testSecretStore) GetSecretValue(ctx context.Context, tenantID model.GlobalID, secretKey string) (string, error) {
370+
return "", nil
371+
}
372+
369373
func TestDefaultRunnerFactory(t *testing.T) {
370374
t.Parallel()
371375

internal/checks/checks.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"syscall"
1414
"time"
1515

16+
"github.com/jpillora/backoff"
1617
"github.com/prometheus/client_golang/prometheus"
1718
"github.com/prometheus/prometheus/prompb"
1819
"github.com/rs/zerolog"
@@ -22,7 +23,6 @@ import (
2223
"google.golang.org/grpc/status"
2324

2425
logproto "github.com/grafana/loki/pkg/push"
25-
2626
"github.com/grafana/synthetic-monitoring-agent/internal/error_types"
2727
"github.com/grafana/synthetic-monitoring-agent/internal/feature"
2828
"github.com/grafana/synthetic-monitoring-agent/internal/k6runner"
@@ -81,7 +81,7 @@ type Updater struct {
8181
k6Runner k6runner.Runner
8282
scraperFactory scraper.Factory
8383
tenantLimits *limits.TenantLimits
84-
tenantSecrets *secrets.TenantSecrets
84+
tenantSecrets secrets.SecretProvider
8585
telemeter *telemetry.Telemeter
8686
usageReporter usage.Reporter
8787
}
@@ -108,7 +108,7 @@ type (
108108
type UpdaterOptions struct {
109109
Conn *grpc.ClientConn
110110
Logger zerolog.Logger
111-
Backoff Backoffer
111+
Backoff *backoff.Backoff
112112
Publisher pusher.Publisher
113113
TenantCh chan<- sm.Tenant
114114
IsConnected func(bool)
@@ -117,8 +117,8 @@ type UpdaterOptions struct {
117117
K6Runner k6runner.Runner
118118
ScraperFactory scraper.Factory
119119
TenantLimits *limits.TenantLimits
120+
TenantSecrets secrets.SecretProvider
120121
Telemeter *telemetry.Telemeter
121-
TenantSecrets *secrets.TenantSecrets
122122
UsageReporter usage.Reporter
123123
}
124124

@@ -243,6 +243,7 @@ func NewUpdater(opts UpdaterOptions) (*Updater, error) {
243243
tenantLimits: opts.TenantLimits,
244244
tenantSecrets: opts.TenantSecrets,
245245
telemeter: opts.Telemeter,
246+
usageReporter: opts.UsageReporter,
246247
metrics: metrics{
247248
changeErrorsCounter: changeErrorsCounter,
248249
changesCounter: changesCounter,
@@ -252,7 +253,6 @@ func NewUpdater(opts UpdaterOptions) (*Updater, error) {
252253
scrapeErrorCounter: scrapeErrorCounter,
253254
scrapesCounter: scrapesCounter,
254255
},
255-
usageReporter: opts.UsageReporter,
256256
}, nil
257257
}
258258

@@ -332,7 +332,6 @@ func handleError(ctx context.Context, logger zerolog.Logger, backoff Backoffer,
332332
return false, nil
333333
}
334334

335-
//goland:noinspection GoBoolExpressions
336335
func (c *Updater) loop(ctx context.Context) (bool, error) {
337336
connected := false
338337

@@ -399,9 +398,23 @@ func (c *Updater) loop(ctx context.Context) (bool, error) {
399398

400399
c.probe = &result.Probe
401400

402-
err = c.usageReporter.ReportProbe(ctx, result.Probe, c.features)
403-
if err != nil {
404-
c.logger.Warn().Err(err).Msg("reporting usage failed")
401+
// Report usage if reporter is configured
402+
if c.usageReporter != nil {
403+
err := c.usageReporter.ReportProbe(ctx, result.Probe, c.features)
404+
if err != nil {
405+
c.logger.Warn().Err(err).Msg("reporting usage failed")
406+
}
407+
}
408+
409+
// Update secret provider with probe capabilities if it supports it
410+
if updatableSecretProvider, ok := c.tenantSecrets.(secrets.UpdatableCapabilityAwareSecretProvider); ok {
411+
updatableSecretProvider.UpdateCapabilities(c.probe.Capabilities)
412+
logger := c.logger.With().Int64("probe_id", c.probe.Id).Logger()
413+
enableProtocolSecrets := false
414+
if c.probe.Capabilities != nil {
415+
enableProtocolSecrets = c.probe.Capabilities.EnableProtocolSecrets
416+
}
417+
logger.Debug().Bool("enable_protocol_secrets", enableProtocolSecrets).Msg("updated secret provider with probe capabilities")
405418
}
406419

407420
logger := c.logger.With().Int64("probe_id", c.probe.Id).Logger()

internal/checks/checks_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ func testScraperFactory(ctx context.Context, check model.Check, publisher pusher
473473
k6Runner k6runner.Runner,
474474
labelsLimiter scraper.LabelsLimiter,
475475
telemeter *telemetry.Telemeter,
476-
secretStore *secrets.TenantSecrets,
476+
secretStore secrets.SecretProvider,
477477
) (*scraper.Scraper, error) {
478478
return scraper.NewWithOpts(
479479
ctx,

internal/prober/browser/browser_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,7 @@ type noopSecretStore struct{}
8989
func (n noopSecretStore) GetSecretCredentials(ctx context.Context, tenantID model.GlobalID) (*sm.SecretStore, error) {
9090
return &sm.SecretStore{}, nil
9191
}
92+
93+
func (n noopSecretStore) GetSecretValue(ctx context.Context, tenantID model.GlobalID, secretKey string) (string, error) {
94+
return "", nil
95+
}

0 commit comments

Comments
 (0)