diff --git a/cmd/launcher/launcher.go b/cmd/launcher/launcher.go index 954f777b0..ca2fc2154 100644 --- a/cmd/launcher/launcher.go +++ b/cmd/launcher/launcher.go @@ -194,6 +194,13 @@ func runLauncher(ctx context.Context, cancel func(), multiSlogger, systemMultiSl flagController := flags.NewFlagController(slogger, stores[storage.AgentFlagsStore], fcOpts...) k := knapsack.New(stores, flagController, db, multiSlogger, systemMultiSlogger) + // Generate a new run ID + newRunID := k.GetRunID() + + // Apply the run ID to both logger and slogger + logger = log.With(logger, "run_id", newRunID) + slogger = slogger.With("run_id", newRunID) + // start counting uptime processStartTime := time.Now().UTC() diff --git a/ee/agent/knapsack/knapsack.go b/ee/agent/knapsack/knapsack.go index bd54a14f2..dc66c072c 100644 --- a/ee/agent/knapsack/knapsack.go +++ b/ee/agent/knapsack/knapsack.go @@ -9,6 +9,7 @@ import ( "log/slog" + "github.com/kolide/kit/ulid" "github.com/kolide/launcher/ee/agent/storage" "github.com/kolide/launcher/ee/agent/types" "github.com/kolide/launcher/ee/tuf" @@ -16,6 +17,9 @@ import ( "go.etcd.io/bbolt" ) +// Package-level runID variable +var runID string + // type alias Flags, so that we can embed it inside knapsack, as `flags` and not `Flags` type flags types.Flags @@ -59,6 +63,16 @@ func New(stores map[storage.Store]types.KVStore, flags types.Flags, db *bbolt.DB return k } +// NewRunID sets the run ID in the knapsack +func (k *knapsack) GetRunID() string { + if runID == "" { + runID = ulid.New() + k.slogger.Logger = k.slogger.Logger.With("run_id", runID) + k.systemSlogger.Logger = k.systemSlogger.Logger.With("run_id", runID) + } + return runID +} + // Logging interface methods func (k *knapsack) Slogger() *slog.Logger { return k.slogger.Logger diff --git a/pkg/log/multislogger/multislogger.go b/pkg/log/multislogger/multislogger.go index fa5a7a3a3..c064f0124 100644 --- a/pkg/log/multislogger/multislogger.go +++ b/pkg/log/multislogger/multislogger.go @@ -5,7 +5,6 @@ import ( "log/slog" "os" - "github.com/kolide/kit/ulid" slogmulti "github.com/samber/slog-multi" ) @@ -34,8 +33,7 @@ var ctxValueKeysToAdd = []contextKey{ type MultiSlogger struct { *slog.Logger - handlers []slog.Handler - launcherRunId string + handlers []slog.Handler } // New creates a new multislogger if no handlers are passed in, it will @@ -43,8 +41,7 @@ type MultiSlogger struct { func New(h ...slog.Handler) *MultiSlogger { ms := &MultiSlogger{ // setting to fanout with no handlers is noop - Logger: slog.New(slogmulti.Fanout()), - launcherRunId: ulid.New(), + Logger: slog.New(slogmulti.Fanout()), } ms.AddHandler(h...) @@ -69,7 +66,7 @@ func (m *MultiSlogger) AddHandler(handler ...slog.Handler) { Pipe(slogmulti.NewHandleInlineMiddleware(utcTimeMiddleware)). Pipe(slogmulti.NewHandleInlineMiddleware(ctxValuesMiddleWare)). Handler(slogmulti.Fanout(m.handlers...)), - ).With("launcher_run_id", m.launcherRunId) + ) } func utcTimeMiddleware(ctx context.Context, record slog.Record, next func(context.Context, slog.Record) error) error {