diff --git a/apiserver/controllers/controllers.go b/apiserver/controllers/controllers.go index f8a8c3b3..36b63891 100644 --- a/apiserver/controllers/controllers.go +++ b/apiserver/controllers/controllers.go @@ -37,7 +37,7 @@ import ( ) func NewAPIController(r *runner.Runner, authenticator *auth.Authenticator, hub *wsWriter.Hub) (*APIController, error) { - controllerInfo, err := r.GetControllerInfo(auth.GetAdminContext()) + controllerInfo, err := r.GetControllerInfo(auth.GetAdminContext(nil)) if err != nil { return nil, errors.Wrap(err, "failed to get controller info") } diff --git a/auth/context.go b/auth/context.go index bce9f25e..71d29d27 100644 --- a/auth/context.go +++ b/auth/context.go @@ -238,8 +238,10 @@ func UserID(ctx context.Context) string { // GetAdminContext will return an admin context. This can be used internally // when fetching users. -func GetAdminContext() context.Context { - ctx := context.Background() +func GetAdminContext(ctx context.Context) context.Context { + if ctx == nil { + ctx = context.Background() + } ctx = SetUserID(ctx, "") ctx = SetAdmin(ctx, true) ctx = SetIsEnabled(ctx, true) diff --git a/cmd/garm/main.go b/cmd/garm/main.go index 16e411e7..59686fd1 100644 --- a/cmd/garm/main.go +++ b/cmd/garm/main.go @@ -220,7 +220,7 @@ func main() { router = routers.WithMetricsRouter(router, cfg.Metrics.DisableAuth, metricsMiddleware) slog.InfoContext(ctx, "start metrics collection") - runnerMetrics.CollectObjectMetric(runner, time.NewTicker(cfg.Metrics.Period)) + runnerMetrics.CollectObjectMetric(ctx, runner, time.NewTicker(cfg.Metrics.Period)) } if cfg.Default.DebugServer { diff --git a/runner/enterprises_test.go b/runner/enterprises_test.go index 809577a7..b3bedfdd 100644 --- a/runner/enterprises_test.go +++ b/runner/enterprises_test.go @@ -60,7 +60,7 @@ type EnterpriseTestSuite struct { } func (s *EnterpriseTestSuite) SetupTest() { - adminCtx := auth.GetAdminContext() + adminCtx := auth.GetAdminContext(nil) // create testing sqlite database dbCfg := garmTesting.GetTestSqliteDBConfig(s.T()) diff --git a/runner/metrics/metrics.go b/runner/metrics/metrics.go index 577d67f7..5427118f 100644 --- a/runner/metrics/metrics.go +++ b/runner/metrics/metrics.go @@ -1,6 +1,7 @@ package metrics import ( + "context" "log/slog" "time" @@ -8,9 +9,8 @@ import ( "github.com/cloudbase/garm/runner" ) -func CollectObjectMetric(r *runner.Runner, timer *time.Ticker) { - - ctx := auth.GetAdminContext() +func CollectObjectMetric(ctx context.Context, r *runner.Runner, ticker *time.Ticker) { + ctx = auth.GetAdminContext(ctx) controllerInfo, err := r.GetControllerInfo(ctx) if err != nil { @@ -19,51 +19,55 @@ func CollectObjectMetric(r *runner.Runner, timer *time.Ticker) { go func() { // we wan't to initiate the collection immediately - for ; true; <-timer.C { + for ; true; <-ticker.C { + select { + case <-ctx.Done(): + return + default: + slog.InfoContext(ctx, "collecting metrics") - slog.InfoContext(ctx, "collecting metrics") + var err error + slog.DebugContext(ctx, "collecting organization metrics") + err = CollectOrganizationMetric(ctx, r) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect organization metrics") + } - var err error - slog.DebugContext(ctx, "collecting organization metrics") - err = CollectOrganizationMetric(ctx, r) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect organization metrics") - } + slog.DebugContext(ctx, "collecting enterprise metrics") + err = CollectEnterpriseMetric(ctx, r) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect enterprise metrics") + } - slog.DebugContext(ctx, "collecting enterprise metrics") - err = CollectEnterpriseMetric(ctx, r) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect enterprise metrics") - } + slog.DebugContext(ctx, "collecting repository metrics") + err = CollectRepositoryMetric(ctx, r) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect repository metrics") + } - slog.DebugContext(ctx, "collecting repository metrics") - err = CollectRepositoryMetric(ctx, r) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect repository metrics") - } + slog.DebugContext(ctx, "collecting provider metrics") + err = CollectProviderMetric(ctx, r) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect provider metrics") + } - slog.DebugContext(ctx, "collecting provider metrics") - err = CollectProviderMetric(ctx, r) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect provider metrics") - } + slog.DebugContext(ctx, "collecting pool metrics") + err = CollectPoolMetric(ctx, r) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect pool metrics") + } - slog.DebugContext(ctx, "collecting pool metrics") - err = CollectPoolMetric(ctx, r) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect pool metrics") - } + slog.DebugContext(ctx, "collecting health metrics") + err = CollectHealthMetric(ctx, r, controllerInfo) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect health metrics") + } - slog.DebugContext(ctx, "collecting health metrics") - err = CollectHealthMetric(ctx, r, controllerInfo) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect health metrics") - } - - slog.DebugContext(ctx, "collecting instance metrics") - err = CollectInstanceMetric(ctx, r, controllerInfo) - if err != nil { - slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect instance metrics") + slog.DebugContext(ctx, "collecting instance metrics") + err = CollectInstanceMetric(ctx, r, controllerInfo) + if err != nil { + slog.With(slog.Any("error", err)).ErrorContext(ctx, "cannot collect instance metrics") + } } } }() diff --git a/runner/organizations_test.go b/runner/organizations_test.go index 3aa3e427..978dfbaa 100644 --- a/runner/organizations_test.go +++ b/runner/organizations_test.go @@ -60,7 +60,7 @@ type OrgTestSuite struct { } func (s *OrgTestSuite) SetupTest() { - adminCtx := auth.GetAdminContext() + adminCtx := auth.GetAdminContext(nil) // create testing sqlite database dbCfg := garmTesting.GetTestSqliteDBConfig(s.T()) diff --git a/runner/pools_test.go b/runner/pools_test.go index db112b69..be1bd4e7 100644 --- a/runner/pools_test.go +++ b/runner/pools_test.go @@ -47,7 +47,7 @@ type PoolTestSuite struct { } func (s *PoolTestSuite) SetupTest() { - adminCtx := auth.GetAdminContext() + adminCtx := auth.GetAdminContext(nil) // create testing sqlite database dbCfg := garmTesting.GetTestSqliteDBConfig(s.T()) diff --git a/runner/repositories_test.go b/runner/repositories_test.go index 4c918124..1ede8d82 100644 --- a/runner/repositories_test.go +++ b/runner/repositories_test.go @@ -59,7 +59,7 @@ type RepoTestSuite struct { } func (s *RepoTestSuite) SetupTest() { - adminCtx := auth.GetAdminContext() + adminCtx := auth.GetAdminContext(nil) // create testing sqlite database dbCfg := garmTesting.GetTestSqliteDBConfig(s.T()) @@ -90,7 +90,7 @@ func (s *RepoTestSuite) SetupTest() { var minIdleRunners uint = 20 providerMock := runnerCommonMocks.NewProvider(s.T()) fixtures := &RepoTestFixtures{ - AdminContext: auth.GetAdminContext(), + AdminContext: auth.GetAdminContext(nil), Store: db, StoreRepos: repos, Providers: map[string]common.Provider{