func parseLine()

in pkg/metrics/collector/sockstat.go [115:147]


func parseLine(in string) (*socketStats, error) {
	line := strings.Split(in, " ")
	if len(line) < 2 || len(line[0]) < 2 || line[0][len(line[0])-1] != ':' {
		return nil, fmt.Errorf("invalid line %q", in)
	}

	ret := &socketStats{}
	tcpEntries := map[string]*sockStatEntry{
		"inuse": {&ret.tcpInUse, extractSockStatUint},
		"tw":    {&ret.tcpTimeWait, extractSockStatUint},
		"mem":   {&ret.memUsedInPages, extractSockStatUint},
	}

	udpEntries := map[string]*sockStatEntry{
		"inuse": {&ret.udpInUse, extractSockStatUint},
		"mem":   {&ret.memUsedInPages, extractSockStatUint},
	}

	protocol := line[0][:len(line[0])-1]
	rest := line[1:]

	switch protocol {
	case "TCP", "TCP6":
		if err := extractSockStatFields(rest, tcpEntries); err != nil {
			return nil, err
		}
	case "UDP", "UDP6":
		if err := extractSockStatFields(rest, udpEntries); err != nil {
			return nil, err
		}
	}
	return ret, nil
}