Skip to content

Collector panics on startup for non-nilable config options with unset environment variable #10949

Closed
@crobert-1

Description

@crobert-1

Describe the bug

When the collector is started with a configuration that has a non-nilable config option (e.g. int or uint64) set to an environment variable that hasn't been set, the collector panics without any information other than the stack.

Steps to reproduce

Config:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:8518

exporters:
  debug:
    verbosity: detailed
    sampling_initial: ${UNSET_VARIABLE}

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: []
      exporters: [debug]

Start the collector with an int configuration option, in this case the debug exporter's sampling_initial option, set to the environment variable UNSET_VARIABLE, which isn't set.

What did you expect to see?

No panic. I'm not sure if intended behavior here is to error and force the user to set the value of the variable, or to start with a default value, such as 0 for number types.

What did you see instead?

$ ./bin/otelcorecol_darwin_amd64 --config config.yaml 
panic: reflect: call of reflect.Value.Interface on zero Value

goroutine 1 [running]:
reflect.valueInterface({0x0?, 0x0?, 0xc00041c528?}, 0x85?)
	reflect/value.go:1501 +0xfb
reflect.Value.Interface({0x0?, 0x0?, 0xc0003f5400?})
	reflect/value.go:1496 +0x25
go.opentelemetry.io/collector/confmap.decodeConfig.expandNilStructPointersHookFunc.func2({0x0?, 0x0?, 0xa0b8020?}, {0xa0b8020?, 0xc0003b32c8?, 0xc0003f5480?})
	go.opentelemetry.io/collector/confmap@v0.107.0/confmap.go:306 +0x131
github.com/go-viper/mapstructure/v2.cachedDecodeHook.func3({0x0?, 0x0?, 0x5?}, {0xa0b8020?, 0xc0003b32c8?, 0xc00041c650?})
	github.com/go-viper/mapstructure/v2@v2.1.0/decode_hooks.go:54 +0x2c
github.com/go-viper/mapstructure/v2.ComposeDecodeHookFunc.func1({0xa19d580?, 0xc0003f5480?, 0xc00030a270?}, {0xa0b8020?, 0xc0003b32c8?, 0xc00030a270?})
	github.com/go-viper/mapstructure/v2@v2.1.0/decode_hooks.go:98 +0xdc
github.com/go-viper/mapstructure/v2.cachedDecodeHook.func3({0xa19d580?, 0xc0003f5480?, 0xc0003fe601?}, {0xa0b8020?, 0xc0003b32c8?, 0xc00041c700?})
	github.com/go-viper/mapstructure/v2@v2.1.0/decode_hooks.go:54 +0x2c
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc00030a030, {0xa082da9, 0x10}, {0xa19d580?, 0xc0003f5480?}, {0xa0b8020?, 0xc0003b32c8?, 0x22?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:480 +0x12e
github.com/go-viper/mapstructure/v2.(*Decoder).decodeStructFromMap(0xc00030a030, {0x0, 0x0}, {0xa11cb00?, 0xc0003f1b90?, 0xa200180?}, {0xa200180?, 0xc0003b32c0?, 0xc00041d160?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1462 +0xb10
github.com/go-viper/mapstructure/v2.(*Decoder).decodeStruct(0xc00030a030, {0x0, 0x0}, {0xa11cb00?, 0xc0003f1b90?}, {0xa200180?, 0xc0003b32c0?, 0xc00041d228?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1278 +0x55f
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc00030a030, {0x0, 0x0}, {0xa11cb00?, 0xc0003f1b90?}, {0xa200180?, 0xc0003b32c0?, 0xc0002a2e98?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:505 +0x27f
github.com/go-viper/mapstructure/v2.(*Decoder).decodePtr(0xc00030a030, {0x0, 0x0}, {0xa11cb00, 0xc0003f1b90}, {0xa10bb80?, 0xc0002a2e98?, 0xc00041d388?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1104 +0x3f6
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc00030a030, {0x0, 0x0}, {0xa11cb00?, 0xc0003f1b90?}, {0xa10bb80?, 0xc0002a2e98?, 0xc0002a2e98?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:509 +0x255
github.com/go-viper/mapstructure/v2.(*Decoder).decodePtr(0xc00030a030, {0x0, 0x0}, {0xa11cb00, 0xc0003f1b90}, {0xc0003f24c0?, 0xc0002a2e98?, 0xab1e740?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1110 +0x49d
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc00030a030, {0x0, 0x0}, {0xa11cb00?, 0xc0003f1b90?}, {0xc0003f24c0?, 0xc0002a2e98?, 0xa11cb00?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:509 +0x255
github.com/go-viper/mapstructure/v2.(*Decoder).decodeBasic(0xc00030a030, {0x0, 0x0}, {0xa11cb00, 0xc0003f1b90}, {0xa1313a0?, 0xc0003edf00?, 0xc0003b2e12?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:555 +0x61f
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc00030a030, {0x0, 0x0}, {0xa11cb00?, 0xc0003f1b90?}, {0xa1313a0?, 0xc0003edf00?, 0x0?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:493 +0x23d
github.com/go-viper/mapstructure/v2.(*Decoder).Decode(0xc00030a030, {0xa11cb00, 0xc0003f1b90})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:430 +0xbb
go.opentelemetry.io/collector/confmap.decodeConfig(0xc0003edd50, {0xa088e80, 0xc0003edf00}, 0x1, 0x0)
	go.opentelemetry.io/collector/confmap@v0.107.0/confmap.go:211 +0x2cf
go.opentelemetry.io/collector/confmap.(*Conf).Unmarshal(0xc0003edd50, {0xa088e80, 0xc0003edf00}, {0x0, 0x0, 0x10?})
	go.opentelemetry.io/collector/confmap@v0.107.0/confmap.go:88 +0xa5
go.opentelemetry.io/collector/otelcol/internal/configunmarshaler.(*Configs[...]).Unmarshal(0xa2ccca0, 0xc0003ed330)
	go.opentelemetry.io/collector/otelcol@v0.107.0/internal/configunmarshaler/configs.go:52 +0x285
go.opentelemetry.io/collector/confmap.decodeConfig.unmarshalerHookFunc.func7({0xa11cb00?, 0xc0003d9770?, 0xa1af280?}, {0xa1af280?, 0xc0003db520?, 0xc0003d9770?})
	go.opentelemetry.io/collector/confmap@v0.107.0/confmap.go:422 +0x271
github.com/go-viper/mapstructure/v2.cachedDecodeHook.func3({0xa11cb00?, 0xc0003d9770?, 0x5?}, {0xa1af280?, 0xc0003db520?, 0xc00041dd40?})
	github.com/go-viper/mapstructure/v2@v2.1.0/decode_hooks.go:54 +0x2c
github.com/go-viper/mapstructure/v2.ComposeDecodeHookFunc.func1({0xa11cb00?, 0xc0003d9770?, 0xc0003ed320?}, {0xa1af280?, 0xc0003db520?, 0xc0003ed320?})
	github.com/go-viper/mapstructure/v2@v2.1.0/decode_hooks.go:98 +0xdc
github.com/go-viper/mapstructure/v2.cachedDecodeHook.func3({0xa11cb00?, 0xc0003d9770?, 0xc0003e6601?}, {0xa1af280?, 0xc0003db520?, 0xc00041ddf0?})
	github.com/go-viper/mapstructure/v2@v2.1.0/decode_hooks.go:54 +0x2c
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc0003db5f0, {0xa0712bd, 0x9}, {0xa11cb00?, 0xc0003d9770?}, {0xa1af280?, 0xc0003db520?, 0x16?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:480 +0x12e
github.com/go-viper/mapstructure/v2.(*Decoder).decodeStructFromMap(0xc0003db5f0, {0x0, 0x0}, {0xa11cb00?, 0xc0003d9680?, 0xa230480?}, {0xa230480?, 0xc0003e6480?, 0xc00041e850?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1462 +0xb10
github.com/go-viper/mapstructure/v2.(*Decoder).decodeStruct(0xc0003db5f0, {0x0, 0x0}, {0xa11cb00?, 0xc0003d9680?}, {0xa230480?, 0xc0003e6480?, 0xc00041e918?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1278 +0x55f
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc0003db5f0, {0x0, 0x0}, {0xa11cb00?, 0xc0003d9680?}, {0xa230480?, 0xc0003e6480?, 0xc0002a2ba8?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:505 +0x27f
github.com/go-viper/mapstructure/v2.(*Decoder).decodePtr(0xc0003db5f0, {0x0, 0x0}, {0xa11cb00, 0xc0003d9680}, {0xa089400?, 0xc0002a2ba8?, 0xc00029cce2?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:1104 +0x3f6
github.com/go-viper/mapstructure/v2.(*Decoder).decode(0xc0003db5f0, {0x0, 0x0}, {0xa11cb00?, 0xc0003d9680?}, {0xa089400?, 0xc0002a2ba8?, 0x0?})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:509 +0x255
github.com/go-viper/mapstructure/v2.(*Decoder).Decode(0xc0003db5f0, {0xa11cb00, 0xc0003d9680})
	github.com/go-viper/mapstructure/v2@v2.1.0/mapstructure.go:430 +0xbb
go.opentelemetry.io/collector/confmap.decodeConfig(0xc0003db0e0, {0xa0a2bc0, 0xc0002a2ba8}, 0x1, 0x0)
	go.opentelemetry.io/collector/confmap@v0.107.0/confmap.go:211 +0x2cf
go.opentelemetry.io/collector/confmap.(*Conf).Unmarshal(0xc0003db0e0, {0xa0a2bc0, 0xc0002a2ba8}, {0x0, 0x0, 0xc0002a2b98?})
	go.opentelemetry.io/collector/confmap@v0.107.0/confmap.go:88 +0xa5
go.opentelemetry.io/collector/otelcol.unmarshal(0xc0003db0e0, {0xc000391c20, 0xc000391d10, 0xc000391c80, 0xc000391b30, 0xc000391da0, 0xc000391c50, 0xc000391d40, 0xc000391cb0, 0xc000391b60, ...})
	go.opentelemetry.io/collector/otelcol@v0.107.0/unmarshaler.go:47 +0x2ff
go.opentelemetry.io/collector/otelcol.(*configProvider).Get(0x4?, {0xa2d1d30?, 0xab838a0?}, {0xc000391c20, 0xc000391d10, 0xc000391c80, 0xc000391b30, 0xc000391da0, 0xc000391c50, 0xc000391d40, ...})
	go.opentelemetry.io/collector/otelcol@v0.107.0/configprovider.go:107 +0xb8
go.opentelemetry.io/collector/otelcol.(*Collector).setupConfigurationComponents(0xc000363b00, {0xa2d1d30, 0xab838a0})
	go.opentelemetry.io/collector/otelcol@v0.107.0/collector.go:170 +0x166
go.opentelemetry.io/collector/otelcol.(*Collector).Run(0xc000363b00, {0xa2d1d30, 0xab838a0})
	go.opentelemetry.io/collector/otelcol@v0.107.0/collector.go:272 +0x55
go.opentelemetry.io/collector/otelcol.NewCommand.func1(0xc000356908, {0x9e70af5?, 0x7?, 0x9e6dbc5?})
	go.opentelemetry.io/collector/otelcol@v0.107.0/command.go:37 +0xa7
github.com/spf13/cobra.(*Command).execute(0xc000356908, {0xc00019a190, 0x2, 0x2})
	github.com/spf13/cobra@v1.8.1/command.go:985 +0xaca
github.com/spf13/cobra.(*Command).ExecuteC(0xc000356908)
	github.com/spf13/cobra@v1.8.1/command.go:1117 +0x3ff
github.com/spf13/cobra.(*Command).Execute(0xa2bae30?)
	github.com/spf13/cobra@v1.8.1/command.go:1041 +0x13
main.runInteractive({0xa2bae30, {{0x9e747b3, 0xb}, {0x9ea2c94, 0x33}, {0x9e747be, 0xb}}, 0x0, {{{0x0, 0x0, ...}, ...}}, ...})
	go.opentelemetry.io/collector/cmd/otelcorecol/main.go:49 +0x5d
main.run(...)
	go.opentelemetry.io/collector/cmd/otelcorecol/main_others.go:10
main.main()
	go.opentelemetry.io/collector/cmd/otelcorecol/main.go:42 +0x1b8

What version did you use?

v0.107.0 and v0.106.1

Environment

This has been hit on barebones macos/amd64 and in k8s as well.

Metadata

Metadata

Assignees

Labels

area:confmapbugSomething isn't workingrelease:blockerThe issue must be resolved before cutting the next release

Type

No type

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions