2020-03-01 16:39:15 -07:00
|
|
|
package telemetry_test
|
2019-12-19 09:57:21 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
stdlog "log"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
2020-03-01 16:39:15 -07:00
|
|
|
"golang.org/x/tools/internal/telemetry"
|
2019-12-20 13:10:23 -07:00
|
|
|
"golang.org/x/tools/internal/telemetry/export"
|
2019-12-19 09:57:21 -07:00
|
|
|
tellog "golang.org/x/tools/internal/telemetry/log"
|
|
|
|
"golang.org/x/tools/internal/telemetry/tag"
|
2020-03-01 16:39:15 -07:00
|
|
|
teltrace "golang.org/x/tools/internal/telemetry/trace"
|
2019-12-19 09:57:21 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
stdlog.SetOutput(new(noopWriter))
|
|
|
|
}
|
|
|
|
|
|
|
|
type noopWriter int
|
|
|
|
|
|
|
|
func (nw *noopWriter) Write(b []byte) (int, error) {
|
|
|
|
return len(b), nil
|
|
|
|
}
|
|
|
|
|
2019-12-20 13:10:23 -07:00
|
|
|
func A(ctx context.Context, a int) int {
|
2019-12-19 09:57:21 -07:00
|
|
|
if a > 0 {
|
|
|
|
_ = 10 * 12
|
|
|
|
}
|
2019-12-20 13:10:23 -07:00
|
|
|
return B(ctx, "Called from A")
|
2019-12-19 09:57:21 -07:00
|
|
|
}
|
|
|
|
|
2019-12-20 13:10:23 -07:00
|
|
|
func B(ctx context.Context, b string) int {
|
2019-12-19 09:57:21 -07:00
|
|
|
b = strings.ToUpper(b)
|
|
|
|
if len(b) > 1024 {
|
|
|
|
b = strings.ToLower(b)
|
|
|
|
}
|
|
|
|
return len(b)
|
|
|
|
}
|
|
|
|
|
|
|
|
func A_log(ctx context.Context, a int) int {
|
|
|
|
if a > 0 {
|
|
|
|
tellog.Print(ctx, "a > 0", tag.Of("a", a))
|
|
|
|
_ = 10 * 12
|
|
|
|
}
|
|
|
|
tellog.Print(ctx, "calling b")
|
|
|
|
return B_log(ctx, "Called from A")
|
|
|
|
}
|
|
|
|
|
|
|
|
func B_log(ctx context.Context, b string) int {
|
|
|
|
b = strings.ToUpper(b)
|
|
|
|
tellog.Print(ctx, "b uppercased, so lowercased", tag.Of("len_b", len(b)))
|
|
|
|
if len(b) > 1024 {
|
|
|
|
b = strings.ToLower(b)
|
|
|
|
tellog.Print(ctx, "b > 1024, so lowercased", tag.Of("b", b))
|
|
|
|
}
|
|
|
|
return len(b)
|
|
|
|
}
|
|
|
|
|
2020-03-01 16:39:15 -07:00
|
|
|
func A_trace(ctx context.Context, a int) int {
|
|
|
|
ctx, done := teltrace.StartSpan(ctx, "A")
|
|
|
|
defer done()
|
|
|
|
if a > 0 {
|
|
|
|
_ = 10 * 12
|
|
|
|
}
|
|
|
|
return B_trace(ctx, "Called from A")
|
|
|
|
}
|
|
|
|
|
|
|
|
func B_trace(ctx context.Context, b string) int {
|
|
|
|
ctx, done := teltrace.StartSpan(ctx, "B")
|
|
|
|
defer done()
|
|
|
|
b = strings.ToUpper(b)
|
|
|
|
if len(b) > 1024 {
|
|
|
|
b = strings.ToLower(b)
|
|
|
|
}
|
|
|
|
return len(b)
|
|
|
|
}
|
2019-12-20 13:10:23 -07:00
|
|
|
func A_log_stdlib(ctx context.Context, a int) int {
|
2019-12-19 09:57:21 -07:00
|
|
|
if a > 0 {
|
|
|
|
stdlog.Printf("a > 0 where a=%d", a)
|
|
|
|
_ = 10 * 12
|
|
|
|
}
|
|
|
|
stdlog.Print("calling b")
|
2019-12-20 13:10:23 -07:00
|
|
|
return B_log_stdlib(ctx, "Called from A")
|
2019-12-19 09:57:21 -07:00
|
|
|
}
|
|
|
|
|
2019-12-20 13:10:23 -07:00
|
|
|
func B_log_stdlib(ctx context.Context, b string) int {
|
2019-12-19 09:57:21 -07:00
|
|
|
b = strings.ToUpper(b)
|
|
|
|
stdlog.Printf("b uppercased, so lowercased where len_b=%d", len(b))
|
|
|
|
if len(b) > 1024 {
|
|
|
|
b = strings.ToLower(b)
|
|
|
|
stdlog.Printf("b > 1024, so lowercased where b=%s", b)
|
|
|
|
}
|
|
|
|
return len(b)
|
|
|
|
}
|
|
|
|
|
2019-12-20 13:10:23 -07:00
|
|
|
var values = []int{0, 10, 20, 100, 1000}
|
|
|
|
|
2020-03-01 16:39:15 -07:00
|
|
|
type loggingExporter struct {
|
|
|
|
logger export.Exporter
|
|
|
|
}
|
|
|
|
|
|
|
|
func newExporter() *loggingExporter {
|
|
|
|
return &loggingExporter{
|
|
|
|
logger: export.LogWriter(new(noopWriter), false),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *loggingExporter) ProcessEvent(ctx context.Context, event telemetry.Event) context.Context {
|
2020-03-01 16:35:55 -07:00
|
|
|
export.ContextSpan(ctx, event)
|
2020-03-01 16:39:15 -07:00
|
|
|
return e.logger.ProcessEvent(ctx, event)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *loggingExporter) Metric(ctx context.Context, data telemetry.MetricData) {
|
|
|
|
e.logger.Metric(ctx, data)
|
|
|
|
}
|
|
|
|
|
2019-12-20 13:10:23 -07:00
|
|
|
func BenchmarkBaseline(b *testing.B) {
|
|
|
|
ctx := context.Background()
|
2019-12-19 09:57:21 -07:00
|
|
|
b.ReportAllocs()
|
2019-12-20 13:10:23 -07:00
|
|
|
b.ResetTimer()
|
2019-12-19 09:57:21 -07:00
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
for _, value := range values {
|
2019-12-20 13:10:23 -07:00
|
|
|
if g := A(ctx, value); g <= 0 {
|
2019-12-19 09:57:21 -07:00
|
|
|
b.Fatalf("Unexpected got g(%d) <= 0", g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkLoggingNoExporter(b *testing.B) {
|
2019-12-20 13:10:23 -07:00
|
|
|
ctx := context.Background()
|
2020-02-05 11:30:35 -07:00
|
|
|
export.SetExporter(nil)
|
2019-12-20 13:10:23 -07:00
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
for _, value := range values {
|
|
|
|
if g := A_log(ctx, value); g <= 0 {
|
|
|
|
b.Fatalf("Unexpected got g(%d) <= 0", g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkLogging(b *testing.B) {
|
|
|
|
ctx := context.Background()
|
2020-03-01 16:39:15 -07:00
|
|
|
export.SetExporter(newExporter())
|
2019-12-19 09:57:21 -07:00
|
|
|
b.ReportAllocs()
|
2019-12-20 13:10:23 -07:00
|
|
|
b.ResetTimer()
|
2019-12-19 09:57:21 -07:00
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
for _, value := range values {
|
2019-12-20 13:10:23 -07:00
|
|
|
if g := A_log(ctx, value); g <= 0 {
|
2019-12-19 09:57:21 -07:00
|
|
|
b.Fatalf("Unexpected got g(%d) <= 0", g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-03-01 16:46:11 -07:00
|
|
|
func BenchmarkTracingNoExporter(b *testing.B) {
|
|
|
|
ctx := context.Background()
|
|
|
|
export.SetExporter(nil)
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
for _, value := range values {
|
|
|
|
if g := A_trace(ctx, value); g <= 0 {
|
|
|
|
b.Fatalf("Unexpected got g(%d) <= 0", g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkTracing(b *testing.B) {
|
|
|
|
ctx := context.Background()
|
|
|
|
export.SetExporter(newExporter())
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
for _, value := range values {
|
|
|
|
if g := A_trace(ctx, value); g <= 0 {
|
|
|
|
b.Fatalf("Unexpected got g(%d) <= 0", g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-12-19 09:57:21 -07:00
|
|
|
|
|
|
|
func BenchmarkLoggingStdlib(b *testing.B) {
|
2019-12-20 13:10:23 -07:00
|
|
|
ctx := context.Background()
|
2019-12-19 09:57:21 -07:00
|
|
|
b.ReportAllocs()
|
2019-12-20 13:10:23 -07:00
|
|
|
b.ResetTimer()
|
2019-12-19 09:57:21 -07:00
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
for _, value := range values {
|
2019-12-20 13:10:23 -07:00
|
|
|
if g := A_log_stdlib(ctx, value); g <= 0 {
|
2019-12-19 09:57:21 -07:00
|
|
|
b.Fatalf("Unexpected got g(%d) <= 0", g)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|