master
go 1,005 lines 30 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package clickhouse
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
10 )
11
12 const (
13 prioConnections = collectorapi.Priority + iota
14
15 prioSlowReads
16 prioReadBackoff
17
18 prioMemoryUsage
19
20 prioDiskSpaceUsage
21
22 prioRunningQueries
23 prioQueriesPreempted
24 prioQueries
25 prioSelectQueries
26 prioInsertQueries
27 prioQueriesMemoryLimitExceeded
28
29 prioLongestRunningQueryTime
30 prioQueriesLatency
31 prioSelectQueriesLatency
32 prioInsertQueriesLatency
33
34 prioIO
35 prioIOPS
36 prioIOErrors
37 prioIOSeeks
38 prioIOFileOpens
39
40 prioDatabaseTableSize
41 prioDatabaseTableParts
42 prioDatabaseTableRows
43
44 prioReplicatedPartsCurrentActivity
45 prioReplicasMaxAbsoluteDelay
46 prioReadOnlyReplica
47 prioReplicatedDataLoss
48 prioReplicatedPartFetches
49 prioReplicatedPartFetchesOfMerged
50 prioReplicatedPartMerges
51
52 prioInsertedBytes
53 prioInsertedRows
54 prioRejectedInserts
55 prioDelayedInserts
56 prioDelayedInsertsThrottleTime
57
58 prioSelectedBytes
59 prioSelectedRows
60 prioSelectedParts
61 prioSelectedRanges
62 prioSelectedMarks
63
64 prioMerges
65 prioMergesLatency
66 prioMergedUncompressedBytes
67 prioMergedRows
68
69 prioMergeTreeDataWriterRows
70 prioMergeTreeDataWriterUncompressedBytes
71 prioMergeTreeDataWriterCompressedBytes
72
73 prioUncompressedCacheRequests
74 prioMarkCacheRequests
75
76 prioMaxPartCountForPartition
77 prioParts
78
79 prioDistributedSend
80 prioDistributedConnectionTries
81 prioDistributedConnectionFailTry
82 prioDistributedConnectionFailAtAll
83
84 prioDistributedFilesToInsert
85 prioDistributedRejectedInserts
86 prioDistributedDelayedInserts
87 prioDistributedDelayedInsertsMilliseconds
88 prioDistributedSyncInsertionTimeoutExceeded
89 prioDistributedAsyncInsertionFailures
90
91 prioUptime
92 )
93
94 var chCharts = collectorapi.Charts{
95 chartConnections.Copy(),
96
97 chartMemoryUsage.Copy(),
98
99 chartSlowReads.Copy(),
100 chartReadBackoff.Copy(),
101
102 chartRunningQueries.Copy(),
103 chartQueries.Copy(),
104 chartSelectQueries.Copy(),
105 chartInsertQueries.Copy(),
106 chartQueriesPreempted.Copy(),
107 chartQueriesMemoryLimitExceeded.Copy(),
108
109 chartLongestRunningQueryTime.Copy(),
110 chartQueriesLatency.Copy(),
111 chartSelectQueriesLatency.Copy(),
112 chartInsertQueriesLatency.Copy(),
113
114 chartFileDescriptorIO.Copy(),
115 chartFileDescriptorIOPS.Copy(),
116 chartFileDescriptorIOErrors.Copy(),
117 chartIOSeeks.Copy(),
118 chartIOFileOpens.Copy(),
119
120 chartReplicatedPartsActivity.Copy(),
121 chartReplicasMaxAbsoluteDelay.Copy(),
122 chartReadonlyReplica.Copy(),
123 chartReplicatedDataLoss.Copy(),
124 chartReplicatedPartFetches.Copy(),
125 chartReplicatedPartMerges.Copy(),
126 chartReplicatedPartFetchesOfMerged.Copy(),
127
128 chartInsertedRows.Copy(),
129 chartInsertedBytes.Copy(),
130 chartRejectedInserts.Copy(),
131 chartDelayedInserts.Copy(),
132 chartDelayedInsertsThrottleTime.Copy(),
133
134 chartSelectedRows.Copy(),
135 chartSelectedBytes.Copy(),
136 chartSelectedParts.Copy(),
137 chartSelectedRanges.Copy(),
138 chartSelectedMarks.Copy(),
139
140 chartMerges.Copy(),
141 chartMergesLatency.Copy(),
142 chartMergedUncompressedBytes.Copy(),
143 chartMergedRows.Copy(),
144
145 chartMergeTreeDataWriterInsertedRows.Copy(),
146 chartMergeTreeDataWriterUncompressedBytes.Copy(),
147 chartMergeTreeDataWriterCompressedBytes.Copy(),
148
149 chartUncompressedCacheRequests.Copy(),
150 chartMarkCacheRequests.Copy(),
151
152 chartMaxPartCountForPartition.Copy(),
153 chartPartsCount.Copy(),
154
155 chartDistributedConnections.Copy(),
156 chartDistributedConnectionAttempts.Copy(),
157 chartDistributedConnectionFailRetries.Copy(),
158 chartDistributedConnectionFailExhaustedRetries.Copy(),
159
160 chartDistributedFilesToInsert.Copy(),
161 chartDistributedRejectedInserts.Copy(),
162 chartDistributedDelayedInserts.Copy(),
163 chartDistributedDelayedInsertsLatency.Copy(),
164 chartDistributedSyncInsertionTimeoutExceeded.Copy(),
165 chartDistributedAsyncInsertionFailures.Copy(),
166
167 chartUptime.Copy(),
168 }
169
170 var (
171 chartConnections = collectorapi.Chart{
172 ID: "connections",
173 Title: "Connections",
174 Units: "connections",
175 Fam: "conns",
176 Ctx: "clickhouse.connections",
177 Priority: prioConnections,
178 Dims: collectorapi.Dims{
179 {ID: "metrics_TCPConnection", Name: "tcp"},
180 {ID: "metrics_HTTPConnection", Name: "http"},
181 {ID: "metrics_MySQLConnection", Name: "mysql"},
182 {ID: "metrics_PostgreSQLConnection", Name: "postgresql"},
183 {ID: "metrics_InterserverConnection", Name: "interserver"},
184 },
185 }
186 )
187
188 var (
189 chartSlowReads = collectorapi.Chart{
190 ID: "slow_reads",
191 Title: "Slow reads from a file",
192 Units: "reads/s",
193 Fam: "slow reads",
194 Ctx: "clickhouse.slow_reads",
195 Priority: prioSlowReads,
196 Dims: collectorapi.Dims{
197 {ID: "events_SlowRead", Name: "slow"},
198 },
199 }
200 chartReadBackoff = collectorapi.Chart{
201 ID: "read_backoff",
202 Title: "Read backoff events",
203 Units: "events/s",
204 Fam: "slow reads",
205 Ctx: "clickhouse.read_backoff",
206 Priority: prioReadBackoff,
207 Dims: collectorapi.Dims{
208 {ID: "events_ReadBackoff", Name: "read_backoff"},
209 },
210 }
211 )
212
213 var (
214 chartMemoryUsage = collectorapi.Chart{
215 ID: "memory_usage",
216 Title: "Memory usage",
217 Units: "bytes",
218 Fam: "mem",
219 Ctx: "clickhouse.memory_usage",
220 Priority: prioMemoryUsage,
221 Type: collectorapi.Area,
222 Dims: collectorapi.Dims{
223 {ID: "metrics_MemoryTracking", Name: "used"},
224 },
225 }
226 )
227
228 var diskChartsTmpl = collectorapi.Charts{
229 diskSpaceUsageChartTmpl.Copy(),
230 }
231
232 var (
233 diskSpaceUsageChartTmpl = collectorapi.Chart{
234 ID: "disk_%s_space_usage",
235 Title: "Disk space usage",
236 Units: "bytes",
237 Fam: "disk space",
238 Ctx: "clickhouse.disk_space_usage",
239 Type: collectorapi.Stacked,
240 Priority: prioDiskSpaceUsage,
241 Dims: collectorapi.Dims{
242 {ID: "disk_%s_free_space_bytes", Name: "free"},
243 {ID: "disk_%s_used_space_bytes", Name: "used"},
244 },
245 }
246 )
247
248 var (
249 chartRunningQueries = collectorapi.Chart{
250 ID: "running_queries",
251 Title: "Running queries",
252 Units: "queries",
253 Fam: "queries",
254 Ctx: "clickhouse.running_queries",
255 Priority: prioRunningQueries,
256 Dims: collectorapi.Dims{
257 {ID: "metrics_Query", Name: "running"},
258 },
259 }
260 chartQueriesPreempted = collectorapi.Chart{
261 ID: "queries_preempted",
262 Title: "Queries waiting due to priority",
263 Units: "queries",
264 Fam: "queries",
265 Ctx: "clickhouse.queries_preempted",
266 Priority: prioQueriesPreempted,
267 Dims: collectorapi.Dims{
268 {ID: "metrics_QueryPreempted", Name: "preempted"},
269 },
270 }
271 chartQueries = collectorapi.Chart{
272 ID: "queries",
273 Title: "Queries",
274 Units: "queries/s",
275 Fam: "queries",
276 Ctx: "clickhouse.queries",
277 Priority: prioQueries,
278 Type: collectorapi.Stacked,
279 Dims: collectorapi.Dims{
280 {ID: "events_SuccessfulQuery", Name: "successful", Algo: collectorapi.Incremental},
281 {ID: "events_FailedQuery", Name: "failed", Algo: collectorapi.Incremental},
282 },
283 }
284 chartSelectQueries = collectorapi.Chart{
285 ID: "select_queries",
286 Title: "Select queries",
287 Units: "selects/s",
288 Fam: "queries",
289 Ctx: "clickhouse.select_queries",
290 Priority: prioSelectQueries,
291 Type: collectorapi.Stacked,
292 Dims: collectorapi.Dims{
293 {ID: "events_SuccessfulSelectQuery", Name: "successful", Algo: collectorapi.Incremental},
294 {ID: "events_FailedSelectQuery", Name: "failed", Algo: collectorapi.Incremental},
295 },
296 }
297 chartInsertQueries = collectorapi.Chart{
298 ID: "insert_queries",
299 Title: "Insert queries",
300 Units: "inserts/s",
301 Fam: "queries",
302 Ctx: "clickhouse.insert_queries",
303 Priority: prioInsertQueries,
304 Type: collectorapi.Stacked,
305 Dims: collectorapi.Dims{
306 {ID: "events_SuccessfulInsertQuery", Name: "successful", Algo: collectorapi.Incremental},
307 {ID: "events_FailedInsertQuery", Name: "failed", Algo: collectorapi.Incremental},
308 },
309 }
310 chartQueriesMemoryLimitExceeded = collectorapi.Chart{
311 ID: "queries_memory_limit_exceeded",
312 Title: "Memory limit exceeded for query",
313 Units: "queries/s",
314 Fam: "queries",
315 Ctx: "clickhouse.queries_memory_limit_exceeded",
316 Priority: prioQueriesMemoryLimitExceeded,
317 Dims: collectorapi.Dims{
318 {ID: "events_QueryMemoryLimitExceeded", Name: "mem_limit_exceeded"},
319 },
320 }
321 )
322
323 var (
324 chartLongestRunningQueryTime = collectorapi.Chart{
325 ID: "longest_running_query_time",
326 Title: "Longest running query time",
327 Units: "seconds",
328 Fam: "query latency",
329 Ctx: "clickhouse.longest_running_query_time",
330 Priority: prioLongestRunningQueryTime,
331 Dims: collectorapi.Dims{
332 {ID: "LongestRunningQueryTime", Name: "longest_query_time", Div: precision},
333 },
334 }
335 chartQueriesLatency = collectorapi.Chart{
336 ID: "queries_latency",
337 Title: "Queries latency",
338 Units: "microseconds",
339 Fam: "query latency",
340 Ctx: "clickhouse.queries_latency",
341 Priority: prioQueriesLatency,
342 Dims: collectorapi.Dims{
343 {ID: "events_QueryTimeMicroseconds", Name: "queries_time", Algo: collectorapi.Incremental},
344 },
345 }
346 chartSelectQueriesLatency = collectorapi.Chart{
347 ID: "select_queries_latency",
348 Title: "Select queries latency",
349 Units: "microseconds",
350 Fam: "query latency",
351 Ctx: "clickhouse.select_queries_latency",
352 Priority: prioSelectQueriesLatency,
353 Dims: collectorapi.Dims{
354 {ID: "events_SelectQueryTimeMicroseconds", Name: "selects_time", Algo: collectorapi.Incremental},
355 },
356 }
357 chartInsertQueriesLatency = collectorapi.Chart{
358 ID: "insert_queries_latency",
359 Title: "Insert queries latency",
360 Units: "microseconds",
361 Fam: "query latency",
362 Ctx: "clickhouse.insert_queries_latency",
363 Priority: prioInsertQueriesLatency,
364 Dims: collectorapi.Dims{
365 {ID: "events_InsertQueryTimeMicroseconds", Name: "inserts_time", Algo: collectorapi.Incremental},
366 },
367 }
368 )
369
370 var (
371 chartFileDescriptorIO = collectorapi.Chart{
372 ID: "file_descriptor_io",
373 Title: "Read and written data",
374 Units: "bytes/s",
375 Fam: "io",
376 Ctx: "clickhouse.io",
377 Priority: prioIO,
378 Type: collectorapi.Area,
379 Dims: collectorapi.Dims{
380 {ID: "events_ReadBufferFromFileDescriptorReadBytes", Name: "reads", Algo: collectorapi.Incremental},
381 {ID: "events_WriteBufferFromFileDescriptorWriteBytes", Name: "writes", Mul: -1, Algo: collectorapi.Incremental},
382 },
383 }
384 chartFileDescriptorIOPS = collectorapi.Chart{
385 ID: "file_descriptor_iops",
386 Title: "Read and write operations",
387 Units: "ops/s",
388 Fam: "io",
389 Ctx: "clickhouse.iops",
390 Priority: prioIOPS,
391 Dims: collectorapi.Dims{
392 {ID: "events_ReadBufferFromFileDescriptorRead", Name: "reads", Algo: collectorapi.Incremental},
393 {ID: "events_WriteBufferFromFileDescriptorWrite", Name: "writes", Mul: -1, Algo: collectorapi.Incremental},
394 },
395 }
396 chartFileDescriptorIOErrors = collectorapi.Chart{
397 ID: "file_descriptor_io_errors",
398 Title: "Read and write errors",
399 Units: "errors/s",
400 Fam: "io",
401 Ctx: "clickhouse.io_errors",
402 Priority: prioIOErrors,
403 Dims: collectorapi.Dims{
404 {ID: "events_ReadBufferFromFileDescriptorReadFailed", Name: "read", Algo: collectorapi.Incremental},
405 {ID: "events_WriteBufferFromFileDescriptorWriteFailed", Name: "write", Algo: collectorapi.Incremental},
406 },
407 }
408 chartIOSeeks = collectorapi.Chart{
409 ID: "io_seeks",
410 Title: "lseek function calls",
411 Units: "ops/s",
412 Fam: "io",
413 Ctx: "clickhouse.io_seeks",
414 Priority: prioIOSeeks,
415 Dims: collectorapi.Dims{
416 {ID: "events_Seek", Name: "lseek", Algo: collectorapi.Incremental},
417 },
418 }
419 chartIOFileOpens = collectorapi.Chart{
420 ID: "io_file_opens",
421 Title: "File opens",
422 Units: "ops/s",
423 Fam: "io",
424 Ctx: "clickhouse.io_file_opens",
425 Priority: prioIOFileOpens,
426 Dims: collectorapi.Dims{
427 {ID: "events_FileOpen", Name: "file_open", Algo: collectorapi.Incremental},
428 },
429 }
430 )
431
432 var tableChartsTmpl = collectorapi.Charts{
433 tableSizeChartTmpl.Copy(),
434 tablePartsChartTmpl.Copy(),
435 tableRowsChartTmpl.Copy(),
436 }
437
438 var (
439 tableSizeChartTmpl = collectorapi.Chart{
440 ID: "table_%s_database_%s_size",
441 Title: "Table size",
442 Units: "bytes",
443 Fam: "tables",
444 Ctx: "clickhouse.database_table_size",
445 Type: collectorapi.Area,
446 Priority: prioDatabaseTableSize,
447 Dims: collectorapi.Dims{
448 {ID: "table_%s_database_%s_size_bytes", Name: "size"},
449 },
450 }
451 tablePartsChartTmpl = collectorapi.Chart{
452 ID: "table_%s_database_%s_parts",
453 Title: "Table parts",
454 Units: "parts",
455 Fam: "tables",
456 Ctx: "clickhouse.database_table_parts",
457 Priority: prioDatabaseTableParts,
458 Dims: collectorapi.Dims{
459 {ID: "table_%s_database_%s_parts", Name: "parts"},
460 },
461 }
462 tableRowsChartTmpl = collectorapi.Chart{
463 ID: "table_%s_database_%s_rows",
464 Title: "Table rows",
465 Units: "rows",
466 Fam: "tables",
467 Ctx: "clickhouse.database_table_rows",
468 Priority: prioDatabaseTableRows,
469 Dims: collectorapi.Dims{
470 {ID: "table_%s_database_%s_rows", Name: "rows"},
471 },
472 }
473 )
474
475 var (
476 chartReplicatedPartsActivity = collectorapi.Chart{
477 ID: "replicated_parts_activity",
478 Title: "Replicated parts current activity",
479 Units: "parts",
480 Fam: "replicas",
481 Ctx: "clickhouse.replicated_parts_current_activity",
482 Priority: prioReplicatedPartsCurrentActivity,
483 Dims: collectorapi.Dims{
484 {ID: "metrics_ReplicatedFetch", Name: "fetch"},
485 {ID: "metrics_ReplicatedSend", Name: "send"},
486 {ID: "metrics_ReplicatedChecks", Name: "check"},
487 },
488 }
489 chartReplicasMaxAbsoluteDelay = collectorapi.Chart{
490 ID: "replicas_max_absolute_delay",
491 Title: "Replicas max absolute delay",
492 Units: "seconds",
493 Fam: "replicas",
494 Ctx: "clickhouse.replicas_max_absolute_delay",
495 Priority: prioReplicasMaxAbsoluteDelay,
496 Dims: collectorapi.Dims{
497 {ID: "async_metrics_ReplicasMaxAbsoluteDelay", Name: "replication_delay", Div: precision},
498 },
499 }
500 chartReadonlyReplica = collectorapi.Chart{
501 ID: "readonly_replica",
502 Title: "Replicated tables in readonly state",
503 Units: "tables",
504 Fam: "replicas",
505 Ctx: "clickhouse.replicated_readonly_tables",
506 Priority: prioReadOnlyReplica,
507 Dims: collectorapi.Dims{
508 {ID: "metrics_ReadonlyReplica", Name: "read_only"},
509 },
510 }
511 chartReplicatedDataLoss = collectorapi.Chart{
512 ID: "replicated_data_loss",
513 Title: "Replicated data loss",
514 Units: "events/s",
515 Fam: "replicas",
516 Ctx: "clickhouse.replicated_data_loss",
517 Priority: prioReplicatedDataLoss,
518 Dims: collectorapi.Dims{
519 {ID: "events_ReplicatedDataLoss", Name: "data_loss", Algo: collectorapi.Incremental},
520 },
521 }
522 chartReplicatedPartFetches = collectorapi.Chart{
523 ID: "replicated_part_fetches",
524 Title: "Replicated part fetches",
525 Units: "fetches/s",
526 Fam: "replicas",
527 Ctx: "clickhouse.replicated_part_fetches",
528 Priority: prioReplicatedPartFetches,
529 Dims: collectorapi.Dims{
530 {ID: "events_ReplicatedPartFetches", Name: "successful", Algo: collectorapi.Incremental},
531 {ID: "events_ReplicatedPartFailedFetches", Name: "failed", Algo: collectorapi.Incremental},
532 },
533 }
534 chartReplicatedPartFetchesOfMerged = collectorapi.Chart{
535 ID: "replicated_part_fetches_of_merged",
536 Title: "Replicated part fetches of merged",
537 Units: "fetches/s",
538 Fam: "replicas",
539 Ctx: "clickhouse.replicated_part_fetches_of_merged",
540 Priority: prioReplicatedPartFetchesOfMerged,
541 Dims: collectorapi.Dims{
542 {ID: "events_ReplicatedPartFetchesOfMerged", Name: "merged", Algo: collectorapi.Incremental},
543 },
544 }
545 chartReplicatedPartMerges = collectorapi.Chart{
546 ID: "replicated_part_merges",
547 Title: "Replicated part merges",
548 Units: "merges/s",
549 Fam: "replicas",
550 Ctx: "clickhouse.replicated_part_merges",
551 Priority: prioReplicatedPartMerges,
552 Dims: collectorapi.Dims{
553 {ID: "events_ReplicatedPartMerges", Name: "merges", Algo: collectorapi.Incremental},
554 },
555 }
556 )
557
558 var (
559 chartInsertedBytes = collectorapi.Chart{
560 ID: "inserted_bytes",
561 Title: "Inserted data",
562 Units: "bytes/s",
563 Fam: "inserts",
564 Ctx: "clickhouse.inserted_bytes",
565 Priority: prioInsertedBytes,
566 Type: collectorapi.Area,
567 Dims: collectorapi.Dims{
568 {ID: "events_InsertedBytes", Name: "inserted", Algo: collectorapi.Incremental},
569 },
570 }
571 chartInsertedRows = collectorapi.Chart{
572 ID: "inserted_rows",
573 Title: "Inserted rows",
574 Units: "rows/s",
575 Fam: "inserts",
576 Ctx: "clickhouse.inserted_rows",
577 Priority: prioInsertedRows,
578 Dims: collectorapi.Dims{
579 {ID: "events_InsertedRows", Name: "inserted", Algo: collectorapi.Incremental},
580 },
581 }
582 chartRejectedInserts = collectorapi.Chart{
583 ID: "rejected_inserts",
584 Title: "Rejected inserts",
585 Units: "inserts/s",
586 Fam: "inserts",
587 Ctx: "clickhouse.rejected_inserts",
588 Priority: prioRejectedInserts,
589 Dims: collectorapi.Dims{
590 {ID: "events_RejectedInserts", Name: "rejected", Algo: collectorapi.Incremental},
591 },
592 }
593 chartDelayedInserts = collectorapi.Chart{
594 ID: "delayed_inserts",
595 Title: "Delayed inserts",
596 Units: "inserts/s",
597 Fam: "inserts",
598 Ctx: "clickhouse.delayed_inserts",
599 Priority: prioDelayedInserts,
600 Dims: collectorapi.Dims{
601 {ID: "events_DelayedInserts", Name: "delayed", Algo: collectorapi.Incremental},
602 },
603 }
604 chartDelayedInsertsThrottleTime = collectorapi.Chart{
605 ID: "delayed_inserts_throttle_time",
606 Title: "Delayed inserts throttle time",
607 Units: "milliseconds",
608 Fam: "inserts",
609 Ctx: "clickhouse.delayed_inserts_throttle_time",
610 Priority: prioDelayedInsertsThrottleTime,
611 Dims: collectorapi.Dims{
612 {ID: "events_DelayedInsertsMilliseconds", Name: "delayed_inserts_throttle_time", Algo: collectorapi.Incremental},
613 },
614 }
615 )
616
617 var (
618 chartSelectedBytes = collectorapi.Chart{
619 ID: "selected_bytes",
620 Title: "Selected data",
621 Units: "bytes/s",
622 Fam: "selects",
623 Ctx: "clickhouse.selected_bytes",
624 Priority: prioSelectedBytes,
625 Type: collectorapi.Area,
626 Dims: collectorapi.Dims{
627 {ID: "events_SelectedBytes", Name: "selected", Algo: collectorapi.Incremental},
628 },
629 }
630 chartSelectedRows = collectorapi.Chart{
631 ID: "selected_rows",
632 Title: "Selected rows",
633 Units: "rows/s",
634 Fam: "selects",
635 Ctx: "clickhouse.selected_rows",
636 Priority: prioSelectedRows,
637 Dims: collectorapi.Dims{
638 {ID: "events_SelectedRows", Name: "selected", Algo: collectorapi.Incremental},
639 },
640 }
641 chartSelectedParts = collectorapi.Chart{
642 ID: "selected_parts",
643 Title: "Selected parts",
644 Units: "parts/s",
645 Fam: "selects",
646 Ctx: "clickhouse.selected_parts",
647 Priority: prioSelectedParts,
648 Dims: collectorapi.Dims{
649 {ID: "events_SelectedParts", Name: "selected", Algo: collectorapi.Incremental},
650 },
651 }
652 chartSelectedRanges = collectorapi.Chart{
653 ID: "selected_ranges",
654 Title: "Selected ranges",
655 Units: "ranges/s",
656 Fam: "selects",
657 Ctx: "clickhouse.selected_ranges",
658 Priority: prioSelectedRanges,
659 Dims: collectorapi.Dims{
660 {ID: "events_SelectedRanges", Name: "selected", Algo: collectorapi.Incremental},
661 },
662 }
663 chartSelectedMarks = collectorapi.Chart{
664 ID: "selected_marks",
665 Title: "Selected marks",
666 Units: "marks/s",
667 Fam: "selects",
668 Ctx: "clickhouse.selected_marks",
669 Priority: prioSelectedMarks,
670 Dims: collectorapi.Dims{
671 {ID: "events_SelectedMarks", Name: "selected", Algo: collectorapi.Incremental},
672 },
673 }
674 )
675
676 var (
677 chartMerges = collectorapi.Chart{
678 ID: "merges",
679 Title: "Merge operations",
680 Units: "ops/s",
681 Fam: "merges",
682 Ctx: "clickhouse.merges",
683 Priority: prioMerges,
684 Dims: collectorapi.Dims{
685 {ID: "events_Merge", Name: "merge", Algo: collectorapi.Incremental},
686 },
687 }
688 chartMergesLatency = collectorapi.Chart{
689 ID: "merges_latency",
690 Title: "Time spent for background merges",
691 Units: "milliseconds",
692 Fam: "merges",
693 Ctx: "clickhouse.merges_latency",
694 Priority: prioMergesLatency,
695 Dims: collectorapi.Dims{
696 {ID: "events_MergesTimeMilliseconds", Name: "merges_time", Algo: collectorapi.Incremental},
697 },
698 }
699 chartMergedUncompressedBytes = collectorapi.Chart{
700 ID: "merged_uncompressed_bytes",
701 Title: "Uncompressed data read for background merges",
702 Units: "bytes/s",
703 Fam: "merges",
704 Ctx: "clickhouse.merged_uncompressed_bytes",
705 Priority: prioMergedUncompressedBytes,
706 Type: collectorapi.Area,
707 Dims: collectorapi.Dims{
708 {ID: "events_MergedUncompressedBytes", Name: "merged_uncompressed", Algo: collectorapi.Incremental},
709 },
710 }
711 chartMergedRows = collectorapi.Chart{
712 ID: "merged_rows",
713 Title: "Merged rows",
714 Units: "rows/s",
715 Fam: "merges",
716 Ctx: "clickhouse.merged_rows",
717 Priority: prioMergedRows,
718 Dims: collectorapi.Dims{
719 {ID: "events_MergedRows", Name: "merged", Algo: collectorapi.Incremental},
720 },
721 }
722 )
723
724 var (
725 chartMergeTreeDataWriterInsertedRows = collectorapi.Chart{
726 ID: "merge_tree_data_writer_inserted_rows",
727 Title: "Rows INSERTed to MergeTree tables",
728 Units: "rows/s",
729 Fam: "merge tree",
730 Ctx: "clickhouse.merge_tree_data_writer_inserted_rows",
731 Priority: prioMergeTreeDataWriterRows,
732 Dims: collectorapi.Dims{
733 {ID: "events_MergeTreeDataWriterRows", Name: "inserted", Algo: collectorapi.Incremental},
734 },
735 }
736 chartMergeTreeDataWriterUncompressedBytes = collectorapi.Chart{
737 ID: "merge_tree_data_writer_uncompressed_bytes",
738 Title: "Data INSERTed to MergeTree tables",
739 Units: "bytes/s",
740 Fam: "merge tree",
741 Ctx: "clickhouse.merge_tree_data_writer_uncompressed_bytes",
742 Type: collectorapi.Area,
743 Priority: prioMergeTreeDataWriterUncompressedBytes,
744 Dims: collectorapi.Dims{
745 {ID: "events_MergeTreeDataWriterUncompressedBytes", Name: "inserted", Algo: collectorapi.Incremental},
746 },
747 }
748 chartMergeTreeDataWriterCompressedBytes = collectorapi.Chart{
749 ID: "merge_tree_data_writer_compressed_bytes",
750 Title: "Data written to disk for data INSERTed to MergeTree tables",
751 Units: "bytes/s",
752 Fam: "merge tree",
753 Ctx: "clickhouse.merge_tree_data_writer_compressed_bytes",
754 Type: collectorapi.Area,
755 Priority: prioMergeTreeDataWriterCompressedBytes,
756 Dims: collectorapi.Dims{
757 {ID: "events_MergeTreeDataWriterCompressedBytes", Name: "written", Algo: collectorapi.Incremental},
758 },
759 }
760 )
761
762 var (
763 chartUncompressedCacheRequests = collectorapi.Chart{
764 ID: "uncompressed_cache_requests",
765 Title: "Uncompressed cache requests",
766 Units: "requests/s",
767 Fam: "cache",
768 Ctx: "clickhouse.uncompressed_cache_requests",
769 Priority: prioUncompressedCacheRequests,
770 Dims: collectorapi.Dims{
771 {ID: "events_UncompressedCacheHits", Name: "hits", Algo: collectorapi.Incremental},
772 {ID: "events_UncompressedCacheMisses", Name: "misses", Algo: collectorapi.Incremental},
773 },
774 }
775 chartMarkCacheRequests = collectorapi.Chart{
776 ID: "mark_cache_requests",
777 Title: "Mark cache requests",
778 Units: "requests/s",
779 Fam: "cache",
780 Ctx: "clickhouse.mark_cache_requests",
781 Priority: prioMarkCacheRequests,
782 Dims: collectorapi.Dims{
783 {ID: "events_MarkCacheHits", Name: "hits", Algo: collectorapi.Incremental},
784 {ID: "events_MarkCacheMisses", Name: "misses", Algo: collectorapi.Incremental},
785 },
786 }
787 )
788
789 var (
790 chartMaxPartCountForPartition = collectorapi.Chart{
791 ID: "max_part_count_for_partition",
792 Title: "Max part count for partition",
793 Units: "parts",
794 Fam: "parts",
795 Ctx: "clickhouse.max_part_count_for_partition",
796 Priority: prioMaxPartCountForPartition,
797 Dims: collectorapi.Dims{
798 {ID: "async_metrics_MaxPartCountForPartition", Name: "max_parts_partition"},
799 },
800 }
801 chartPartsCount = collectorapi.Chart{
802 ID: "parts_count",
803 Title: "Parts",
804 Units: "parts",
805 Fam: "parts",
806 Ctx: "clickhouse.parts_count",
807 Priority: prioParts,
808 Dims: collectorapi.Dims{
809 {ID: "metrics_PartsTemporary", Name: "temporary"},
810 {ID: "metrics_PartsPreActive", Name: "pre_active"},
811 {ID: "metrics_PartsActive", Name: "active"},
812 {ID: "metrics_PartsDeleting", Name: "deleting"},
813 {ID: "metrics_PartsDeleteOnDestroy", Name: "delete_on_destroy"},
814 {ID: "metrics_PartsOutdated", Name: "outdated"},
815 {ID: "metrics_PartsWide", Name: "wide"},
816 {ID: "metrics_PartsCompact", Name: "compact"},
817 },
818 }
819 )
820
821 var (
822 chartDistributedConnections = collectorapi.Chart{
823 ID: "distributes_connections",
824 Title: "Active distributed connection",
825 Units: "connections",
826 Fam: "distributed conns",
827 Ctx: "clickhouse.distributed_connections",
828 Priority: prioDistributedSend,
829 Dims: collectorapi.Dims{
830 {ID: "metrics_DistributedSend", Name: "active"},
831 },
832 }
833 chartDistributedConnectionAttempts = collectorapi.Chart{
834 ID: "distributes_connections_attempts",
835 Title: "Distributed connection attempts",
836 Units: "attempts/s",
837 Fam: "distributed conns",
838 Ctx: "clickhouse.distributed_connections_attempts",
839 Priority: prioDistributedConnectionTries,
840 Dims: collectorapi.Dims{
841 {ID: "events_DistributedConnectionTries", Name: "connection", Algo: collectorapi.Incremental},
842 },
843 }
844 chartDistributedConnectionFailRetries = collectorapi.Chart{
845 ID: "distributes_connections_fail_retries",
846 Title: "Distributed connection fails with retry",
847 Units: "fails/s",
848 Fam: "distributed conns",
849 Ctx: "clickhouse.distributed_connections_fail_retries",
850 Priority: prioDistributedConnectionFailTry,
851 Dims: collectorapi.Dims{
852 {ID: "events_DistributedConnectionFailTry", Name: "connection_retry", Algo: collectorapi.Incremental},
853 },
854 }
855 chartDistributedConnectionFailExhaustedRetries = collectorapi.Chart{
856 ID: "distributes_connections_fail_exhausted_retries",
857 Title: "Distributed connection fails after all retries finished",
858 Units: "fails/s",
859 Fam: "distributed conns",
860 Ctx: "clickhouse.distributed_connections_fail_exhausted_retries",
861 Priority: prioDistributedConnectionFailAtAll,
862 Dims: collectorapi.Dims{
863 {ID: "events_DistributedConnectionFailAtAll", Name: "connection_retry_exhausted", Algo: collectorapi.Incremental},
864 },
865 }
866 )
867
868 var (
869 chartDistributedFilesToInsert = collectorapi.Chart{
870 ID: "distributes_files_to_insert",
871 Title: "Pending files to process for asynchronous insertion into Distributed tables",
872 Units: "files",
873 Fam: "distributed inserts",
874 Ctx: "clickhouse.distributed_files_to_insert",
875 Priority: prioDistributedFilesToInsert,
876 Dims: collectorapi.Dims{
877 {ID: "metrics_DistributedFilesToInsert", Name: "pending_insertions"},
878 },
879 }
880 chartDistributedRejectedInserts = collectorapi.Chart{
881 ID: "distributes_rejected_inserts",
882 Title: "Rejected INSERTs to a Distributed table",
883 Units: "inserts/s",
884 Fam: "distributed inserts",
885 Ctx: "clickhouse.distributed_rejected_inserts",
886 Priority: prioDistributedRejectedInserts,
887 Dims: collectorapi.Dims{
888 {ID: "events_DistributedRejectedInserts", Name: "rejected", Algo: collectorapi.Incremental},
889 },
890 }
891 chartDistributedDelayedInserts = collectorapi.Chart{
892 ID: "distributes_delayed_inserts",
893 Title: "Delayed INSERTs to a Distributed table",
894 Units: "inserts/s",
895 Fam: "distributed inserts",
896 Ctx: "clickhouse.distributed_delayed_inserts",
897 Priority: prioDistributedDelayedInserts,
898 Dims: collectorapi.Dims{
899 {ID: "events_DistributedDelayedInserts", Name: "delayed", Algo: collectorapi.Incremental},
900 },
901 }
902 chartDistributedDelayedInsertsLatency = collectorapi.Chart{
903 ID: "distributes_delayed_inserts_latency",
904 Title: "Time spent while the INSERT of a block to a Distributed table was throttled",
905 Units: "milliseconds",
906 Fam: "distributed inserts",
907 Ctx: "clickhouse.distributed_delayed_inserts_latency",
908 Priority: prioDistributedDelayedInsertsMilliseconds,
909 Dims: collectorapi.Dims{
910 {ID: "events_DistributedDelayedInsertsMilliseconds", Name: "delayed_time", Algo: collectorapi.Incremental},
911 },
912 }
913 chartDistributedSyncInsertionTimeoutExceeded = collectorapi.Chart{
914 ID: "distributes_sync_insertion_timeout_exceeded",
915 Title: "Distributed table sync insertions timeouts",
916 Units: "timeouts/s",
917 Fam: "distributed inserts",
918 Ctx: "clickhouse.distributed_sync_insertion_timeout_exceeded",
919 Priority: prioDistributedSyncInsertionTimeoutExceeded,
920 Dims: collectorapi.Dims{
921 {ID: "events_DistributedSyncInsertionTimeoutExceeded", Name: "sync_insertion", Algo: collectorapi.Incremental},
922 },
923 }
924 chartDistributedAsyncInsertionFailures = collectorapi.Chart{
925 ID: "distributes_async_insertions_failures",
926 Title: "Distributed table async insertion failures",
927 Units: "failures/s",
928 Fam: "distributed inserts",
929 Ctx: "clickhouse.distributed_async_insertions_failures",
930 Priority: prioDistributedAsyncInsertionFailures,
931 Dims: collectorapi.Dims{
932 {ID: "events_DistributedAsyncInsertionFailures", Name: "async_insertions", Algo: collectorapi.Incremental},
933 },
934 }
935 )
936
937 var (
938 chartUptime = collectorapi.Chart{
939 ID: "uptime",
940 Title: "Uptime",
941 Units: "seconds",
942 Fam: "uptime",
943 Ctx: "clickhouse.uptime",
944 Priority: prioUptime,
945 Dims: collectorapi.Dims{
946 {ID: "async_metrics_Uptime", Name: "uptime"},
947 },
948 }
949 )
950
951 func (c *Collector) addDiskCharts(disk *seenDisk) {
952 charts := diskChartsTmpl.Copy()
953
954 for _, chart := range *charts {
955 chart.ID = fmt.Sprintf(chart.ID, disk.disk)
956 chart.Labels = []collectorapi.Label{
957 {Key: "disk_name", Value: disk.disk},
958 }
959 for _, dim := range chart.Dims {
960 dim.ID = fmt.Sprintf(dim.ID, disk.disk)
961 }
962 }
963
964 if err := c.Charts().Add(*charts...); err != nil {
965 c.Warning(err)
966 }
967 }
968
969 func (c *Collector) removeDiskCharts(disk *seenDisk) {
970 px := fmt.Sprintf("disk_%s_", disk.disk)
971 c.removeCharts(px)
972 }
973
974 func (c *Collector) addTableCharts(table *seenTable) {
975 charts := tableChartsTmpl.Copy()
976
977 for _, chart := range *charts {
978 chart.ID = fmt.Sprintf(chart.ID, table.table, table.db)
979 chart.Labels = []collectorapi.Label{
980 {Key: "database", Value: table.db},
981 {Key: "table", Value: table.table},
982 }
983 for _, dim := range chart.Dims {
984 dim.ID = fmt.Sprintf(dim.ID, table.table, table.db)
985 }
986 }
987
988 if err := c.Charts().Add(*charts...); err != nil {
989 c.Warning(err)
990 }
991 }
992
993 func (c *Collector) removeTableCharts(table *seenTable) {
994 px := fmt.Sprintf("table_%s_database_%s_", table.table, table.db)
995 c.removeCharts(px)
996 }
997
998 func (c *Collector) removeCharts(prefix string) {
999 for _, chart := range *c.Charts() {
1000 if strings.HasPrefix(chart.ID, prefix) {
1001 chart.MarkRemove()
1002 chart.MarkNotCreated()
1003 }
1004 }
1005 }