master
go 333 lines 9.46 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package beanstalk
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioCurrentJobs = collectorapi.Priority + iota
14 prioJobsRate
15 prioJobsTimeouts
16
17 prioCurrentTubes
18
19 prioCommandsRate
20
21 prioCurrentConnections
22 prioConnectionsRate
23
24 prioBinlogRecords
25
26 prioCpuUsage
27
28 prioUptime
29
30 prioTubeCurrentJobs
31 prioTubeJobsRate
32
33 prioTubeCommands
34
35 prioTubeCurrentConnections
36
37 prioTubePauseTime
38 )
39
40 var (
41 statsCharts = collectorapi.Charts{
42 currentJobs.Copy(),
43 jobsRateChart.Copy(),
44 jobsTimeoutsChart.Copy(),
45
46 currentTubesChart.Copy(),
47
48 commandsRateChart.Copy(),
49
50 currentConnectionsChart.Copy(),
51 connectionsRateChart.Copy(),
52
53 binlogRecordsChart.Copy(),
54
55 cpuUsageChart.Copy(),
56
57 uptimeChart.Copy(),
58 }
59
60 currentJobs = collectorapi.Chart{
61 ID: "current_jobs",
62 Title: "Current Jobs",
63 Units: "jobs",
64 Fam: "jobs",
65 Ctx: "beanstalk.current_jobs",
66 Type: collectorapi.Stacked,
67 Priority: prioCurrentJobs,
68 Dims: collectorapi.Dims{
69 {ID: "current-jobs-ready", Name: "ready"},
70 {ID: "current-jobs-buried", Name: "buried"},
71 {ID: "current-jobs-urgent", Name: "urgent"},
72 {ID: "current-jobs-delayed", Name: "delayed"},
73 {ID: "current-jobs-reserved", Name: "reserved"},
74 },
75 }
76 jobsRateChart = collectorapi.Chart{
77 ID: "jobs_rate",
78 Title: "Jobs Rate",
79 Units: "jobs/s",
80 Fam: "jobs",
81 Ctx: "beanstalk.jobs_rate",
82 Type: collectorapi.Line,
83 Priority: prioJobsRate,
84 Dims: collectorapi.Dims{
85 {ID: "total-jobs", Name: "created", Algo: collectorapi.Incremental},
86 },
87 }
88 jobsTimeoutsChart = collectorapi.Chart{
89 ID: "jobs_timeouts",
90 Title: "Timed Out Jobs",
91 Units: "jobs/s",
92 Fam: "jobs",
93 Ctx: "beanstalk.jobs_timeouts",
94 Type: collectorapi.Line,
95 Priority: prioJobsTimeouts,
96 Dims: collectorapi.Dims{
97 {ID: "job-timeouts", Name: "timeouts", Algo: collectorapi.Incremental},
98 },
99 }
100
101 currentTubesChart = collectorapi.Chart{
102 ID: "current_tubes",
103 Title: "Current Tubes",
104 Units: "tubes",
105 Fam: "tubes",
106 Ctx: "beanstalk.current_tubes",
107 Type: collectorapi.Line,
108 Priority: prioCurrentTubes,
109 Dims: collectorapi.Dims{
110 {ID: "current-tubes", Name: "tubes"},
111 },
112 }
113
114 commandsRateChart = collectorapi.Chart{
115 ID: "commands_rate",
116 Title: "Commands Rate",
117 Units: "commands/s",
118 Fam: "commands",
119 Ctx: "beanstalk.commands_rate",
120 Type: collectorapi.Stacked,
121 Priority: prioCommandsRate,
122 Dims: collectorapi.Dims{
123 {ID: "cmd-put", Name: "put", Algo: collectorapi.Incremental},
124 {ID: "cmd-peek", Name: "peek", Algo: collectorapi.Incremental},
125 {ID: "cmd-peek-ready", Name: "peek-ready", Algo: collectorapi.Incremental},
126 {ID: "cmd-peek-delayed", Name: "peek-delayed", Algo: collectorapi.Incremental},
127 {ID: "cmd-peek-buried", Name: "peek-buried", Algo: collectorapi.Incremental},
128 {ID: "cmd-reserve", Name: "reserve", Algo: collectorapi.Incremental},
129 {ID: "cmd-reserve-with-timeout", Name: "reserve-with-timeout", Algo: collectorapi.Incremental},
130 {ID: "cmd-touch", Name: "touch", Algo: collectorapi.Incremental},
131 {ID: "cmd-use", Name: "use", Algo: collectorapi.Incremental},
132 {ID: "cmd-watch", Name: "watch", Algo: collectorapi.Incremental},
133 {ID: "cmd-ignore", Name: "ignore", Algo: collectorapi.Incremental},
134 {ID: "cmd-delete", Name: "delete", Algo: collectorapi.Incremental},
135 {ID: "cmd-release", Name: "release", Algo: collectorapi.Incremental},
136 {ID: "cmd-bury", Name: "bury", Algo: collectorapi.Incremental},
137 {ID: "cmd-kick", Name: "kick", Algo: collectorapi.Incremental},
138 {ID: "cmd-stats", Name: "stats", Algo: collectorapi.Incremental},
139 {ID: "cmd-stats-job", Name: "stats-job", Algo: collectorapi.Incremental},
140 {ID: "cmd-stats-tube", Name: "stats-tube", Algo: collectorapi.Incremental},
141 {ID: "cmd-list-tubes", Name: "list-tubes", Algo: collectorapi.Incremental},
142 {ID: "cmd-list-tube-used", Name: "list-tube-used", Algo: collectorapi.Incremental},
143 {ID: "cmd-list-tubes-watched", Name: "list-tubes-watched", Algo: collectorapi.Incremental},
144 {ID: "cmd-pause-tube", Name: "pause-tube", Algo: collectorapi.Incremental},
145 },
146 }
147
148 currentConnectionsChart = collectorapi.Chart{
149 ID: "current_connections",
150 Title: "Current Connections",
151 Units: "connections",
152 Fam: "connections",
153 Ctx: "beanstalk.current_connections",
154 Type: collectorapi.Line,
155 Priority: prioCurrentConnections,
156 Dims: collectorapi.Dims{
157 {ID: "current-connections", Name: "open"},
158 {ID: "current-producers", Name: "producers"},
159 {ID: "current-workers", Name: "workers"},
160 {ID: "current-waiting", Name: "waiting"},
161 },
162 }
163 connectionsRateChart = collectorapi.Chart{
164 ID: "connections_rate",
165 Title: "Connections Rate",
166 Units: "connections/s",
167 Fam: "connections",
168 Ctx: "beanstalk.connections_rate",
169 Type: collectorapi.Line,
170 Priority: prioConnectionsRate,
171 Dims: collectorapi.Dims{
172 {ID: "total-connections", Name: "created", Algo: collectorapi.Incremental},
173 },
174 }
175
176 binlogRecordsChart = collectorapi.Chart{
177 ID: "binlog_records",
178 Title: "Binlog Records",
179 Units: "records/s",
180 Fam: "binlog",
181 Ctx: "beanstalk.binlog_records",
182 Type: collectorapi.Line,
183 Priority: prioBinlogRecords,
184 Dims: collectorapi.Dims{
185 {ID: "binlog-records-written", Name: "written", Algo: collectorapi.Incremental},
186 {ID: "binlog-records-migrated", Name: "migrated", Algo: collectorapi.Incremental},
187 },
188 }
189
190 cpuUsageChart = collectorapi.Chart{
191 ID: "cpu_usage",
192 Title: "CPU Usage",
193 Units: "percent",
194 Fam: "cpu usage",
195 Ctx: "beanstalk.cpu_usage",
196 Type: collectorapi.Stacked,
197 Priority: prioCpuUsage,
198 Dims: collectorapi.Dims{
199 {ID: "rusage-utime", Name: "user", Algo: collectorapi.Incremental, Mul: 100, Div: 1000},
200 {ID: "rusage-stime", Name: "system", Algo: collectorapi.Incremental, Mul: 100, Div: 1000},
201 },
202 }
203
204 uptimeChart = collectorapi.Chart{
205 ID: "uptime",
206 Title: "Uptime",
207 Units: "seconds",
208 Fam: "uptime",
209 Ctx: "beanstalk.uptime",
210 Type: collectorapi.Line,
211 Priority: prioUptime,
212 Dims: collectorapi.Dims{
213 {ID: "uptime"},
214 },
215 }
216 )
217
218 var (
219 tubeChartsTmpl = collectorapi.Charts{
220 tubeCurrentJobsChartTmpl.Copy(),
221 tubeJobsRateChartTmpl.Copy(),
222
223 tubeCommandsRateChartTmpl.Copy(),
224
225 tubeCurrentConnectionsChartTmpl.Copy(),
226
227 tubePauseTimeChartTmpl.Copy(),
228 }
229
230 tubeCurrentJobsChartTmpl = collectorapi.Chart{
231 ID: "tube_%s_current_jobs",
232 Title: "Tube Current Jobs",
233 Units: "jobs",
234 Fam: "tube jobs",
235 Ctx: "beanstalk.tube_current_jobs",
236 Type: collectorapi.Stacked,
237 Priority: prioTubeCurrentJobs,
238 Dims: collectorapi.Dims{
239 {ID: "tube_%s_current-jobs-ready", Name: "ready"},
240 {ID: "tube_%s_current-jobs-buried", Name: "buried"},
241 {ID: "tube_%s_current-jobs-urgent", Name: "urgent"},
242 {ID: "tube_%s_current-jobs-delayed", Name: "delayed"},
243 {ID: "tube_%s_current-jobs-reserved", Name: "reserved"},
244 },
245 }
246 tubeJobsRateChartTmpl = collectorapi.Chart{
247 ID: "tube_%s_jobs_rate",
248 Title: "Tube Jobs Rate",
249 Units: "jobs/s",
250 Fam: "tube jobs",
251 Ctx: "beanstalk.tube_jobs_rate",
252 Type: collectorapi.Line,
253 Priority: prioTubeJobsRate,
254 Dims: collectorapi.Dims{
255 {ID: "tube_%s_total-jobs", Name: "created", Algo: collectorapi.Incremental},
256 },
257 }
258 tubeCommandsRateChartTmpl = collectorapi.Chart{
259 ID: "tube_%s_commands_rate",
260 Title: "Tube Commands",
261 Units: "commands/s",
262 Fam: "tube commands",
263 Ctx: "beanstalk.tube_commands_rate",
264 Type: collectorapi.Stacked,
265 Priority: prioTubeCommands,
266 Dims: collectorapi.Dims{
267 {ID: "tube_%s_cmd-delete", Name: "delete", Algo: collectorapi.Incremental},
268 {ID: "tube_%s_cmd-pause-tube", Name: "pause-tube", Algo: collectorapi.Incremental},
269 },
270 }
271 tubeCurrentConnectionsChartTmpl = collectorapi.Chart{
272 ID: "tube_%s_current_connections",
273 Title: "Tube Current Connections",
274 Units: "connections",
275 Fam: "tube connections",
276 Ctx: "beanstalk.tube_current_connections",
277 Type: collectorapi.Stacked,
278 Priority: prioTubeCurrentConnections,
279 Dims: collectorapi.Dims{
280 {ID: "tube_%s_current-using", Name: "using"},
281 {ID: "tube_%s_current-waiting", Name: "waiting"},
282 {ID: "tube_%s_current-watching", Name: "watching"},
283 },
284 }
285 tubePauseTimeChartTmpl = collectorapi.Chart{
286 ID: "tube_%s_pause_time",
287 Title: "Tube Pause Time",
288 Units: "seconds",
289 Fam: "tube pause",
290 Ctx: "beanstalk.tube_pause",
291 Type: collectorapi.Line,
292 Priority: prioTubePauseTime,
293 Dims: collectorapi.Dims{
294 {ID: "tube_%s_pause", Name: "since"},
295 {ID: "tube_%s_pause-time-left", Name: "left"},
296 },
297 }
298 )
299
300 func (c *Collector) addTubeCharts(name string) {
301 charts := tubeChartsTmpl.Copy()
302
303 for _, chart := range *charts {
304 chart.ID = fmt.Sprintf(chart.ID, cleanTubeName(name))
305 chart.Labels = []collectorapi.Label{
306 {Key: "tube_name", Value: name},
307 }
308
309 for _, dim := range chart.Dims {
310 dim.ID = fmt.Sprintf(dim.ID, name)
311 }
312 }
313
314 if err := c.Charts().Add(*charts...); err != nil {
315 c.Warning(err)
316 }
317 }
318
319 func (c *Collector) removeTubeCharts(name string) {
320 px := fmt.Sprintf("tube_%s_", cleanTubeName(name))
321
322 for _, chart := range *c.Charts() {
323 if strings.HasPrefix(chart.ID, px) {
324 chart.MarkRemove()
325 chart.MarkNotCreated()
326 }
327 }
328 }
329
330 func cleanTubeName(name string) string {
331 r := strings.NewReplacer(" ", "_", ".", "_", ",", "_")
332 return r.Replace(name)
333 }