{"record":{"id":"1283f418ae69efbe","repo":"openzipkin/zipkin","slug":"no-value-at","errorCode":null,"errorMessage":"No value at {}","messagePattern":"No value at (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"zipkin/src/main/java/zipkin2/internal/V2SpanReader.java","lineNumber":79,"sourceCode":"            } 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\")) {\n        if (reader.nextBoolean()) builder.shared(true);\n      } else {\n        reader.skipValue();\n      }\n    }\n    reader.endObject();\n    return builder.build();\n  }\n\n  @Override public String toString() {\n    return \"Span\";","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/openzipkin/zipkin/blob/878ce2a1fad54ca941d17fdcf2e1d924b148eb1f/zipkin/src/main/java/zipkin2/internal/V2SpanReader.java#L61-L97","documentation":"In V2 JSON spans the \"tags\" member is an object mapping tag names to string values. When a tag's value is JSON null, V2SpanReader throws 'No value at <jsonPath>' — null is not a valid tag value because tags are plain strings (empty string is allowed, null is not).","triggerScenarios":"SpanBytesDecoder.JSON_V2 decoding a span like {\"tags\":{\"env\":null}} — typically produced by serializing a map that contains a null value, or by mappers that emit null for missing entries.","commonSituations":"Reporters copying application maps into tags verbatim (HashMap with null values); JSON serializers not configured to exclude nulls; middleware adding conditional tags and writing null when a condition is false.","solutions":["On the producer, filter null values before tagging: tags.forEach((k,v) -> { if (v != null) span.tag(k, v); });","Configure Jackson/Gson serializers with NON_NULL inclusion so null map values are not emitted.","Represent absence by omitting the tag entirely, never by a null value; use \"\" if an empty tag is intended.","At ingest, pre-parse and strip null tag values if you must accept dirty payloads."],"exampleFix":"// before\nMap<String,String> meta = ...; // may contain nulls\nmeta.forEach(span::tag);\n\n// after\nfor (Map.Entry<String,String> e : meta.entrySet()) {\n  if (e.getValue() != null) span.tag(e.getKey(), e.getValue());\n}","handlingStrategy":"validation","validationCode":"for (Map.Entry<String,String> e : metadata.entrySet()) { if (e.getValue() != null) span.tag(e.getKey(), e.getValue()); }","typeGuard":"boolean tagValuePresent(JsonNode tags, String key) { return tags.has(key) && !tags.get(key).isNull(); }","tryCatchPattern":null,"preventionTips":["Filter null map values before copying them into tags.","Omit tags you do not have; never emit null values."],"tags":["zipkin","json","v2","tags","null-value"],"backgroundTag":null,"analyzedSha":"878ce2a1fad54ca941d17fdcf2e1d924b148eb1f","analyzedAt":"2026-08-14T15:17:09.895Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}