src/go/plugin/go.d/modules/vcsa/collect.go
// SPDX-License-Identifier: GPL-3.0-or-later
package vcsa
import (
"sync"
)
var componentHealthStatuses = []string{"green", "red", "yellow", "orange", "gray"}
var softwareHealthStatuses = []string{"green", "red", "orange", "gray"}
type vcsaHealthStatus struct {
System *string
ApplMgmt *string
Load *string
Mem *string
Swap *string
DatabaseStorage *string
Storage *string
SoftwarePackages *string
}
func (vc *VCSA) collect() (map[string]int64, error) {
err := vc.client.Ping()
if err != nil {
return nil, err
}
var status vcsaHealthStatus
vc.scrapeHealth(&status)
mx := make(map[string]int64)
writeStatus(mx, "system", componentHealthStatuses, status.System)
writeStatus(mx, "applmgmt", componentHealthStatuses, status.ApplMgmt)
writeStatus(mx, "load", componentHealthStatuses, status.Load)
writeStatus(mx, "mem", componentHealthStatuses, status.Mem)
writeStatus(mx, "swap", componentHealthStatuses, status.Swap)
writeStatus(mx, "database_storage", componentHealthStatuses, status.DatabaseStorage)
writeStatus(mx, "storage", componentHealthStatuses, status.Storage)
writeStatus(mx, "software_packages", softwareHealthStatuses, status.SoftwarePackages)
return mx, nil
}
func (vc *VCSA) scrapeHealth(status *vcsaHealthStatus) {
wg := &sync.WaitGroup{}
scrape := func(fn func() (string, error), value **string) {
v, err := fn()
if err != nil {
vc.Error(err)
return
}
*value = &v
}
for _, fn := range []func(){
func() { scrape(vc.client.System, &status.System) },
func() { scrape(vc.client.ApplMgmt, &status.ApplMgmt) },
func() { scrape(vc.client.Load, &status.Load) },
func() { scrape(vc.client.DatabaseStorage, &status.DatabaseStorage) },
func() { scrape(vc.client.Storage, &status.Storage) },
func() { scrape(vc.client.Mem, &status.Mem) },
func() { scrape(vc.client.Swap, &status.Swap) },
func() { scrape(vc.client.SoftwarePackages, &status.SoftwarePackages) },
} {
fn := fn
wg.Add(1)
go func() { defer wg.Done(); fn() }()
}
wg.Wait()
}
func writeStatus(mx map[string]int64, key string, statuses []string, status *string) {
if status == nil {
return
}
var found bool
for _, s := range statuses {
mx[key+"_status_"+s] = boolToInt(s == *status)
found = found || s == *status
}
mx[key+"_status_unknown"] = boolToInt(!found)
}
func boolToInt(v bool) int64 {
if v {
return 1
}
return 0
}