{"record":{"id":"bfe8ed515d1723c6","repo":"pinpoint-apm/pinpoint","slug":"unsupported-operation","errorCode":null,"errorMessage":"UNSUPPORTED_OPERATION","messagePattern":"UNSUPPORTED_OPERATION","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"warning","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DisableChildTrace.java","lineNumber":115,"sourceCode":"    }\n\n    private LocalTraceRoot getTraceRoot() {\n        return this.traceRoot;\n    }\n\n    @Override\n    public long getId() {\n        return getTraceRoot().getLocalTransactionId();\n    }\n\n    @Override\n    public long getStartTime() {\n        return traceRoot.getTraceStartTime();\n    }\n\n    @Override\n    public TraceId getTraceId() {\n        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);\n    }\n\n    @Override\n    public boolean canSampled() {\n        return false;\n    }\n\n    @Override\n    public boolean isRoot() {\n        return false;\n    }\n\n    @Override\n    public boolean isAsync() {\n        return true;\n    }\n\n    @Override","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/DisableChildTrace.java#L97-L133","documentation":"DisableChildTrace represents child traces of unsampled (disabled) traces; since no real trace exists, TraceId-dependent operations are not supported and getTraceId() throws UnsupportedOperationException('UNSUPPORTED_OPERATION').","triggerScenarios":"Calling getTraceId() on a DisableChildTrace instance — e.g. plugin code or logging that requests the trace id from a child of a sampling-disabled trace.","commonSituations":"Custom plugins assuming every Trace object exposes a TraceId; logging frameworks reading traceId during unsampled requests; code paths that skip canSampled() checks before accessing trace metadata.","solutions":["Check canSampled()/trace type before calling getTraceId()","Use traceRoot or the parent's TraceId where available instead","Handle UnsupportedOperationException gracefully in plugin code","Only record data on sampled traces"],"exampleFix":"// before\nlong id = trace.getTraceId().getTransactionSequence(); // throws on DisableChildTrace\n// after\nif (trace.canSampled()) {\n    long id = trace.getTraceId().getTransactionSequence();\n}","handlingStrategy":"type-guard","validationCode":"if (!trace.canSampled()) {\n    // skip TraceId access\n}","typeGuard":"boolean hasTraceId(Trace t) {\n    return t.canSampled() && !(t instanceof DisableChildTrace);\n}","tryCatchPattern":"try {\n    TraceId id = trace.getTraceId();\n} catch (UnsupportedOperationException e) {\n    // unsampled/disabled trace: skip TraceId-dependent logic\n}","preventionTips":["Always check canSampled() before TraceId access","Do not assume every Trace implementation supports getTraceId()","Guard plugin code that logs transaction metadata on disabled traces"],"tags":["trace","sampling","unsupported-operation"],"backgroundTag":"operation-not-supported","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}