Skip to content

Commit a441af1

Browse files
authored
Merge branch 'main' into opencensus_producer
2 parents b3eef31 + 0617172 commit a441af1

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
2323
- Global error handler uses an atomic value instead of a mutex. (#3543)
2424
- Add `Producer` interface and `Reader.RegisterProducer(Producer)` to `go.opentelemetry.io/otel/sdk/metric` to enable external metric Producers. (#3524)
2525
- Add `NewMetricProducer` to `go.opentelemetry.io/otel/bridge/opencensus`, which can be used to pass OpenCensus metrics to an OpenTelemetry Reader. (#3541)
26+
- Global logger uses an atomic value instead of a mutex. (#3545)
2627

2728
### Deprecated
2829

internal/global/internal_logging.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ package global // import "go.opentelemetry.io/otel/internal/global"
1717
import (
1818
"log"
1919
"os"
20-
"sync"
20+
"sync/atomic"
21+
"unsafe"
2122

2223
"github.com/go-logr/logr"
2324
"github.com/go-logr/stdr"
@@ -27,37 +28,36 @@ import (
2728
//
2829
// The default logger uses stdr which is backed by the standard `log.Logger`
2930
// interface. This logger will only show messages at the Error Level.
30-
var globalLogger logr.Logger = stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile))
31-
var globalLoggerLock = &sync.RWMutex{}
31+
var globalLogger unsafe.Pointer
32+
33+
func init() {
34+
SetLogger(stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)))
35+
}
3236

3337
// SetLogger overrides the globalLogger with l.
3438
//
3539
// To see Info messages use a logger with `l.V(1).Enabled() == true`
3640
// To see Debug messages use a logger with `l.V(5).Enabled() == true`.
3741
func SetLogger(l logr.Logger) {
38-
globalLoggerLock.Lock()
39-
defer globalLoggerLock.Unlock()
40-
globalLogger = l
42+
atomic.StorePointer(&globalLogger, unsafe.Pointer(&l))
43+
}
44+
45+
func getLogger() logr.Logger {
46+
return *(*logr.Logger)(atomic.LoadPointer(&globalLogger))
4147
}
4248

4349
// Info prints messages about the general state of the API or SDK.
4450
// This should usually be less then 5 messages a minute.
4551
func Info(msg string, keysAndValues ...interface{}) {
46-
globalLoggerLock.RLock()
47-
defer globalLoggerLock.RUnlock()
48-
globalLogger.V(1).Info(msg, keysAndValues...)
52+
getLogger().V(1).Info(msg, keysAndValues...)
4953
}
5054

5155
// Error prints messages about exceptional states of the API or SDK.
5256
func Error(err error, msg string, keysAndValues ...interface{}) {
53-
globalLoggerLock.RLock()
54-
defer globalLoggerLock.RUnlock()
55-
globalLogger.Error(err, msg, keysAndValues...)
57+
getLogger().Error(err, msg, keysAndValues...)
5658
}
5759

5860
// Debug prints messages about all internal changes in the API or SDK.
5961
func Debug(msg string, keysAndValues ...interface{}) {
60-
globalLoggerLock.RLock()
61-
defer globalLoggerLock.RUnlock()
62-
globalLogger.V(5).Info(msg, keysAndValues...)
62+
getLogger().V(5).Info(msg, keysAndValues...)
6363
}

0 commit comments

Comments
 (0)