Redis plugin, add key metrics and simplify parsing

This commit is contained in:
Cameron Sparr 2015-09-22 15:59:34 -07:00
parent e0372358df
commit b92a0d5126
1 changed files with 62 additions and 50 deletions

View File

@ -6,7 +6,7 @@ import (
"fmt" "fmt"
"net" "net"
"net/url" "net/url"
"strconv" // "strconv"
"strings" "strings"
"sync" "sync"
@ -140,69 +140,81 @@ func (r *Redis) gatherServer(addr *url.URL, acc plugins.Accumulator) error {
c.Write([]byte("info\r\n")) c.Write([]byte("info\r\n"))
rdr := bufio.NewReader(c) rdr := bufio.NewReader(c)
scanner := bufio.NewScanner(rdr)
line, err := rdr.ReadString('\n') for scanner.Scan() {
if err != nil { fmt.Println(scanner.Text())
return err }
if err := scanner.Err(); err != nil {
fmt.Println("reading standard input:", err)
} }
if line[0] != '$' { // line, err := rdr.ReadString('\n')
return fmt.Errorf("bad line start: %s", ErrProtocolError) // if err != nil {
} // return err
// }
line = strings.TrimSpace(line) // if line[0] != '$' {
// return fmt.Errorf("bad line start: %s", ErrProtocolError)
// }
szStr := line[1:] // line = strings.TrimSpace(line)
sz, err := strconv.Atoi(szStr) // szStr := line[0:]
if err != nil {
return fmt.Errorf("bad size string <<%s>>: %s", szStr, ErrProtocolError)
}
var read int // sz, err := strconv.Atoi(szStr)
// if err != nil {
// return fmt.Errorf("bad size string <<%s>>: %s", szStr, ErrProtocolError)
// }
for read < sz { // var read int
line, err := rdr.ReadString('\n')
if err != nil {
return err
}
read += len(line) // for read < sz {
// line, err := rdr.ReadString('\n')
// fmt.Printf(line)
// if err != nil {
// return err
// }
if len(line) == 1 || line[0] == '#' { // read += len(line)
continue // if len(line) == 1 || line[0] == '#' {
} // continue
// }
parts := strings.SplitN(line, ":", 2) // _, rPort, err := net.SplitHostPort(addr.Host)
// if err != nil {
// rPort = defaultPort
// }
// tags := map[string]string{"host": addr.String(), "port": rPort}
name := string(parts[0]) // parts := strings.SplitN(line, ":", 2)
// if len(parts) < 2 {
// continue
// }
// name := string(parts[0])
// metric, ok := Tracking[name]
// if !ok {
// // See if this is the keyspace line
// if strings.Contains(string(parts[1]), "keys=") {
// tags["database"] = name
// acc.Add("foo", 999, tags)
// }
// continue
// }
metric, ok := Tracking[name] // val := strings.TrimSpace(parts[1])
if !ok { // ival, err := strconv.ParseUint(val, 10, 64)
continue // if err == nil {
} // acc.Add(metric, ival, tags)
// continue
// }
_, rPort, err := net.SplitHostPort(addr.Host) // fval, err := strconv.ParseFloat(val, 64)
if err != nil { // if err != nil {
rPort = defaultPort // return err
} // }
tags := map[string]string{"host": addr.String(), "port": rPort}
val := strings.TrimSpace(parts[1]) // acc.Add(metric, fval, tags)
// }
ival, err := strconv.ParseUint(val, 10, 64)
if err == nil {
acc.Add(metric, ival, tags)
continue
}
fval, err := strconv.ParseFloat(val, 64)
if err != nil {
return err
}
acc.Add(metric, fval, tags)
}
return nil return nil
} }