Skip to content

Commit 1c48ed5

Browse files
committed
otelconf: add support for OTEL_EXPERIMENTAL_CONFIG_FILE
As discussed in open-telemetry#8059, adding an init function to support users passing in a configuration file via the environment variables OTEL_EXPERIMENTAL_CONFIG_FILE. Fixes open-telemetry#8059 Signed-off-by: alex boten <[email protected]>
1 parent 14afea5 commit 1c48ed5

File tree

1 file changed

+52
-4
lines changed

1 file changed

+52
-4
lines changed

otelconf/config.go

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ package otelconf // import "go.opentelemetry.io/contrib/otelconf"
77
import (
88
"context"
99
"errors"
10+
"log"
11+
"os"
1012

11-
"go.opentelemetry.io/otel/log"
13+
"go.opentelemetry.io/otel"
14+
apilog "go.opentelemetry.io/otel/log"
15+
"go.opentelemetry.io/otel/log/global"
1216
nooplog "go.opentelemetry.io/otel/log/noop"
1317
"go.opentelemetry.io/otel/metric"
1418
noopmetric "go.opentelemetry.io/otel/metric/noop"
@@ -27,7 +31,7 @@ import (
2731
type SDK struct {
2832
meterProvider metric.MeterProvider
2933
tracerProvider trace.TracerProvider
30-
loggerProvider log.LoggerProvider
34+
loggerProvider apilog.LoggerProvider
3135
shutdown shutdownFunc
3236
}
3337

@@ -41,8 +45,8 @@ func (s *SDK) MeterProvider() metric.MeterProvider {
4145
return s.meterProvider
4246
}
4347

44-
// LoggerProvider returns a configured log.LoggerProvider.
45-
func (s *SDK) LoggerProvider() log.LoggerProvider {
48+
// LoggerProvider returns a configured apilog.LoggerProvider.
49+
func (s *SDK) LoggerProvider() apilog.LoggerProvider {
4650
return s.loggerProvider
4751
}
4852

@@ -58,6 +62,50 @@ var noopSDK = SDK{
5862
shutdown: func(context.Context) error { return nil },
5963
}
6064

65+
var sdk *SDK
66+
67+
// init checks the local environment and uses the file set in the variable
68+
// `OTEL_EXPERIMENTAL_CONFIG_FILE` to configure the SDK automatically.
69+
func init() {
70+
// look for the env variable
71+
filename, ok := os.LookupEnv("OTEL_EXPERIMENTAL_CONFIG_FILE")
72+
if !ok {
73+
return
74+
}
75+
b, err := os.ReadFile(filename)
76+
if err != nil {
77+
log.Fatal(err)
78+
}
79+
80+
// Parse a configuration file into an OpenTelemetryConfiguration model.
81+
c, err := ParseYAML(b)
82+
if err != nil {
83+
log.Fatal(err)
84+
}
85+
86+
// Create SDK components with the parsed configuration.
87+
s, err := NewSDK(WithOpenTelemetryConfiguration(*c))
88+
if err != nil {
89+
log.Fatal(err)
90+
}
91+
92+
// Set the global providers.
93+
otel.SetTracerProvider(s.TracerProvider())
94+
otel.SetMeterProvider(s.MeterProvider())
95+
global.SetLoggerProvider(s.LoggerProvider())
96+
sdk = &s
97+
}
98+
99+
// Shutdown calls the shutdown function of the global SDK instantiated if
100+
func Shutdown(ctx context.Context) {
101+
if sdk == nil {
102+
return
103+
}
104+
if err := sdk.Shutdown(ctx); err != nil {
105+
log.Fatal(err)
106+
}
107+
}
108+
61109
// NewSDK creates SDK providers based on the configuration model.
62110
func NewSDK(opts ...ConfigurationOption) (SDK, error) {
63111
o := configOptions{

0 commit comments

Comments
 (0)