firehol/netdata

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

Summary

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

package gearman

import (
    "fmt"
    "strings"

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

const (
    prioQueuedJobsByActivity = module.Priority + iota
    prioQueuedJobsByPriority

    prioFunctionQueuedJobsByActivity
    prioFunctionQueuedJobsByPriority
    prioFunctionAvailableWorkers
)

var summaryCharts = module.Charts{
    chartQueuedJobsActivity.Copy(),
    chartQueuedJobsPriority.Copy(),
}

var (
    chartQueuedJobsActivity = module.Chart{
        ID:       "queued_jobs_by_activity",
        Title:    "Jobs Activity",
        Units:    "jobs",
        Fam:      "jobs",
        Ctx:      "gearman.queued_jobs_activity",
        Priority: prioQueuedJobsByActivity,
        Type:     module.Stacked,
        Dims: module.Dims{
            {ID: "total_jobs_running", Name: "running"},
            {ID: "total_jobs_waiting", Name: "waiting"},
        },
    }
    chartQueuedJobsPriority = module.Chart{
        ID:       "queued_jobs_by_priority",
        Title:    "Jobs Priority",
        Units:    "jobs",
        Fam:      "jobs",
        Ctx:      "gearman.queued_jobs_priority",
        Priority: prioQueuedJobsByPriority,
        Type:     module.Stacked,
        Dims: module.Dims{
            {ID: "total_high_priority_jobs", Name: "high"},
            {ID: "total_normal_priority_jobs", Name: "normal"},
            {ID: "total_low_priority_jobs", Name: "low"},
        },
    }
)

var functionStatusChartsTmpl = module.Charts{
    functionQueuedJobsActivityChartTmpl.Copy(),
    functionWorkersChartTmpl.Copy(),
}

var (
    functionQueuedJobsActivityChartTmpl = module.Chart{
        ID:       "function_%s_queued_jobs_by_activity",
        Title:    "Function Jobs Activity",
        Units:    "jobs",
        Fam:      "fn jobs",
        Ctx:      "gearman.function_queued_jobs_activity",
        Priority: prioFunctionQueuedJobsByActivity,
        Type:     module.Stacked,
        Dims: module.Dims{
            {ID: "function_%s_jobs_running", Name: "running"},
            {ID: "function_%s_jobs_waiting", Name: "waiting"},
        },
    }
    functionWorkersChartTmpl = module.Chart{
        ID:       "function_%s_workers",
        Title:    "Function Workers",
        Units:    "workers",
        Fam:      "fn workers",
        Ctx:      "gearman.function_workers",
        Priority: prioFunctionAvailableWorkers,
        Type:     module.Line,
        Dims: module.Dims{
            {ID: "function_%s_workers_available", Name: "available"},
        },
    }
)

var functionPriorityStatusChartsTmpl = module.Charts{
    functionQueuedJobsByPriorityChartTmpl.Copy(),
}

var (
    functionQueuedJobsByPriorityChartTmpl = module.Chart{
        ID:       "prio_function_%s_queued_jobs_by_priority",
        Title:    "Function Jobs Priority",
        Units:    "jobs",
        Fam:      "fn jobs",
        Ctx:      "gearman.function_queued_jobs_priority",
        Priority: prioFunctionQueuedJobsByPriority,
        Type:     module.Stacked,
        Dims: module.Dims{
            {ID: "function_%s_high_priority_jobs", Name: "high"},
            {ID: "function_%s_normal_priority_jobs", Name: "normal"},
            {ID: "function_%s_low_priority_jobs", Name: "low"},
        },
    }
)

func (g *Gearman) addFunctionStatusCharts(name string) {
    g.addFunctionCharts(name, functionStatusChartsTmpl.Copy())
}

func (g *Gearman) removeFunctionStatusCharts(name string) {
    px := fmt.Sprintf("function_%s_", cleanFunctionName(name))
    g.removeCharts(px)
}

func (g *Gearman) addFunctionPriorityStatusCharts(name string) {
    g.addFunctionCharts(name, functionPriorityStatusChartsTmpl.Copy())
}

func (g *Gearman) removeFunctionPriorityStatusCharts(name string) {
    px := fmt.Sprintf("prio_function_%s_", cleanFunctionName(name))
    g.removeCharts(px)
}

func (g *Gearman) addFunctionCharts(name string, charts *module.Charts) {
    charts = charts.Copy()

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

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

func (g *Gearman) removeCharts(px string) {
    for _, chart := range *g.Charts() {
        if strings.HasPrefix(chart.ID, px) {
            chart.MarkRemove()
            chart.MarkNotCreated()
        }
    }
}

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