command.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. feature_stats "v2ray.com/core/features/stats"
  11. )
  12. // statsServer is an implementation of StatsService.
  13. type statsServer struct {
  14. stats feature_stats.Manager
  15. }
  16. func NewStatsServer(manager feature_stats.Manager) StatsServiceServer {
  17. return &statsServer{stats: manager}
  18. }
  19. func (s *statsServer) GetStats(ctx context.Context, request *GetStatsRequest) (*GetStatsResponse, error) {
  20. c := s.stats.GetCounter(request.Name)
  21. if c == nil {
  22. return nil, newError(request.Name, " not found.")
  23. }
  24. var value int64
  25. if request.Reset_ {
  26. value = c.Set(0)
  27. } else {
  28. value = c.Value()
  29. }
  30. return &GetStatsResponse{
  31. Stat: &Stat{
  32. Name: request.Name,
  33. Value: value,
  34. },
  35. }, nil
  36. }
  37. func (s *statsServer) QueryStats(ctx context.Context, request *QueryStatsRequest) (*QueryStatsResponse, error) {
  38. matcher, err := strmatcher.Substr.New(request.Pattern)
  39. if err != nil {
  40. return nil, err
  41. }
  42. response := &QueryStatsResponse{}
  43. manager, ok := s.stats.(*stats.Manager)
  44. if !ok {
  45. return nil, newError("QueryStats only works its own stats.Manager.")
  46. }
  47. manager.Visit(func(name string, c feature_stats.Counter) bool {
  48. if matcher.Match(name) {
  49. var value int64
  50. if request.Reset_ {
  51. value = c.Set(0)
  52. } else {
  53. value = c.Value()
  54. }
  55. response.Stat = append(response.Stat, &Stat{
  56. Name: name,
  57. Value: value,
  58. })
  59. }
  60. return true
  61. })
  62. return response, nil
  63. }
  64. type service struct {
  65. statsManager feature_stats.Manager
  66. }
  67. func (s *service) Register(server *grpc.Server) {
  68. RegisterStatsServiceServer(server, NewStatsServer(s.statsManager))
  69. }
  70. func init() {
  71. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) {
  72. s := new(service)
  73. core.RequireFeatures(ctx, func(sm feature_stats.Manager) {
  74. s.statsManager = sm
  75. })
  76. return s, nil
  77. }))
  78. }