|
|
@@ -31,7 +31,9 @@ const (
|
|
|
goRunqget = "runtime.runqget"
|
|
|
goServeHTTP = "net/http.serverHandler.ServeHTTP"
|
|
|
goTransport = "net/http.(*Transport).roundTrip"
|
|
|
+ goGrpcServerHandleStream = "google.golang.org/grpc.(*Server).handleStream"
|
|
|
goGrpcHttp2OperateHeader = "google.golang.org/grpc/internal/transport.(*http2Server).operateHeaders"
|
|
|
+ goGrpcServerWritestatus = "google.golang.org/grpc/internal/transport.(*http2Server).writeStatus"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
@@ -295,7 +297,7 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32, appInfo *AppInfo, codeType uint1
|
|
|
}
|
|
|
switch s.Name {
|
|
|
case goTlsWriteSymbol, goTlsReadSymbol:
|
|
|
- case goExecute, goNewproc1, goRunqget, goServeHTTP, goTransport, goGrpcHttp2OperateHeader:
|
|
|
+ case goExecute, goNewproc1, goRunqget, goServeHTTP, goTransport, goGrpcHttp2OperateHeader,goGrpcServerHandleStream:
|
|
|
default:
|
|
|
continue
|
|
|
}
|
|
|
@@ -385,26 +387,42 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32, appInfo *AppInfo, codeType uint1
|
|
|
}
|
|
|
klog.Infoln("goGrpcHttp2OperateHeader ok")
|
|
|
links = append(links, l)
|
|
|
- // sStart := s.Value - textSection.Addr
|
|
|
- // sEnd := sStart + s.Size
|
|
|
- // if sEnd > textSectionLen {
|
|
|
- // continue
|
|
|
- // }
|
|
|
- // sBytes := textSectionData[sStart:sEnd]
|
|
|
- // returnOffsets := getReturnOffsets(ef.Machine, sBytes)
|
|
|
- // if len(returnOffsets) == 0 {
|
|
|
- // err = fmt.Errorf("failed to attach uprobe_http2Server_operateHeader no return offsets found")
|
|
|
- // klog.Errorln(err)
|
|
|
- // return nil, err
|
|
|
- // }
|
|
|
- // for _, offset := range returnOffsets {
|
|
|
- // l, err := exe.Uprobe(s.Name, t.uprobes["uprobe_HandlerFunc_ServeHTTP_Returns"], &link.UprobeOptions{Address: address, Offset: uint64(offset)})
|
|
|
- // if err != nil {
|
|
|
- // klog.WithError(err).Errorln(fmt.Errorf("failed to attach exit_runtime_newproc1 uprobe"))
|
|
|
- // return nil, err
|
|
|
- // }
|
|
|
- // links = append(links, l)
|
|
|
- // }
|
|
|
+ case goGrpcServerWritestatus:
|
|
|
+ l, err := exe.Uprobe(s.Name, t.uprobes["uprobe_http2Server_WriteStatus2"], &link.UprobeOptions{Address: address})
|
|
|
+ if err != nil {
|
|
|
+ klog.WithError(err).Errorln("failed to attach uprobe_http2Server_WriteStatus2 uprobe")
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ klog.Infoln("google.golang.org/grpc/internal/transport.(*http2Server).writeStatus ok")
|
|
|
+ links = append(links, l)
|
|
|
+ case goGrpcServerHandleStream:
|
|
|
+ l, err := exe.Uprobe(s.Name, t.uprobes["uprobe_server_handleStream2"], &link.UprobeOptions{Address: address})
|
|
|
+ if err != nil {
|
|
|
+ klog.WithError(err).Errorln("failed to attach uprobe_server_handleStream2 uprobe")
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ klog.Infoln("google.golang.org/grpc.(*Server).handleStream ok")
|
|
|
+ links = append(links, l)
|
|
|
+ sStart := s.Value - textSection.Addr
|
|
|
+ sEnd := sStart + s.Size
|
|
|
+ if sEnd > textSectionLen {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ sBytes := textSectionData[sStart:sEnd]
|
|
|
+ returnOffsets := getReturnOffsets(ef.Machine, sBytes)
|
|
|
+ if len(returnOffsets) == 0 {
|
|
|
+ err = fmt.Errorf("failed to attach uprobe_server_handleStream2 no return offsets found")
|
|
|
+ klog.Errorln(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ for _, offset := range returnOffsets {
|
|
|
+ l, err := exe.Uprobe(s.Name, t.uprobes["uprobe_server_handleStream2_Returns"], &link.UprobeOptions{Address: address, Offset: uint64(offset)})
|
|
|
+ if err != nil {
|
|
|
+ klog.WithError(err).Errorln(fmt.Errorf("failed to attach exit_runtime_newproc1 uprobe"))
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ links = append(links, l)
|
|
|
+ }
|
|
|
case goServeHTTP:
|
|
|
l, err := exe.Uprobe(s.Name, t.uprobes["uprobe_HandlerFunc_ServeHTTP"], &link.UprobeOptions{Address: address})
|
|
|
if err != nil {
|