diff --git a/otelcol/command.go b/otelcol/command.go index 6efd16df562..632603106f5 100644 --- a/otelcol/command.go +++ b/otelcol/command.go @@ -6,6 +6,9 @@ package otelcol // import "go.opentelemetry.io/collector/otelcol" import ( "errors" "flag" + "fmt" + "os" + "text/tabwriter" "github.com/spf13/cobra" @@ -36,6 +39,7 @@ func NewCommand(set CollectorSettings) *cobra.Command { return col.Run(cmd.Context()) }, } + rootCmd.AddCommand(newFeaturesCommand()) rootCmd.AddCommand(newComponentsCommand(set)) rootCmd.AddCommand(newValidateSubCommand(set, flagSet)) rootCmd.Flags().AddGoFlagSet(flagSet) @@ -63,3 +67,44 @@ func updateSettingsUsingFlags(set *CollectorSettings, flags *flag.FlagSet) error } return nil } + +func newFeaturesCommand() *cobra.Command { + return &cobra.Command{ + Use: "features [feature-id]", + Short: "Display feature gates information", + Long: "Display information about available feature gates and their status", + RunE: func(_ *cobra.Command, args []string) error { + if len(args) > 0 { + found := false + featuregate.GlobalRegistry().VisitAll(func(g *featuregate.Gate) { + if g.ID() == args[0] { + found = true + fmt.Printf("Feature: %s\n", g.ID()) + fmt.Printf("Enabled: %v\n", g.IsEnabled()) + fmt.Printf("Stage: %s\n", g.Stage()) + fmt.Printf("Description: %s\n", g.Description()) + fmt.Printf("From Version: %s\n", g.FromVersion()) + if g.ToVersion() != "" { + fmt.Printf("To Version: %s\n", g.ToVersion()) + } + } + }) + if !found { + return fmt.Errorf("feature %q not found", args[0]) + } + return nil + } + + w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) + fmt.Fprintf(w, "ID\tEnabled\tStage\tDescription\n") + featuregate.GlobalRegistry().VisitAll(func(g *featuregate.Gate) { + fmt.Fprintf(w, "%s\t%v\t%s\t%s\n", + g.ID(), + g.IsEnabled(), + g.Stage(), + g.Description()) + }) + return w.Flush() + }, + } +}