client.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "sync"
  8. "time"
  9. "github.com/tal-tech/go-zero/core/lang"
  10. "github.com/tal-tech/go-zero/core/threading"
  11. "gopkg.in/cheggaaa/pb.v1"
  12. )
  13. var (
  14. freq = flag.Int("freq", 100, "frequence")
  15. duration = flag.String("duration", "10s", "duration")
  16. )
  17. type (
  18. counting struct {
  19. ok int
  20. fail int
  21. reject int
  22. errs int
  23. unknown int
  24. }
  25. metric struct {
  26. counting
  27. lock sync.Mutex
  28. }
  29. )
  30. func (m *metric) addOk() {
  31. m.lock.Lock()
  32. m.ok++
  33. m.lock.Unlock()
  34. }
  35. func (m *metric) addFail() {
  36. m.lock.Lock()
  37. m.ok++
  38. m.lock.Unlock()
  39. }
  40. func (m *metric) addReject() {
  41. m.lock.Lock()
  42. m.ok++
  43. m.lock.Unlock()
  44. }
  45. func (m *metric) addErrs() {
  46. m.lock.Lock()
  47. m.errs++
  48. m.lock.Unlock()
  49. }
  50. func (m *metric) addUnknown() {
  51. m.lock.Lock()
  52. m.unknown++
  53. m.lock.Unlock()
  54. }
  55. func (m *metric) reset() counting {
  56. m.lock.Lock()
  57. result := counting{
  58. ok: m.ok,
  59. fail: m.fail,
  60. reject: m.reject,
  61. errs: m.errs,
  62. unknown: m.unknown,
  63. }
  64. m.ok = 0
  65. m.fail = 0
  66. m.reject = 0
  67. m.errs = 0
  68. m.unknown = 0
  69. m.lock.Unlock()
  70. return result
  71. }
  72. func runRequests(url string, frequence int, metrics *metric, done <-chan lang.PlaceholderType) {
  73. ticker := time.NewTicker(time.Second / time.Duration(frequence))
  74. defer ticker.Stop()
  75. for {
  76. select {
  77. case <-ticker.C:
  78. go func() {
  79. resp, err := http.Get(url)
  80. if err != nil {
  81. metrics.addErrs()
  82. return
  83. }
  84. defer resp.Body.Close()
  85. switch resp.StatusCode {
  86. case http.StatusOK:
  87. metrics.addOk()
  88. case http.StatusInternalServerError:
  89. metrics.addFail()
  90. case http.StatusServiceUnavailable:
  91. metrics.addReject()
  92. default:
  93. metrics.addUnknown()
  94. }
  95. }()
  96. case <-done:
  97. return
  98. }
  99. }
  100. }
  101. func main() {
  102. flag.Parse()
  103. fp, err := os.Create("result.csv")
  104. lang.Must(err)
  105. defer fp.Close()
  106. fmt.Fprintln(fp, "seconds,goodOk,goodFail,goodReject,goodErrs,goodUnknowns,goodDropRatio,"+
  107. "heavyOk,heavyFail,heavyReject,heavyErrs,heavyUnknowns,heavyDropRatio")
  108. var gm, hm metric
  109. dur, err := time.ParseDuration(*duration)
  110. lang.Must(err)
  111. done := make(chan lang.PlaceholderType)
  112. group := threading.NewRoutineGroup()
  113. group.RunSafe(func() {
  114. runRequests("http://localhost:8080/heavy", *freq, &hm, done)
  115. })
  116. group.RunSafe(func() {
  117. runRequests("http://localhost:8080/good", *freq, &gm, done)
  118. })
  119. go func() {
  120. ticker := time.NewTicker(time.Second)
  121. defer ticker.Stop()
  122. var seconds int
  123. for range ticker.C {
  124. seconds++
  125. g := gm.reset()
  126. h := hm.reset()
  127. fmt.Fprintf(fp, "%d,%d,%d,%d,%d,%d,%.1f,%d,%d,%d,%d,%d,%.1f\n",
  128. seconds, g.ok, g.fail, g.reject, g.errs, g.unknown,
  129. float32(g.reject)/float32(g.ok+g.fail+g.reject+g.unknown),
  130. h.ok, h.fail, h.reject, h.errs, h.unknown,
  131. float32(h.reject)/float32(h.ok+h.fail+h.reject+h.unknown))
  132. }
  133. }()
  134. go func() {
  135. bar := pb.New(int(dur / time.Second)).Start()
  136. ticker := time.NewTicker(time.Second)
  137. defer ticker.Stop()
  138. for range ticker.C {
  139. bar.Increment()
  140. }
  141. bar.Finish()
  142. }()
  143. <-time.After(dur)
  144. close(done)
  145. group.Wait()
  146. time.Sleep(time.Millisecond * 900)
  147. }