master
go 85 lines 1.56 KB
Raw
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/plugins/pkg/web"
9 )
10
11 const querySystemDisks = `
12 SELECT
13 name,
14 sum(free_space) as free_space,
15 sum(total_space) as total_space
16 FROM
17 system.disks
18 GROUP BY
19 name FORMAT CSVWithNames
20 `
21
22 type diskStats struct {
23 name string
24 totalBytes int64
25 freeBytes int64
26 }
27
28 func (c *Collector) collectSystemDisks(mx map[string]int64) error {
29 req, err := web.NewHTTPRequest(c.RequestConfig)
30 if err != nil {
31 return err
32 }
33 req.URL.RawQuery = makeURLQuery(querySystemDisks)
34
35 seen := make(map[string]*diskStats)
36
37 getDisk := func(name string) *diskStats {
38 s, ok := seen[name]
39 if !ok {
40 s = &diskStats{name: name}
41 seen[name] = s
42 }
43 return s
44 }
45
46 var name string
47
48 err = c.doHTTP(req, func(column, value string, lineEnd bool) {
49 switch column {
50 case "name":
51 name = value
52 case "free_space":
53 v, _ := strconv.ParseInt(value, 10, 64)
54 getDisk(name).freeBytes = v
55 case "total_space":
56 v, _ := strconv.ParseInt(value, 10, 64)
57 getDisk(name).totalBytes = v
58 }
59 })
60 if err != nil {
61 return err
62 }
63
64 for _, disk := range seen {
65 if _, ok := c.seenDisks[disk.name]; !ok {
66 v := &seenDisk{disk: disk.name}
67 c.seenDisks[disk.name] = v
68 c.addDiskCharts(v)
69 }
70
71 px := "disk_" + disk.name + "_"
72
73 mx[px+"free_space_bytes"] = disk.freeBytes
74 mx[px+"used_space_bytes"] = disk.totalBytes - disk.freeBytes
75 }
76
77 for k, v := range c.seenDisks {
78 if _, ok := seen[k]; !ok {
79 delete(c.seenDisks, k)
80 c.removeDiskCharts(v)
81 }
82 }
83
84 return nil
85 }