github.com/netdata/go.d.plugin@v0.58.1/modules/vcsa/collect.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package vcsa 4 5 import ( 6 "sync" 7 ) 8 9 var componentHealthStatuses = []string{"green", "red", "yellow", "orange", "gray"} 10 var softwareHealthStatuses = []string{"green", "red", "orange", "gray"} 11 12 type vcsaHealthStatus struct { 13 System *string 14 ApplMgmt *string 15 Load *string 16 Mem *string 17 Swap *string 18 DatabaseStorage *string 19 Storage *string 20 SoftwarePackages *string 21 } 22 23 func (vc *VCSA) collect() (map[string]int64, error) { 24 err := vc.client.Ping() 25 if err != nil { 26 return nil, err 27 } 28 29 var status vcsaHealthStatus 30 vc.scrapeHealth(&status) 31 32 mx := make(map[string]int64) 33 34 writeStatus(mx, "system", componentHealthStatuses, status.System) 35 writeStatus(mx, "applmgmt", componentHealthStatuses, status.ApplMgmt) 36 writeStatus(mx, "load", componentHealthStatuses, status.Load) 37 writeStatus(mx, "mem", componentHealthStatuses, status.Mem) 38 writeStatus(mx, "swap", componentHealthStatuses, status.Swap) 39 writeStatus(mx, "database_storage", componentHealthStatuses, status.DatabaseStorage) 40 writeStatus(mx, "storage", componentHealthStatuses, status.Storage) 41 writeStatus(mx, "software_packages", softwareHealthStatuses, status.SoftwarePackages) 42 43 return mx, nil 44 } 45 46 func (vc *VCSA) scrapeHealth(status *vcsaHealthStatus) { 47 wg := &sync.WaitGroup{} 48 49 scrape := func(fn func() (string, error), value **string) { 50 v, err := fn() 51 if err != nil { 52 vc.Error(err) 53 return 54 } 55 *value = &v 56 } 57 58 for _, fn := range []func(){ 59 func() { scrape(vc.client.System, &status.System) }, 60 func() { scrape(vc.client.ApplMgmt, &status.ApplMgmt) }, 61 func() { scrape(vc.client.Load, &status.Load) }, 62 func() { scrape(vc.client.DatabaseStorage, &status.DatabaseStorage) }, 63 func() { scrape(vc.client.Storage, &status.Storage) }, 64 func() { scrape(vc.client.Mem, &status.Mem) }, 65 func() { scrape(vc.client.Swap, &status.Swap) }, 66 func() { scrape(vc.client.SoftwarePackages, &status.SoftwarePackages) }, 67 } { 68 fn := fn 69 70 wg.Add(1) 71 go func() { defer wg.Done(); fn() }() 72 } 73 74 wg.Wait() 75 } 76 77 func writeStatus(mx map[string]int64, key string, statuses []string, status *string) { 78 if status == nil { 79 return 80 } 81 82 var found bool 83 for _, s := range statuses { 84 mx[key+"_status_"+s] = boolToInt(s == *status) 85 found = found || s == *status 86 } 87 mx[key+"_status_unknown"] = boolToInt(!found) 88 } 89 90 func boolToInt(v bool) int64 { 91 if v { 92 return 1 93 } 94 return 0 95 }