Hook系统调用
可以用来拦截网络流量
package hook
import (
"net"
"runtime"
"syscall"
)
// GetCurrentGoRoutineID GetCurrentGoRoutineID
func GetCurrentGoRoutineID() int64 {
return runtime.GetCurrentGoRoutineId()
}
// SetDelegatedFromGoRoutineID SetDelegatedFromGoRoutineID
func SetDelegatedFromGoRoutineID(gID int64) {
runtime.SetDelegatedFromGoRoutineId(gID)
}
// RegisterOnConnect RegisterOnConnect
func RegisterOnConnect(callback func(fd int, sa syscall.Sockaddr)) {
syscall.OnConnect = callback
}
// RegisterOnAccept RegisterOnAccept
func RegisterOnAccept(callback func(serverSocketFD int, clientSocketFD int, sa syscall.Sockaddr)) {
syscall.OnAccept = callback
}
// RegisterOnRecv RegisterOnRecv
func RegisterOnRecv(callback func(fd int, net string, raddr net.Addr, span []byte)) {
net.OnRead = callback
}
// RegisterOnSend RegisterOnSend
func RegisterOnSend(callback func(fd int, net string, raddr net.Addr, span []byte)) {
net.OnWrite = callback
}
// RegisterOnClose RegisterOnClose
func RegisterOnClose(callback func(fd int)) {
net.OnClose = callback
}
// RegisterOnGoRoutineExit RegisterOnGoRoutineExit
func RegisterOnGoRoutineExit(callback func(goid int64)) {
runtime.OnGoRoutineExit = callback
}
go:linkname
可以实现引导编译器将当前(私有)方法或者变量在编译时链接到指定的位置的方法或者变量,第一个参数表示当前方法或变量,第二个参数表示目标方法或变量,因为这关指令会破坏系统和包的模块化,因此在使用时必须导入unsafe
Prof
如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
调用go tool pprof http://localhost:3999/debug/pprof/profile
来开始采集数据,
之后输入png就可以生成一个调用图
pprof现在支持加label可以观察时间都耗费在哪里