内置Trace

grpc内置了客户端和服务端的请求追踪,基于golang.org/x/net/trace包实现,默认是开启状态,可以查看事件和请求日志,对于基本的请求状态查看调试也是很有帮助的,客户端与服务端基本一致,这里以服务端开启trace server为例,修改hello项目服务端代码:

目录结构

  1. |—— hello_trace/
  2. |—— client/
  3. |—— main.go // 客户端
  4. |—— server/
  5. |—— main.go // 服务端
  6. |—— proto/
  7. |—— hello/
  8. |—— hello.proto // proto描述文件
  9. |—— hello.pb.go // proto编译后文件

示例代码

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "net/http"
  6. pb "github.com/jergoo/go-grpc-example/proto/hello" // 引入编译生成的包
  7. "golang.org/x/net/context"
  8. "golang.org/x/net/trace"
  9. "google.golang.org/grpc"
  10. "google.golang.org/grpc/grpclog"
  11. )
  12. const (
  13. // Address gRPC服务地址
  14. Address = "127.0.0.1:50052"
  15. )
  16. // 定义helloService并实现约定的接口
  17. type helloService struct{}
  18. // HelloService Hello服务
  19. var HelloService = helloService{}
  20. // SayHello 实现Hello服务接口
  21. func (h helloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
  22. resp := new(pb.HelloResponse)
  23. resp.Message = fmt.Sprintf("Hello %s.", in.Name)
  24. return resp, nil
  25. }
  26. func main() {
  27. listen, err := net.Listen("tcp", Address)
  28. if err != nil {
  29. grpclog.Fatalf("failed to listen: %v", err)
  30. }
  31. // 实例化grpc Server
  32. s := grpc.NewServer()
  33. // 注册HelloService
  34. pb.RegisterHelloServer(s, HelloService)
  35. // 开启trace
  36. go startTrace()
  37. grpclog.Println("Listen on " + Address)
  38. s.Serve(listen)
  39. }
  40. func startTrace() {
  41. trace.AuthRequest = func(req *http.Request) (any, sensitive bool) {
  42. return true, true
  43. }
  44. go http.ListenAndServe(":50051", nil)
  45. grpclog.Println("Trace listen on 50051")
  46. }

这里我们开启一个http服务监听50051端口,用来查看grpc请求的trace信息

运行:

  1. $ go run main.go
  2. Listen on 127.0.0.1:50052
  3. Trace listen on 50051
  4. # 进入client目录执行一次客户端请求

服务端事件查看

访问:localhost:50051/debug/events,结果如图:

内置Trace - 图1

可以看到服务端注册的服务和服务正常启动的事件信息。

请求日志信息查看

访问:localhost:50051/debug/requests,结果如图:

内置Trace - 图2

这里可以显示最近的请求状态,包括请求的服务、参数、耗时、响应,对于简单的状态查看还是很方便的,默认值显示最近10条记录。