{"record":{"id":"30c587a3f762f37f","repo":"pinpoint-apm/pinpoint","slug":"ioexception-parsing","errorCode":null,"errorMessage":"IOException parsing ","messagePattern":"IOException parsing ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"agent-module/plugins-loader/src/main/java/com/navercorp/pinpoint/loader/plugins/trace/yaml/TraceMetadataProviderYamlParser.java","lineNumber":61,"sourceCode":" */\npublic class TraceMetadataProviderYamlParser implements TraceMetadataProviderParser {\n\n    private final Logger logger = LogManager.getLogger(this.getClass());\n    private final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());\n\n    @Override\n    public ParsedTraceMetadataProvider parse(URL url) {\n        String typeProviderId = getTypeProviderId(url);\n        try {\n            ParsedTraceMetadata parsedTraceMetadata = parse0(url);\n            try {List<ServiceTypeInfo> serviceTypeInfos = toServiceTypeInfos(parsedTraceMetadata.getServiceTypes());\n                List<AnnotationKey> annotationKeys = toAnnotationKeys(parsedTraceMetadata.getAnnotationKeys());\n                return new ParsedTraceMetadataProvider(typeProviderId, serviceTypeInfos, annotationKeys);\n            } catch (Exception e) {\n                throw new IllegalStateException(\"Invalid type provider definition : \" + url.toString(), e);\n            }\n        } catch (IOException e) {\n            throw new IllegalStateException(\"IOException parsing \" + url.toExternalForm(), e);\n        }\n    }\n\n    private ParsedTraceMetadata parse0(URL metaUrl) throws IOException {\n        try (InputStream inputStream = metaUrl.openStream()) {\n            ParsedTraceMetadata parsedTraceMetadata = mapper.readValue(inputStream, ParsedTraceMetadata.class);\n            if (parsedTraceMetadata == null) {\n                logger.warn(\"Empty type provider definition. Skipping : {}\", metaUrl.toExternalForm());\n            }\n            return parsedTraceMetadata;\n        } catch (JsonParseException | JsonMappingException e) {\n            throw new IllegalStateException(\"Error parsing yml : \" + metaUrl, e);\n        } catch (IOException e) {\n            throw new IllegalStateException(\"Error opening stream : \" + metaUrl, e);\n        }\n    }\n\n    private String getTypeProviderId(URL metaUrl) {","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/plugins-loader/src/main/java/com/navercorp/pinpoint/loader/plugins/trace/yaml/TraceMetadataProviderYamlParser.java#L43-L79","documentation":"TraceMetadataProviderYamlParser.parse(URL) treats any IOException while opening/reading the provider URL as a fatal problem and wraps it in an IllegalStateException('IOException parsing ' + url). This distinguishes I/O failures from the semantic-conversion failures handled by the other branch.","triggerScenarios":"The URL passed to parse() cannot be opened or read: stream creation or mapper.readValue throws an IOException other than Jackson's parse/mapping exceptions (which are handled in parse0).","commonSituations":"Type-provider yml missing from the plugin jar after packaging; wrong classpath resource path; jar corrupted; file permissions on an external resource URL.","solutions":["Confirm the YAML resource actually exists inside the plugin artifact (unzip -l plugin.jar | grep yml)","Check the URL/path used to locate the resource matches the packaged location","Rebuild the plugin if packaging filtered the resource out","Verify read permissions on the file/jar"],"exampleFix":"// before: resource not on classpath\nURL url = getClass().getResource(\"/typo-provider.yml\");\n// after\nURL url = getClass().getResource(\"/pinpoint/type-provider.yml\");","handlingStrategy":"try-catch","validationCode":"URL url = getClass().getResource(path);\nif (url == null) {\n    throw new FileNotFoundException(\"missing type provider resource: \" + path);\n}","typeGuard":null,"tryCatchPattern":"try {\n    parser.parse(url);\n} catch (IllegalStateException e) {\n    // message contains 'IOException parsing' — check resource exists/readable, then rethrow or skip provider\n}","preventionTips":["Verify resources are packaged in the plugin jar (check build resource includes)","Use getResource() null-checks before parse()","Confirm jar integrity after build/deploy"],"tags":["io","plugin","resource","url"],"backgroundTag":"file-read-failed","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"}