summaryrefslogtreecommitdiff
path: root/vendor/go.opentelemetry.io/otel/handler.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-05-12 14:55:18 +0200
committerLibravatar GitHub <noreply@github.com>2023-05-12 14:55:18 +0200
commitb47661f0330f9f6902e19a3bf6fb664dcfa85907 (patch)
tree831e75f76943094bcb2852ac29bc02ba511c70a0 /vendor/go.opentelemetry.io/otel/handler.go
parent[chore] Update a bunch of database dependencies (#1772) (diff)
downloadgotosocial-b47661f0330f9f6902e19a3bf6fb664dcfa85907.tar.xz
[bugfix] Downstep otel to fix freebsd compile issue (#1773)
https://github.com/open-telemetry/opentelemetry-go/issues/4076
Diffstat (limited to 'vendor/go.opentelemetry.io/otel/handler.go')
-rw-r--r--vendor/go.opentelemetry.io/otel/handler.go64
1 files changed, 56 insertions, 8 deletions
diff --git a/vendor/go.opentelemetry.io/otel/handler.go b/vendor/go.opentelemetry.io/otel/handler.go
index 4115fe3bb..ecd363ab5 100644
--- a/vendor/go.opentelemetry.io/otel/handler.go
+++ b/vendor/go.opentelemetry.io/otel/handler.go
@@ -15,16 +15,58 @@
package otel // import "go.opentelemetry.io/otel"
import (
- "go.opentelemetry.io/otel/internal/global"
+ "log"
+ "os"
+ "sync/atomic"
+ "unsafe"
)
var (
- // Compile-time check global.ErrDelegator implements ErrorHandler.
- _ ErrorHandler = (*global.ErrDelegator)(nil)
- // Compile-time check global.ErrLogger implements ErrorHandler.
- _ ErrorHandler = (*global.ErrLogger)(nil)
+ // globalErrorHandler provides an ErrorHandler that can be used
+ // throughout an OpenTelemetry instrumented project. When a user
+ // specified ErrorHandler is registered (`SetErrorHandler`) all calls to
+ // `Handle` and will be delegated to the registered ErrorHandler.
+ globalErrorHandler = defaultErrorHandler()
+
+ // Compile-time check that delegator implements ErrorHandler.
+ _ ErrorHandler = (*delegator)(nil)
+ // Compile-time check that errLogger implements ErrorHandler.
+ _ ErrorHandler = (*errLogger)(nil)
)
+type delegator struct {
+ delegate unsafe.Pointer
+}
+
+func (d *delegator) Handle(err error) {
+ d.getDelegate().Handle(err)
+}
+
+func (d *delegator) getDelegate() ErrorHandler {
+ return *(*ErrorHandler)(atomic.LoadPointer(&d.delegate))
+}
+
+// setDelegate sets the ErrorHandler delegate.
+func (d *delegator) setDelegate(eh ErrorHandler) {
+ atomic.StorePointer(&d.delegate, unsafe.Pointer(&eh))
+}
+
+func defaultErrorHandler() *delegator {
+ d := &delegator{}
+ d.setDelegate(&errLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
+ return d
+}
+
+// errLogger logs errors if no delegate is set, otherwise they are delegated.
+type errLogger struct {
+ l *log.Logger
+}
+
+// Handle logs err if no delegate is set, otherwise it is delegated.
+func (h *errLogger) Handle(err error) {
+ h.l.Print(err)
+}
+
// GetErrorHandler returns the global ErrorHandler instance.
//
// The default ErrorHandler instance returned will log all errors to STDERR
@@ -34,7 +76,9 @@ var (
//
// Subsequent calls to SetErrorHandler after the first will not forward errors
// to the new ErrorHandler for prior returned instances.
-func GetErrorHandler() ErrorHandler { return global.GetErrorHandler() }
+func GetErrorHandler() ErrorHandler {
+ return globalErrorHandler
+}
// SetErrorHandler sets the global ErrorHandler to h.
//
@@ -42,7 +86,11 @@ func GetErrorHandler() ErrorHandler { return global.GetErrorHandler() }
// GetErrorHandler will send errors to h instead of the default logging
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
// delegate errors to h.
-func SetErrorHandler(h ErrorHandler) { global.SetErrorHandler(h) }
+func SetErrorHandler(h ErrorHandler) {
+ globalErrorHandler.setDelegate(h)
+}
// Handle is a convenience function for ErrorHandler().Handle(err).
-func Handle(err error) { global.Handle(err) }
+func Handle(err error) {
+ GetErrorHandler().Handle(err)
+}