mirror of
https://github.com/golang/go
synced 2024-11-05 23:36:12 -07:00
f207553f3c
There is no reason for it to be public now, it is no longer possible to build an event without using the helpers. This also allows us to delay setting the time until after the nil exporter check, for a significant time saving in the no exporter case. name old time/op new time/op delta /Baseline-8 588ns ± 4% 575ns ± 4% -2.24% (p=0.000 n=18+18) /StdLog-8 9.61µs ± 3% 9.58µs ± 3% ~ (p=0.384 n=18+18) /LogNoExporter-8 3.94µs ± 2% 2.26µs ± 2% -42.50% (p=0.000 n=17+18) /TraceNoExporter-8 2.77µs ± 4% 1.11µs ± 2% -59.82% (p=0.000 n=18+18) /StatsNoExporter-8 3.83µs ± 5% 2.15µs ± 3% -43.70% (p=0.000 n=18+17) /Log-8 23.3µs ± 6% 23.0µs ± 1% ~ (p=0.245 n=18+17) /Trace-8 26.4µs ± 3% 26.5µs ± 4% ~ (p=0.269 n=18+17) /Stats-8 5.36µs ± 2% 5.45µs ± 3% +1.68% (p=0.000 n=17+18) Change-Id: Ibde0e20eaf99d03f786cd1436f05eab7b2a17b20 Reviewed-on: https://go-review.googlesource.com/c/tools/+/224657 Run-TryBot: Ian Cottrell <iancottrell@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package event
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
// Exporter is a function that handles events.
|
|
// It may return a modified context and event.
|
|
type Exporter func(context.Context, Event, TagMap) context.Context
|
|
|
|
var (
|
|
exporter unsafe.Pointer
|
|
)
|
|
|
|
// SetExporter sets the global exporter function that handles all events.
|
|
// The exporter is called synchronously from the event call site, so it should
|
|
// return quickly so as not to hold up user code.
|
|
func SetExporter(e Exporter) {
|
|
p := unsafe.Pointer(&e)
|
|
if e == nil {
|
|
// &e is always valid, and so p is always valid, but for the early abort
|
|
// of ProcessEvent to be efficient it needs to make the nil check on the
|
|
// pointer without having to dereference it, so we make the nil function
|
|
// also a nil pointer
|
|
p = nil
|
|
}
|
|
atomic.StorePointer(&exporter, p)
|
|
}
|
|
|
|
// dispatch is called to deliver an event to the supplied exporter.
|
|
// it will fill in the time and generate the basic tag source.
|
|
func dispatch(ctx context.Context, ev Event) context.Context {
|
|
// get the global exporter and abort early if there is not one
|
|
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
|
|
if exporterPtr == nil {
|
|
return ctx
|
|
}
|
|
// add the current time to the event
|
|
ev.At = time.Now()
|
|
// hand the event off to the current exporter
|
|
return (*exporterPtr)(ctx, ev, ev.Map())
|
|
}
|