diff options
Diffstat (limited to 'src/go/collectors/go.d.plugin/modules/vsphere/discover/discover.go')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/vsphere/discover/discover.go | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/vsphere/discover/discover.go b/src/go/collectors/go.d.plugin/modules/vsphere/discover/discover.go new file mode 100644 index 000000000..0d68b71c3 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/vsphere/discover/discover.go @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package discover + +import ( + "fmt" + "strings" + "time" + + "github.com/netdata/netdata/go/go.d.plugin/modules/vsphere/match" + rs "github.com/netdata/netdata/go/go.d.plugin/modules/vsphere/resources" + + "github.com/netdata/netdata/go/go.d.plugin/logger" + "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/types" +) + +type Client interface { + Datacenters(pathSet ...string) ([]mo.Datacenter, error) + Folders(pathSet ...string) ([]mo.Folder, error) + ComputeResources(pathSet ...string) ([]mo.ComputeResource, error) + Hosts(pathSet ...string) ([]mo.HostSystem, error) + VirtualMachines(pathSet ...string) ([]mo.VirtualMachine, error) + + CounterInfoByName() (map[string]*types.PerfCounterInfo, error) +} + +func New(client Client) *Discoverer { + return &Discoverer{ + Client: client, + } +} + +type Discoverer struct { + *logger.Logger + Client + match.HostMatcher + match.VMMatcher +} + +type resources struct { + dcs []mo.Datacenter + folders []mo.Folder + clusters []mo.ComputeResource + hosts []mo.HostSystem + vms []mo.VirtualMachine +} + +func (d Discoverer) Discover() (*rs.Resources, error) { + startTime := time.Now() + raw, err := d.discover() + if err != nil { + return nil, fmt.Errorf("discovering resources : %v", err) + } + + res := d.build(raw) + + err = d.setHierarchy(res) + if err != nil { + // TODO: handle objects w/o hier? + d.Error(err) + } + + numH := len(res.Hosts) + numV := len(res.VMs) + removed := d.removeUnmatched(res) + if removed == (numH + numV) { + return nil, fmt.Errorf("all resoursces were filtered (%d hosts, %d vms)", numH, numV) + } + + err = d.collectMetricLists(res) + if err != nil { + return nil, fmt.Errorf("collecting metric lists : %v", err) + } + + d.Infof("discovering : discovered %d/%d hosts, %d/%d vms, the whole process took %s", + len(res.Hosts), + len(raw.hosts), + len(res.VMs), + len(raw.vms), + time.Since(startTime)) + + return res, nil +} + +var ( + // properties to set + datacenterPathSet = []string{"name", "parent"} + folderPathSet = []string{"name", "parent"} + clusterPathSet = []string{"name", "parent"} + hostPathSet = []string{"name", "parent", "runtime.powerState", "summary.overallStatus"} + vmPathSet = []string{"name", "runtime.host", "runtime.powerState", "summary.overallStatus"} +) + +func (d Discoverer) discover() (*resources, error) { + d.Debug("discovering : starting resource discovering process") + + start := time.Now() + t := start + datacenters, err := d.Datacenters(datacenterPathSet...) + if err != nil { + return nil, err + } + d.Debugf("discovering : found %d dcs, process took %s", len(datacenters), time.Since(t)) + + t = time.Now() + folders, err := d.Folders(folderPathSet...) + if err != nil { + return nil, err + } + d.Debugf("discovering : found %d folders, process took %s", len(folders), time.Since(t)) + + t = time.Now() + clusters, err := d.ComputeResources(clusterPathSet...) + if err != nil { + return nil, err + } + d.Debugf("discovering : found %d clusters, process took %s", len(clusters), time.Since(t)) + + t = time.Now() + hosts, err := d.Hosts(hostPathSet...) + if err != nil { + return nil, err + } + d.Debugf("discovering : found %d hosts, process took %s", len(hosts), time.Since(t)) + + t = time.Now() + vms, err := d.VirtualMachines(vmPathSet...) + if err != nil { + return nil, err + } + d.Debugf("discovering : found %d vms, process took %s", len(hosts), time.Since(t)) + + raw := resources{ + dcs: datacenters, + folders: folders, + clusters: clusters, + hosts: hosts, + vms: vms, + } + + d.Infof("discovering : found %d dcs, %d folders, %d clusters (%d dummy), %d hosts, %d vms, process took %s", + len(raw.dcs), + len(raw.folders), + len(clusters), + numOfDummyClusters(clusters), + len(raw.hosts), + len(raw.vms), + time.Since(start), + ) + + return &raw, nil +} + +func numOfDummyClusters(clusters []mo.ComputeResource) (num int) { + for _, c := range clusters { + // domain-s61 | domain-c52 + if strings.HasPrefix(c.Reference().Value, "domain-s") { + num++ + } + } + return num +} |