@@ -26,6 +26,7 @@ import (
2626 "github.com/go-viper/mapstructure/v2"
2727 "go.opentelemetry.io/collector/component"
2828 "go.opentelemetry.io/collector/confmap"
29+ "go.opentelemetry.io/collector/confmap/xconfmap"
2930 "gopkg.in/yaml.v3"
3031)
3132
@@ -63,13 +64,8 @@ func parseConfig[C any](id component.ID, yamlConfig string, createDefaultConfig
6364 return parseMultipleConfigs [C ](yamlConfig , deserializedConf , createDefaultConfig )
6465 }
6566
66- configMap := make (map [string ]any )
67- for k , v := range deserializedConf .ToStringMap () {
68- configMap [k ] = escapeDollarSigns (v )
69- }
70-
7167 defaultConfig := createDefaultConfig ()
72- err = confmap . NewFromStringMap ( configMap ). Unmarshal ( & defaultConfig )
68+ err = unmarshalValidConfig ( deserializedConf , defaultConfig )
7369 if err != nil {
7470 return nil , err
7571 }
@@ -89,13 +85,8 @@ func parseMultipleConfigs[C any](yamlConfig string, deserializedConf *confmap.Co
8985 return nil , err
9086 }
9187
92- subConfigMap := map [string ]any {}
93- for k , v := range sub .ToStringMap () {
94- subConfigMap [k ] = escapeDollarSigns (v )
95- }
96-
9788 defaultConfig := createDefaultConfig ()
98- err = confmap . NewFromStringMap ( subConfigMap ). Unmarshal ( & defaultConfig )
89+ err = unmarshalValidConfig ( sub , defaultConfig )
9990 if err != nil {
10091 return nil , err
10192 }
@@ -106,6 +97,25 @@ func parseMultipleConfigs[C any](yamlConfig string, deserializedConf *confmap.Co
10697 return configs , nil
10798}
10899
100+ func unmarshalValidConfig [C any ](cfg * confmap.Conf , defaultConfig C ) error {
101+ subConfigMap := map [string ]any {}
102+ for k , v := range cfg .ToStringMap () {
103+ subConfigMap [k ] = escapeDollarSigns (v )
104+ }
105+
106+ err := confmap .NewFromStringMap (subConfigMap ).Unmarshal (& defaultConfig )
107+ if err != nil {
108+ return err
109+ }
110+
111+ validator , ok := any (defaultConfig ).(xconfmap.Validator )
112+ if ok {
113+ return validator .Validate ()
114+ }
115+
116+ return nil
117+ }
118+
109119func sortedConfigKeys (yamlData string ) ([]string , error ) {
110120 var root yaml.Node
111121 if err := yaml .Unmarshal ([]byte (yamlData ), & root ); err != nil {
0 commit comments