{"record":{"id":"f22c3a1f251f688a","repo":"openzipkin/zipkin","slug":"incomplete-annotation-at-f22c3a","errorCode":null,"errorMessage":"Incomplete annotation at {}","messagePattern":"Incomplete annotation at (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"zipkin/src/main/java/zipkin2/internal/V2SpanReader.java","lineNumber":68,"sourceCode":"        builder.remoteEndpoint(ENDPOINT_READER.fromJson(reader));\n      } else if (nextName.equals(\"annotations\")) {\n        reader.beginArray();\n        while (reader.hasNext()) {\n          reader.beginObject();\n          Long timestamp = null;\n          String value = null;\n          while (reader.hasNext()) {\n            nextName = reader.nextName();\n            if (nextName.equals(\"timestamp\")) {\n              timestamp = reader.nextLong();\n            } else if (nextName.equals(\"value\")) {\n              value = reader.nextString();\n            } else {\n              reader.skipValue();\n            }\n          }\n          if (timestamp == null || value == null) {\n            throw new IllegalArgumentException(\"Incomplete annotation at \" + reader.getPath());\n          }\n          reader.endObject();\n          builder.addAnnotation(timestamp, value);\n        }\n        reader.endArray();\n      } else if (nextName.equals(\"tags\")) {\n        reader.beginObject();\n        while (reader.hasNext()) {\n          String key = reader.nextName();\n          if (reader.peekNull()) {\n            throw new IllegalArgumentException(\"No value at \" + reader.getPath());\n          }\n          builder.putTag(key, reader.nextString());\n        }\n        reader.endObject();\n      } else if (nextName.equals(\"debug\")) {\n        if (reader.nextBoolean()) builder.debug(true);\n      } else if (nextName.equals(\"shared\")) {","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/openzipkin/zipkin/blob/878ce2a1fad54ca941d17fdcf2e1d924b148eb1f/zipkin/src/main/java/zipkin2/internal/V2SpanReader.java#L50-L86","documentation":"In V2 JSON span decoding, each element of the \"annotations\" array must carry both \"timestamp\" and \"value\"; after reading the object, V2SpanReader throws 'Incomplete annotation at <jsonPath>' when either is null. JSON_V2 is stricter than a lenient parser: model-required fields must be present even if the JSON itself is well-formed.","triggerScenarios":"SpanBytesDecoder.JSON_V2.decode/decodeList on a span where an annotation object misses timestamp or value — e.g. {\"annotations\":[{\"timestamp\":1610000000000000}]} or the fields were renamed (ts/val) by a custom exporter.","commonSituations":"Custom reporters writing hand-shaped span JSON instead of using SpanBytesEncoder.JSON_V2; pipelines that drop zero-valued timestamps (some serializers omit 0L); field-name drift between brave/zipkin report format versions.","solutions":["Fix the producer to emit both \"timestamp\" (microseconds) and \"value\" for every annotation — simplest is to use brave's or zipkin's own encoder.","Inspect the JSON path in the message to find the exact offending annotation.","Check for serializers configured to skip default values (WRITE_DATES_AS_TIMESTAMPS off / NON_DEFAULT inclusion) that drop timestamp=0.","Reject the span at ingest with a clear error back to the producer."],"exampleFix":"// before\n{\"annotations\":[{\"value\":\"sr\"}]}\n\n// after\n{\"annotations\":[{\"timestamp\":1617235200000000,\"value\":\"sr\"}]}","handlingStrategy":"validation","validationCode":"boolean isCompleteV2Annotation(JsonNode n) { return n.hasNonNull(\"timestamp\") && n.hasNonNull(\"value\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use brave/zipkin reporters so annotation JSON is always well-formed.","Disable NON_DEFAULT/NON_EMPTY field exclusion on custom serializers that drop timestamp=0."],"tags":["zipkin","json","v2","annotation"],"backgroundTag":null,"analyzedSha":"878ce2a1fad54ca941d17fdcf2e1d924b148eb1f","analyzedAt":"2026-08-14T15:17:09.895Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}