Skip to content

Commit 8139361

Browse files
authored
Support a global MeterProvider in go.opentelemetry.io/otel (open-telemetry#3818)
* Move ErrorHandler impl to internal To avoid the import cycle, the otel/metric package needs to not import otel. To achieve this, the error handling implementation is moved to the otel/internal/global package where both can import the needed functionality. * Add global metric to go.opentelemetry.io/otel * Crosslink and update to global metric in otel * Add changes to changelog * Set PR number in changelog * Add global metric unit tests * Rename MeterProivder() to GetMeterProivder() * Add TODO to remove nolint comments
1 parent c39e625 commit 8139361

File tree

33 files changed

+551
-282
lines changed

33 files changed

+551
-282
lines changed

CHANGELOG.md

+12
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
88

99
## [Unreleased]
1010

11+
### Added
12+
13+
- Support global `MeterProvider` in `go.opentelemetry.io/otel`. (#3818)
14+
- Use `Meter` for a `metric.Meter` from the global `metric.MeterProvider`.
15+
- Use `GetMeterProivder` for a global `metric.MeterProvider`.
16+
- Use `SetMeterProivder` to set the global `metric.MeterProvider`.
17+
1118
### Changed
1219

1320
- Dropped compatibility testing for [Go 1.18].
@@ -17,6 +24,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1724

1825
- Handle empty environment variable as it they were not set. (#3764)
1926

27+
### Deprecated
28+
29+
- The `go.opentelemetry.io/otel/metric/global` package is deprecated.
30+
Use `go.opentelemetry.io/otel` instead. (#3818)
31+
2032
### Removed
2133

2234
- The deprecated `go.opentelemetry.io/otel/metric/unit` package is removed. (#3814)

bridge/opentracing/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,8 @@ require (
1818
github.com/go-logr/logr v1.2.3 // indirect
1919
github.com/go-logr/stdr v1.2.2 // indirect
2020
github.com/pmezard/go-difflib v1.0.0 // indirect
21+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2122
gopkg.in/yaml.v3 v3.0.1 // indirect
2223
)
24+
25+
replace go.opentelemetry.io/otel/metric => ../../metric

bridge/opentracing/test/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
github.com/go-logr/stdr v1.2.2 // indirect
2424
github.com/golang/protobuf v1.5.2 // indirect
2525
github.com/pmezard/go-difflib v1.0.0 // indirect
26+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2627
go.opentelemetry.io/otel/trace v1.14.0 // indirect
2728
golang.org/x/net v0.7.0 // indirect
2829
golang.org/x/sys v0.5.0 // indirect
@@ -31,3 +32,5 @@ require (
3132
google.golang.org/protobuf v1.28.1 // indirect
3233
gopkg.in/yaml.v3 v3.0.1 // indirect
3334
)
35+
36+
replace go.opentelemetry.io/otel/metric => ../../../metric

example/fib/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
require (
1313
github.com/go-logr/logr v1.2.3 // indirect
1414
github.com/go-logr/stdr v1.2.2 // indirect
15+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
1516
golang.org/x/sys v0.5.0 // indirect
1617
)
1718

@@ -22,3 +23,5 @@ replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../exporters
2223
replace go.opentelemetry.io/otel/sdk => ../../sdk
2324

2425
replace go.opentelemetry.io/otel/trace => ../../trace
26+
27+
replace go.opentelemetry.io/otel/metric => ../../metric

example/jaeger/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ require (
1717
require (
1818
github.com/go-logr/logr v1.2.3 // indirect
1919
github.com/go-logr/stdr v1.2.2 // indirect
20+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2021
go.opentelemetry.io/otel/trace v1.14.0 // indirect
2122
golang.org/x/sys v0.5.0 // indirect
2223
)
2324

2425
replace go.opentelemetry.io/otel/trace => ../../trace
26+
27+
replace go.opentelemetry.io/otel/metric => ../../metric

example/namedtracer/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ require (
1717

1818
require (
1919
github.com/go-logr/logr v1.2.3 // indirect
20+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2021
golang.org/x/sys v0.5.0 // indirect
2122
)
2223

2324
replace go.opentelemetry.io/otel/trace => ../../trace
2425

2526
replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../exporters/stdout/stdouttrace
27+
28+
replace go.opentelemetry.io/otel/metric => ../../metric

example/otel-collector/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
2424
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 // indirect
2525
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 // indirect
26+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2627
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
2728
golang.org/x/net v0.7.0 // indirect
2829
golang.org/x/sys v0.5.0 // indirect
@@ -38,3 +39,5 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../../exporters/otl
3839
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../../exporters/otlp/otlptrace/otlptracegrpc
3940

4041
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry
42+
43+
replace go.opentelemetry.io/otel/metric => ../../metric

example/passthrough/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
require (
1313
github.com/go-logr/logr v1.2.3 // indirect
1414
github.com/go-logr/stdr v1.2.2 // indirect
15+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
1516
golang.org/x/sys v0.5.0 // indirect
1617
)
1718

@@ -22,3 +23,5 @@ replace (
2223
)
2324

2425
replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../exporters/stdout/stdouttrace
26+
27+
replace go.opentelemetry.io/otel/metric => ../../metric

example/zipkin/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ require (
1919
github.com/go-logr/logr v1.2.3 // indirect
2020
github.com/go-logr/stdr v1.2.2 // indirect
2121
github.com/openzipkin/zipkin-go v0.4.1 // indirect
22+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2223
golang.org/x/sys v0.5.0 // indirect
2324
)
2425

2526
replace go.opentelemetry.io/otel/trace => ../../trace
27+
28+
replace go.opentelemetry.io/otel/metric => ../../metric

exporters/jaeger/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require (
1616
github.com/davecgh/go-spew v1.1.1 // indirect
1717
github.com/pmezard/go-difflib v1.0.0 // indirect
1818
github.com/stretchr/objx v0.5.0 // indirect
19+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
1920
golang.org/x/sys v0.5.0 // indirect
2021
gopkg.in/yaml.v3 v3.0.1 // indirect
2122
)
@@ -25,3 +26,5 @@ replace go.opentelemetry.io/otel/trace => ../../trace
2526
replace go.opentelemetry.io/otel => ../..
2627

2728
replace go.opentelemetry.io/otel/sdk => ../../sdk
29+
30+
replace go.opentelemetry.io/otel/metric => ../../metric

exporters/otlp/otlpmetric/otlpmetricgrpc/example_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ package otlpmetricgrpc_test
1717
import (
1818
"context"
1919

20+
"go.opentelemetry.io/otel"
2021
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
21-
"go.opentelemetry.io/otel/metric/global"
2222
"go.opentelemetry.io/otel/sdk/metric"
2323
)
2424

@@ -35,7 +35,7 @@ func Example() {
3535
panic(err)
3636
}
3737
}()
38-
global.SetMeterProvider(meterProvider)
38+
otel.SetMeterProvider(meterProvider)
3939

4040
// From here, the meterProvider can be used by instrumentation to collect
4141
// telemetry.

exporters/otlp/otlpmetric/otlpmetricgrpc/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ require (
99
go.opentelemetry.io/otel v1.14.0
1010
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0
1111
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.37.0
12-
go.opentelemetry.io/otel/metric v0.37.0
1312
go.opentelemetry.io/otel/sdk/metric v0.37.0
1413
go.opentelemetry.io/proto/otlp v0.19.0
1514
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f
@@ -26,6 +25,7 @@ require (
2625
github.com/google/go-cmp v0.5.9 // indirect
2726
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
2827
github.com/pmezard/go-difflib v1.0.0 // indirect
28+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2929
go.opentelemetry.io/otel/sdk v1.14.0 // indirect
3030
go.opentelemetry.io/otel/trace v1.14.0 // indirect
3131
golang.org/x/net v0.7.0 // indirect

exporters/otlp/otlpmetric/otlpmetrichttp/example_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ package otlpmetrichttp_test
1717
import (
1818
"context"
1919

20+
"go.opentelemetry.io/otel"
2021
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
21-
"go.opentelemetry.io/otel/metric/global"
2222
"go.opentelemetry.io/otel/sdk/metric"
2323
)
2424

@@ -35,7 +35,7 @@ func Example() {
3535
panic(err)
3636
}
3737
}()
38-
global.SetMeterProvider(meterProvider)
38+
otel.SetMeterProvider(meterProvider)
3939

4040
// From here, the meterProvider can be used by instrumentation to collect
4141
// telemetry.

exporters/otlp/otlpmetric/otlpmetrichttp/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ require (
99
go.opentelemetry.io/otel v1.14.0
1010
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0
1111
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.37.0
12-
go.opentelemetry.io/otel/metric v0.37.0
1312
go.opentelemetry.io/otel/sdk/metric v0.37.0
1413
go.opentelemetry.io/proto/otlp v0.19.0
1514
google.golang.org/protobuf v1.28.1
@@ -24,6 +23,7 @@ require (
2423
github.com/google/go-cmp v0.5.9 // indirect
2524
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
2625
github.com/pmezard/go-difflib v1.0.0 // indirect
26+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2727
go.opentelemetry.io/otel/sdk v1.14.0 // indirect
2828
go.opentelemetry.io/otel/trace v1.14.0 // indirect
2929
golang.org/x/net v0.7.0 // indirect

exporters/otlp/otlptrace/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ require (
2222
github.com/golang/protobuf v1.5.2 // indirect
2323
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
2424
github.com/pmezard/go-difflib v1.0.0 // indirect
25+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2526
golang.org/x/net v0.7.0 // indirect
2627
golang.org/x/sys v0.5.0 // indirect
2728
golang.org/x/text v0.7.0 // indirect
@@ -36,3 +37,5 @@ replace go.opentelemetry.io/otel/sdk => ../../../sdk
3637
replace go.opentelemetry.io/otel/trace => ../../../trace
3738

3839
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../internal/retry
40+
41+
replace go.opentelemetry.io/otel/metric => ../../../metric

exporters/otlp/otlptrace/otlptracegrpc/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
github.com/golang/protobuf v1.5.2 // indirect
2424
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
2525
github.com/pmezard/go-difflib v1.0.0 // indirect
26+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2627
go.opentelemetry.io/otel/trace v1.14.0 // indirect
2728
golang.org/x/net v0.7.0 // indirect
2829
golang.org/x/sys v0.5.0 // indirect
@@ -39,3 +40,5 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../
3940
replace go.opentelemetry.io/otel/trace => ../../../../trace
4041

4142
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
43+
44+
replace go.opentelemetry.io/otel/metric => ../../../../metric

exporters/otlp/otlptrace/otlptracehttp/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ require (
2121
github.com/golang/protobuf v1.5.2 // indirect
2222
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
2323
github.com/pmezard/go-difflib v1.0.0 // indirect
24+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2425
golang.org/x/net v0.7.0 // indirect
2526
golang.org/x/sys v0.5.0 // indirect
2627
golang.org/x/text v0.7.0 // indirect
@@ -38,3 +39,5 @@ replace go.opentelemetry.io/otel/sdk => ../../../../sdk
3839
replace go.opentelemetry.io/otel/trace => ../../../../trace
3940

4041
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
42+
43+
replace go.opentelemetry.io/otel/metric => ../../../../metric

exporters/stdout/stdouttrace/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ require (
1919
github.com/go-logr/logr v1.2.3 // indirect
2020
github.com/go-logr/stdr v1.2.2 // indirect
2121
github.com/pmezard/go-difflib v1.0.0 // indirect
22+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
2223
golang.org/x/sys v0.5.0 // indirect
2324
gopkg.in/yaml.v3 v3.0.1 // indirect
2425
)
2526

2627
replace go.opentelemetry.io/otel/trace => ../../../trace
28+
29+
replace go.opentelemetry.io/otel/metric => ../../../metric

exporters/zipkin/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require (
1616
require (
1717
github.com/davecgh/go-spew v1.1.1 // indirect
1818
github.com/pmezard/go-difflib v1.0.0 // indirect
19+
go.opentelemetry.io/otel/metric v0.37.0 // indirect
1920
golang.org/x/sys v0.5.0 // indirect
2021
gopkg.in/yaml.v3 v3.0.1 // indirect
2122
)
@@ -25,3 +26,5 @@ replace go.opentelemetry.io/otel/trace => ../../trace
2526
replace go.opentelemetry.io/otel => ../..
2627

2728
replace go.opentelemetry.io/otel/sdk => ../../sdk
29+
30+
replace go.opentelemetry.io/otel/metric => ../../metric

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/go-logr/stdr v1.2.2
88
github.com/google/go-cmp v0.5.9
99
github.com/stretchr/testify v1.8.2
10+
go.opentelemetry.io/otel/metric v0.37.0
1011
go.opentelemetry.io/otel/trace v1.14.0
1112
)
1213

@@ -17,3 +18,5 @@ require (
1718
)
1819

1920
replace go.opentelemetry.io/otel/trace => ./trace
21+
22+
replace go.opentelemetry.io/otel/metric => ./metric

handler.go

+8-56
Original file line numberDiff line numberDiff line change
@@ -15,58 +15,16 @@
1515
package otel // import "go.opentelemetry.io/otel"
1616

1717
import (
18-
"log"
19-
"os"
20-
"sync/atomic"
21-
"unsafe"
18+
"go.opentelemetry.io/otel/internal/global"
2219
)
2320

2421
var (
25-
// globalErrorHandler provides an ErrorHandler that can be used
26-
// throughout an OpenTelemetry instrumented project. When a user
27-
// specified ErrorHandler is registered (`SetErrorHandler`) all calls to
28-
// `Handle` and will be delegated to the registered ErrorHandler.
29-
globalErrorHandler = defaultErrorHandler()
30-
31-
// Compile-time check that delegator implements ErrorHandler.
32-
_ ErrorHandler = (*delegator)(nil)
33-
// Compile-time check that errLogger implements ErrorHandler.
34-
_ ErrorHandler = (*errLogger)(nil)
22+
// Compile-time check global.ErrDelegator implements ErrorHandler.
23+
_ ErrorHandler = (*global.ErrDelegator)(nil)
24+
// Compile-time check global.ErrLogger implements ErrorHandler.
25+
_ ErrorHandler = (*global.ErrLogger)(nil)
3526
)
3627

37-
type delegator struct {
38-
delegate unsafe.Pointer
39-
}
40-
41-
func (d *delegator) Handle(err error) {
42-
d.getDelegate().Handle(err)
43-
}
44-
45-
func (d *delegator) getDelegate() ErrorHandler {
46-
return *(*ErrorHandler)(atomic.LoadPointer(&d.delegate))
47-
}
48-
49-
// setDelegate sets the ErrorHandler delegate.
50-
func (d *delegator) setDelegate(eh ErrorHandler) {
51-
atomic.StorePointer(&d.delegate, unsafe.Pointer(&eh))
52-
}
53-
54-
func defaultErrorHandler() *delegator {
55-
d := &delegator{}
56-
d.setDelegate(&errLogger{l: log.New(os.Stderr, "", log.LstdFlags)})
57-
return d
58-
}
59-
60-
// errLogger logs errors if no delegate is set, otherwise they are delegated.
61-
type errLogger struct {
62-
l *log.Logger
63-
}
64-
65-
// Handle logs err if no delegate is set, otherwise it is delegated.
66-
func (h *errLogger) Handle(err error) {
67-
h.l.Print(err)
68-
}
69-
7028
// GetErrorHandler returns the global ErrorHandler instance.
7129
//
7230
// The default ErrorHandler instance returned will log all errors to STDERR
@@ -76,21 +34,15 @@ func (h *errLogger) Handle(err error) {
7634
//
7735
// Subsequent calls to SetErrorHandler after the first will not forward errors
7836
// to the new ErrorHandler for prior returned instances.
79-
func GetErrorHandler() ErrorHandler {
80-
return globalErrorHandler
81-
}
37+
func GetErrorHandler() ErrorHandler { return global.GetErrorHandler() }
8238

8339
// SetErrorHandler sets the global ErrorHandler to h.
8440
//
8541
// The first time this is called all ErrorHandler previously returned from
8642
// GetErrorHandler will send errors to h instead of the default logging
8743
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
8844
// delegate errors to h.
89-
func SetErrorHandler(h ErrorHandler) {
90-
globalErrorHandler.setDelegate(h)
91-
}
45+
func SetErrorHandler(h ErrorHandler) { global.SetErrorHandler(h) }
9246

9347
// Handle is a convenience function for ErrorHandler().Handle(err).
94-
func Handle(err error) {
95-
GetErrorHandler().Handle(err)
96-
}
48+
func Handle(err error) { global.Handle(err) }

0 commit comments

Comments
 (0)