1
0

metrics_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package scenarios
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "testing"
  8. "github.com/xtls/xray-core/app/metrics"
  9. "github.com/xtls/xray-core/app/proxyman"
  10. "github.com/xtls/xray-core/app/router"
  11. "github.com/xtls/xray-core/common"
  12. "github.com/xtls/xray-core/common/net"
  13. "github.com/xtls/xray-core/common/serial"
  14. "github.com/xtls/xray-core/core"
  15. "github.com/xtls/xray-core/proxy/dokodemo"
  16. "github.com/xtls/xray-core/proxy/freedom"
  17. "github.com/xtls/xray-core/testing/servers/tcp"
  18. )
  19. const expectedMessage = "goroutine profile: total"
  20. func TestMetrics(t *testing.T) {
  21. tcpServer := tcp.Server{
  22. MsgProcessor: xor,
  23. }
  24. dest, err := tcpServer.Start()
  25. common.Must(err)
  26. defer tcpServer.Close()
  27. metricsPort := tcp.PickPort()
  28. clientConfig := &core.Config{
  29. App: []*serial.TypedMessage{
  30. serial.ToTypedMessage(&metrics.Config{
  31. Tag: "metrics_out",
  32. }),
  33. serial.ToTypedMessage(&router.Config{
  34. Rule: []*router.RoutingRule{
  35. {
  36. InboundTag: []string{"metrics_in"},
  37. TargetTag: &router.RoutingRule_Tag{
  38. Tag: "metrics_out",
  39. },
  40. },
  41. },
  42. }),
  43. },
  44. Inbound: []*core.InboundHandlerConfig{
  45. {
  46. Tag: "metrics_in",
  47. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  48. PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(metricsPort)}},
  49. Listen: net.NewIPOrDomain(net.LocalHostIP),
  50. }),
  51. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  52. Address: net.NewIPOrDomain(dest.Address),
  53. Port: uint32(dest.Port),
  54. Networks: []net.Network{net.Network_TCP},
  55. }),
  56. },
  57. },
  58. Outbound: []*core.OutboundHandlerConfig{
  59. {
  60. Tag: "default-outbound",
  61. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  62. },
  63. },
  64. }
  65. servers, err := InitializeServerConfigs(clientConfig)
  66. common.Must(err)
  67. defer CloseAllServers(servers)
  68. resp, err := http.Get(fmt.Sprintf("http://127.0.0.1:%d/debug/pprof/goroutine?debug=1", metricsPort))
  69. common.Must(err)
  70. if resp == nil {
  71. t.Error("unexpected pprof nil response")
  72. }
  73. if resp.StatusCode != http.StatusOK {
  74. t.Error("unexpected pprof status code")
  75. }
  76. body, err := ioutil.ReadAll(resp.Body)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. if string(body)[0:len(expectedMessage)] != expectedMessage {
  81. t.Error("unexpected response body from pprof handler")
  82. }
  83. resp2, err2 := http.Get(fmt.Sprintf("http://127.0.0.1:%d/debug/vars", metricsPort))
  84. common.Must(err2)
  85. if resp2 == nil {
  86. t.Error("unexpected expvars nil response")
  87. }
  88. if resp2.StatusCode != http.StatusOK {
  89. t.Error("unexpected expvars status code")
  90. }
  91. body2, err2 := ioutil.ReadAll(resp2.Body)
  92. if err2 != nil {
  93. t.Fatal(err2)
  94. }
  95. var json2 map[string]interface{}
  96. if json.Unmarshal(body2, &json2) != nil {
  97. t.Error("unexpected response body from expvars handler")
  98. }
  99. }