firehol/netdata

View on GitHub
src/go/plugin/go.d/modules/vcsa/collect.go

Summary

Maintainability
A
0 mins
Test Coverage
// 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
}