67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
// Importer for global RRD stats
|
|
package rrd
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"os/exec"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var linePattern = regexp.MustCompile("^<!-- ....-..-.. ..:..:.. [A-Z]+ / (\\d+) --> <row><v>([^<]+)</v><v>([^<]+)</v></row>")
|
|
|
|
type Dataset struct {
|
|
Time time.Time
|
|
Nodes float64
|
|
Clients float64
|
|
}
|
|
|
|
func Read(rrdFile string) chan Dataset {
|
|
out := make(chan Dataset)
|
|
cmd := exec.Command("rrdtool", "dump", rrdFile)
|
|
stdout, err := cmd.StdoutPipe()
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := cmd.Start(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
r := bufio.NewReader(stdout)
|
|
found := false
|
|
|
|
go func() {
|
|
for {
|
|
// Read stdout by line
|
|
line, _, err := r.ReadLine()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
str := strings.TrimSpace(string(line))
|
|
|
|
// Search for the start of the daily datasets
|
|
if !found {
|
|
found = strings.Contains(str, "<!-- 86400 seconds -->")
|
|
continue
|
|
}
|
|
if matches := linePattern.FindStringSubmatch(str); matches != nil && matches[2] != "NaN" {
|
|
seconds, _ := strconv.Atoi(matches[1])
|
|
nodes, _ := strconv.ParseFloat(matches[2], 64)
|
|
clients, _ := strconv.ParseFloat(matches[2], 64)
|
|
|
|
out <- Dataset{
|
|
Time: time.Unix(int64(seconds), 0),
|
|
Nodes: nodes,
|
|
Clients: clients,
|
|
}
|
|
}
|
|
}
|
|
close(out)
|
|
}()
|
|
return out
|
|
}
|