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  }