...

Source file src/edge-infra.dev/cmd/edge/monitoring/metermaid/cli/compare.go

Documentation: edge-infra.dev/cmd/edge/monitoring/metermaid/cli

     1  package cli
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/peterbourgon/ff/v3/ffcli"
    10  
    11  	metrics "edge-infra.dev/pkg/lib/gcp/monitoring/metrics"
    12  	"edge-infra.dev/pkg/lib/gcp/monitoring/monutil"
    13  )
    14  
    15  type compareArgsT struct {
    16  	byMetric  bool
    17  	byProject bool
    18  }
    19  
    20  var compareArgs compareArgsT
    21  var compareFlagSet = newCompareFlagSet(&compareArgs)
    22  
    23  func newCompareFlagSet(compareArgs *compareArgsT) *flag.FlagSet {
    24  	comparef := newFlagSet("compare")
    25  	comparef.BoolVar(&compareArgs.byProject, "by-project", false, "Metric descriptor comparisons sorted by project ID. (cannot be used with --by-metric)")
    26  	comparef.BoolVar(&compareArgs.byMetric, "by-metric", false, "Metric descriptors comparisons sorted by metric. (cannot be used with --by-project)")
    27  	return comparef
    28  }
    29  
    30  var compareCmd = &ffcli.Command{
    31  	Name:       "compare",
    32  	ShortUsage: "compare [flags]",
    33  	ShortHelp:  "compare metric descriptor labels",
    34  	LongHelp: strings.TrimSpace(`
    35  Compares metricDescriptor labels from two or more projects.
    36  `),
    37  	FlagSet: withGlobalFlags(compareFlagSet),
    38  	Exec:    runCompare,
    39  }
    40  
    41  func runCompare(ctx context.Context, args []string) error {
    42  	if len(args) > 0 {
    43  		Fatalf("too many non-flag arguments: %q", args)
    44  	}
    45  	if !checkCompareFlags() || !checkGlobalFlags() {
    46  		return flag.ErrHelp
    47  	}
    48  
    49  	// retrieve metric descriptors as list
    50  	projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",")
    51  	d, err := retrieveDescriptors(ctx, projects)
    52  	if err != nil {
    53  		return Errorf("failed to metricDescriptors for multiple projects: %w", err)
    54  	}
    55  
    56  	// necessary when specifying multiple projects as foreman is a multi-project source
    57  	if filterForeman {
    58  		projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",")
    59  		d, err = d.FilterProjects(projects)
    60  		if err != nil {
    61  			return err
    62  		}
    63  	}
    64  
    65  	switch {
    66  	case compareArgs.byMetric && !jsonFormat:
    67  		_ = metrics.TmplMetricCompare.Execute(Stdout, d.CompareMetrics())
    68  
    69  	case compareArgs.byProject && !jsonFormat:
    70  		_ = metrics.TmplProjectCompare.Execute(Stdout, d.CompareProjects())
    71  
    72  	case compareArgs.byMetric && jsonFormat:
    73  		_ = metrics.TmplJSON.Execute(Stdout, d.CompareMetrics())
    74  
    75  	case compareArgs.byProject && jsonFormat:
    76  		_ = metrics.TmplJSON.Execute(Stdout, d.CompareProjects())
    77  
    78  	case !compareArgs.byMetric && !compareArgs.byProject && jsonFormat:
    79  		_ = metrics.TmplJSON.Execute(Stdout, d.Compare())
    80  
    81  	default:
    82  		_ = metrics.TmplDescCompare.Execute(Stdout, d.Compare())
    83  	}
    84  
    85  	if !silent {
    86  		fmt.Printf("\n%s", monutil.White(mmBroomTitle))
    87  	}
    88  	return nil
    89  }
    90  
    91  // checkCompareFlags validates the required Compare subcommand flags have been provided.
    92  func checkCompareFlags() bool {
    93  	if compareArgs.byMetric && compareArgs.byProject {
    94  		fmt.Println("Error: 'by-metric' and 'by-project' were selected - only one sort method allowed")
    95  		return false
    96  	}
    97  
    98  	return true
    99  }
   100  

View as plain text