tracelogger_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package logx
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "strings"
  7. "sync/atomic"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. "go.opentelemetry.io/otel"
  12. sdktrace "go.opentelemetry.io/otel/sdk/trace"
  13. )
  14. func TestTraceLog(t *testing.T) {
  15. SetLevel(InfoLevel)
  16. w := new(mockWriter)
  17. old := writer.Swap(w)
  18. defer writer.Store(old)
  19. otp := otel.GetTracerProvider()
  20. tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()))
  21. otel.SetTracerProvider(tp)
  22. defer otel.SetTracerProvider(otp)
  23. ctx, _ := tp.Tracer("foo").Start(context.Background(), "bar")
  24. WithContext(ctx).Info(testlog)
  25. validate(t, w.String(), true, true)
  26. }
  27. func TestTraceError(t *testing.T) {
  28. w := new(mockWriter)
  29. old := writer.Swap(w)
  30. defer writer.Store(old)
  31. otp := otel.GetTracerProvider()
  32. tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()))
  33. otel.SetTracerProvider(tp)
  34. defer otel.SetTracerProvider(otp)
  35. l := WithContext(context.Background())
  36. ctx, _ := tp.Tracer("foo").Start(context.Background(), "bar")
  37. var nilCtx context.Context
  38. l = l.WithContext(nilCtx)
  39. l = l.WithContext(ctx)
  40. SetLevel(InfoLevel)
  41. l.WithDuration(time.Second).Error(testlog)
  42. validate(t, w.String(), true, true)
  43. w.Reset()
  44. l.WithDuration(time.Second).Errorf(testlog)
  45. validate(t, w.String(), true, true)
  46. w.Reset()
  47. l.WithDuration(time.Second).Errorv(testlog)
  48. fmt.Println(w.String())
  49. validate(t, w.String(), true, true)
  50. w.Reset()
  51. l.WithDuration(time.Second).Errorw(testlog, Field("foo", "bar"))
  52. validate(t, w.String(), true, true)
  53. assert.True(t, strings.Contains(w.String(), "foo"), w.String())
  54. assert.True(t, strings.Contains(w.String(), "bar"), w.String())
  55. }
  56. func TestTraceInfo(t *testing.T) {
  57. w := new(mockWriter)
  58. old := writer.Swap(w)
  59. defer writer.Store(old)
  60. otp := otel.GetTracerProvider()
  61. tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()))
  62. otel.SetTracerProvider(tp)
  63. defer otel.SetTracerProvider(otp)
  64. ctx, _ := tp.Tracer("foo").Start(context.Background(), "bar")
  65. l := WithContext(ctx)
  66. SetLevel(InfoLevel)
  67. l.WithDuration(time.Second).Info(testlog)
  68. validate(t, w.String(), true, true)
  69. w.Reset()
  70. l.WithDuration(time.Second).Infof(testlog)
  71. validate(t, w.String(), true, true)
  72. w.Reset()
  73. l.WithDuration(time.Second).Infov(testlog)
  74. validate(t, w.String(), true, true)
  75. w.Reset()
  76. l.WithDuration(time.Second).Infow(testlog, Field("foo", "bar"))
  77. validate(t, w.String(), true, true)
  78. assert.True(t, strings.Contains(w.String(), "foo"), w.String())
  79. assert.True(t, strings.Contains(w.String(), "bar"), w.String())
  80. }
  81. func TestTraceInfoConsole(t *testing.T) {
  82. old := atomic.LoadUint32(&encoding)
  83. atomic.StoreUint32(&encoding, jsonEncodingType)
  84. defer func() {
  85. atomic.StoreUint32(&encoding, old)
  86. }()
  87. w := new(mockWriter)
  88. o := writer.Swap(w)
  89. defer writer.Store(o)
  90. otp := otel.GetTracerProvider()
  91. tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()))
  92. otel.SetTracerProvider(tp)
  93. defer otel.SetTracerProvider(otp)
  94. ctx, _ := tp.Tracer("foo").Start(context.Background(), "bar")
  95. l := WithContext(ctx)
  96. SetLevel(InfoLevel)
  97. l.WithDuration(time.Second).Info(testlog)
  98. validate(t, w.String(), true, true)
  99. w.Reset()
  100. l.WithDuration(time.Second).Infof(testlog)
  101. validate(t, w.String(), true, true)
  102. w.Reset()
  103. l.WithDuration(time.Second).Infov(testlog)
  104. validate(t, w.String(), true, true)
  105. }
  106. func TestTraceSlow(t *testing.T) {
  107. w := new(mockWriter)
  108. old := writer.Swap(w)
  109. defer writer.Store(old)
  110. otp := otel.GetTracerProvider()
  111. tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()))
  112. otel.SetTracerProvider(tp)
  113. defer otel.SetTracerProvider(otp)
  114. ctx, _ := tp.Tracer("foo").Start(context.Background(), "bar")
  115. l := WithContext(ctx)
  116. SetLevel(InfoLevel)
  117. l.WithDuration(time.Second).Slow(testlog)
  118. assert.True(t, strings.Contains(w.String(), traceKey))
  119. assert.True(t, strings.Contains(w.String(), spanKey))
  120. w.Reset()
  121. l.WithDuration(time.Second).Slowf(testlog)
  122. fmt.Println("buf:", w.String())
  123. validate(t, w.String(), true, true)
  124. w.Reset()
  125. l.WithDuration(time.Second).Slowv(testlog)
  126. validate(t, w.String(), true, true)
  127. w.Reset()
  128. l.WithDuration(time.Second).Sloww(testlog, Field("foo", "bar"))
  129. validate(t, w.String(), true, true)
  130. assert.True(t, strings.Contains(w.String(), "foo"), w.String())
  131. assert.True(t, strings.Contains(w.String(), "bar"), w.String())
  132. }
  133. func TestTraceWithoutContext(t *testing.T) {
  134. w := new(mockWriter)
  135. old := writer.Swap(w)
  136. defer writer.Store(old)
  137. l := WithContext(context.Background())
  138. SetLevel(InfoLevel)
  139. l.WithDuration(time.Second).Info(testlog)
  140. validate(t, w.String(), false, false)
  141. w.Reset()
  142. l.WithDuration(time.Second).Infof(testlog)
  143. validate(t, w.String(), false, false)
  144. }
  145. func validate(t *testing.T, body string, expectedTrace, expectedSpan bool) {
  146. var val mockValue
  147. assert.Nil(t, json.Unmarshal([]byte(body), &val))
  148. assert.Equal(t, expectedTrace, len(val.Trace) > 0)
  149. assert.Equal(t, expectedSpan, len(val.Span) > 0)
  150. }
  151. type mockValue struct {
  152. Trace string `json:"trace"`
  153. Span string `json:"span"`
  154. }