{"record":{"id":"f752e98328c26c37","repo":"openzipkin/zipkin","slug":"no-key-at","errorCode":null,"errorMessage":"No key at {}","messagePattern":"No key at (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"zipkin/src/main/java/zipkin2/internal/V1JsonSpanReader.java","lineNumber":149,"sourceCode":"      if (nextName.equals(\"key\")) {\n        key = reader.nextString();\n      } else if (nextName.equals(\"value\")) {\n        if (reader.peekString()) {\n          stringValue = reader.nextString();\n        } else if (reader.peekBoolean()) {\n          booleanValue = reader.nextBoolean();\n        } else {\n          reader.skipValue();\n        }\n      } else if (nextName.equals(\"endpoint\")) {\n        endpoint = ENDPOINT_READER.fromJson(reader);\n      } else {\n        reader.skipValue();\n      }\n    }\n\n    if (key == null) {\n      throw new IllegalArgumentException(\"No key at \" + reader.getPath());\n    }\n    reader.endObject();\n\n    if (stringValue != null) {\n      builder.addBinaryAnnotation(key, stringValue, endpoint);\n    } else if (booleanValue != null && booleanValue && endpoint != null) {\n      if (key.equals(\"sa\") || key.equals(\"ca\") || key.equals(\"ma\")) {\n        builder.addBinaryAnnotation(key, endpoint);\n      }\n    }\n  }\n}\n","sourceCodeStart":131,"sourceCodeEnd":162,"githubUrl":"https://github.com/openzipkin/zipkin/blob/878ce2a1fad54ca941d17fdcf2e1d924b148eb1f/zipkin/src/main/java/zipkin2/internal/V1JsonSpanReader.java#L131-L162","documentation":"In V1 JSON spans, every binary annotation object must have a 'key' member. After parsing the object, V1JsonSpanReader throws 'No key at <jsonPath>' when key == null — value or endpoint may be absent, but key is mandatory because binary annotations are a key/value map representation.","triggerScenarios":"Decoding JSON_V1 input whose binaryAnnotations[] entry omits 'key', e.g. {\"value\":\"zipkin\",\"endpoint\":{...}}.","commonSituations":"Legacy fixture files hand-edited incorrectly; converters from other formats mapping tag values but not names; JSON pipelines renaming/dropping the key field.","solutions":["Add the missing \"key\" member to the binary annotation at the reported path.","Regenerate V1 fixtures from real spans: Span.Builder.putTag then JSON_V1 encode.","Migrate producers to V2 JSON where tags are a plain object of name->string, harder to malform.","Validate legacy payloads with a JSON schema before decode."],"exampleFix":"// before\n{\"binaryAnnotations\":[{\"value\":\"i-9b4f2a\",\"endpoint\":{\"serviceName\":\"web\"}}]}\n\n// after\n{\"binaryAnnotations\":[{\"key\":\"ec2.instance-id\",\"value\":\"i-9b4f2a\",\"endpoint\":{\"serviceName\":\"web\"}}]}","handlingStrategy":"validation","validationCode":"boolean hasV1BinaryAnnotationKey(JsonNode n) { return n.hasNonNull(\"key\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Generate V1 fixtures by encoding real Span objects rather than hand-writing JSON.","Validate legacy payloads against a JSON schema before decode."],"tags":["zipkin","json","v1","binary-annotation"],"backgroundTag":null,"analyzedSha":"878ce2a1fad54ca941d17fdcf2e1d924b148eb1f","analyzedAt":"2026-08-14T15:17:09.895Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}