hook_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package redis
  2. import (
  3. "context"
  4. "log"
  5. "strings"
  6. "testing"
  7. "time"
  8. red "github.com/go-redis/redis/v8"
  9. "github.com/stretchr/testify/assert"
  10. ztrace "github.com/zeromicro/go-zero/core/trace"
  11. tracesdk "go.opentelemetry.io/otel/trace"
  12. )
  13. func TestHookProcessCase1(t *testing.T) {
  14. ztrace.StartAgent(ztrace.Config{
  15. Name: "go-zero-test",
  16. Endpoint: "http://localhost:14268/api/traces",
  17. Batcher: "jaeger",
  18. Sampler: 1.0,
  19. })
  20. writer := log.Writer()
  21. var buf strings.Builder
  22. log.SetOutput(&buf)
  23. defer log.SetOutput(writer)
  24. ctx, err := durationHook.BeforeProcess(context.Background(), nil)
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. assert.Nil(t, durationHook.AfterProcess(ctx, red.NewCmd(context.Background())))
  29. assert.False(t, strings.Contains(buf.String(), "slow"))
  30. assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name())
  31. }
  32. func TestHookProcessCase2(t *testing.T) {
  33. ztrace.StartAgent(ztrace.Config{
  34. Name: "go-zero-test",
  35. Endpoint: "http://localhost:14268/api/traces",
  36. Batcher: "jaeger",
  37. Sampler: 1.0,
  38. })
  39. writer := log.Writer()
  40. var buf strings.Builder
  41. log.SetOutput(&buf)
  42. defer log.SetOutput(writer)
  43. ctx, err := durationHook.BeforeProcess(context.Background(), nil)
  44. if err != nil {
  45. t.Fatal(err)
  46. }
  47. assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name())
  48. time.Sleep(slowThreshold.Load() + time.Millisecond)
  49. assert.Nil(t, durationHook.AfterProcess(ctx, red.NewCmd(context.Background(), "foo", "bar")))
  50. assert.True(t, strings.Contains(buf.String(), "slow"))
  51. assert.True(t, strings.Contains(buf.String(), "trace"))
  52. assert.True(t, strings.Contains(buf.String(), "span"))
  53. }
  54. func TestHookProcessCase3(t *testing.T) {
  55. writer := log.Writer()
  56. var buf strings.Builder
  57. log.SetOutput(&buf)
  58. defer log.SetOutput(writer)
  59. assert.Nil(t, durationHook.AfterProcess(context.Background(), red.NewCmd(context.Background())))
  60. assert.True(t, buf.Len() == 0)
  61. }
  62. func TestHookProcessCase4(t *testing.T) {
  63. writer := log.Writer()
  64. var buf strings.Builder
  65. log.SetOutput(&buf)
  66. defer log.SetOutput(writer)
  67. ctx := context.WithValue(context.Background(), startTimeKey, "foo")
  68. assert.Nil(t, durationHook.AfterProcess(ctx, red.NewCmd(context.Background())))
  69. assert.True(t, buf.Len() == 0)
  70. }
  71. func TestHookProcessPipelineCase1(t *testing.T) {
  72. writer := log.Writer()
  73. var buf strings.Builder
  74. log.SetOutput(&buf)
  75. defer log.SetOutput(writer)
  76. ctx, err := durationHook.BeforeProcessPipeline(context.Background(), nil)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name())
  81. assert.Nil(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{
  82. red.NewCmd(context.Background()),
  83. }))
  84. assert.False(t, strings.Contains(buf.String(), "slow"))
  85. }
  86. func TestHookProcessPipelineCase2(t *testing.T) {
  87. ztrace.StartAgent(ztrace.Config{
  88. Name: "go-zero-test",
  89. Endpoint: "http://localhost:14268/api/traces",
  90. Batcher: "jaeger",
  91. Sampler: 1.0,
  92. })
  93. writer := log.Writer()
  94. var buf strings.Builder
  95. log.SetOutput(&buf)
  96. defer log.SetOutput(writer)
  97. ctx, err := durationHook.BeforeProcessPipeline(context.Background(), nil)
  98. if err != nil {
  99. t.Fatal(err)
  100. }
  101. assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name())
  102. time.Sleep(slowThreshold.Load() + time.Millisecond)
  103. assert.Nil(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{
  104. red.NewCmd(context.Background(), "foo", "bar"),
  105. }))
  106. assert.True(t, strings.Contains(buf.String(), "slow"))
  107. assert.True(t, strings.Contains(buf.String(), "trace"))
  108. assert.True(t, strings.Contains(buf.String(), "span"))
  109. }
  110. func TestHookProcessPipelineCase3(t *testing.T) {
  111. writer := log.Writer()
  112. var buf strings.Builder
  113. log.SetOutput(&buf)
  114. defer log.SetOutput(writer)
  115. assert.Nil(t, durationHook.AfterProcessPipeline(context.Background(), []red.Cmder{
  116. red.NewCmd(context.Background()),
  117. }))
  118. assert.True(t, buf.Len() == 0)
  119. }
  120. func TestHookProcessPipelineCase4(t *testing.T) {
  121. writer := log.Writer()
  122. var buf strings.Builder
  123. log.SetOutput(&buf)
  124. defer log.SetOutput(writer)
  125. ctx := context.WithValue(context.Background(), startTimeKey, "foo")
  126. assert.Nil(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{
  127. red.NewCmd(context.Background()),
  128. }))
  129. assert.True(t, buf.Len() == 0)
  130. }
  131. func TestHookProcessPipelineCase5(t *testing.T) {
  132. writer := log.Writer()
  133. var buf strings.Builder
  134. log.SetOutput(&buf)
  135. defer log.SetOutput(writer)
  136. ctx := context.WithValue(context.Background(), startTimeKey, "foo")
  137. assert.Nil(t, durationHook.AfterProcessPipeline(ctx, nil))
  138. assert.True(t, buf.Len() == 0)
  139. }