{"record":{"id":"246412f4e1c81630","repo":"pinpoint-apm/pinpoint","slug":"invalid-full-qualified-method-name-fullqualified","errorCode":null,"errorMessage":"invalid full qualified method name(${fullQualifiedMethodName}). not found method","messagePattern":"invalid full qualified method name\\((.+?)\\)\\. not found method","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agent-module/plugins/user/src/main/java/com/navercorp/pinpoint/plugin/user/UserPlugin.java","lineNumber":175,"sourceCode":"                final String className = toClassName(fullyQualifiedMethodName);\n                final String methodName = toMethodName(fullyQualifiedMethodName);\n                Set<String> methodNames = userMethods.get(className);\n                if (methodNames == null) {\n                    methodNames = new HashSet<>();\n                    userMethods.put(className, methodNames);\n                }\n                methodNames.add(methodName);\n            } catch (Exception e) {\n                logger.warn(\"Failed to parse user method(\" + fullyQualifiedMethodName + \").\", e);\n            }\n        }\n        return userMethods;\n    }\n\n    String toClassName(String fullQualifiedMethodName) {\n        final int classEndPosition = fullQualifiedMethodName.lastIndexOf('.');\n        if (classEndPosition <= 0) {\n            throw new IllegalArgumentException(\"invalid full qualified method name(\" + fullQualifiedMethodName + \"). not found method\");\n        }\n\n        return fullQualifiedMethodName.substring(0, classEndPosition);\n    }\n\n    String toMethodName(String fullQualifiedMethodName) {\n        final int methodBeginPosition = fullQualifiedMethodName.lastIndexOf('.');\n        if (methodBeginPosition <= 0 || methodBeginPosition + 1 >= fullQualifiedMethodName.length()) {\n            throw new IllegalArgumentException(\"invalid full qualified method name(\" + fullQualifiedMethodName + \"). not found method\");\n        }\n\n        return fullQualifiedMethodName.substring(methodBeginPosition + 1);\n    }\n\n    @Override\n    public void setTransformTemplate(TransformTemplate transformTemplate) {\n        this.transformTemplate = transformTemplate;\n    }","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/plugins/user/src/main/java/com/navercorp/pinpoint/plugin/user/UserPlugin.java#L157-L193","documentation":"UserPlugin.toClassName splits a fully qualified method name like 'com.foo.Bar.baz' into its class portion by finding the last dot. If there is no dot (position <= 0), the string is not a valid fully qualified method name, and it throws IllegalArgumentException with the offending input. This is a plugin configuration parsing guard.","triggerScenarios":"A user-plugin configuration value (e.g. a targeted method expression) contains no '.' separator between class and method — e.g. 'MyClass' or an empty string passed to toClassName.","commonSituations":"Typo or missing method part in pinpoint-user-plugin config (profiler.user.include/remove entries); property file line-wrapping that truncated the method name; using a class name instead of a fully qualified method name.","solutions":["Provide the full qualified method name including class and method, e.g. 'com.example.Foo.bar'","Check the plugin configuration file for truncated or wrapped lines","Trim whitespace/typos such as leading dots or missing package segments","Add a config pre-check that validates each entry contains at least one dot"],"exampleFix":"// before\nuserPlugin.include(\"com.example.Foo\");\n// after\nuserPlugin.include(\"com.example.Foo.handleRequest\");","handlingStrategy":"validation","validationCode":"String fqn = config.getMethodName();\nif (fqn == null || fqn.indexOf('.') <= 0 || fqn.endsWith(\".\")) {\n    throw new IllegalArgumentException(\"expected package.Class.method, got: \" + fqn);\n}","typeGuard":null,"tryCatchPattern":"try {\n    String cls = toClassName(fqn);\n} catch (IllegalArgumentException e) {\n    logger.error(\"bad user-plugin method expression: {}\", fqn, e);\n    throw new PluginSetupException(e);\n}","preventionTips":["Always configure fully qualified method names as package.Class.method","Trim and inspect config values for truncation before plugin setup","Validate every configured expression at startup with a dot-count check","Keep method expressions on one line in config files to avoid line-wrap truncation"],"tags":["configuration","parsing","plugin","argument-format"],"backgroundTag":"invalid-argument-format","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}