summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/vcsa/collect.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/vcsa/collect.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/vcsa/collect.go b/src/go/collectors/go.d.plugin/modules/vcsa/collect.go
new file mode 100644
index 000000000..8a734d9e8
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/vcsa/collect.go
@@ -0,0 +1,95 @@
+// 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
+}