-
Notifications
You must be signed in to change notification settings - Fork 0
/
view.go
79 lines (68 loc) · 1.94 KB
/
view.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
75
76
77
78
79
package main
import (
"fmt"
"os"
"text/tabwriter"
"google.golang.org/grpc/codes"
)
type ViewCmd struct {
CmdCommon
Expand bool `optional:"" help:"Show message bodies"`
Headers bool `optional:"" help:"Show headers"`
StatusMessage bool `optional:"" help:"Show status message"`
CallID uint64 `optional:"" help:"Only view conversation with this call id"`
}
func (cmd *ViewCmd) Run(cli *Context) error {
f, err := openFile(cmd.LogInputFile, cli.Follow)
if err != nil {
return err
}
defer f.Close()
conversations, err := readConversations(cli, f)
if err != nil {
return err
}
var w tabwriter.Writer
w.Init(os.Stdout, 0, 8, 0, '\t', 0)
fmt.Fprintf(&w, "ID\tWhen\tElapsed\tMethod\tStatus\n")
for _, c := range conversations {
// skip conversations that have no client headers
if c.CallId() == 0 {
continue
}
if cmd.CallID != 0 {
if c.CallId() != cmd.CallID {
continue
}
}
statusCode := codes.Code(c.responseTrailer.GetTrailer().GetStatusCode())
fmt.Fprintf(&w, "%d\t%s\t%s\t%s\t%s\n", c.CallId(), c.Timestamp(), c.Elapsed(), c.MethodName(), statusCode)
if cmd.Headers {
if m := c.requestHeader.GetClientHeader().GetMetadata(); len(m.GetEntry()) > 0 {
fmt.Fprintf(&w, "->{h}\t%s\n", renderMetadata(m))
}
if m := c.responseHeader.GetServerHeader().GetMetadata(); len(m.GetEntry()) > 0 {
fmt.Fprintf(&w, "<-{h}\t%s\n", renderMetadata(m))
}
if m := c.responseTrailer.GetTrailer().GetMetadata(); len(m.GetEntry()) > 0 {
fmt.Fprintf(&w, "<-{t}\t%s\n", renderMetadata(m))
}
}
if cmd.Expand {
if err := c.FormatRequest(&w, cli); err != nil {
fmt.Fprintf(&w, "->\t%v\n", err)
}
if err := c.FormatResponse(&w, cli); err != nil {
fmt.Fprintf(&w, "<-\t%v\n", err)
}
fmt.Fprintln(&w)
}
if cmd.StatusMessage {
if t := c.responseTrailer.GetTrailer(); t != nil {
fmt.Fprintf(&w, "<-{s}\t%s\n", t.StatusMessage)
}
}
}
w.Flush()
return nil
}