Skip to content

Commit 408df63

Browse files
committed
Major code changes
1) Added time string to top result 2) Improved netstat output format 3) Return 127.0.0.1 instead of panic while error happens 4) vmstat implementation 5) vmstat fixed build error 6) Added command top from procps 7) Added tags configured in the YAML to meta-info request for action API 8) Socket timeout while reading response from OpenJ9 VM 9) Fixed toph2 error continue instead of break when error happens 10) Full thread dump to thread dump 11) jattach: change timeout to 30 minutes 12) Support timestamp override as value in m3-fin response 13) Fixed stuck process while capturing Kernel data
1 parent f623744 commit 408df63

File tree

327 files changed

+53037
-90
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

327 files changed

+53037
-90
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,4 @@ Please refer to any one of the following links if you want to build the ycrash a
7373
7474
1. Build yc agent in [Windows](/docs/Build%20yc%20agent%20in%20Windows.pdf)
7575
2. Build yc agent in [Linux](/docs/build-yc-agent-linux.md)
76-
3. Build yc agent in [MacOS](/docs/build-yc-agent-macos.md)
77-
76+
3. Build yc agent in [MacOS](/docs/build-yc-agent-macos.md)

capture/heap.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ func (t *HeapDump) Run() (result Result, err error) {
130130
return
131131
}
132132
defer func() {
133-
if err := zipfile.Close(); err != nil {
134-
logger.Log("failed to close zip file: %s", err.Error())
133+
if err := zipfile.Close(); err != nil && !errors.Is(err, os.ErrClosed) {
134+
logger.Debug().Err(err).Msg("failed to close zip file")
135135
}
136136
}()
137137
writer := zip.NewWriter(bufio.NewWriter(zipfile))

capture/jstack.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,18 @@ func NewJStack(javaHome string, pid int) *JStack {
2626
}
2727

2828
func (t *JStack) Run() (result Result, err error) {
29-
b1 := make(chan int, 1)
30-
b2 := make(chan int, 1)
31-
e1 := make(chan error, 1)
32-
e2 := make(chan error, 1)
29+
b1 := make(chan int, count)
30+
b2 := make(chan int, count)
31+
e1 := make(chan error, count)
32+
e2 := make(chan error, count)
3333
defer func() {
3434
close(b1)
3535
close(b2)
3636
}()
3737
go func() {
38+
defer func() {
39+
close(e1)
40+
}()
3841
for {
3942
n, ok := <-b1
4043
if !ok {
@@ -57,17 +60,21 @@ func (t *JStack) Run() (result Result, err error) {
5760
return
5861
}
5962
}
63+
e := jstack.Sync()
64+
if e != nil {
65+
logger.Log("failed to sync file %s", e)
66+
}
67+
_, e = jstack.WriteString("\nFull thread dump\n")
68+
if e != nil {
69+
logger.Log("failed to write file %s", e)
70+
}
6071
_, err = (&JStackF{
6172
jstack: jstack,
6273
javaHome: t.javaHome,
6374
pid: t.pid,
6475
}).Run()
6576
e1 <- err
6677

67-
_, e := jstack.WriteString("\n")
68-
if e != nil {
69-
logger.Log("failed to write file %s", e)
70-
}
7178
e = jstack.Sync()
7279
if e != nil {
7380
logger.Log("failed to sync file %s", e)
@@ -80,6 +87,9 @@ func (t *JStack) Run() (result Result, err error) {
8087
}()
8188

8289
go func() {
90+
defer func() {
91+
close(e2)
92+
}()
8393
for {
8494
n, ok := <-b2
8595
if !ok {
@@ -96,11 +106,11 @@ func (t *JStack) Run() (result Result, err error) {
96106
b1 <- n
97107
err = <-e1
98108
if err != nil {
99-
break
109+
logger.Warn().Err(err).Msg("Failed to run jstack with err")
100110
}
101111
err = <-e2
102112
if err != nil {
103-
break
113+
logger.Warn().Err(err).Msg("Failed to run top h with err")
104114
}
105115

106116
if n == count {

capture/netstat.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,28 @@ func NewNetStat() *NetStat {
2020
}
2121

2222
func (t *NetStat) Run() (result Result, err error) {
23-
netstat, err := os.Create("netstat.out")
23+
file, err := os.Create("netstat.out")
2424
if err != nil {
2525
return
2626
}
27-
defer netstat.Close()
28-
netstat.WriteString(fmt.Sprintf("%s\n", shell.NowString()))
29-
err = shell.CommandCombinedOutputToWriter(netstat, shell.NetState)
27+
defer file.Close()
28+
file.WriteString(fmt.Sprintf("%s\n", shell.NowString()))
29+
err = shell.CommandCombinedOutputToWriter(file, shell.NetState)
3030
if err != nil {
31-
return
31+
err = netStat(true, true, true, true, false, true, false, file)
32+
if err != nil {
33+
return
34+
}
3235
}
3336
t.Wait()
34-
netstat.WriteString(fmt.Sprintf("\n%s\n", shell.NowString()))
35-
err = shell.CommandCombinedOutputToWriter(netstat, shell.NetState)
37+
file.WriteString(fmt.Sprintf("\n%s\n", shell.NowString()))
38+
err = shell.CommandCombinedOutputToWriter(file, shell.NetState)
3639
if err != nil {
37-
return
40+
err = netStat(true, true, true, true, false, true, false, file)
41+
if err != nil {
42+
return
43+
}
3844
}
39-
result.Msg, result.Ok = shell.PostData(t.Endpoint(), "ns", netstat)
45+
result.Msg, result.Ok = shell.PostData(t.Endpoint(), "ns", file)
4046
return
4147
}

capture/netstat_native.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
//go:build windows || linux
2+
// +build windows linux
3+
4+
package capture
5+
6+
import (
7+
"fmt"
8+
"github.com/cakturk/go-netstat/netstat"
9+
"io"
10+
"net"
11+
"os"
12+
)
13+
14+
func netStat(udp, tcp, ipv4, ipv6, resolve, all, listening bool, writer io.Writer) (err error) {
15+
if os.Geteuid() != 0 {
16+
_, err = fmt.Fprintln(writer, "Not all processes could be identified, you would have to be root to see it all.")
17+
if err != nil {
18+
return
19+
}
20+
}
21+
_, err = fmt.Fprintf(writer, "Proto %-23s %-23s %-12s %-16s\n", "Local Addr", "Foreign Addr", "State", "PID/Program name")
22+
if err != nil {
23+
return
24+
}
25+
26+
if udp {
27+
if ipv4 {
28+
tabs, err := netstat.UDPSocks(netstat.NoopFilter)
29+
if err == nil {
30+
err = displaySockInfo("udp", tabs, resolve, writer)
31+
if err != nil {
32+
return err
33+
}
34+
}
35+
}
36+
if ipv6 {
37+
tabs, err := netstat.UDP6Socks(netstat.NoopFilter)
38+
if err == nil {
39+
err := displaySockInfo("udp6", tabs, resolve, writer)
40+
if err != nil {
41+
return err
42+
}
43+
}
44+
}
45+
} else {
46+
tcp = true
47+
}
48+
49+
if tcp {
50+
var fn netstat.AcceptFn
51+
52+
switch {
53+
case all:
54+
fn = func(*netstat.SockTabEntry) bool { return true }
55+
case listening:
56+
fn = func(s *netstat.SockTabEntry) bool {
57+
return s.State == netstat.Listen
58+
}
59+
default:
60+
fn = func(s *netstat.SockTabEntry) bool {
61+
return s.State != netstat.Listen
62+
}
63+
}
64+
65+
if ipv4 {
66+
tabs, err := netstat.TCPSocks(fn)
67+
if err == nil {
68+
err := displaySockInfo("tcp", tabs, resolve, writer)
69+
if err != nil {
70+
return err
71+
}
72+
}
73+
}
74+
if ipv6 {
75+
tabs, err := netstat.TCP6Socks(fn)
76+
if err == nil {
77+
err := displaySockInfo("tcp6", tabs, resolve, writer)
78+
if err != nil {
79+
return err
80+
}
81+
}
82+
}
83+
}
84+
return
85+
}
86+
87+
func displaySockInfo(proto string, s []netstat.SockTabEntry, resolve bool, writer io.Writer) (err error) {
88+
lookup := func(skaddr *netstat.SockAddr) string {
89+
const IPv4Strlen = 17
90+
addr := skaddr.IP.String()
91+
if resolve {
92+
names, err := net.LookupAddr(addr)
93+
if err == nil && len(names) > 0 {
94+
addr = names[0]
95+
}
96+
}
97+
if len(addr) > IPv4Strlen {
98+
addr = addr[:IPv4Strlen]
99+
}
100+
return fmt.Sprintf("%s:%d", addr, skaddr.Port)
101+
}
102+
103+
for _, e := range s {
104+
p := "-"
105+
if e.Process != nil {
106+
pn := e.Process.String()
107+
if len(pn) > 0 {
108+
p = pn
109+
}
110+
}
111+
saddr := lookup(e.LocalAddr)
112+
daddr := lookup(e.RemoteAddr)
113+
state := e.State.String()
114+
if len(state) <= 0 {
115+
state = "CLOSE"
116+
}
117+
_, err = fmt.Fprintf(writer, "%-5s %-23.23s %-23.23s %-12s %-16s\n", proto, saddr, daddr, state, p)
118+
if err != nil {
119+
return
120+
}
121+
}
122+
return
123+
}

capture/netstat_others.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//go:build !windows && !linux
2+
// +build !windows,!linux
3+
4+
package capture
5+
6+
import (
7+
"errors"
8+
"io"
9+
)
10+
11+
func netStat(udp, tcp, ipv4, ipv6, resolve, all, listening bool, writer io.Writer) (err error) {
12+
return errors.New("netstat is not supported on this platform")
13+
}

capture/netstat_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package capture
22

3-
import "testing"
3+
import (
4+
"os"
5+
"testing"
6+
)
47

58
func TestNetStat(t *testing.T) {
69
capNetStat := NewNetStat()
@@ -16,3 +19,10 @@ func TestNetStat(t *testing.T) {
1619
t.Fatal(result)
1720
}
1821
}
22+
23+
func TestNativeNetStat(t *testing.T) {
24+
err := netStat(true, true, true, true, true, true, false, os.Stdout)
25+
if err != nil {
26+
t.Fatal(err)
27+
}
28+
}

capture/top.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77
"io/ioutil"
88
"os"
9+
"os/exec"
910
"strconv"
1011
"time"
1112

@@ -34,7 +35,7 @@ func (t *Top) Run() (result Result, err error) {
3435
}
3536
}()
3637
t.Cmd, err = shell.CommandStartInBackgroundToWriter(file, shell.Top)
37-
if err != nil {
38+
if err != nil && !errors.Is(err, exec.ErrNotFound) {
3839
return
3940
}
4041
if t.Cmd.IsSkipped() {
@@ -121,7 +122,7 @@ func (t *TopH) Run() (result Result, err error) {
121122
return
122123
}
123124
t.Cmd, err = shell.CommandStartInBackgroundToWriter(file, command)
124-
if err != nil {
125+
if err != nil && !errors.Is(err, exec.ErrNotFound) {
125126
return
126127
}
127128
if t.Cmd.IsSkipped() {

0 commit comments

Comments
 (0)