@@ -5,6 +5,7 @@ package otelconf // import "go.opentelemetry.io/contrib/otelconf"
55
66import (
77 "context"
8+ "encoding/json"
89 "errors"
910 "fmt"
1011 "reflect"
@@ -13,6 +14,7 @@ import (
1314 sdklog "go.opentelemetry.io/otel/sdk/log"
1415 sdkmetric "go.opentelemetry.io/otel/sdk/metric"
1516 sdktrace "go.opentelemetry.io/otel/sdk/trace"
17+ yaml "go.yaml.in/yaml/v3"
1618)
1719
1820const (
@@ -127,6 +129,53 @@ func newErrInvalid(id string) error {
127129 return & errInvalid {Identifier : id }
128130}
129131
132+ // unmarshalSamplerTypes handles always_on and always_off sampler unmarshaling.
133+ func unmarshalSamplerTypes (raw map [string ]any , plain * Sampler ) {
134+ // always_on can be nil, must check and set here
135+ if _ , ok := raw ["always_on" ]; ok {
136+ plain .AlwaysOn = AlwaysOnSampler {}
137+ }
138+ // always_off can be nil, must check and set here
139+ if _ , ok := raw ["always_off" ]; ok {
140+ plain .AlwaysOff = AlwaysOffSampler {}
141+ }
142+ }
143+
144+ // unmarshalTextMapPropagatorTypes handles all propagator type unmarshaling.
145+ func unmarshalTextMapPropagatorTypes (raw map [string ]any , plain * TextMapPropagator ) {
146+ // b3 can be nil, must check and set here
147+ if v , ok := raw ["b3" ]; ok && v == nil {
148+ plain .B3 = B3Propagator {}
149+ }
150+ if v , ok := raw ["b3multi" ]; ok && v == nil {
151+ plain .B3Multi = B3MultiPropagator {}
152+ }
153+ if v , ok := raw ["baggage" ]; ok && v == nil {
154+ plain .Baggage = BaggagePropagator {}
155+ }
156+ if v , ok := raw ["jaeger" ]; ok && v == nil {
157+ plain .Jaeger = JaegerPropagator {}
158+ }
159+ if v , ok := raw ["ottrace" ]; ok && v == nil {
160+ plain .Ottrace = OpenTracingPropagator {}
161+ }
162+ if v , ok := raw ["tracecontext" ]; ok && v == nil {
163+ plain .Tracecontext = TraceContextPropagator {}
164+ }
165+ }
166+
167+ // unmarshalMetricProducer handles opencensus metric producer unmarshaling.
168+ func unmarshalMetricProducer (raw map [string ]any , plain * MetricProducer ) {
169+ // opencensus can be nil, must check and set here
170+ if v , ok := raw ["opencensus" ]; ok && v == nil {
171+ delete (raw , "opencensus" )
172+ plain .Opencensus = OpenCensusMetricProducer {}
173+ }
174+ if len (raw ) > 0 {
175+ plain .AdditionalProperties = raw
176+ }
177+ }
178+
130179// validatePeriodicMetricReader handles validation for PeriodicMetricReader.
131180func validatePeriodicMetricReader (plain * PeriodicMetricReader ) error {
132181 if plain .Timeout != nil && 0 > * plain .Timeout {
@@ -249,3 +298,91 @@ func createHeadersConfig(headers []NameStringValuePair, headersList *string) (ma
249298 }
250299 return result , nil
251300}
301+
302+ var enumValuesAttributeType = []any {
303+ nil ,
304+ "string" ,
305+ "bool" ,
306+ "int" ,
307+ "double" ,
308+ "string_array" ,
309+ "bool_array" ,
310+ "int_array" ,
311+ "double_array" ,
312+ }
313+
314+ // MarshalUnmarshaler combines marshal and unmarshal operations.
315+ type MarshalUnmarshaler interface {
316+ Marshal (v any ) ([]byte , error )
317+ Unmarshal (data []byte , v any ) error
318+ }
319+
320+ // jsonCodec implements MarshalUnmarshaler for JSON.
321+ type jsonCodec struct {}
322+
323+ func (jsonCodec ) Marshal (v any ) ([]byte , error ) {
324+ return json .Marshal (v )
325+ }
326+
327+ func (jsonCodec ) Unmarshal (data []byte , v any ) error {
328+ return json .Unmarshal (data , v )
329+ }
330+
331+ // yamlCodec implements MarshalUnmarshaler for YAML.
332+ type yamlCodec struct {}
333+
334+ func (yamlCodec ) Marshal (v any ) ([]byte , error ) {
335+ return yaml .Marshal (v )
336+ }
337+
338+ func (yamlCodec ) Unmarshal (data []byte , v any ) error {
339+ return yaml .Unmarshal (data , v )
340+ }
341+
342+ // setConfigDefaults sets default values for disabled and log_level.
343+ func setConfigDefaults (raw map [string ]any , plain * OpenTelemetryConfiguration , codec MarshalUnmarshaler ) error {
344+ // Configure if the SDK is disabled or not.
345+ // If omitted or null, false is used.
346+ plain .Disabled = ptr (false )
347+ if v , ok := raw ["disabled" ]; ok && v != nil {
348+ marshaled , err := codec .Marshal (v )
349+ if err != nil {
350+ return err
351+ }
352+ var disabled bool
353+ if err := codec .Unmarshal (marshaled , & disabled ); err != nil {
354+ return err
355+ }
356+ plain .Disabled = & disabled
357+ }
358+
359+ // Configure the log level of the internal logger used by the SDK.
360+ // If omitted, info is used.
361+ plain .LogLevel = ptr ("info" )
362+ if v , ok := raw ["log_level" ]; ok && v != nil {
363+ marshaled , err := codec .Marshal (v )
364+ if err != nil {
365+ return err
366+ }
367+ var logLevel string
368+ if err := codec .Unmarshal (marshaled , & logLevel ); err != nil {
369+ return err
370+ }
371+ plain .LogLevel = & logLevel
372+ }
373+
374+ return nil
375+ }
376+
377+ // validateStringField validates a string field is present and correct type.
378+ func validateStringField (raw map [string ]any , fieldName string ) (string , error ) {
379+ v , ok := raw [fieldName ]
380+ if ! ok {
381+ return "" , fmt .Errorf ("cannot unmarshal field %s in NameStringValuePair required" , fieldName )
382+ }
383+ str , ok := v .(string )
384+ if ! ok {
385+ return "" , fmt .Errorf ("cannot unmarshal field %s in NameStringValuePair must be string" , fieldName )
386+ }
387+ return str , nil
388+ }
0 commit comments