github.com/vmware/govmomi@v0.51.0/examples/perfmanager/main.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  /*
     6  This example program shows how to collect performance metrics from virtual machines using govmomi.
     7  */
     8  
     9  package main
    10  
    11  import (
    12  	"context"
    13  	"flag"
    14  	"fmt"
    15  
    16  	"github.com/vmware/govmomi/examples"
    17  	"github.com/vmware/govmomi/performance"
    18  	"github.com/vmware/govmomi/view"
    19  	"github.com/vmware/govmomi/vim25"
    20  	"github.com/vmware/govmomi/vim25/types"
    21  )
    22  
    23  var interval = flag.Int("i", 20, "Interval ID")
    24  
    25  func main() {
    26  	examples.Run(func(ctx context.Context, c *vim25.Client) error {
    27  		// Get virtual machines references
    28  		m := view.NewManager(c)
    29  
    30  		v, err := m.CreateContainerView(ctx, c.ServiceContent.RootFolder, nil, true)
    31  		if err != nil {
    32  			return err
    33  		}
    34  
    35  		defer v.Destroy(ctx)
    36  
    37  		vmsRefs, err := v.Find(ctx, []string{"VirtualMachine"}, nil)
    38  		if err != nil {
    39  			return err
    40  		}
    41  
    42  		// Create a PerfManager
    43  		perfManager := performance.NewManager(c)
    44  
    45  		// Retrieve counters name list
    46  		counters, err := perfManager.CounterInfoByName(ctx)
    47  		if err != nil {
    48  			return err
    49  		}
    50  
    51  		var names []string
    52  		for name := range counters {
    53  			names = append(names, name)
    54  		}
    55  
    56  		// Create PerfQuerySpec
    57  		spec := types.PerfQuerySpec{
    58  			MaxSample:  1,
    59  			MetricId:   []types.PerfMetricId{{Instance: "*"}},
    60  			IntervalId: int32(*interval),
    61  		}
    62  
    63  		// Query metrics
    64  		sample, err := perfManager.SampleByName(ctx, spec, names, vmsRefs)
    65  		if err != nil {
    66  			return err
    67  		}
    68  
    69  		result, err := perfManager.ToMetricSeries(ctx, sample)
    70  		if err != nil {
    71  			return err
    72  		}
    73  
    74  		// Read result
    75  		for _, metric := range result {
    76  			name := metric.Entity
    77  
    78  			for _, v := range metric.Value {
    79  				counter := counters[v.Name]
    80  				units := counter.UnitInfo.GetElementDescription().Label
    81  
    82  				instance := v.Instance
    83  				if instance == "" {
    84  					instance = "-"
    85  				}
    86  
    87  				if len(v.Value) != 0 {
    88  					fmt.Printf("%s\t%s\t%s\t%s\t%s\n",
    89  						name, instance, v.Name, v.ValueCSV(), units)
    90  				}
    91  			}
    92  		}
    93  		return nil
    94  	})
    95  }