github.com/netdata/go.d.plugin@v0.58.1/modules/zookeeper/collect.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package zookeeper 4 5 import ( 6 "fmt" 7 "strconv" 8 "strings" 9 ) 10 11 func (z *Zookeeper) collect() (map[string]int64, error) { 12 return z.collectMntr() 13 } 14 15 func (z *Zookeeper) collectMntr() (map[string]int64, error) { 16 const command = "mntr" 17 lines, err := z.fetch("mntr") 18 if err != nil { 19 return nil, err 20 } 21 switch len(lines) { 22 case 0: 23 return nil, fmt.Errorf("'%s' command returned empty response", command) 24 case 1: 25 // mntr is not executed because it is not in the whitelist. 26 return nil, fmt.Errorf("'%s' command returned bad response: %s", command, lines[0]) 27 } 28 29 mx := make(map[string]int64) 30 for _, line := range lines { 31 parts := strings.Fields(line) 32 if len(parts) != 2 || !strings.HasPrefix(parts[0], "zk_") { 33 continue 34 } 35 36 key, value := strings.TrimPrefix(parts[0], "zk_"), parts[1] 37 switch key { 38 case "version": 39 case "server_state": 40 mx[key] = convertServerState(value) 41 case "min_latency", "avg_latency", "max_latency": 42 v, err := strconv.ParseFloat(value, 64) 43 if err != nil { 44 continue 45 } 46 mx[key] = int64(v * 1000) 47 default: 48 v, err := strconv.ParseFloat(value, 64) 49 if err != nil { 50 continue 51 } 52 mx[key] = int64(v) 53 } 54 } 55 56 if len(mx) == 0 { 57 return nil, fmt.Errorf("'%s' command: failed to parse response", command) 58 } 59 return mx, nil 60 } 61 62 func convertServerState(state string) int64 { 63 switch state { 64 default: 65 return 0 66 case "leader": 67 return 1 68 case "follower": 69 return 2 70 case "observer": 71 return 3 72 case "standalone": 73 return 4 74 } 75 }