firehol/netdata

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

Summary

Maintainability
B
5 hrs
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package beanstalk

import (
    "fmt"
    "strings"

    "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
)

const (
    prioCurrentJobs = module.Priority + iota
    prioJobsRate
    prioJobsTimeouts

    prioCurrentTubes

    prioCommandsRate

    prioCurrentConnections
    prioConnectionsRate

    prioBinlogRecords

    prioCpuUsage

    prioUptime

    prioTubeCurrentJobs
    prioTubeJobsRate

    prioTubeCommands

    prioTubeCurrentConnections

    prioTubePauseTime
)

var (
    statsCharts = module.Charts{
        currentJobs.Copy(),
        jobsRateChart.Copy(),
        jobsTimeoutsChart.Copy(),

        currentTubesChart.Copy(),

        commandsRateChart.Copy(),

        currentConnectionsChart.Copy(),
        connectionsRateChart.Copy(),

        binlogRecordsChart.Copy(),

        cpuUsageChart.Copy(),

        uptimeChart.Copy(),
    }

    currentJobs = module.Chart{
        ID:       "current_jobs",
        Title:    "Current Jobs",
        Units:    "jobs",
        Fam:      "jobs",
        Ctx:      "beanstalk.current_jobs",
        Type:     module.Stacked,
        Priority: prioCurrentJobs,
        Dims: module.Dims{
            {ID: "current-jobs-ready", Name: "ready"},
            {ID: "current-jobs-buried", Name: "buried"},
            {ID: "current-jobs-urgent", Name: "urgent"},
            {ID: "current-jobs-delayed", Name: "delayed"},
            {ID: "current-jobs-reserved", Name: "reserved"},
        },
    }
    jobsRateChart = module.Chart{
        ID:       "jobs_rate",
        Title:    "Jobs Rate",
        Units:    "jobs/s",
        Fam:      "jobs",
        Ctx:      "beanstalk.jobs_rate",
        Type:     module.Line,
        Priority: prioJobsRate,
        Dims: module.Dims{
            {ID: "total-jobs", Name: "created", Algo: module.Incremental},
        },
    }
    jobsTimeoutsChart = module.Chart{
        ID:       "jobs_timeouts",
        Title:    "Timed Out Jobs",
        Units:    "jobs/s",
        Fam:      "jobs",
        Ctx:      "beanstalk.jobs_timeouts",
        Type:     module.Line,
        Priority: prioJobsTimeouts,
        Dims: module.Dims{
            {ID: "job-timeouts", Name: "timeouts", Algo: module.Incremental},
        },
    }

    currentTubesChart = module.Chart{
        ID:       "current_tubes",
        Title:    "Current Tubes",
        Units:    "tubes",
        Fam:      "tubes",
        Ctx:      "beanstalk.current_tubes",
        Type:     module.Line,
        Priority: prioCurrentTubes,
        Dims: module.Dims{
            {ID: "current-tubes", Name: "tubes"},
        },
    }

    commandsRateChart = module.Chart{
        ID:       "commands_rate",
        Title:    "Commands Rate",
        Units:    "commands/s",
        Fam:      "commands",
        Ctx:      "beanstalk.commands_rate",
        Type:     module.Stacked,
        Priority: prioCommandsRate,
        Dims: module.Dims{
            {ID: "cmd-put", Name: "put", Algo: module.Incremental},
            {ID: "cmd-peek", Name: "peek", Algo: module.Incremental},
            {ID: "cmd-peek-ready", Name: "peek-ready", Algo: module.Incremental},
            {ID: "cmd-peek-delayed", Name: "peek-delayed", Algo: module.Incremental},
            {ID: "cmd-peek-buried", Name: "peek-buried", Algo: module.Incremental},
            {ID: "cmd-reserve", Name: "reserve", Algo: module.Incremental},
            {ID: "cmd-reserve-with-timeout", Name: "reserve-with-timeout", Algo: module.Incremental},
            {ID: "cmd-touch", Name: "touch", Algo: module.Incremental},
            {ID: "cmd-use", Name: "use", Algo: module.Incremental},
            {ID: "cmd-watch", Name: "watch", Algo: module.Incremental},
            {ID: "cmd-ignore", Name: "ignore", Algo: module.Incremental},
            {ID: "cmd-delete", Name: "delete", Algo: module.Incremental},
            {ID: "cmd-release", Name: "release", Algo: module.Incremental},
            {ID: "cmd-bury", Name: "bury", Algo: module.Incremental},
            {ID: "cmd-kick", Name: "kick", Algo: module.Incremental},
            {ID: "cmd-stats", Name: "stats", Algo: module.Incremental},
            {ID: "cmd-stats-job", Name: "stats-job", Algo: module.Incremental},
            {ID: "cmd-stats-tube", Name: "stats-tube", Algo: module.Incremental},
            {ID: "cmd-list-tubes", Name: "list-tubes", Algo: module.Incremental},
            {ID: "cmd-list-tube-used", Name: "list-tube-used", Algo: module.Incremental},
            {ID: "cmd-list-tubes-watched", Name: "list-tubes-watched", Algo: module.Incremental},
            {ID: "cmd-pause-tube", Name: "pause-tube", Algo: module.Incremental},
        },
    }

    currentConnectionsChart = module.Chart{
        ID:       "current_connections",
        Title:    "Current Connections",
        Units:    "connections",
        Fam:      "connections",
        Ctx:      "beanstalk.current_connections",
        Type:     module.Line,
        Priority: prioCurrentConnections,
        Dims: module.Dims{
            {ID: "current-connections", Name: "open"},
            {ID: "current-producers", Name: "producers"},
            {ID: "current-workers", Name: "workers"},
            {ID: "current-waiting", Name: "waiting"},
        },
    }
    connectionsRateChart = module.Chart{
        ID:       "connections_rate",
        Title:    "Connections Rate",
        Units:    "connections/s",
        Fam:      "connections",
        Ctx:      "beanstalk.connections_rate",
        Type:     module.Line,
        Priority: prioConnectionsRate,
        Dims: module.Dims{
            {ID: "total-connections", Name: "created", Algo: module.Incremental},
        },
    }

    binlogRecordsChart = module.Chart{
        ID:       "binlog_records",
        Title:    "Binlog Records",
        Units:    "records/s",
        Fam:      "binlog",
        Ctx:      "beanstalk.binlog_records",
        Type:     module.Line,
        Priority: prioBinlogRecords,
        Dims: module.Dims{
            {ID: "binlog-records-written", Name: "written", Algo: module.Incremental},
            {ID: "binlog-records-migrated", Name: "migrated", Algo: module.Incremental},
        },
    }

    cpuUsageChart = module.Chart{
        ID:       "cpu_usage",
        Title:    "CPU Usage",
        Units:    "percent",
        Fam:      "cpu usage",
        Ctx:      "beanstalk.cpu_usage",
        Type:     module.Stacked,
        Priority: prioCpuUsage,
        Dims: module.Dims{
            {ID: "rusage-utime", Name: "user", Algo: module.Incremental, Mul: 100, Div: 1000},
            {ID: "rusage-stime", Name: "system", Algo: module.Incremental, Mul: 100, Div: 1000},
        },
    }

    uptimeChart = module.Chart{
        ID:       "uptime",
        Title:    "Uptime",
        Units:    "seconds",
        Fam:      "uptime",
        Ctx:      "beanstalk.uptime",
        Type:     module.Line,
        Priority: prioUptime,
        Dims: module.Dims{
            {ID: "uptime"},
        },
    }
)

var (
    tubeChartsTmpl = module.Charts{
        tubeCurrentJobsChartTmpl.Copy(),
        tubeJobsRateChartTmpl.Copy(),

        tubeCommandsRateChartTmpl.Copy(),

        tubeCurrentConnectionsChartTmpl.Copy(),

        tubePauseTimeChartTmpl.Copy(),
    }

    tubeCurrentJobsChartTmpl = module.Chart{
        ID:       "tube_%s_current_jobs",
        Title:    "Tube Current Jobs",
        Units:    "jobs",
        Fam:      "tube jobs",
        Ctx:      "beanstalk.tube_current_jobs",
        Type:     module.Stacked,
        Priority: prioTubeCurrentJobs,
        Dims: module.Dims{
            {ID: "tube_%s_current-jobs-ready", Name: "ready"},
            {ID: "tube_%s_current-jobs-buried", Name: "buried"},
            {ID: "tube_%s_current-jobs-urgent", Name: "urgent"},
            {ID: "tube_%s_current-jobs-delayed", Name: "delayed"},
            {ID: "tube_%s_current-jobs-reserved", Name: "reserved"},
        },
    }
    tubeJobsRateChartTmpl = module.Chart{
        ID:       "tube_%s_jobs_rate",
        Title:    "Tube Jobs Rate",
        Units:    "jobs/s",
        Fam:      "tube jobs",
        Ctx:      "beanstalk.tube_jobs_rate",
        Type:     module.Line,
        Priority: prioTubeJobsRate,
        Dims: module.Dims{
            {ID: "tube_%s_total-jobs", Name: "created", Algo: module.Incremental},
        },
    }
    tubeCommandsRateChartTmpl = module.Chart{
        ID:       "tube_%s_commands_rate",
        Title:    "Tube Commands",
        Units:    "commands/s",
        Fam:      "tube commands",
        Ctx:      "beanstalk.tube_commands_rate",
        Type:     module.Stacked,
        Priority: prioTubeCommands,
        Dims: module.Dims{
            {ID: "tube_%s_cmd-delete", Name: "delete", Algo: module.Incremental},
            {ID: "tube_%s_cmd-pause-tube", Name: "pause-tube", Algo: module.Incremental},
        },
    }
    tubeCurrentConnectionsChartTmpl = module.Chart{
        ID:       "tube_%s_current_connections",
        Title:    "Tube Current Connections",
        Units:    "connections",
        Fam:      "tube connections",
        Ctx:      "beanstalk.tube_current_connections",
        Type:     module.Stacked,
        Priority: prioTubeCurrentConnections,
        Dims: module.Dims{
            {ID: "tube_%s_current-using", Name: "using"},
            {ID: "tube_%s_current-waiting", Name: "waiting"},
            {ID: "tube_%s_current-watching", Name: "watching"},
        },
    }
    tubePauseTimeChartTmpl = module.Chart{
        ID:       "tube_%s_pause_time",
        Title:    "Tube Pause Time",
        Units:    "seconds",
        Fam:      "tube pause",
        Ctx:      "beanstalk.tube_pause",
        Type:     module.Line,
        Priority: prioTubePauseTime,
        Dims: module.Dims{
            {ID: "tube_%s_pause", Name: "since"},
            {ID: "tube_%s_pause-time-left", Name: "left"},
        },
    }
)

func (b *Beanstalk) addTubeCharts(name string) {
    charts := tubeChartsTmpl.Copy()

    for _, chart := range *charts {
        chart.ID = fmt.Sprintf(chart.ID, cleanTubeName(name))
        chart.Labels = []module.Label{
            {Key: "tube_name", Value: name},
        }

        for _, dim := range chart.Dims {
            dim.ID = fmt.Sprintf(dim.ID, name)
        }
    }

    if err := b.Charts().Add(*charts...); err != nil {
        b.Warning(err)
    }
}

func (b *Beanstalk) removeTubeCharts(name string) {
    px := fmt.Sprintf("tube_%s_", cleanTubeName(name))

    for _, chart := range *b.Charts() {
        if strings.HasPrefix(chart.ID, px) {
            chart.MarkRemove()
            chart.MarkNotCreated()
        }
    }
}

func cleanTubeName(name string) string {
    r := strings.NewReplacer(" ", "_", ".", "_", ",", "_")
    return r.Replace(name)
}