command.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package command
  2. //go:generate errorgen
  3. import (
  4. "context"
  5. grpc "google.golang.org/grpc"
  6. "v2ray.com/core"
  7. "v2ray.com/core/app/stats"
  8. "v2ray.com/core/common"
  9. "v2ray.com/core/common/strmatcher"
  10. )
  11. // statsServer is an implementation of StatsService.
  12. type statsServer struct {
  13. stats core.StatManager
  14. }
  15. func NewStatsServer(manager core.StatManager) StatsServiceServer {
  16. return &statsServer{stats: manager}
  17. }
  18. func (s *statsServer) GetStats(ctx context.Context, request *GetStatsRequest) (*GetStatsResponse, error) {
  19. c := s.stats.GetCounter(request.Name)
  20. if c == nil {
  21. return nil, newError(request.Name, " not found.")
  22. }
  23. var value int64
  24. if request.Reset_ {
  25. value = c.Set(0)
  26. } else {
  27. value = c.Value()
  28. }
  29. return &GetStatsResponse{
  30. Stat: &Stat{
  31. Name: request.Name,
  32. Value: value,
  33. },
  34. }, nil
  35. }
  36. func (s *statsServer) QueryStats(ctx context.Context, request *QueryStatsRequest) (*QueryStatsResponse, error) {
  37. matcher, err := strmatcher.Substr.New(request.Pattern)
  38. if err != nil {
  39. return nil, err
  40. }
  41. response := &QueryStatsResponse{}
  42. manager, ok := s.stats.(*stats.Manager)
  43. if !ok {
  44. return nil, newError("QueryStats only works its own stats.Manager.")
  45. }
  46. manager.Visit(func(name string, c core.StatCounter) bool {
  47. if matcher.Match(name) {
  48. var value int64
  49. if request.Reset_ {
  50. value = c.Set(0)
  51. } else {
  52. value = c.Value()
  53. }
  54. response.Stat = append(response.Stat, &Stat{
  55. Name: name,
  56. Value: value,
  57. })
  58. }
  59. return true
  60. })
  61. return response, nil
  62. }
  63. type service struct {
  64. v *core.Instance
  65. }
  66. func (s *service) Register(server *grpc.Server) {
  67. RegisterStatsServiceServer(server, NewStatsServer(s.v.Stats()))
  68. }
  69. func init() {
  70. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) {
  71. s := core.MustFromContext(ctx)
  72. return &service{v: s}, nil
  73. }))
  74. }