summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/vsphere/discover/metric_lists.go
blob: 0eecb81ea7170a51f62fbdc6abfc0ee1f0176eef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// SPDX-License-Identifier: GPL-3.0-or-later

package discover

import (
	"sort"
	"time"

	rs "github.com/netdata/netdata/go/go.d.plugin/modules/vsphere/resources"

	"github.com/vmware/govmomi/performance"
	"github.com/vmware/govmomi/vim25/types"
)

func (d Discoverer) collectMetricLists(res *rs.Resources) error {
	d.Debug("discovering : metric lists : starting resources metric lists collection process")
	t := time.Now()
	perfCounters, err := d.CounterInfoByName()
	if err != nil {
		return err
	}

	hostML := simpleHostMetricList(perfCounters)
	for _, h := range res.Hosts {
		h.MetricList = hostML
	}
	vmML := simpleVMMetricList(perfCounters)
	for _, v := range res.VMs {
		v.MetricList = vmML
	}

	d.Infof("discovering : metric lists : collected metric lists for %d/%d hosts, %d/%d vms, process took %s",
		len(res.Hosts),
		len(res.Hosts),
		len(res.VMs),
		len(res.VMs),
		time.Since(t),
	)

	return nil
}

func simpleHostMetricList(pci map[string]*types.PerfCounterInfo) performance.MetricList {
	return simpleMetricList(hostMetrics, pci)
}

func simpleVMMetricList(pci map[string]*types.PerfCounterInfo) performance.MetricList {
	return simpleMetricList(vmMetrics, pci)
}

func simpleMetricList(metrics []string, pci map[string]*types.PerfCounterInfo) performance.MetricList {
	sort.Strings(metrics)

	var pml performance.MetricList
	for _, v := range metrics {
		m, ok := pci[v]
		if !ok {
			// TODO: should be logged
			continue
		}
		// TODO: only summary metrics for now
		// TODO: some metrics only appear if Instance is *, for example
		// virtualDisk.totalWriteLatency.average.scsi0:0
		// virtualDisk.numberWriteAveraged.average.scsi0:0
		// virtualDisk.write.average.scsi0:0
		// virtualDisk.totalReadLatency.average.scsi0:0
		// virtualDisk.numberReadAveraged.average.scsi0:0
		// virtualDisk.read.average.scsi0:0
		// disk.numberReadAveraged.average
		// disk.numberWriteAveraged.average
		// TODO: metrics will be unsorted after if at least one Instance is *
		pml = append(pml, types.PerfMetricId{CounterId: m.Key, Instance: ""})
	}
	return pml
}

var (
	vmMetrics = []string{
		"cpu.usage.average",

		"mem.usage.average",
		"mem.granted.average",
		"mem.consumed.average",
		"mem.active.average",
		"mem.shared.average",
		// Refers to VMkernel swapping!
		"mem.swapinRate.average",
		"mem.swapoutRate.average",
		"mem.swapped.average",

		"net.bytesRx.average",
		"net.bytesTx.average",
		"net.packetsRx.summation",
		"net.packetsTx.summation",
		"net.droppedRx.summation",
		"net.droppedTx.summation",

		// the only summary disk metrics
		"disk.read.average",
		"disk.write.average",
		"disk.maxTotalLatency.latest",

		"sys.uptime.latest",
	}

	hostMetrics = []string{
		"cpu.usage.average",

		"mem.usage.average",
		"mem.granted.average",
		"mem.consumed.average",
		"mem.active.average",
		"mem.shared.average",
		"mem.sharedcommon.average",
		// Refers to VMkernel swapping!
		"mem.swapinRate.average",
		"mem.swapoutRate.average",

		"net.bytesRx.average",
		"net.bytesTx.average",
		"net.packetsRx.summation",
		"net.packetsTx.summation",
		"net.droppedRx.summation",
		"net.droppedTx.summation",
		"net.errorsRx.summation",
		"net.errorsTx.summation",

		// the only summary disk metrics
		"disk.read.average",
		"disk.write.average",
		"disk.maxTotalLatency.latest",

		"sys.uptime.latest",
	}
)