github.com/vmware/govmomi@v0.51.0/cli/metric/performance.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package metric
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"math"
    12  	"strconv"
    13  
    14  	"github.com/vmware/govmomi/cli/flags"
    15  	"github.com/vmware/govmomi/performance"
    16  )
    17  
    18  type PerformanceFlag struct {
    19  	*flags.DatacenterFlag
    20  	*flags.OutputFlag
    21  
    22  	m *performance.Manager
    23  
    24  	interval string
    25  }
    26  
    27  func NewPerformanceFlag(ctx context.Context) (*PerformanceFlag, context.Context) {
    28  	f := &PerformanceFlag{}
    29  	f.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    30  	f.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    31  	return f, ctx
    32  }
    33  
    34  func (f *PerformanceFlag) Register(ctx context.Context, fs *flag.FlagSet) {
    35  	f.DatacenterFlag.Register(ctx, fs)
    36  	f.OutputFlag.Register(ctx, fs)
    37  
    38  	fs.StringVar(&f.interval, "i", "real", "Interval ID (real|day|week|month|year)")
    39  }
    40  
    41  func (f *PerformanceFlag) Process(ctx context.Context) error {
    42  	if err := f.DatacenterFlag.Process(ctx); err != nil {
    43  		return err
    44  	}
    45  	if err := f.OutputFlag.Process(ctx); err != nil {
    46  		return err
    47  	}
    48  
    49  	return nil
    50  }
    51  
    52  func (f *PerformanceFlag) Manager(ctx context.Context) (*performance.Manager, error) {
    53  	if f.m != nil {
    54  		return f.m, nil
    55  	}
    56  
    57  	c, err := f.Client()
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	f.m = performance.NewManager(c)
    63  
    64  	f.m.Sort = true
    65  
    66  	return f.m, err
    67  }
    68  
    69  func (f *PerformanceFlag) Interval(val int32) int32 {
    70  	var interval int32
    71  
    72  	if f.interval != "" {
    73  		if i, ok := performance.Intervals[f.interval]; ok {
    74  			interval = i
    75  		} else {
    76  			n, err := strconv.ParseUint(f.interval, 10, 32)
    77  			if err != nil {
    78  				panic(err)
    79  			}
    80  
    81  			if n > math.MaxInt32 {
    82  				panic(fmt.Errorf("value out of range for int32: %d", n))
    83  			} else {
    84  				interval = int32(n)
    85  			}
    86  		}
    87  	}
    88  
    89  	if interval == 0 {
    90  		if val == -1 {
    91  			// realtime not supported
    92  			return 300
    93  		}
    94  
    95  		return val
    96  	}
    97  
    98  	return interval
    99  }
   100  
   101  func (f *PerformanceFlag) ErrNotFound(name string) error {
   102  	return fmt.Errorf("counter %q not found", name)
   103  }