Skip to content

Commit 62abcc1

Browse files
committed
internal/telemetry: change Exporter to be a function type.
Change-Id: Id410da20310baf4da6875de08e4449c7a6fb0250 Reviewed-on: https://go-review.googlesource.com/c/tools/+/224277 Run-TryBot: Ian Cottrell <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Emmanuel Odeke <[email protected]>
1 parent 1fc30e1 commit 62abcc1

File tree

5 files changed

+43
-60
lines changed

5 files changed

+43
-60
lines changed

internal/lsp/debug/serve.go

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ import (
3636
"golang.org/x/tools/internal/telemetry/export/prometheus"
3737
)
3838

39-
type exporter struct {
40-
stderr io.Writer
41-
}
42-
4339
type instanceKeyType int
4440

4541
const instanceKey = instanceKeyType(0)
@@ -387,9 +383,7 @@ func getMemory(r *http.Request) interface{} {
387383
}
388384

389385
func init() {
390-
event.SetExporter(&exporter{
391-
stderr: os.Stderr,
392-
})
386+
event.SetExporter(makeExporter(os.Stderr))
393387
}
394388

395389
func GetInstance(ctx context.Context) *Instance {
@@ -545,31 +539,33 @@ func (i *Instance) writeMemoryDebug(threshold uint64) error {
545539
return nil
546540
}
547541

548-
func (e *exporter) ProcessEvent(ctx context.Context, ev event.Event) (context.Context, event.Event) {
549-
ctx, ev = export.ContextSpan(ctx, ev)
550-
i := GetInstance(ctx)
551-
if ev.IsLog() && (ev.Error != nil || i == nil) {
552-
fmt.Fprintf(e.stderr, "%v\n", ev)
553-
}
554-
ctx, ev = protocol.LogEvent(ctx, ev)
555-
if i == nil {
542+
func makeExporter(stderr io.Writer) event.Exporter {
543+
return func(ctx context.Context, ev event.Event) (context.Context, event.Event) {
544+
ctx, ev = export.ContextSpan(ctx, ev)
545+
i := GetInstance(ctx)
546+
if ev.IsLog() && (ev.Error != nil || i == nil) {
547+
fmt.Fprintf(stderr, "%v\n", ev)
548+
}
549+
ctx, ev = protocol.LogEvent(ctx, ev)
550+
if i == nil {
551+
return ctx, ev
552+
}
553+
ctx, ev = export.Tag(ctx, ev)
554+
ctx, ev = i.metrics.ProcessEvent(ctx, ev)
555+
if i.ocagent != nil {
556+
ctx, ev = i.ocagent.ProcessEvent(ctx, ev)
557+
}
558+
if i.prometheus != nil {
559+
ctx, ev = i.prometheus.ProcessEvent(ctx, ev)
560+
}
561+
if i.rpcs != nil {
562+
ctx, ev = i.rpcs.ProcessEvent(ctx, ev)
563+
}
564+
if i.traces != nil {
565+
ctx, ev = i.traces.ProcessEvent(ctx, ev)
566+
}
556567
return ctx, ev
557568
}
558-
ctx, ev = export.Tag(ctx, ev)
559-
ctx, ev = i.metrics.ProcessEvent(ctx, ev)
560-
if i.ocagent != nil {
561-
ctx, ev = i.ocagent.ProcessEvent(ctx, ev)
562-
}
563-
if i.prometheus != nil {
564-
ctx, ev = i.prometheus.ProcessEvent(ctx, ev)
565-
}
566-
if i.rpcs != nil {
567-
ctx, ev = i.rpcs.ProcessEvent(ctx, ev)
568-
}
569-
if i.traces != nil {
570-
ctx, ev = i.traces.ProcessEvent(ctx, ev)
571-
}
572-
return ctx, ev
573569
}
574570

575571
type dataFunc func(*http.Request) interface{}

internal/telemetry/bench_test.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func Benchmark(b *testing.B) {
9595
b.Run("TraceNoExporter", Trace.runBenchmark)
9696
b.Run("StatsNoExporter", Stats.runBenchmark)
9797

98-
event.SetExporter(newExporter())
98+
event.SetExporter(noopExporter)
9999
b.Run("Log", Log.runBenchmark)
100100
b.Run("Trace", Trace.runBenchmark)
101101
b.Run("Stats", Stats.runBenchmark)
@@ -142,17 +142,9 @@ func (nw *noopWriter) Write(b []byte) (int, error) {
142142
return len(b), nil
143143
}
144144

145-
type loggingExporter struct {
146-
logger event.Exporter
147-
}
148-
149-
func newExporter() *loggingExporter {
150-
return &loggingExporter{
151-
logger: export.LogWriter(new(noopWriter), false),
152-
}
153-
}
145+
var noopLogger = export.LogWriter(new(noopWriter), false)
154146

155-
func (e *loggingExporter) ProcessEvent(ctx context.Context, ev event.Event) (context.Context, event.Event) {
147+
func noopExporter(ctx context.Context, ev event.Event) (context.Context, event.Event) {
156148
ctx, ev = export.ContextSpan(ctx, ev)
157-
return e.logger.ProcessEvent(ctx, ev)
149+
return noopLogger(ctx, ev)
158150
}

internal/telemetry/event/export.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,35 @@ import (
1010
"unsafe"
1111
)
1212

13-
type Exporter interface {
14-
// ProcessEvent is a function that handles all events.
15-
// This is called with all events that should be delivered to the exporter
16-
// along with the context in which that event ocurred.
17-
// This method is called synchronously from the event call site, so it should
18-
// return quickly so as not to hold up user code.
19-
ProcessEvent(context.Context, Event) (context.Context, Event)
20-
}
13+
// Exporter is a function that handles events.
14+
// It may return a modified context and event.
15+
type Exporter func(context.Context, Event) (context.Context, Event)
2116

2217
var (
2318
exporter unsafe.Pointer
2419
)
2520

21+
// SetExporter sets the global exporter function that handles all events.
22+
// The exporter is called synchronously from the event call site, so it should
23+
// return quickly so as not to hold up user code.
2624
func SetExporter(e Exporter) {
2725
p := unsafe.Pointer(&e)
2826
if e == nil {
2927
// &e is always valid, and so p is always valid, but for the early abort
3028
// of ProcessEvent to be efficient it needs to make the nil check on the
31-
// pointer without having to dereference it, so we make the nil interface
29+
// pointer without having to dereference it, so we make the nil function
3230
// also a nil pointer
3331
p = nil
3432
}
3533
atomic.StorePointer(&exporter, p)
3634
}
3735

36+
// ProcessEvent is called to deliver an event to the global exporter.
3837
func ProcessEvent(ctx context.Context, ev Event) (context.Context, Event) {
3938
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
4039
if exporterPtr == nil {
4140
return ctx, ev
4241
}
4342
// and now also hand the event of to the current exporter
44-
return (*exporterPtr).ProcessEvent(ctx, ev)
43+
return (*exporterPtr)(ctx, ev)
4544
}

internal/telemetry/export/log.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,17 @@ import (
88
"context"
99
"fmt"
1010
"io"
11-
"os"
1211

1312
"golang.org/x/tools/internal/telemetry/event"
1413
)
1514

16-
func init() {
17-
event.SetExporter(LogWriter(os.Stderr, true))
18-
}
19-
2015
// LogWriter returns an Exporter that logs events to the supplied writer.
2116
// If onlyErrors is true it does not log any event that did not have an
2217
// associated error.
2318
// It ignores all telemetry other than log events.
2419
func LogWriter(w io.Writer, onlyErrors bool) event.Exporter {
25-
return &logWriter{writer: w, onlyErrors: onlyErrors}
20+
lw := &logWriter{writer: w, onlyErrors: onlyErrors}
21+
return lw.ProcessEvent
2622
}
2723

2824
type logWriter struct {

internal/telemetry/export/ocagent/ocagent_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ func registerExporter() *testExporter {
116116
metricBytesIn.Record(&exporter.metrics, bytesIn)
117117
metricRecursiveCalls.SumInt64(&exporter.metrics, recursiveCalls)
118118

119-
event.SetExporter(exporter)
119+
event.SetExporter(exporter.processEvent)
120120
return exporter
121121
}
122122

123-
func (e *testExporter) ProcessEvent(ctx context.Context, ev event.Event) (context.Context, event.Event) {
123+
func (e *testExporter) processEvent(ctx context.Context, ev event.Event) (context.Context, event.Event) {
124124
switch {
125125
case ev.IsStartSpan():
126126
ev.At = e.start

0 commit comments

Comments
 (0)