{"record":{"id":"8d3e9cb885d7a0f8","repo":"grafana/k6","slug":"invalid-reflectmetadata-param-w","errorCode":null,"errorMessage":"invalid reflectMetadata param: %w","messagePattern":"invalid reflectMetadata param: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/grpc/params.go","lineNumber":180,"sourceCode":"\t\t\tif !ok {\n\t\t\t\treturn result, fmt.Errorf(\"invalid plaintext value: '%#v', it needs to be boolean\", v)\n\t\t\t}\n\t\tcase \"timeout\":\n\t\t\tvar err error\n\t\t\tresult.Timeout, err = types.GetDurationValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"invalid timeout value: %w\", err)\n\t\t\t}\n\t\tcase \"reflect\":\n\t\t\tvar ok bool\n\t\t\tresult.UseReflectionProtocol, ok = v.(bool)\n\t\t\tif !ok {\n\t\t\t\treturn result, fmt.Errorf(\"invalid reflect value: '%#v', it needs to be boolean\", v)\n\t\t\t}\n\t\tcase \"reflectMetadata\":\n\t\t\tmd, err := newMetadata(params.Get(k))\n\t\t\tif err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"invalid reflectMetadata param: %w\", err)\n\t\t\t}\n\n\t\t\tresult.ReflectionMetadata = md\n\t\tcase \"maxReceiveSize\":\n\t\t\tvar ok bool\n\t\t\tresult.MaxReceiveSize, ok = v.(int64)\n\t\t\tif !ok {\n\t\t\t\treturn result, fmt.Errorf(\"invalid maxReceiveSize value: '%#v', it needs to be an integer\", v)\n\t\t\t}\n\t\t\tif result.MaxReceiveSize < 0 {\n\t\t\t\treturn result, fmt.Errorf(\"invalid maxReceiveSize value: '%#v, it needs to be a positive integer\", v)\n\t\t\t}\n\t\tcase \"maxSendSize\":\n\t\t\tvar ok bool\n\t\t\tresult.MaxSendSize, ok = v.(int64)\n\t\t\tif !ok {\n\t\t\t\treturn result, fmt.Errorf(\"invalid maxSendSize value: '%#v', it needs to be an integer\", v)\n\t\t\t}","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/grpc/params.go#L162-L198","documentation":"reflectMetadata in client.connect() params is parsed by the same newMetadata() used for call metadata: it must be a plain object of string values (plus Uint8Array/ArrayBuffer for -bin keys) that k6 attaches to reflection requests. Any other shape or value type is wrapped as 'invalid reflectMetadata param'.","triggerScenarios":"connect(addr, { reflect: true, reflectMetadata: 'auth=token' }) (string, not object); { reflectMetadata: { 'trace-bin': 'xyz' } }; { reflectMetadata: ['auth'] }.","commonSituations":"Passing grpcurl-style header strings; reusing header arrays from other clients; forgetting the string/binary value rules apply here too.","solutions":["Pass a plain object: reflectMetadata: { auth: 'token' }","Apply the same rules as call metadata: strings for normal keys, Uint8Array for -bin keys","Read the wrapped cause after the colon in the message to find the offending key"],"exampleFix":"// before\nclient.connect(addr, { reflect: true, reflectMetadata: 'auth=token' });\n\n// after\nclient.connect(addr, { reflect: true, reflectMetadata: { auth: 'token' } });","handlingStrategy":"validation","validationCode":"if (connectParams.reflectMetadata != null) {\n  assertGrpcMetadata(connectParams.reflectMetadata, 'reflectMetadata');\n}\nclient.connect(addr, connectParams);","typeGuard":"function isPlainObject(v) {\n  return v != null && typeof v === 'object' && !Array.isArray(v);\n}","tryCatchPattern":null,"preventionTips":["Pass reflectMetadata as a plain object of string values, same rules as call metadata","Use Uint8Array for any -bin keys inside reflectMetadata","Do not pass grpcurl-style 'k=v' header strings"],"tags":["grpc","connect","reflection","metadata","type-error"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}