func()

in flw/flw.go [131:202]


func (c *Client) Cons(server string) ([]*ServerClient, error) {
	const (
		zrAddr = `^ /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):(?:\d+))\[\d+\]`
		zrPac  = `\(queued=(\d+),recved=(\d+),sent=(\d+),sid=(0x[A-Za-z0-9]+),lop=(\w+),est=(\d+),to=(\d+),`
		zrSesh = `lcxid=(0x[A-Za-z0-9]+),lzxid=(0x[A-Za-z0-9]+),lresp=(\d+),llat=(\d+),minlat=(\d+),avglat=(\d+),maxlat=(\d+)\)`
	)

	re, err := regexp.Compile(fmt.Sprintf("%v%v%v", zrAddr, zrPac, zrSesh))
	if err != nil {
		return nil, fmt.Errorf("error compiling cons response regex: %w", err)
	}

	response, err := fourLetterWord(server, "cons", c.Timeout)

	if err != nil {
		return nil, fmt.Errorf("error parsing cons response: %w", err)
	}

	scan := bufio.NewScanner(bytes.NewReader(response))

	var clients []*ServerClient

	for scan.Scan() {
		line := scan.Bytes()

		if len(line) == 0 {
			continue
		}

		m := re.FindAllStringSubmatch(string(line), -1)

		if m == nil {
			return nil, fmt.Errorf("unable to parse fields from zookeeper response (no regex matches)")
		}

		match := m[0][1:]

		queued, _ := strconv.ParseInt(match[1], 0, 64)
		recvd, _ := strconv.ParseInt(match[2], 0, 64)
		sent, _ := strconv.ParseInt(match[3], 0, 64)
		sid, _ := strconv.ParseInt(match[4], 0, 64)
		est, _ := strconv.ParseInt(match[6], 0, 64)
		timeout, _ := strconv.ParseInt(match[7], 0, 32)
		lcxid, _ := parseInt64(match[8])
		lzxid, _ := parseInt64(match[9])
		lresp, _ := strconv.ParseInt(match[10], 0, 64)
		llat, _ := strconv.ParseInt(match[11], 0, 32)
		minlat, _ := strconv.ParseInt(match[12], 0, 32)
		avglat, _ := strconv.ParseInt(match[13], 0, 32)
		maxlat, _ := strconv.ParseInt(match[14], 0, 32)

		clients = append(clients, &ServerClient{
			Queued:        queued,
			Received:      recvd,
			Sent:          sent,
			SessionID:     sid,
			Lcxid:         int64(lcxid),
			Lzxid:         int64(lzxid),
			Timeout:       int32(timeout),
			LastLatency:   int32(llat),
			MinLatency:    int32(minlat),
			AvgLatency:    int32(avglat),
			MaxLatency:    int32(maxlat),
			Established:   time.Unix(est, 0),
			LastResponse:  time.Unix(lresp, 0),
			Addr:          match[0],
			LastOperation: match[5],
		})
	}

	return clients, nil
}