master
go 118 lines 2.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package zookeeper
4
5 import (
6 "fmt"
7 "strconv"
8 "strings"
9
10 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/oldmetrix"
11 )
12
13 func (c *Collector) collect() (map[string]int64, error) {
14 return c.collectMntr()
15 }
16
17 func (c *Collector) collectMntr() (map[string]int64, error) {
18 const command = "mntr"
19
20 lines, err := c.fetch("mntr")
21 if err != nil {
22 return nil, err
23 }
24
25 switch len(lines) {
26 case 0:
27 return nil, fmt.Errorf("'%s' command returned empty response", command)
28 case 1:
29 // mntr is not executed because it is not in the whitelist.
30 return nil, fmt.Errorf("'%s' command returned bad response: %s", command, lines[0])
31 }
32
33 mx := make(map[string]int64)
34
35 for _, line := range lines {
36 parts := strings.Fields(line)
37 if len(parts) != 2 || !strings.HasPrefix(parts[0], "zk_") {
38 continue
39 }
40
41 key, value := parts[0], parts[1]
42 if !zkMetrics[key] {
43 continue
44 }
45 key = strings.TrimPrefix(key, "zk_")
46
47 switch key {
48 case "server_state":
49 for _, v := range zkServerStates {
50 mx[key+"_"+v] = oldmetrix.Bool(v == value)
51 }
52 case "min_latency", "avg_latency", "max_latency":
53 writeMetric(mx, key, value, 1000, 1)
54 case "uptime":
55 writeMetric(mx, key, value, 1, 1000) // ms->seconds
56 default:
57 writeMetric(mx, key, value, 1, 1)
58 }
59 }
60
61 if len(mx) == 0 {
62 return nil, fmt.Errorf("'%s' command: failed to parse response", command)
63 }
64
65 return mx, nil
66 }
67
68 func writeMetric(mx map[string]int64, metric, value string, mul, div float64) {
69 v, err := strconv.ParseFloat(value, 64)
70 if err != nil {
71 return
72 }
73 if mul != 0 {
74 v *= mul
75 }
76 if div != 0 {
77 v /= div
78 }
79 mx[metric] = int64(v)
80
81 }
82
83 var zkServerStates = []string{
84 "leader",
85 "follower",
86 "observer",
87 "standalone",
88 }
89
90 var zkMetrics = map[string]bool{
91 "zk_server_state": true,
92
93 "zk_outstanding_requests": true,
94 "zk_min_latency": true,
95 "zk_avg_latency": true,
96 "zk_max_latency": true,
97 "zk_stale_requests": true,
98 "zk_stale_requests_dropped": true,
99
100 "zk_num_alive_connections": true,
101 "zk_auth_failed_count": true,
102 "zk_connection_drop_count": true,
103 "zk_connection_rejected": true,
104 "zk_global_sessions": true,
105
106 "zk_packets_received": true,
107 "zk_packets_sent": true,
108
109 "zk_open_file_descriptor_count": true,
110 "zk_max_file_descriptor_count": true,
111 "zk_znode_count": true,
112 "zk_ephemerals_count": true,
113 "zk_watch_count": true,
114 "zk_approximate_data_size": true,
115
116 "zk_uptime": true,
117 "zk_throttled_ops": true,
118 }