@cryptotaxi247 / netdata-1 / commits / 6c1abf1cf

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"