@@ -7,8 +7,12 @@ package otelconf // import "go.opentelemetry.io/contrib/otelconf"
77import (
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 (
2731type 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.
62110func NewSDK (opts ... ConfigurationOption ) (SDK , error ) {
63111 o := configOptions {
0 commit comments