{"record":{"id":"47a1ec5ca9dfa972","repo":"pinpoint-apm/pinpoint","slug":"unsupported-operation-47a1ec","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/recorder/DisableSpanEventRecorder.java","lineNumber":234,"sourceCode":"\n    @Override\n    public void recordAttribute(String key, List<AttributeValue> values) {\n\n    }\n\n    @Override\n    public void recordAttribute(String key, Map<String, AttributeValue> values) {\n\n    }\n\n    @Override\n    public Object attachFrameObject(Object frameObject) {\n        return null;\n    }\n\n    @Override\n    public Object getFrameObject() {\n        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);\n    }\n\n    @Override\n    public Object detachFrameObject() {\n        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION);\n    }\n\n\n}\n","sourceCodeStart":216,"sourceCodeEnd":244,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/DisableSpanEventRecorder.java#L216-L244","documentation":"DisableSpanEventRecorder is a no-op recorder used when a span event is disabled (e.g. asynchronous/optional recording that should do nothing). Frame object storage is intentionally unsupported, so getFrameObject() always throws UnsupportedOperationException. Hitting it means code called a storage method on a disabled recorder that can never hold frame state.","triggerScenarios":"Any code path that calls getFrameObject() on a DisableSpanEventRecorder — typically when the active trace is a DisableTrace and someone still invokes frame-object APIs on the SpanEventRecorder.","commonSituations":"A plugin/interceptor that unconditionally stores and reads frame objects (e.g. for async invocation tracking) but runs on a disabled trace; plugin code not checking whether recording is enabled before using frame objects.","solutions":["Check whether the trace/recorder is disabled before calling frame object APIs","Use a recorder that supports frame objects (SpanEventRecorder from an active trace) when frame state is needed","Rework interceptor logic so frame object attach/get/detach is skipped for disabled traces","Report to the plugin author that it must handle DisableSpanEventRecorder"],"exampleFix":"// before\nObject prev = recorder.getFrameObject();\n// after\nif (!(recorder instanceof DisableSpanEventRecorder)) {\n    Object prev = recorder.getFrameObject();\n}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"boolean supportsFrameObjects(SpanEventRecorder r) {\n    return !(r instanceof DisableSpanEventRecorder);\n}","tryCatchPattern":"try {\n    Object frame = recorder.getFrameObject();\n} catch (UnsupportedOperationException e) {\n    logger.debug(\"Frame objects unsupported on this recorder\");\n    return null;\n}","preventionTips":["Always check whether a trace is disabled before using frame-object APIs","Never assume SpanEventRecorder implementations are full-featured; the disabled variant is a stub","Write plugin tests that run interceptors against disabled traces"],"tags":["pinpoint-profiler","noop-recorder","unsupported-api"],"backgroundTag":"unsupported-operation","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"}