master
go 487 lines 15 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package yugabytedb
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioMasterClientOps = collectorapi.Priority + iota
14 prioMasterClientOpsLatency
15 prioMasterDdlOps
16 prioMasterDdlOpsLatency
17
18 prioServiceOps
19 prioServiceOpsLatency
20 prioServiceTraffic
21
22 prioConsensusOps
23 prioConsensusOpsLatency
24 prioConsensusTraffic
25
26 prioYCQLStatements
27 prioYCQLStatementsLatency
28
29 prioYSQLConnectionUsage
30 prioYSQLActiveConnections
31 prioYSQLEstablishedConnections
32 prioYSQLOverLimitConnections
33 prioYSQLStatements
34 prioYSQLStatementsLatency
35 )
36
37 var (
38 masterClientOpsChartTmpl = collectorapi.Chart{
39 ID: "master_client_%s_operations",
40 Title: "Master Client Operations",
41 Units: "ops/s",
42 Fam: "master client ops",
43 Ctx: "yugabytedb.master_client_operations",
44 Priority: prioMasterClientOps,
45 Dims: collectorapi.Dims{
46 {ID: metricPxMasterLatencyMasterClient + "_%s_count", Name: "operations", Algo: collectorapi.Incremental},
47 },
48 }
49 masterClientOpLatencyChartTmpl = collectorapi.Chart{
50 ID: "master_client_%s_operations_latency",
51 Title: "Master Client Operation Latency",
52 Units: "microseconds",
53 Fam: "master client ops",
54 Ctx: "yugabytedb.master_client_operations_latency",
55 Priority: prioMasterClientOpsLatency,
56 Dims: collectorapi.Dims{
57 {ID: metricPxMasterLatencyMasterClient + "_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
58 },
59 }
60
61 masterDdlOpsChartTmpl = collectorapi.Chart{
62 ID: "master_ddl_%s_operations",
63 Title: "Master DDL Operations",
64 Units: "ops/s",
65 Fam: "ddl ops",
66 Ctx: "yugabytedb.master_ddl_operations",
67 Priority: prioMasterDdlOps,
68 Dims: collectorapi.Dims{
69 {ID: metricPxMasterLatencyMasterDdl + "_%s_count", Name: "operations", Algo: collectorapi.Incremental},
70 },
71 }
72 masterDdlOpLatencyChartTmpl = collectorapi.Chart{
73 ID: "master_ddl_%s_operations_latency",
74 Title: "Master DDL Operations Latency",
75 Units: "microseconds",
76 Fam: "ddl ops",
77 Ctx: "yugabytedb.master_ddl_operations_latency",
78 Priority: prioMasterDdlOpsLatency,
79 Dims: collectorapi.Dims{
80 {ID: metricPxMasterLatencyMasterDdl + "_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
81 },
82 }
83
84 masterServiceOpsChartTmpl = collectorapi.Chart{
85 ID: "master_%s_%s_operations",
86 Title: "Master %s Operations",
87 Units: "ops/s",
88 Fam: "master svc operations",
89 Ctx: "yugabytedb.master_%s_operations",
90 Priority: prioServiceOps,
91 Dims: collectorapi.Dims{
92 {ID: metricPxTserverHandlerLatency + "_%s_%s_count", Name: "operations", Algo: collectorapi.Incremental},
93 },
94 }
95 masterServiceOpLatencyChartTmpl = collectorapi.Chart{
96 ID: "master_%s_%s_operation_latency",
97 Title: "Master %s Operation Latency",
98 Units: "microseconds",
99 Fam: "master svc operations",
100 Ctx: "yugabytedb.master_%s_operations_latency",
101 Priority: prioServiceOpsLatency,
102 Dims: collectorapi.Dims{
103 {ID: metricPxTserverHandlerLatency + "_%s_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
104 },
105 }
106 masterServiceTrafficChartTmpl = collectorapi.Chart{
107 ID: "master_%s_%s_traffic",
108 Title: "Master %s Traffic",
109 Units: "bytes/s",
110 Fam: "master svc operations",
111 Ctx: "yugabytedb.master_%s_traffic",
112 Priority: prioServiceTraffic,
113 Type: collectorapi.Area,
114 Dims: collectorapi.Dims{
115 {ID: metricPxTserverResponseBytes + "_%s_%s", Name: "received", Algo: collectorapi.Incremental},
116 {ID: metricPxTserverRequestBytes + "_%s_%s", Name: "sent", Algo: collectorapi.Incremental},
117 },
118 }
119
120 masterConsensusOpsChartTmpl = collectorapi.Chart{
121 ID: "master_consensus_%s_operations",
122 Title: "Master Consensus Operations",
123 Units: "ops/s",
124 Fam: "master consensus operations",
125 Ctx: "yugabytedb.master_consensus_operations",
126 Priority: prioConsensusOps,
127 Dims: collectorapi.Dims{
128 {ID: metricPxServerLatencyConsensusService + "_%s_count", Name: "operations", Algo: collectorapi.Incremental},
129 },
130 }
131 masterConsensusOpLatencyChartTmpl = collectorapi.Chart{
132 ID: "master_consensus_%s_operation_latency",
133 Title: "Master Consensus Operation Latency",
134 Units: "microseconds",
135 Fam: "master consensus operations",
136 Ctx: "yugabytedb.master_consensus_operations_latency",
137 Priority: prioConsensusOpsLatency,
138 Dims: collectorapi.Dims{
139 {ID: metricPxServerLatencyConsensusService + "_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
140 },
141 }
142 masterConsensusTrafficChartTmpl = collectorapi.Chart{
143 ID: "master_consensus_%s_traffic",
144 Title: "Master Consensus Traffic",
145 Units: "bytes/s",
146 Fam: "master consensus operations",
147 Ctx: "yugabytedb.master_consensus_traffic",
148 Priority: prioConsensusTraffic,
149 Type: collectorapi.Area,
150 Dims: collectorapi.Dims{
151 {ID: metricPxServerResponseBytesConsensusService + "_%s", Name: "received", Algo: collectorapi.Incremental},
152 {ID: metricPxServerRequestBytesConsensusService + "_%s", Name: "sent", Algo: collectorapi.Incremental},
153 },
154 }
155 )
156
157 var (
158 tserverServiceOpsChartTmpl = collectorapi.Chart{
159 ID: "tserver_%s_%s_operations",
160 Title: "TServer %s Operations",
161 Units: "ops/s",
162 Fam: "tserver svc operations",
163 Ctx: "yugabytedb.tserver_%s_operations",
164 Priority: prioServiceOps,
165 Dims: collectorapi.Dims{
166 {ID: metricPxTserverHandlerLatency + "_%s_%s_count", Name: "operations", Algo: collectorapi.Incremental},
167 },
168 }
169 tserverServiceOpLatencyChartTmpl = collectorapi.Chart{
170 ID: "tserver_%s_%s_operation_latency",
171 Title: "TServer %s Operation Latency",
172 Units: "microseconds",
173 Fam: "tserver svc operations",
174 Ctx: "yugabytedb.tserver_%s_operations_latency",
175 Priority: prioServiceOpsLatency,
176 Dims: collectorapi.Dims{
177 {ID: metricPxTserverHandlerLatency + "_%s_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
178 },
179 }
180 tserverServiceTrafficChartTmpl = collectorapi.Chart{
181 ID: "tserver_%s_%s_traffic",
182 Title: "TServer %s Traffic",
183 Units: "bytes/s",
184 Fam: "tserver svc operations",
185 Ctx: "yugabytedb.tserver_%s_traffic",
186 Priority: prioServiceTraffic,
187 Type: collectorapi.Area,
188 Dims: collectorapi.Dims{
189 {ID: metricPxTserverResponseBytes + "_%s_%s", Name: "received", Algo: collectorapi.Incremental},
190 {ID: metricPxTserverRequestBytes + "_%s_%s", Name: "sent", Algo: collectorapi.Incremental},
191 },
192 }
193
194 tserverConsensusOpsChartTmpl = collectorapi.Chart{
195 ID: "tserver_consensus_%s_operations",
196 Title: "TServer Consensus Operations",
197 Units: "ops/s",
198 Fam: "tserver consensus operations",
199 Ctx: "yugabytedb.tserver_consensus_operations",
200 Priority: prioConsensusOps,
201 Dims: collectorapi.Dims{
202 {ID: metricPxServerLatencyConsensusService + "_%s_count", Name: "operations", Algo: collectorapi.Incremental},
203 },
204 }
205 tserverConsensusOpLatencyChartTmpl = collectorapi.Chart{
206 ID: "tserver_consensus_%s_operation_latency",
207 Title: "TServer Consensus Operation Latency",
208 Units: "microseconds",
209 Fam: "tserver consensus operations",
210 Ctx: "yugabytedb.tserver_consensus_operations_latency",
211 Priority: prioConsensusOpsLatency,
212 Dims: collectorapi.Dims{
213 {ID: metricPxServerLatencyConsensusService + "_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
214 },
215 }
216 tserverConsensusTrafficChartTmpl = collectorapi.Chart{
217 ID: "tserver_consensus_%s_traffic",
218 Title: "TServer Consensus Traffic",
219 Units: "bytes/s",
220 Fam: "tserver consensus operations",
221 Ctx: "yugabytedb.tserver_consensus_traffic",
222 Priority: prioConsensusTraffic,
223 Type: collectorapi.Area,
224 Dims: collectorapi.Dims{
225 {ID: metricPxServerResponseBytesConsensusService + "_%s", Name: "received", Algo: collectorapi.Incremental},
226 {ID: metricPxServerRequestBytesConsensusService + "_%s", Name: "sent", Algo: collectorapi.Incremental},
227 },
228 }
229 )
230
231 var ysqlBaseCharts = collectorapi.Charts{
232 ysqlConnectionUsageChart.Copy(),
233 ysqlActiveConnectionsChart.Copy(),
234 ysqlEstablishedConnectionsChart.Copy(),
235 ysqlOverLimitConnectionsChart.Copy(),
236 }
237
238 var (
239 ysqlConnectionUsageChart = collectorapi.Chart{
240 ID: "ysql_connections_usage",
241 Title: "YSQL Connections Usage",
242 Units: "connections",
243 Fam: "connections",
244 Ctx: "yugabytedb.ysql_connection_usage",
245 Type: collectorapi.Stacked,
246 Priority: prioYSQLConnectionUsage,
247 Dims: collectorapi.Dims{
248 {ID: "yb_ysqlserver_connection_available", Name: "available"},
249 {ID: metricSqlConnTotal, Name: "used"},
250 },
251 }
252 ysqlActiveConnectionsChart = collectorapi.Chart{
253 ID: "ysql_active_connections",
254 Title: "YSQL Active Connections",
255 Units: "connections",
256 Fam: "connections",
257 Ctx: "yugabytedb.ysql_active_connections",
258 Priority: prioYSQLActiveConnections,
259 Dims: collectorapi.Dims{
260 {ID: metricSqlActiveConnTotal, Name: "active"},
261 },
262 }
263 ysqlEstablishedConnectionsChart = collectorapi.Chart{
264 ID: "ysql_established_connections",
265 Title: "YSQL Established Connections",
266 Units: "connections/s",
267 Fam: "connections",
268 Ctx: "yugabytedb.ysql_established_connections",
269 Priority: prioYSQLEstablishedConnections,
270 Dims: collectorapi.Dims{
271 {ID: metricSqlNewConnTotal, Name: "established"},
272 },
273 }
274 ysqlOverLimitConnectionsChart = collectorapi.Chart{
275 ID: "ysql_over_limit_connections",
276 Title: "YSQL Rejected Over Limit Connections",
277 Units: "rejects/s",
278 Fam: "connections",
279 Ctx: "yugabytedb.ysql_over_limit_connections",
280 Priority: prioYSQLOverLimitConnections,
281 Dims: collectorapi.Dims{
282 {ID: metricSqlConnOverLimitTotal, Name: "over_limit", Algo: collectorapi.Incremental},
283 },
284 }
285
286 ysqlStatementsChartTmpl = collectorapi.Chart{
287 ID: "ysql_sql_%s_statements",
288 Title: "YSQL SQL Statements",
289 Units: "statements/s",
290 Fam: "ysql statements",
291 Ctx: "yugabytedb.ysql_sql_statements",
292 Priority: prioYSQLStatements,
293 Dims: collectorapi.Dims{
294 {ID: metricPxYSQLLatencySQLProcessor + "_%s_count", Name: "statements", Algo: collectorapi.Incremental},
295 },
296 }
297 ysqlStatementsLatencyChartTmpl = collectorapi.Chart{
298 ID: "ysql_sql_%s_statements_latency",
299 Title: "YSQL SQL Statements Latency",
300 Units: "microseconds",
301 Fam: "ysql statements",
302 Ctx: "yugabytedb.ysql_sql_statements_latency",
303 Priority: prioYSQLStatementsLatency,
304 Dims: collectorapi.Dims{
305 {ID: metricPxYSQLLatencySQLProcessor + "_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
306 },
307 }
308 )
309
310 var (
311 ycqlStatementsChartTmpl = collectorapi.Chart{
312 ID: "ycql_sql_%s_statements",
313 Title: "YCQL SQL Statements",
314 Units: "statements/s",
315 Fam: "ycql statements",
316 Ctx: "yugabytedb.ycql_sql_statements",
317 Priority: prioYCQLStatements,
318 Dims: collectorapi.Dims{
319 {ID: metricPxYCQLLatencySQLProcessor + "_%s_count", Name: "statements", Algo: collectorapi.Incremental},
320 },
321 }
322 ycqlStatementsLatencyChartTmpl = collectorapi.Chart{
323 ID: "ysql_cql_%s_statements_latency",
324 Title: "YSQL SQL Statements Latency",
325 Units: "microseconds",
326 Fam: "ycql statements",
327 Ctx: "yugabytedb.ycql_sql_statements_latency",
328 Priority: prioYCQLStatementsLatency,
329 Dims: collectorapi.Dims{
330 {ID: metricPxYCQLLatencySQLProcessor + "_%s_sum", Name: "latency", Algo: collectorapi.Incremental},
331 },
332 }
333 )
334
335 func (c *Collector) addMasterClientOpCharts(op string) {
336 charts := collectorapi.Charts{
337 masterClientOpsChartTmpl.Copy(),
338 masterClientOpLatencyChartTmpl.Copy(),
339 }
340
341 for _, chart := range charts {
342 chart.ID = fmt.Sprintf(chart.ID, op)
343 chart.Labels = []collectorapi.Label{
344 {Key: "operation", Value: op},
345 }
346 for _, dim := range chart.Dims {
347 dim.ID = fmt.Sprintf(dim.ID, op)
348 }
349 if err := c.Charts().Add(chart.Copy()); err != nil {
350 c.Warning(err)
351 }
352 }
353 }
354
355 func (c *Collector) addMasterDDLOpCharts(op string) {
356 charts := collectorapi.Charts{
357 masterDdlOpsChartTmpl.Copy(),
358 masterDdlOpLatencyChartTmpl.Copy(),
359 }
360
361 for _, chart := range charts {
362 chart.ID = fmt.Sprintf(chart.ID, op)
363 chart.Labels = []collectorapi.Label{
364 {Key: "operation", Value: op},
365 }
366 for _, dim := range chart.Dims {
367 dim.ID = fmt.Sprintf(dim.ID, op)
368 }
369 if err := c.Charts().Add(chart.Copy()); err != nil {
370 c.Warning(err)
371 }
372 }
373 }
374
375 func (c *Collector) addConsensusServiceOpCharts(op string) {
376 var charts collectorapi.Charts
377 if c.srvType == srvTypeMaster {
378 charts = collectorapi.Charts{
379 masterConsensusOpsChartTmpl.Copy(),
380 masterConsensusOpLatencyChartTmpl.Copy(),
381 masterConsensusTrafficChartTmpl.Copy(),
382 }
383 } else {
384 charts = collectorapi.Charts{
385 tserverConsensusOpsChartTmpl.Copy(),
386 tserverConsensusOpLatencyChartTmpl.Copy(),
387 tserverConsensusTrafficChartTmpl.Copy(),
388 }
389 }
390
391 for _, chart := range charts {
392 chart.ID = fmt.Sprintf(chart.ID, op)
393 chart.Labels = []collectorapi.Label{
394 {Key: "operation", Value: op},
395 }
396 for _, dim := range chart.Dims {
397 dim.ID = fmt.Sprintf(dim.ID, op)
398 }
399 if err := c.Charts().Add(chart.Copy()); err != nil {
400 c.Warning(err)
401 }
402 }
403 }
404
405 func (c *Collector) addServiceOpCharts(svc, op string) {
406 var charts collectorapi.Charts
407 if c.srvType == srvTypeMaster {
408 charts = collectorapi.Charts{
409 masterServiceOpsChartTmpl.Copy(),
410 masterServiceOpLatencyChartTmpl.Copy(),
411 masterServiceTrafficChartTmpl.Copy(),
412 }
413 } else {
414 charts = collectorapi.Charts{
415 tserverServiceOpsChartTmpl.Copy(),
416 tserverServiceOpLatencyChartTmpl.Copy(),
417 tserverServiceTrafficChartTmpl.Copy(),
418 }
419 }
420
421 for _, chart := range charts {
422 chart.ID = fmt.Sprintf(chart.ID, svc, op)
423 chart.Title = fmt.Sprintf(chart.Title, svc)
424 chart.Ctx = fmt.Sprintf(chart.Ctx, strings.ToLower(svc))
425 chart.Labels = []collectorapi.Label{
426 {Key: "operation", Value: op},
427 }
428 for _, dim := range chart.Dims {
429 dim.ID = fmt.Sprintf(dim.ID, svc, op)
430 }
431 if err := c.Charts().Add(chart.Copy()); err != nil {
432 c.Warning(err)
433 }
434 }
435 }
436
437 func (c *Collector) addCQLStatementCharts(stmt string) {
438 charts := collectorapi.Charts{
439 ycqlStatementsChartTmpl.Copy(),
440 ycqlStatementsLatencyChartTmpl.Copy(),
441 }
442
443 for _, chart := range charts {
444 chart.ID = fmt.Sprintf(chart.ID, stmt)
445 chart.Labels = []collectorapi.Label{
446 {Key: "statement", Value: stmt},
447 }
448 for _, dim := range chart.Dims {
449 dim.ID = fmt.Sprintf(dim.ID, stmt)
450 }
451 if err := c.Charts().Add(chart.Copy()); err != nil {
452 c.Warning(err)
453 }
454 }
455 }
456
457 func (c *Collector) addSQLStatementCharts(stmt string) {
458 charts := collectorapi.Charts{
459 ysqlStatementsChartTmpl.Copy(),
460 ysqlStatementsLatencyChartTmpl.Copy(),
461 }
462
463 for _, chart := range charts {
464 chart.ID = fmt.Sprintf(chart.ID, stmt)
465 chart.Labels = []collectorapi.Label{
466 {Key: "statement", Value: stmt},
467 }
468 for _, dim := range chart.Dims {
469 dim.ID = fmt.Sprintf(dim.ID, stmt)
470 }
471 if err := c.Charts().Add(chart.Copy()); err != nil {
472 c.Warning(err)
473 }
474 }
475 }
476
477 func (c *Collector) addBaseCharts() {
478 switch c.srvType {
479 case srvTypeMaster:
480 case srvTypeTServer:
481 case srvTypeCQL:
482 case srvTypeSQL:
483 if err := c.Charts().Add(*ysqlBaseCharts.Copy()...); err != nil {
484 c.Warning(err)
485 }
486 }
487 }