From d1af6b5d62240d029723a50e3ba60f2c48473a89 Mon Sep 17 00:00:00 2001 From: Victor Lyuboslavsky <2685025+getvictor@users.noreply.github.com> Date: Thu, 12 Feb 2026 11:22:30 -0600 Subject: [PATCH 1/2] Transitioned activity bounded context to slog. --- cmd/fleet/serve.go | 5 +++-- server/activity/bootstrap/bootstrap.go | 4 ++-- server/activity/internal/mysql/activity.go | 9 ++++----- server/activity/internal/service/service.go | 8 ++++---- server/activity/internal/service/service_test.go | 7 ++++--- server/activity/internal/testutils/testutils.go | 10 ++++++---- server/datastore/mysql/testing_utils.go | 4 +++- server/service/testing_utils.go | 2 +- 8 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cmd/fleet/serve.go b/cmd/fleet/serve.go index 3d9e5df7c65..583e77e2c96 100644 --- a/cmd/fleet/serve.go +++ b/cmd/fleet/serve.go @@ -9,6 +9,7 @@ import ( "database/sql/driver" "errors" "fmt" + "log/slog" "math/rand" "net/http" "net/url" @@ -1010,7 +1011,7 @@ the way that the Fleet server works. level.Info(logger).Log("instanceID", instanceID) // Bootstrap activity bounded context (needed for cron schedules and HTTP routes) - activitySvc, activityRoutes := createActivityBoundedContext(svc, dbConns, logger) + activitySvc, activityRoutes := createActivityBoundedContext(svc, dbConns, logger.SlogLogger()) // Perform a cleanup of cron_stats outside of the cronSchedules because the // schedule package uses cron_stats entries to decide whether a schedule will @@ -1757,7 +1758,7 @@ the way that the Fleet server works. return serveCmd } -func createActivityBoundedContext(svc fleet.Service, dbConns *common_mysql.DBConnections, logger kitlog.Logger) (activity_api.Service, endpointer.HandlerRoutesFunc) { +func createActivityBoundedContext(svc fleet.Service, dbConns *common_mysql.DBConnections, logger *slog.Logger) (activity_api.Service, endpointer.HandlerRoutesFunc) { legacyAuthorizer, err := authz.NewAuthorizer() if err != nil { initFatal(err, "initializing activity authorizer") diff --git a/server/activity/bootstrap/bootstrap.go b/server/activity/bootstrap/bootstrap.go index 26cb9e28f4d..29c84b7a3c1 100644 --- a/server/activity/bootstrap/bootstrap.go +++ b/server/activity/bootstrap/bootstrap.go @@ -11,7 +11,7 @@ import ( eu "github.com/fleetdm/fleet/v4/server/platform/endpointer" platform_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" "github.com/go-kit/kit/endpoint" - kitlog "github.com/go-kit/log" + "log/slog" ) // New creates a new activity bounded context and returns its service and route handler. @@ -19,7 +19,7 @@ func New( dbConns *platform_mysql.DBConnections, authorizer platform_authz.Authorizer, providers activity.DataProviders, - logger kitlog.Logger, + logger *slog.Logger, ) (api.Service, func(authMiddleware endpoint.Middleware) eu.HandlerRoutesFunc) { ds := mysql.NewDatastore(dbConns, logger) svc := service.NewService(authorizer, ds, providers, logger) diff --git a/server/activity/internal/mysql/activity.go b/server/activity/internal/mysql/activity.go index 45f88d715e7..face284cf6c 100644 --- a/server/activity/internal/mysql/activity.go +++ b/server/activity/internal/mysql/activity.go @@ -12,10 +12,9 @@ import ( "github.com/fleetdm/fleet/v4/server/activity/internal/types" "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" platform_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" - kitlog "github.com/go-kit/log" - "github.com/go-kit/log/level" "github.com/jmoiron/sqlx" "go.opentelemetry.io/otel" + "log/slog" ) // tracer is an OTEL tracer. It has no-op behavior when OTEL is not enabled. @@ -25,11 +24,11 @@ var tracer = otel.Tracer("github.com/fleetdm/fleet/v4/server/activity/internal/m type Datastore struct { primary *sqlx.DB replica *sqlx.DB - logger kitlog.Logger + logger *slog.Logger } // NewDatastore creates a new MySQL datastore for activities. -func NewDatastore(conns *platform_mysql.DBConnections, logger kitlog.Logger) *Datastore { +func NewDatastore(conns *platform_mysql.DBConnections, logger *slog.Logger) *Datastore { return &Datastore{primary: conns.Primary, replica: conns.Replica, logger: logger} } @@ -228,7 +227,7 @@ func (ds *Datastore) fetchActivityDetails(ctx context.Context, activities []*api for _, a := range activities { det, ok := detailsLookup[a.ID] if !ok { - level.Warn(ds.logger).Log("msg", "Activity details not found", "activity_id", a.ID) + ds.logger.WarnContext(ctx, "Activity details not found", "activity_id", a.ID) continue } a.Details = det diff --git a/server/activity/internal/service/service.go b/server/activity/internal/service/service.go index 1f637326caa..697775d474b 100644 --- a/server/activity/internal/service/service.go +++ b/server/activity/internal/service/service.go @@ -14,8 +14,8 @@ import ( "github.com/fleetdm/fleet/v4/server/contexts/ctxerr" platform_authz "github.com/fleetdm/fleet/v4/server/platform/authz" "github.com/fleetdm/fleet/v4/server/ptr" - kitlog "github.com/go-kit/log" "github.com/hashicorp/go-multierror" + "log/slog" ) // streamBatchSize is the number of activities to fetch per batch when streaming. @@ -46,11 +46,11 @@ type Service struct { authz platform_authz.Authorizer store types.Datastore providers activity.DataProviders - logger kitlog.Logger + logger *slog.Logger } // NewService creates a new activity service. -func NewService(authz platform_authz.Authorizer, store types.Datastore, providers activity.DataProviders, logger kitlog.Logger) *Service { +func NewService(authz platform_authz.Authorizer, store types.Datastore, providers activity.DataProviders, logger *slog.Logger) *Service { return &Service{ authz: authz, store: store, @@ -226,7 +226,7 @@ func (s *Service) StreamActivities(systemCtx context.Context, auditLogger api.JS afterID = act.ID } - s.logger.Log("streamed-events", len(streamedIDs)) + s.logger.InfoContext(systemCtx, "streamed events", "count", len(streamedIDs)) // (3) Mark the streamed activities as streamed. if err := s.store.MarkActivitiesAsStreamed(systemCtx, streamedIDs); err != nil { diff --git a/server/activity/internal/service/service_test.go b/server/activity/internal/service/service_test.go index 760bc594fc6..909c7a46155 100644 --- a/server/activity/internal/service/service_test.go +++ b/server/activity/internal/service/service_test.go @@ -11,10 +11,11 @@ import ( "github.com/fleetdm/fleet/v4/server/activity/api" "github.com/fleetdm/fleet/v4/server/activity/internal/types" platform_authz "github.com/fleetdm/fleet/v4/server/platform/authz" + platformlogging "github.com/fleetdm/fleet/v4/server/platform/logging" "github.com/fleetdm/fleet/v4/server/ptr" - "github.com/go-kit/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "log/slog" ) // Test fixtures @@ -114,7 +115,7 @@ func setupTest(opts ...func(*testSetup)) *testSetup { for _, opt := range opts { opt(ts) } - ts.svc = NewService(ts.authz, ts.ds, ts.providers, log.NewNopLogger()) + ts.svc = NewService(ts.authz, ts.ds, ts.providers, slog.New(platformlogging.DiscardHandler{})) return ts } @@ -482,7 +483,7 @@ func TestStreamActivities(t *testing.T) { t.Parallel() newStreamingService := func(ds *mockStreamingDatastore) *Service { - return NewService(&mockAuthorizer{}, ds, &mockDataProviders{mockUserProvider: &mockUserProvider{}, mockHostProvider: &mockHostProvider{}}, log.NewNopLogger()) + return NewService(&mockAuthorizer{}, ds, &mockDataProviders{mockUserProvider: &mockUserProvider{}, mockHostProvider: &mockHostProvider{}}, slog.New(platformlogging.DiscardHandler{})) } t.Run("basic streaming", func(t *testing.T) { diff --git a/server/activity/internal/testutils/testutils.go b/server/activity/internal/testutils/testutils.go index 450041654cc..d0ee4e449ad 100644 --- a/server/activity/internal/testutils/testutils.go +++ b/server/activity/internal/testutils/testutils.go @@ -3,12 +3,14 @@ package testutils import ( "encoding/json" + "log/slog" "testing" "time" + platformlogging "github.com/fleetdm/fleet/v4/server/platform/logging" common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" mysql_testing_utils "github.com/fleetdm/fleet/v4/server/platform/mysql/testing_utils" - "github.com/go-kit/log" + kitlog "github.com/go-kit/log" "github.com/jmoiron/sqlx" "github.com/stretchr/testify/require" ) @@ -16,7 +18,7 @@ import ( // TestDB holds the database connection for tests. type TestDB struct { DB *sqlx.DB - Logger log.Logger + Logger *slog.Logger } // SetupTestDB creates a test database with the Fleet schema loaded. @@ -36,7 +38,7 @@ func SetupTestDB(t *testing.T, testNamePrefix string) *TestDB { return &TestDB{ DB: db, - Logger: log.NewNopLogger(), + Logger: slog.New(platformlogging.DiscardHandler{}), } } @@ -48,7 +50,7 @@ func (tdb *TestDB) Conns() *common_mysql.DBConnections { // TruncateTables clears the tables used by activity bounded context. func (tdb *TestDB) TruncateTables(t *testing.T) { t.Helper() - mysql_testing_utils.TruncateTables(t, tdb.DB, tdb.Logger, nil, "host_activities", "activities", "hosts", "users") + mysql_testing_utils.TruncateTables(t, tdb.DB, kitlog.NewNopLogger(), nil, "host_activities", "activities", "hosts", "users") } // InsertUser creates a user in the database and returns the user ID. diff --git a/server/datastore/mysql/testing_utils.go b/server/datastore/mysql/testing_utils.go index 2af26abe653..113018ac810 100644 --- a/server/datastore/mysql/testing_utils.go +++ b/server/datastore/mysql/testing_utils.go @@ -14,6 +14,7 @@ import ( "errors" "fmt" "io" + "log/slog" "os" "os/exec" "regexp" @@ -34,6 +35,7 @@ import ( nanodep_client "github.com/fleetdm/fleet/v4/server/mdm/nanodep/client" mdmtesting "github.com/fleetdm/fleet/v4/server/mdm/testing_utils" platform_authz "github.com/fleetdm/fleet/v4/server/platform/authz" + platformlogging "github.com/fleetdm/fleet/v4/server/platform/logging" common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" "github.com/fleetdm/fleet/v4/server/platform/mysql/testing_utils" "github.com/go-kit/log" @@ -1018,7 +1020,7 @@ func NewTestActivityService(t testing.TB, ds *Datastore) activity_api.Service { providers := activityacl.NewFleetServiceAdapter(lookupSvc) // Create service via bootstrap (the public API for creating the bounded context) - svc, _ := activity_bootstrap.New(dbConns, &testingAuthorizer{}, providers, log.NewNopLogger()) + svc, _ := activity_bootstrap.New(dbConns, &testingAuthorizer{}, providers, slog.New(platformlogging.DiscardHandler{})) return svc } diff --git a/server/service/testing_utils.go b/server/service/testing_utils.go index 2f599d30928..585c91b582e 100644 --- a/server/service/testing_utils.go +++ b/server/service/testing_utils.go @@ -468,7 +468,7 @@ func RunServerForTestsWithServiceWithDS(t *testing.T, ctx context.Context, ds fl opts[0].DBConns, activityAuthorizer, activityACLAdapter, - logger, + logger.SlogLogger(), ) activityAuthMiddleware := func(next endpoint.Endpoint) endpoint.Endpoint { return auth.AuthenticatedUser(svc, next) From 7b5151e3060832270cfeecdcea52be59e2e5d35c Mon Sep 17 00:00:00 2001 From: Victor Lyuboslavsky <2685025+getvictor@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:02:33 -0600 Subject: [PATCH 2/2] Code review fixes. --- server/activity/arch_test.go | 1 + server/activity/bootstrap/bootstrap.go | 3 ++- server/activity/internal/mysql/activity.go | 2 +- server/activity/internal/service/service.go | 2 +- server/activity/internal/service/service_test.go | 2 +- server/activity/internal/testutils/testutils.go | 4 ++-- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/server/activity/arch_test.go b/server/activity/arch_test.go index 9a94974fd44..4ab2c140401 100644 --- a/server/activity/arch_test.go +++ b/server/activity/arch_test.go @@ -68,6 +68,7 @@ func TestActivityPackageDependencies(t *testing.T) { m + "/server/activity/internal/types", m + "/server/activity/internal/testutils", m + "/server/platform/http", + m + "/server/platform/logging", m + "/server/platform/mysql", m + "/server/platform/mysql/testing_utils", m + "/server/contexts/ctxerr", diff --git a/server/activity/bootstrap/bootstrap.go b/server/activity/bootstrap/bootstrap.go index 29c84b7a3c1..176a2da7ab9 100644 --- a/server/activity/bootstrap/bootstrap.go +++ b/server/activity/bootstrap/bootstrap.go @@ -3,6 +3,8 @@ package bootstrap import ( + "log/slog" + "github.com/fleetdm/fleet/v4/server/activity" "github.com/fleetdm/fleet/v4/server/activity/api" "github.com/fleetdm/fleet/v4/server/activity/internal/mysql" @@ -11,7 +13,6 @@ import ( eu "github.com/fleetdm/fleet/v4/server/platform/endpointer" platform_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" "github.com/go-kit/kit/endpoint" - "log/slog" ) // New creates a new activity bounded context and returns its service and route handler. diff --git a/server/activity/internal/mysql/activity.go b/server/activity/internal/mysql/activity.go index face284cf6c..b709841609d 100644 --- a/server/activity/internal/mysql/activity.go +++ b/server/activity/internal/mysql/activity.go @@ -6,6 +6,7 @@ import ( "database/sql" "encoding/json" "errors" + "log/slog" "time" "github.com/fleetdm/fleet/v4/server/activity/api" @@ -14,7 +15,6 @@ import ( platform_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" "github.com/jmoiron/sqlx" "go.opentelemetry.io/otel" - "log/slog" ) // tracer is an OTEL tracer. It has no-op behavior when OTEL is not enabled. diff --git a/server/activity/internal/service/service.go b/server/activity/internal/service/service.go index 697775d474b..5d226f605f9 100644 --- a/server/activity/internal/service/service.go +++ b/server/activity/internal/service/service.go @@ -4,6 +4,7 @@ package service import ( "context" "encoding/json" + "log/slog" "maps" "slices" "strconv" @@ -15,7 +16,6 @@ import ( platform_authz "github.com/fleetdm/fleet/v4/server/platform/authz" "github.com/fleetdm/fleet/v4/server/ptr" "github.com/hashicorp/go-multierror" - "log/slog" ) // streamBatchSize is the number of activities to fetch per batch when streaming. diff --git a/server/activity/internal/service/service_test.go b/server/activity/internal/service/service_test.go index 909c7a46155..62a063c7130 100644 --- a/server/activity/internal/service/service_test.go +++ b/server/activity/internal/service/service_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "errors" + "log/slog" "strconv" "testing" @@ -15,7 +16,6 @@ import ( "github.com/fleetdm/fleet/v4/server/ptr" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "log/slog" ) // Test fixtures diff --git a/server/activity/internal/testutils/testutils.go b/server/activity/internal/testutils/testutils.go index d0ee4e449ad..f44f149e535 100644 --- a/server/activity/internal/testutils/testutils.go +++ b/server/activity/internal/testutils/testutils.go @@ -7,7 +7,7 @@ import ( "testing" "time" - platformlogging "github.com/fleetdm/fleet/v4/server/platform/logging" + "github.com/fleetdm/fleet/v4/server/platform/logging" common_mysql "github.com/fleetdm/fleet/v4/server/platform/mysql" mysql_testing_utils "github.com/fleetdm/fleet/v4/server/platform/mysql/testing_utils" kitlog "github.com/go-kit/log" @@ -38,7 +38,7 @@ func SetupTestDB(t *testing.T, testNamePrefix string) *TestDB { return &TestDB{ DB: db, - Logger: slog.New(platformlogging.DiscardHandler{}), + Logger: slog.New(logging.DiscardHandler{}), } }