forked from lateefj/slowgrog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.go
74 lines (67 loc) · 1.65 KB
/
parser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"log"
"strconv"
"strings"
"github.com/garyburd/redigo/redis"
)
type MonitorCmd struct {
Timestamp float64 `json:"timestamp"`
Text string `json:"text"`
Params []string `json:"params"`
}
// Parses a line from the monitor redis command.
// Do we care about Host, Port? If so need to implement..
// TODO: This parse sucks but MVP and all....
func ParseMonitorLine(l string) (*MonitorCmd, error) {
if l == "OK" {
return nil, nil
}
m := &MonitorCmd{}
si := strings.Index(l, "[")
ei := strings.Index(l, "]")
t, err := strconv.ParseFloat(l[0:si-1], 10)
if err != nil {
log.Printf("Could not convert timestamp from string to float: %s", t)
}
m.Timestamp = t
cmdPart := strings.Split(l[ei+2:], " ")
// Upper case for consistency the command and trim and extra "
m.Text = strings.ToUpper(strings.Trim(cmdPart[0], "\""))
parts := cmdPart[1:]
m.Params = make([]string, len(parts))
// Trim off " from params
for i, p := range parts {
m.Params[i] = strings.Trim(p, "\"")
}
return m, nil
}
type Slowlog struct {
ID int64
Timestamp int64
Duration int64
Command []string
}
// Parse the slowlog
func ParseSlowlogReply(entries []interface{}, err error) ([]Slowlog, error) {
logs := make([]Slowlog, 0)
if err != nil {
Logger.Fatal(err)
return nil, err
}
for _, entry := range entries {
e, ok := entry.([]interface{})
if !ok {
Logger.Error("Bad Slowlog entry")
continue
}
l := Slowlog{}
_, err = redis.Scan(e, &l.ID, &l.Timestamp, &l.Duration, &l.Command)
if err != nil {
Logger.Errorf("Error trying to scan slowlog is %s", err)
return logs, err
}
logs = append(logs, l)
}
return logs, nil
}