firehol/netdata

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

Summary

Maintainability
A
25 mins
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package beanstalk

import (
    "fmt"
    "slices"
    "time"

    "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
)

func (b *Beanstalk) collect() (map[string]int64, error) {
    if b.conn == nil {
        conn, err := b.establishConn()
        if err != nil {
            return nil, err
        }
        b.conn = conn
    }

    mx := make(map[string]int64)

    if err := b.collectStats(mx); err != nil {
        b.Cleanup()
        return nil, err
    }
    if err := b.collectTubesStats(mx); err != nil {
        return mx, err
    }

    return mx, nil
}

func (b *Beanstalk) collectStats(mx map[string]int64) error {
    stats, err := b.conn.queryStats()
    if err != nil {
        return err
    }
    for k, v := range stm.ToMap(stats) {
        mx[k] = v
    }
    return nil
}

func (b *Beanstalk) collectTubesStats(mx map[string]int64) error {
    now := time.Now()

    if now.Sub(b.lastDiscoverTubesTime) > b.discoverTubesEvery {
        tubes, err := b.conn.queryListTubes()
        if err != nil {
            return err
        }

        b.Debugf("discovered tubes (%d): %v", len(tubes), tubes)
        v := slices.DeleteFunc(tubes, func(s string) bool { return !b.tubeSr.MatchString(s) })
        if len(tubes) != len(v) {
            b.Debugf("discovered tubes after filtering (%d): %v", len(v), v)
        }

        b.discoveredTubes = v
        b.lastDiscoverTubesTime = now
    }

    seen := make(map[string]bool)

    for i, tube := range b.discoveredTubes {
        if tube == "" {
            continue
        }

        stats, err := b.conn.queryStatsTube(tube)
        if err != nil {
            return err
        }

        if stats == nil {
            b.Infof("tube '%s' stats object not found (tube does not exist)", tube)
            b.discoveredTubes[i] = ""
            continue
        }
        if stats.Name == "" {
            b.Debugf("tube '%s' stats object has an empty name, ignoring it", tube)
            b.discoveredTubes[i] = ""
            continue
        }

        seen[stats.Name] = true
        if !b.seenTubes[stats.Name] {
            b.seenTubes[stats.Name] = true
            b.addTubeCharts(stats.Name)
        }

        px := fmt.Sprintf("tube_%s_", stats.Name)
        for k, v := range stm.ToMap(stats) {
            mx[px+k] = v
        }
    }

    for tube := range b.seenTubes {
        if !seen[tube] {
            delete(b.seenTubes, tube)
            b.removeTubeCharts(tube)
        }
    }

    return nil
}

func (b *Beanstalk) establishConn() (beanstalkConn, error) {
    conn := b.newConn(b.Config, b.Logger)

    if err := conn.connect(); err != nil {
        return nil, err
    }

    return conn, nil
}