{"record":{"id":"77b2eab98e5a0fa1","repo":"pinpoint-apm/pinpoint","slug":"trace-v3-span-end-time-is-required","errorCode":null,"errorMessage":"TRACE_V3 span end time is required","messagePattern":"TRACE_V3 span end time is required","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/SpanBo.java","lineNumber":204,"sourceCode":"            throw new IllegalArgumentException(\"TRACE_V3 span requires absolute start/end time\");\n        }\n\n        setVersion(version);\n        this.startTime = startTime;\n        this.elapsed = elapsedMillis;\n        this.endTime = DEFAULT_END_TIME;\n    }\n\n    /**\n     * Sets absolute span time for TRACE_V3 data.\n     * startTime/endTime are epoch nanos. elapsedMillis is retained as the compatibility duration.\n     */\n    public void setTraceTime(int version, long startTime, long endTime, int elapsedMillis) {\n        if (version != SpanVersion.TRACE_V3) {\n            throw new IllegalArgumentException(\"absolute start/end time is only supported for TRACE_V3 spans\");\n        }\n        if (endTime == DEFAULT_END_TIME) {\n            throw new IllegalArgumentException(\"TRACE_V3 span end time is required\");\n        }\n        if (endTime < startTime) {\n            throw new IllegalArgumentException(\"span end time must be greater than or equal to start time\");\n        }\n\n        setVersion(version);\n        this.startTime = startTime;\n        this.elapsed = elapsedMillis;\n        this.endTime = endTime;\n    }\n\n    public boolean hasEndTime() {\n        return endTime != DEFAULT_END_TIME;\n    }\n\n    public long getEndTimeMillis() {\n        if (hasEndTime()) {\n            return timeAccessor().toMillis(endTime);","sourceCodeStart":186,"sourceCodeEnd":222,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/SpanBo.java#L186-L222","documentation":"For TRACE_V3 spans, endTime is mandatory: a value equal to DEFAULT_END_TIME (the unset sentinel used by pre-V3 spans) is rejected with IllegalArgumentException. V3 stores absolute times, so an unset end time would leave the span interval undefined.","triggerScenarios":"Calling setTraceTime(version, startTime, endTime, elapsedMillis) with version == TRACE_V3 while endTime is still DEFAULT_END_TIME — i.e. the caller never resolved a real end timestamp.","commonSituations":"Converted pre-V3 code paths that leave endTime at its default sentinel; partially migrated deserializers that populate start but not end; tests constructing minimal V3 spans without an end time.","solutions":["Provide a real epoch-nano endTime (e.g. startTime + elapsedMillis converted to nanos) when constructing V3 spans","Ensure the deserializer reads the persisted end-time field before calling setTraceTime","Compute endTime from startTime if the source stores only a duration","Update span-construction helpers to require endTime for V3"],"exampleFix":"// before\nspan.setTraceTime(SpanVersion.TRACE_V3, startTime, SpanBo.DEFAULT_END_TIME, elapsed); // throws\n// after\nlong endTime = startTime + TimeUnit.MILLISECONDS.toNanos(elapsed);\nspan.setTraceTime(SpanVersion.TRACE_V3, startTime, endTime, elapsed);","handlingStrategy":"validation","validationCode":"if (version == SpanVersion.TRACE_V3 && endTime == SpanBo.DEFAULT_END_TIME) { endTime = startTime + TimeUnit.MILLISECONDS.toNanos(elapsedMillis); }","typeGuard":"boolean hasEndTime(long endTime) { return endTime != SpanBo.DEFAULT_END_TIME && endTime > 0; }","tryCatchPattern":"try { span.setTraceTime(version, start, end, elapsed); } catch (IllegalArgumentException e) { log.warn(\"V3 end time missing: {}\", e.getMessage()); }","preventionTips":["Always resolve a concrete end time before building V3 spans","Compute endTime from startTime+elapsed when only a duration is stored","Make V3 span constructors/tests require endTime"],"tags":["java","span","missing-value","versioning"],"backgroundTag":"missing-required-argument","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}