master
go 83 lines 1.63 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package clickhouse
4
5 import (
6 "encoding/csv"
7 "fmt"
8 "io"
9 "net/http"
10 "net/url"
11 "slices"
12
13 "github.com/netdata/netdata/go/plugins/pkg/web"
14 )
15
16 const precision = 1000
17
18 func (c *Collector) collect() (map[string]int64, error) {
19 mx := make(map[string]int64)
20
21 if err := c.collectSystemEvents(mx); err != nil {
22 return nil, err
23 }
24 if err := c.collectSystemMetrics(mx); err != nil {
25 return nil, err
26 }
27 if err := c.collectSystemAsyncMetrics(mx); err != nil {
28 return nil, err
29 }
30 if err := c.collectSystemParts(mx); err != nil {
31 return nil, err
32 }
33 if err := c.collectSystemDisks(mx); err != nil {
34 return nil, err
35 }
36 if err := c.collectLongestRunningQueryTime(mx); err != nil {
37 return nil, err
38 }
39
40 return mx, nil
41 }
42
43 func (c *Collector) doHTTP(req *http.Request, assign func(column, value string, lineEnd bool)) error {
44 return web.DoHTTP(c.httpClient).Request(req, func(body io.Reader) error {
45 return readCSVResponseData(body, assign)
46 })
47 }
48
49 func readCSVResponseData(reader io.Reader, assign func(column, value string, lineEnd bool)) error {
50 r := csv.NewReader(reader)
51 r.ReuseRecord = true
52
53 var columns []string
54
55 for {
56 record, err := r.Read()
57 if err != nil {
58 if err == io.EOF {
59 break
60 }
61 return err
62 }
63
64 if len(columns) == 0 {
65 columns = slices.Clone(record)
66 continue
67 }
68
69 if len(columns) != len(record) {
70 return fmt.Errorf("column count mismatch: %d vs %d", len(columns), len(record))
71 }
72
73 for i, l := 0, len(record); i < l; i++ {
74 assign(columns[i], record[i], i == l-1)
75 }
76 }
77
78 return nil
79 }
80
81 func makeURLQuery(q string) string {
82 return url.Values{"query": {q}}.Encode()
83 }