Skip to content
Draft

Aci #1855

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions cmd/bootstrap_manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

package cmd

import (
"fmt"
"strings"

"github.com/microsoft/retina/cmd/standalone"
"github.com/microsoft/retina/cmd/standard"
"github.com/microsoft/retina/internal/buildinfo"
"github.com/microsoft/retina/pkg/config"
"github.com/microsoft/retina/pkg/log"
"github.com/microsoft/retina/pkg/telemetry"
"go.uber.org/zap"
)

const (
logFileName = "retina.log"
)

type BootstrapManager struct {
metricsAddr string
probeAddr string
configFile string
enableLeaderElection bool
}

func NewBootstrapManager(metricsAddr, probeAddr, configFile string, enableLeaderElection bool) *BootstrapManager {
return &BootstrapManager{
metricsAddr: metricsAddr,
probeAddr: probeAddr,
configFile: configFile,
enableLeaderElection: enableLeaderElection,
}
}

func (bm *BootstrapManager) Start() error {
if buildinfo.ApplicationInsightsID != "" {
telemetry.InitAppInsights(buildinfo.ApplicationInsightsID, buildinfo.Version)
defer telemetry.ShutdownAppInsights()
defer telemetry.TrackPanic()
}

daemonConfig, err := config.GetConfig(bm.configFile)
if err != nil {
panic(err)
}

fmt.Println("init logger")
zl, err := log.SetupZapLogger(&log.LogOpts{
Level: daemonConfig.LogLevel,
File: false,
FileName: logFileName,
MaxFileSizeMB: 100, //nolint:gomnd // defaults
MaxBackups: 3, //nolint:gomnd // defaults
MaxAgeDays: 30, //nolint:gomnd // defaults
ApplicationInsightsID: buildinfo.ApplicationInsightsID,
EnableTelemetry: daemonConfig.EnableTelemetry,
},
zap.String("version", buildinfo.Version),
zap.String("plugins", strings.Join(daemonConfig.EnabledPlugin, `,`)),
zap.String("data aggregation level", daemonConfig.DataAggregationLevel.String()),
)
if err != nil {
panic(err)
}
defer zl.Close()

if daemonConfig.EnableStandalone {
sd := standalone.NewDaemon(daemonConfig)
if err = sd.Start(zl); err != nil {
return fmt.Errorf("starting standalone daemon: %w", err)
}
return nil
}

d := standard.NewDaemon(daemonConfig, bm.metricsAddr, bm.probeAddr, bm.enableLeaderElection)
if err := d.Start(zl); err != nil {
return fmt.Errorf("starting daemon: %w", err)
}
return nil
}
7 changes: 3 additions & 4 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"fmt"
"os"

"github.com/microsoft/retina/cmd/standard"
"github.com/spf13/cobra"
)

Expand All @@ -27,9 +26,9 @@ var (
Long: "Start Retina Agent",
RunE: func(cmd *cobra.Command, args []string) error {
// Do Stuff Here
fmt.Println("Starting Retina Agent")
d := standard.NewDaemon(metricsAddr, probeAddr, cfgFile, enableLeaderElection)
if err := d.Start(); err != nil {
fmt.Println("Bootstrapping Retina")
b := NewBootstrapManager(metricsAddr, probeAddr, cfgFile, enableLeaderElection)
if err := b.Start(); err != nil {
return fmt.Errorf("starting daemon: %w", err)
}
return nil
Expand Down
78 changes: 78 additions & 0 deletions cmd/standalone/daemon.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

package standalone

import (
"fmt"

"github.com/microsoft/retina/cmd/telemetry"
"github.com/microsoft/retina/pkg/enricher"
"github.com/microsoft/retina/pkg/log"
"github.com/microsoft/retina/pkg/metrics"
"go.uber.org/zap"
ctrl "sigs.k8s.io/controller-runtime"

"github.com/microsoft/retina/pkg/config"
cache "github.com/microsoft/retina/pkg/controllers/cache/standalone"
sc "github.com/microsoft/retina/pkg/controllers/daemon/standalone"
cm "github.com/microsoft/retina/pkg/managers/controllermanager"
sm "github.com/microsoft/retina/pkg/module/metrics/standalone"
)

type Daemon struct {
config *config.Config
}

func NewDaemon(daemonCfg *config.Config) *Daemon {
return &Daemon{
config: daemonCfg,
}
}

func (d *Daemon) Start(zl *log.ZapLogger) error {
zl.Info("Starting Retina daemon in standalone mode")
mainLogger := zl.Named("main").Sugar()

// Initialize basic metrics and telemetry client
metrics.InitializeMetrics()
tel, err := telemetry.InitializeTelemetryClient(nil, d.config, mainLogger)
if err != nil {
return fmt.Errorf("failed to initialize telemetry client: %w", err)
}

// Initialize cache and run enricher
ctx := ctrl.SetupSignalHandler()
controllerCache := cache.New()
enrich := enricher.New(ctx, controllerCache, d.config.EnableStandalone)
enrich.Run()

// Initialize metrics module
metricsModule := sm.InitModule(ctx, enrich)

mainLogger.Info("Initializing RetinaEndpoint controller")
controller := sc.New(d.config, controllerCache, metricsModule)
go controller.Run(ctx)

// Standalone requires pod level to be disabled
controllerMgr, err := cm.NewControllerManager(d.config, nil, tel)
if err != nil {
mainLogger.Fatal("Failed to create controller manager", zap.Error(err))
}
if err := controllerMgr.Init(ctx); err != nil {
mainLogger.Fatal("Failed to initialize controller manager", zap.Error(err))
}

// start heartbeat goroutine for application insights
go tel.Heartbeat(ctx, d.config.TelemetryInterval)

// Start controller manager, which will start the http server and plugin manager
go controllerMgr.Start(ctx)
mainLogger.Info("Started controller manager")

<-ctx.Done()
controllerMgr.Stop(ctx)

mainLogger.Info("Network observability exiting. Till next time!")
return nil
}
Loading
Loading