Skip to content

Log nil interface panics: reflect: call of reflect.Value.Interface on zero Value #7307

Open
@levdikpavel

Description

@levdikpavel

Description

Trying to log interface for not-nil type with nil value produces panic here
https://github.com/m1heng/opentelemetry-go-contrib/blob/224e5c4eade69ff72355bfd4059f3acbdff34ebe/bridges/otelzap/encoder.go#L325

Similar to #6235

Environment

  • OS: any
  • Architecture: any
  • Go Version: 1.23
  • go.opentelemetry.io/contrib version: I don't know

Steps To Reproduce

package main

import (
	"context"
	"fmt"

	"go.opentelemetry.io/contrib/bridges/otelzap"
	"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc"
	"go.opentelemetry.io/otel/sdk/log"
	"go.uber.org/zap"
)

func main() {
	exporter, err := otlploggrpc.New(
		context.Background(), // literally unused param
		otlploggrpc.WithEndpoint("localhost:8201"),
		otlploggrpc.WithInsecure(),
	)
	if err != nil {
		panic(err)
	}

	processor := log.NewBatchProcessor(exporter)
	loggerProvider := log.NewLoggerProvider(log.WithProcessor(processor))
	otelCore := otelzap.NewCore("otel", otelzap.WithLoggerProvider(loggerProvider))
	logger := zap.New(otelCore)

	logger.Info("hello world")

	var pointer *string
	var nilInterface interface{}
	fmt.Println(nilInterface, nilInterface == nil)
	nilInterface = pointer
	fmt.Println(nilInterface, nilInterface == nil)

	logger.Info("try log array", zap.Any("array", []any{1, 2, 3, nilInterface}))
}
<nil> true
<nil> false
panic: reflect: call of reflect.Value.Interface on zero Value

goroutine 1 [running]:
reflect.valueInterface({0x0?, 0x0?, 0x0?}, 0x0?)
	/Users/levdik/.ya/tools/v4/8427538159/src/reflect/value.go:1489 +0xfc
reflect.Value.Interface(...)
	/Users/levdik/.ya/tools/v4/8427538159/src/reflect/value.go:1484
go.opentelemetry.io/contrib/bridges/otelzap.convertValue({0x1032bc980, 0x0})
	/Users/levdik/arcadia/vendor/go.opentelemetry.io/contrib/bridges/otelzap/encoder.go:328 +0x3e4
go.opentelemetry.io/contrib/bridges/otelzap.convertValue({0x1032cb280, 0x1400000ca80})
	/Users/levdik/arcadia/vendor/go.opentelemetry.io/contrib/bridges/otelzap/encoder.go:305 +0x4c4
go.opentelemetry.io/contrib/bridges/otelzap.(*objectEncoder).AddReflected(0x14000031380, {0x103191fca, 0x5}, {0x1032cb280?, 0x1400000ca80?})
	/Users/levdik/arcadia/vendor/go.opentelemetry.io/contrib/bridges/otelzap/encoder.go:124 +0x3c
go.uber.org/zap/zapcore.Field.AddTo({{0x103191fca, 0x5}, 0x17, 0x0, {0x0, 0x0}, {0x1032cb280, 0x1400000ca80}}, {0x1033e3180, 0x14000031380})
	/Users/levdik/arcadia/vendor/go.uber.org/zap/zapcore/field.go:170 +0x664
go.opentelemetry.io/contrib/bridges/otelzap.convertField({0x14000111080, 0x1, 0x0?})
	/Users/levdik/arcadia/vendor/go.opentelemetry.io/contrib/bridges/otelzap/core.go:226 +0x16c
go.opentelemetry.io/contrib/bridges/otelzap.(*Core).Write(0x1400004c7e0, {0x0, {0xc1ff004ed1e8b780, 0x462f74, 0x1037ea4c0}, {0x0, 0x0}, {0x1031984a0, 0xd}, {0x0, ...}, ...}, ...)
	/Users/levdik/arcadia/vendor/go.opentelemetry.io/contrib/bridges/otelzap/core.go:203 +0x15c
go.uber.org/zap/zapcore.(*CheckedEntry).Write(0x140001b2820, {0x14000111080, 0x1, 0x1})
	/Users/levdik/arcadia/vendor/go.uber.org/zap/zapcore/entry.go:253 +0xe4
go.uber.org/zap.(*Logger).Info(0x103191fca?, {0x1031984a0?, 0x1032cb280?}, {0x14000111080, 0x1, 0x1})
	/Users/levdik/arcadia/vendor/go.uber.org/zap/logger.go:247 +0x54
main.main()
	/Users/levdik/arcadia/junk/levdik/otel/main.go:36 +0x38c

Expected behavior

No panic

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions