{"record":{"id":"f6926c935dbd0be7","repo":"t8y2/dbx","slug":"namesrv-addr-is-required","errorCode":null,"errorMessage":"namesrv_addr is required","messagePattern":"namesrv_addr is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/rocketmq/connection.go","lineNumber":43,"sourceCode":"\tNameServers    []string\n\tClusterName    string\n\tBrokerAddr     string\n\tAccessKey      string\n\tSecretKey      string\n\tRequestTimeout time.Duration\n\tConnectTimeout time.Duration\n\tTLSSkipVerify  bool\n\tSocksProxy     *socksProxyConfig\n}\n\nfunc parseConnection(params map[string]any) (connectionConfig, error) {\n\tconnection := nestedMap(params, \"connection\")\n\tif connection == nil {\n\t\tconnection = params\n\t}\n\tnameServers := splitAddresses(stringValue(connection, \"namesrv_addr\", \"namesrvAddr\"))\n\tif len(nameServers) == 0 {\n\t\treturn connectionConfig{}, fmt.Errorf(\"namesrv_addr is required\")\n\t}\n\tconfig := connectionConfig{\n\t\tNameServers:    nameServers,\n\t\tClusterName:    stringValue(connection, \"cluster_name\", \"clusterName\"),\n\t\tBrokerAddr:     stringValue(connection, \"broker_addr\", \"brokerAddr\"),\n\t\tAccessKey:      stringValue(connection, \"access_key\", \"accessKey\"),\n\t\tSecretKey:      stringValue(connection, \"secret_key\", \"secretKey\"),\n\t\tRequestTimeout: time.Duration(intValue(connection, int(defaultRequestTimeout/time.Millisecond), \"request_timeout_ms\")) * time.Millisecond,\n\t\tConnectTimeout: time.Duration(intValue(connection, int(defaultConnectTimeout/time.Millisecond), \"connect_timeout_ms\")) * time.Millisecond,\n\t\tTLSSkipVerify:  boolValue(connection, false, \"tls_skip_verify\"),\n\t}\n\tif config.RequestTimeout <= 0 {\n\t\tconfig.RequestTimeout = defaultRequestTimeout\n\t}\n\tif config.ConnectTimeout <= 0 {\n\t\tconfig.ConnectTimeout = defaultConnectTimeout\n\t}\n\tif proxy := nestedMap(connection, \"socks_proxy\"); proxy != nil {","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/rocketmq/connection.go#L25-L61","documentation":"parseConnection requires at least one name server address to build a RocketMQ connection; without a namesrv_addr the client cannot discover the cluster topology. splitAddresses is run on 'namesrv_addr' (or camelCase 'namesrvAddr') and the error fires when the resulting list is empty.","triggerScenarios":"connect/testConnection called with connection params that omit 'namesrv_addr', use an alternate wrong key, or pass an empty/whitespace-only value.","commonSituations":"Env-var interpolation failing so the field resolves to empty; users specifying only broker_addr assuming it substitutes for name servers; mixed casing mistakes between snake_case and camelCase.","solutions":["Set 'namesrv_addr' (or 'namesrvAddr') in the connection object with one or more comma-separated host:port values","Verify the environment variable feeding this field is populated and non-empty at runtime","If you only have a broker address, point namesrv_addr at the name server(s) of the same cluster"],"exampleFix":"// before\n{\"connection\": {\"access_key\": \"ak\"}}\n// after\n{\"connection\": {\"namesrv_addr\": \"11.0.0.1:9876,11.0.0.2:9876\", \"access_key\": \"ak\"}}","handlingStrategy":"validation","validationCode":"ns := cfg.Connection[\"namesrv_addr\"]\nif len(strings.Split(fmt.Sprint(ns), \",\")) == 0 || strings.TrimSpace(fmt.Sprint(ns)) == \"\" {\n    return errors.New(\"namesrv_addr must contain at least one host:port\")\n}","typeGuard":"func hasNameServers(conn map[string]any) bool {\n    v := stringValue(conn, \"namesrv_addr\", \"namesrvAddr\")\n    return len(splitAddresses(v)) > 0\n}","tryCatchPattern":"conn, err := parseConnection(params)\nif err != nil {\n    var missing = \"namesrv_addr is required\"\n    if err.Error() == missing { log.Fatal(\"set ROCKETMQ_NAMESRV_ADDR env var\") }\n    return err\n}","preventionTips":["Set namesrv_addr via environment with a startup sanity check","Prefer providing comma-separated name servers for HA","Don't assume broker_addr can replace name servers"],"tags":["configuration","validation","connection"],"backgroundTag":"missing-required-config","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}