command.go 2.0 KB

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