1
0
mirror of https://github.com/golang/go synced 2024-11-06 03:26:15 -07:00
go/internal/telemetry/event/export.go
Ian Cottrell d780ff7bdd internal/telemetry: unify the event handling to an event package
This is now the only package that is exposed to normal use, and should
be the only thing to appear in libraries.

Change-Id: I90ee47c6519f30db16ff5d5d2910be86e91e5df2
Reviewed-on: https://go-review.googlesource.com/c/tools/+/222557
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
2020-03-12 03:58:56 +00:00

56 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"
"unsafe"
)
type Exporter interface {
// ProcessEvent is a function that handles all events.
// This is called with all events that should be delivered to the exporter
// along with the context in which that event ocurred.
// This method is called synchronously from the event call site, so it should
// return quickly so as not to hold up user code.
ProcessEvent(context.Context, Event) context.Context
Metric(context.Context, MetricData)
}
var (
exporter unsafe.Pointer
)
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 interface
// also a nil pointer
p = nil
}
atomic.StorePointer(&exporter, p)
}
func ProcessEvent(ctx context.Context, event Event) context.Context {
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
if exporterPtr == nil {
return ctx
}
// and now also hand the event of to the current exporter
return (*exporterPtr).ProcessEvent(ctx, event)
}
func Metric(ctx context.Context, data MetricData) {
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
if exporterPtr == nil {
return
}
(*exporterPtr).Metric(ctx, data)
}