...

Source file src/github.com/datawire/ambassador/v2/cmd/agent/main.go

Documentation: github.com/datawire/ambassador/v2/cmd/agent

     1  package agent
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  	"net"
     8  	"os"
     9  
    10  	"github.com/spf13/cobra"
    11  	"k8s.io/klog/v2"
    12  
    13  	"github.com/datawire/ambassador/v2/cmd/entrypoint"
    14  	"github.com/datawire/ambassador/v2/pkg/agent"
    15  	"github.com/datawire/ambassador/v2/pkg/busy"
    16  	"github.com/datawire/ambassador/v2/pkg/logutil"
    17  	"github.com/datawire/dlib/dgroup"
    18  	"github.com/datawire/dlib/dlog"
    19  )
    20  
    21  // internal k8s service
    22  const DefaultSnapshotURLFmt = "http://ambassador-admin:%d/snapshot-external"
    23  
    24  func run(cmd *cobra.Command, args []string) error {
    25  	ctx := cmd.Context()
    26  	ambAgent := agent.NewAgent(nil, agent.NewArgoRolloutsGetter)
    27  
    28  	// all log things need to happen here because we still allow the agent to run in amb-sidecar
    29  	// and amb-sidecar should control all the logging if it's kicking off the agent.
    30  	// this codepath is only hit when the agent is running on its own
    31  	logLevel := os.Getenv("AES_LOG_LEVEL")
    32  	// by default, suppress everything except fatal things
    33  	// the watcher in the agent will spit out a lot of errors because we don't give it rbac to
    34  	// list secrets initially.
    35  	klogLevel := 3
    36  	if logLevel != "" {
    37  		logrusLevel, err := logutil.ParseLogLevel(logLevel)
    38  		if err != nil {
    39  			dlog.Errorf(ctx, "error parsing log level, running with default level: %+v", err)
    40  		} else {
    41  			busy.SetLogLevel(logrusLevel)
    42  		}
    43  		klogLevel = logutil.LogrusToKLogLevel(logrusLevel)
    44  	}
    45  	klogFlags := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
    46  	klog.InitFlags(klogFlags)
    47  	if err := klogFlags.Parse([]string{fmt.Sprintf("-stderrthreshold=%d", klogLevel), "-v=2", "-logtostderr=false"}); err != nil {
    48  		return err
    49  	}
    50  	snapshotURL := os.Getenv("AES_SNAPSHOT_URL")
    51  	if snapshotURL == "" {
    52  		snapshotURL = fmt.Sprintf(DefaultSnapshotURLFmt, entrypoint.ExternalSnapshotPort)
    53  	}
    54  
    55  	metricsListener, err := net.Listen("tcp", ":8080")
    56  	if err != nil {
    57  		return err
    58  	}
    59  	dlog.Info(ctx, "metrics service listening on :8080")
    60  
    61  	grp := dgroup.NewGroup(ctx, dgroup.GroupConfig{})
    62  
    63  	grp.Go("metrics-server", func(ctx context.Context) error {
    64  		metricsServer := agent.NewMetricsServer(ambAgent.MetricsRelayHandler)
    65  		return metricsServer.Serve(ctx, metricsListener)
    66  	})
    67  
    68  	grp.Go("watch", func(ctx context.Context) error {
    69  		return ambAgent.Watch(ctx, snapshotURL)
    70  	})
    71  
    72  	return grp.Wait()
    73  }
    74  
    75  func Main(ctx context.Context, version string, args ...string) error {
    76  	argparser := &cobra.Command{
    77  		Use:           os.Args[0],
    78  		Version:       version,
    79  		RunE:          run,
    80  		SilenceErrors: true,
    81  		SilenceUsage:  true,
    82  	}
    83  	argparser.SetFlagErrorFunc(func(cmd *cobra.Command, err error) error {
    84  		if err == nil {
    85  			return nil
    86  		}
    87  		dlog.Errorf(ctx, "%s\nSee '%s --help'.\n", err, cmd.CommandPath())
    88  		return nil
    89  	})
    90  	argparser.SetArgs(args)
    91  	return argparser.ExecuteContext(ctx)
    92  }
    93  

View as plain text