alibaba/nacos · error · NacosApiException
INSTANCE_METADATA_ERROR
INSTANCE_METADATA_ERROR
Error message
metadata format incorrect:{metadata} What it means
Thrown by UtilsAndCommons.parseMetadata when the metadata string is neither valid JSON (Map<String,String>) nor valid comma-separated key=value pairs. The method first tries JSON deserialization; on failure it falls back to splitting on ',' and '='. Each fallback entry must have exactly one '=' producing exactly 2 parts (kv.length == 2). This error carries ErrorCode.INSTANCE_METADATA_ERROR.
Source
Thrown at naming/src/main/java/com/alibaba/nacos/naming/misc/UtilsAndCommons.java:204
*/
public static Map<String, String> parseMetadata(String metadata) throws NacosException {
Map<String, String> metadataMap = new HashMap<>(16);
if (StringUtils.isBlank(metadata)) {
return metadataMap;
}
try {
metadataMap = JacksonUtils.toObj(metadata, new TypeReference<Map<String, String>>() {
});
} catch (Exception e) {
String[] datas = metadata.split(",");
if (datas.length > 0) {
for (String data : datas) {
String[] kv = data.split("=");
if (kv.length != 2) {
throw new NacosApiException(HttpStatus.BAD_REQUEST.value(),
ErrorCode.INSTANCE_METADATA_ERROR,
"metadata format incorrect:" + metadata);
}
metadataMap.put(kv[0], kv[1]);
}
}
}
return metadataMap;
}
/**
* Provide a number between 0(inclusive) and {@code upperLimit}(exclusive) for the given {@code string}, the number
* will be nearly uniform distribution.
*
* <p>e.g. Assume there's an array which contains some IP of the servers provide the same service, the caller name
* can be used to choose the server to achieve load balance.
* <blockquote><pre>View on GitHub (pinned to 9b989acdf1)
Solutions
- Pass metadata as valid JSON: {"key":"value"}.
- Or pass as comma-separated key=value pairs: 'key1=val1,key2=val2'.
- Ensure every entry has exactly one '=' with non-empty key and value.
Example fix
// before
POST /v3/admin/ns/instance?metadata=key
// after
POST /v3/admin/ns/instance?metadata={"version":"1.0","env":"prod"} Defensive patterns
Strategy: validation
Validate before calling
// Pre-validate metadata before calling the API
try {
objectMapper.readValue(metadata, new TypeReference<Map<String,String>>(){});
} catch (Exception jsonEx) {
for (String kv : metadata.split(",")) {
String[] parts = kv.split("=", 2);
if (parts.length != 2 || parts[0].isEmpty()) {
throw new IllegalArgumentException("Bad metadata entry: " + kv);
}
}
} Type guard
function isValidMetadata(metadata: string): boolean {
try {
const obj = JSON.parse(metadata);
return typeof obj === 'object' && obj !== null;
} catch {
return metadata.split(',').every(kv => {
const parts = kv.split('=');
return parts.length === 2 && parts[0].length > 0;
});
}
} Try / catch
try {
namingService.registerInstance(serviceName, ip, port, metadata);
} catch (NacosApiException e) {
if (e.getErrCode() == 400 && e.getMessage().contains("metadata format incorrect")) {
metadata = objectMapper.writeValueAsString(parsedMetadataMap); // re-send as JSON
}
} Prevention
- Always send metadata as a JSON object string for maximum compatibility.
- If using k=v format, ensure every entry has exactly one '='.
When it happens
Trigger: Any naming API that accepts a 'metadata' parameter (instance registration, metadata update) with a malformed string, e.g. metadata='key' (no '='), metadata='key=value=extra' (multiple '='), metadata='{bad json', metadata='a=b,c' (second entry has no '=').
Common situations: Passing metadata in an unsupported format, missing the '=' in some entries, or partial JSON that is neither valid JSON nor valid k=v.
Related errors
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/36b4fe540905a22b.
Report an issue: GitHub.