master
go 158 lines 4.19 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package gearman
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioQueuedJobsByActivity = collectorapi.Priority + iota
14 prioQueuedJobsByPriority
15
16 prioFunctionQueuedJobsByActivity
17 prioFunctionQueuedJobsByPriority
18 prioFunctionAvailableWorkers
19 )
20
21 var summaryCharts = collectorapi.Charts{
22 chartQueuedJobsActivity.Copy(),
23 chartQueuedJobsPriority.Copy(),
24 }
25
26 var (
27 chartQueuedJobsActivity = collectorapi.Chart{
28 ID: "queued_jobs_by_activity",
29 Title: "Jobs Activity",
30 Units: "jobs",
31 Fam: "jobs",
32 Ctx: "gearman.queued_jobs_activity",
33 Priority: prioQueuedJobsByActivity,
34 Type: collectorapi.Stacked,
35 Dims: collectorapi.Dims{
36 {ID: "total_jobs_running", Name: "running"},
37 {ID: "total_jobs_waiting", Name: "waiting"},
38 },
39 }
40 chartQueuedJobsPriority = collectorapi.Chart{
41 ID: "queued_jobs_by_priority",
42 Title: "Jobs Priority",
43 Units: "jobs",
44 Fam: "jobs",
45 Ctx: "gearman.queued_jobs_priority",
46 Priority: prioQueuedJobsByPriority,
47 Type: collectorapi.Stacked,
48 Dims: collectorapi.Dims{
49 {ID: "total_high_priority_jobs", Name: "high"},
50 {ID: "total_normal_priority_jobs", Name: "normal"},
51 {ID: "total_low_priority_jobs", Name: "low"},
52 },
53 }
54 )
55
56 var functionStatusChartsTmpl = collectorapi.Charts{
57 functionQueuedJobsActivityChartTmpl.Copy(),
58 functionWorkersChartTmpl.Copy(),
59 }
60
61 var (
62 functionQueuedJobsActivityChartTmpl = collectorapi.Chart{
63 ID: "function_%s_queued_jobs_by_activity",
64 Title: "Function Jobs Activity",
65 Units: "jobs",
66 Fam: "fn jobs",
67 Ctx: "gearman.function_queued_jobs_activity",
68 Priority: prioFunctionQueuedJobsByActivity,
69 Type: collectorapi.Stacked,
70 Dims: collectorapi.Dims{
71 {ID: "function_%s_jobs_running", Name: "running"},
72 {ID: "function_%s_jobs_waiting", Name: "waiting"},
73 },
74 }
75 functionWorkersChartTmpl = collectorapi.Chart{
76 ID: "function_%s_workers",
77 Title: "Function Workers",
78 Units: "workers",
79 Fam: "fn workers",
80 Ctx: "gearman.function_workers",
81 Priority: prioFunctionAvailableWorkers,
82 Type: collectorapi.Line,
83 Dims: collectorapi.Dims{
84 {ID: "function_%s_workers_available", Name: "available"},
85 },
86 }
87 )
88
89 var functionPriorityStatusChartsTmpl = collectorapi.Charts{
90 functionQueuedJobsByPriorityChartTmpl.Copy(),
91 }
92
93 var (
94 functionQueuedJobsByPriorityChartTmpl = collectorapi.Chart{
95 ID: "prio_function_%s_queued_jobs_by_priority",
96 Title: "Function Jobs Priority",
97 Units: "jobs",
98 Fam: "fn jobs",
99 Ctx: "gearman.function_queued_jobs_priority",
100 Priority: prioFunctionQueuedJobsByPriority,
101 Type: collectorapi.Stacked,
102 Dims: collectorapi.Dims{
103 {ID: "function_%s_high_priority_jobs", Name: "high"},
104 {ID: "function_%s_normal_priority_jobs", Name: "normal"},
105 {ID: "function_%s_low_priority_jobs", Name: "low"},
106 },
107 }
108 )
109
110 func (c *Collector) addFunctionStatusCharts(name string) {
111 c.addFunctionCharts(name, functionStatusChartsTmpl.Copy())
112 }
113
114 func (c *Collector) removeFunctionStatusCharts(name string) {
115 px := fmt.Sprintf("function_%s_", cleanFunctionName(name))
116 c.removeCharts(px)
117 }
118
119 func (c *Collector) addFunctionPriorityStatusCharts(name string) {
120 c.addFunctionCharts(name, functionPriorityStatusChartsTmpl.Copy())
121 }
122
123 func (c *Collector) removeFunctionPriorityStatusCharts(name string) {
124 px := fmt.Sprintf("prio_function_%s_", cleanFunctionName(name))
125 c.removeCharts(px)
126 }
127
128 func (c *Collector) addFunctionCharts(name string, charts *collectorapi.Charts) {
129 charts = charts.Copy()
130
131 for _, chart := range *charts {
132 chart.ID = fmt.Sprintf(chart.ID, cleanFunctionName(name))
133 chart.Labels = []collectorapi.Label{
134 {Key: "function_name", Value: name},
135 }
136 for _, dim := range chart.Dims {
137 dim.ID = fmt.Sprintf(dim.ID, name)
138 }
139 }
140
141 if err := c.Charts().Add(*charts...); err != nil {
142 c.Warning(err)
143 }
144 }
145
146 func (c *Collector) removeCharts(px string) {
147 for _, chart := range *c.Charts() {
148 if strings.HasPrefix(chart.ID, px) {
149 chart.MarkRemove()
150 chart.MarkNotCreated()
151 }
152 }
153 }
154
155 func cleanFunctionName(name string) string {
156 r := strings.NewReplacer(".", "_", ",", "_", " ", "_")
157 return r.Replace(name)
158 }