go.d clickhouse add more metrics (#17756)
Ilya Mashchenko committed
May 27, 2024 at 13:23 UTC
6c1abf1cf7016a4ddf1b362dd14c5813ef078f48
7 files changed
+126
-24
src/go/collectors/go.d.plugin/modules/clickhouse/charts.go
+51
-12
@@ -20,12 +20,13 @@ const (
20
prioDiskSpaceUsage
21
22
prioRunningQueries
23
+ prioQueriesPreempted
24
prioQueries
25
prioSelectQueries
26
prioInsertQueries
26
- prioQueriesPreempted
27
prioQueriesMemoryLimitExceeded
28
29
+ prioLongestRunningQueryTime
30
prioQueriesLatency
31
prioSelectQueriesLatency
32
prioInsertQueriesLatency
@@ -41,6 +42,7 @@ const (
42
prioDatabaseTableRows
43
44
prioReplicatedPartsCurrentActivity
45
+ prioReplicasMaxAbsoluteDelay
46
prioReadOnlyReplica
47
prioReplicatedDataLoss
48
prioReplicatedPartFetches
@@ -71,6 +73,7 @@ const (
73
prioUncompressedCacheRequests
74
prioMarkCacheRequests
75
76
+ prioMaxPartCountForPartition
77
prioParts
78
79
prioDistributedSend
@@ -103,6 +106,7 @@ var chCharts = module.Charts{
106
chartQueriesPreempted.Copy(),
107
chartQueriesMemoryLimitExceeded.Copy(),
108
109
+ chartLongestRunningQueryTime.Copy(),
110
chartQueriesLatency.Copy(),
111
chartSelectQueriesLatency.Copy(),
112
chartInsertQueriesLatency.Copy(),
@@ -114,6 +118,7 @@ var chCharts = module.Charts{
118
chartIOFileOpens.Copy(),
119
120
chartReplicatedPartsActivity.Copy(),
121
+ chartReplicasMaxAbsoluteDelay.Copy(),
122
chartReadonlyReplica.Copy(),
123
chartReplicatedDataLoss.Copy(),
124
chartReplicatedPartFetches.Copy(),
@@ -144,6 +149,7 @@ var chCharts = module.Charts{
149
chartUncompressedCacheRequests.Copy(),
150
chartMarkCacheRequests.Copy(),
151
152
+ chartMaxPartCountForPartition.Copy(),
153
chartPartsCount.Copy(),
154
155
chartDistributedConnections.Copy(),
@@ -251,6 +257,17 @@ var (
257
{ID: "metrics_Query", Name: "running"},
258
},
259
}
260
+ chartQueriesPreempted = module.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: module.Dims{
268
+ {ID: "metrics_QueryPreempted", Name: "preempted"},
269
+ },
270
+ }
271
chartQueries = module.Chart{
272
ID: "queries",
273
Title: "Queries",
@@ -290,17 +307,6 @@ var (
307
{ID: "events_FailedInsertQuery", Name: "failed", Algo: module.Incremental},
308
},
309
}
293
- chartQueriesPreempted = module.Chart{
294
- ID: "queries_preempted",
295
- Title: "Queries waiting due to priority",
296
- Units: "queries",
297
- Fam: "queries",
298
- Ctx: "clickhouse.queries_preempted",
299
- Priority: prioQueriesPreempted,
300
- Dims: module.Dims{
301
- {ID: "metrics_QueryPreempted", Name: "preempted"},
302
- },
303
- }
310
chartQueriesMemoryLimitExceeded = module.Chart{
311
ID: "queries_memory_limit_exceeded",
312
Title: "Memory limit exceeded for query",
@@ -315,6 +321,17 @@ var (
321
)
322
323
var (
324
+ chartLongestRunningQueryTime = module.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: module.Dims{
332
+ {ID: "LongestRunningQueryTime", Name: "longest_query_time", Div: precision},
333
+ },
334
+ }
335
chartQueriesLatency = module.Chart{
336
ID: "queries_latency",
337
Title: "Queries latency",
@@ -469,6 +486,17 @@ var (
486
{ID: "metrics_ReplicatedChecks", Name: "check"},
487
},
488
}
489
+ chartReplicasMaxAbsoluteDelay = module.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: module.Dims{
497
+ {ID: "async_metrics_ReplicasMaxAbsoluteDelay", Name: "replication_delay", Div: precision},
498
+ },
499
+ }
500
chartReadonlyReplica = module.Chart{
501
ID: "readonly_replica",
502
Title: "Replicated tables in readonly state",
@@ -759,6 +787,17 @@ var (
787
)
788
789
var (
790
+ chartMaxPartCountForPartition = module.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: module.Dims{
798
+ {ID: "async_metrics_MaxPartCountForPartition", Name: "max_parts_partition"},
799
+ },
800
+ }
801
chartPartsCount = module.Chart{
802
ID: "parts_count",
803
Title: "Parts",
src/go/collectors/go.d.plugin/modules/clickhouse/clickhouse_test.go
+8
-1
@@ -24,6 +24,7 @@ var (
24
dataRespSystemEvents, _ = os.ReadFile("testdata/resp_system_events.csv")
25
dataRespSystemParts, _ = os.ReadFile("testdata/resp_system_parts.csv")
26
dataRespSystemDisks, _ = os.ReadFile("testdata/resp_system_disks.csv")
27
+ dataRespLongestQueryTime, _ = os.ReadFile("testdata/resp_longest_query_time.csv")
28
)
29
30
func Test_testDataIsValid(t *testing.T) {
@@ -35,6 +36,7 @@ func Test_testDataIsValid(t *testing.T) {
36
"dataRespSystemEvents": dataRespSystemEvents,
37
"dataRespSystemParts": dataRespSystemParts,
38
"dataRespSystemDisks": dataRespSystemDisks,
39
+ "dataRespLongestQueryTime": dataRespLongestQueryTime,
40
} {
41
require.NotNil(t, data, name)
42
}
@@ -122,6 +124,9 @@ func TestClickHouse_Collect(t *testing.T) {
124
"success on valid response": {
125
prepare: prepareCaseOk,
126
wantMetrics: map[string]int64{
127
+ "LongestRunningQueryTime": 73,
128
+ "async_metrics_MaxPartCountForPartition": 7,
129
+ "async_metrics_ReplicasMaxAbsoluteDelay": 0,
130
"async_metrics_Uptime": 64380,
131
"disk_default_free_space_bytes": 165494767616,
132
"disk_default_used_space_bytes": 45184565248,
@@ -187,7 +192,6 @@ func TestClickHouse_Collect(t *testing.T) {
192
"metrics_DistributedSend": 0,
193
"metrics_HTTPConnection": 0,
194
"metrics_InterserverConnection": 0,
190
- "metrics_Query": 1,
195
"metrics_MemoryTracking": 1270999152,
196
"metrics_MySQLConnection": 0,
197
"metrics_PartsActive": 25,
@@ -199,6 +203,7 @@ func TestClickHouse_Collect(t *testing.T) {
203
"metrics_PartsTemporary": 0,
204
"metrics_PartsWide": 76,
205
"metrics_PostgreSQLConnection": 0,
206
+ "metrics_Query": 1,
207
"metrics_QueryPreempted": 0,
208
"metrics_ReadonlyReplica": 0,
209
"metrics_ReplicatedChecks": 0,
@@ -272,6 +277,8 @@ func prepareCaseOk(t *testing.T) (*ClickHouse, func()) {
277
_, _ = w.Write(dataRespSystemParts)
278
case querySystemDisks:
279
_, _ = w.Write(dataRespSystemDisks)
280
+ case queryLongestQueryTime:
281
+ _, _ = w.Write(dataRespLongestQueryTime)
282
default:
283
w.WriteHeader(http.StatusNotFound)
284
}
src/go/collectors/go.d.plugin/modules/clickhouse/collect.go
+5
@@ -11,6 +11,8 @@ import (
11
"slices"
12
)
13
14
+const precision = 1000
15
+
16
func (c *ClickHouse) collect() (map[string]int64, error) {
17
mx := make(map[string]int64)
18
@@ -29,6 +31,9 @@ func (c *ClickHouse) collect() (map[string]int64, error) {
31
if err := c.collectSystemDisks(mx); err != nil {
32
return nil, err
33
}
34
+ if err := c.collectLongestRunningQueryTime(mx); err != nil {
35
+ return nil, err
36
+ }
37
38
return mx, nil
39
}
src/go/collectors/go.d.plugin/modules/clickhouse/collect_system_async_metrics.go
+12
-5
@@ -14,15 +14,21 @@ SELECT
14
metric,
15
value
16
FROM
17
- system.asynchronous_metrics where metric like 'Uptime' FORMAT CSVWithNames
17
+ system.asynchronous_metrics
18
+where
19
+ metric LIKE 'Uptime'
20
+ OR metric LIKE 'MaxPartCountForPartition'
21
+ OR metric LIKE 'ReplicasMaxAbsoluteDelay' FORMAT CSVWithNames
22
`
23
24
func (c *ClickHouse) collectSystemAsyncMetrics(mx map[string]int64) error {
25
req, _ := web.NewHTTPRequest(c.Request)
26
req.URL.RawQuery = makeURLQuery(querySystemAsyncMetrics)
27
24
- want := map[string]bool{
25
- "Uptime": true,
28
+ want := map[string]float64{
29
+ "Uptime": 1,
30
+ "MaxPartCountForPartition": 1,
31
+ "ReplicasMaxAbsoluteDelay": precision,
32
}
33
34
px := "async_metrics_"
@@ -34,12 +40,13 @@ func (c *ClickHouse) collectSystemAsyncMetrics(mx map[string]int64) error {
40
case "metric":
41
metric = value
42
case "value":
37
- if !want[metric] {
43
+ mul, ok := want[metric]
44
+ if !ok {
45
return
46
}
47
n++
48
if v, err := strconv.ParseFloat(value, 64); err == nil {
42
- mx[px+metric] = int64(v)
49
+ mx[px+metric] = int64(v * mul)
50
}
51
}
52
})
src/go/collectors/go.d.plugin/modules/clickhouse/collect_system_processes.go
new
+29
@@ -0,0 +1,29 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+package clickhouse
4
+
5
+import (
6
+ "strconv"
7
+
8
+ "github.com/netdata/netdata/go/go.d.plugin/pkg/web"
9
+)
10
+
11
+const queryLongestQueryTime = `
12
+SELECT
13
+ toString(max(elapsed)) as value
14
+FROM
15
+ system.processes FORMAT CSVWithNames
16
+`
17
+
18
+func (c *ClickHouse) collectLongestRunningQueryTime(mx map[string]int64) error {
19
+ req, _ := web.NewHTTPRequest(c.Request)
20
+ req.URL.RawQuery = makeURLQuery(queryLongestQueryTime)
21
+
22
+ return c.doOKDecodeCSV(req, func(column, value string, lineEnd bool) {
23
+ if column == "value" {
24
+ if v, err := strconv.ParseFloat(value, 64); err == nil {
25
+ mx["LongestRunningQueryTime"] = int64(v * precision)
26
+ }
27
+ }
28
+ })
29
+}
src/go/collectors/go.d.plugin/modules/clickhouse/metadata.yaml
+19
-6
@@ -31,6 +31,7 @@ modules:
31
- system.events
32
- system.disks
33
- system.parts
34
+ - system.processes
35
supported_platforms:
36
include: []
37
exclude: []
@@ -218,6 +219,12 @@ modules:
219
chart_type: line
220
dimensions:
221
- name: running
222
+ - name: clickhouse.queries_preempted
223
+ description: Queries waiting due to priority
224
+ unit: queries
225
+ chart_type: line
226
+ dimensions:
227
+ - name: preempted
228
- name: clickhouse.queries
229
description: Queries
230
unit: queries/s
@@ -239,12 +246,6 @@ modules:
246
dimensions:
247
- name: successful
248
- name: failed
242
- - name: clickhouse.queries_preempted
243
- description: Queries waiting due to priority
244
- unit: queries
245
- chart_type: line
246
- dimensions:
247
- - name: preempted
249
- name: clickhouse.queries_memory_limit_exceeded
250
description: Memory limit exceeded for query
251
unit: queries/s
@@ -310,6 +311,12 @@ modules:
311
- name: fetch
312
- name: send
313
- name: check
314
+ - name: clickhouse.replicas_max_absolute_dela
315
+ description: Replicas max absolute delay
316
+ unit: seconds
317
+ chart_type: line
318
+ dimensions:
319
+ - name: replication_delay
320
- name: clickhouse.replicated_readonly_tables
321
description: Replicated tables in readonly state
322
unit: tables
@@ -445,6 +452,12 @@ modules:
452
dimensions:
453
- name: hits
454
- name: misses
455
+ - name: clickhouse.max_part_count_for_partition
456
+ description: Max part count for partition
457
+ unit: parts
458
+ chart_type: line
459
+ dimensions:
460
+ - name: max_parts_partition
461
- name: clickhouse.parts_count
462
description: Parts
463
unit: parts
src/go/collectors/go.d.plugin/modules/clickhouse/testdata/resp_longest_query_time.csv
new
+2
@@ -0,0 +1,2 @@
1
+"value"
2
+"0.0738"