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  }