{"record":{"id":"6e1e9a3016fafdb8","repo":"apache/skywalking","slug":"lalsourcetypeprovider-for-layer-declared-inp","errorCode":null,"errorMessage":"LALSourceTypeProvider {} for layer {} declared inputType {} — LAL accepts only LogData / LogData.Builder (default agent path), a protobuf Message subclass, or a type implementing {}. Update the provider's inputType() or implement ToJson on {}.","messagePattern":"LALSourceTypeProvider (.+?) for layer (.+?) declared inputType (.+?) — LAL accepts only LogData / LogData\\.Builder \\(default agent path\\), a protobuf Message subclass, or a type implementing (.+?)\\. Update the provider's inputType\\(\\) or implement ToJson on (.+?)\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"critical","filePath":"oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/log/listener/LogFilterListener.java","lineNumber":474,"sourceCode":"         * (custom POJO inputs). A provider that declares an out-of-family\n         * {@code inputType()} will fail downstream dispatch (the framework\n         * fallback {@code (LogData.Builder)} cast throws ClassCastException at\n         * runtime), so we surface the contract violation here at startup with a\n         * pointer at the SPI rather than letting it leak into the receiver hot path.\n         */\n        private static void validateInputTypeContract(final LALSourceTypeProvider provider) {\n            final Class<?> inputType = provider.inputType();\n            if (inputType == null) {\n                return;\n            }\n            if (LogData.class.isAssignableFrom(inputType)\n                || LogData.Builder.class.isAssignableFrom(inputType)\n                || Message.class.isAssignableFrom(inputType)\n                || Message.Builder.class.isAssignableFrom(inputType)\n                || ToJson.class.isAssignableFrom(inputType)) {\n                return;\n            }\n            throw new IllegalStateException(\n                \"LALSourceTypeProvider \" + provider.getClass().getName() + \" for layer \"\n                    + provider.layer() + \" declared inputType \" + inputType.getName()\n                    + \" — LAL accepts only LogData / LogData.Builder (default agent path), \"\n                    + \"a protobuf Message subclass, or a type implementing \"\n                    + ToJson.class.getName() + \". Update the provider's inputType() or \"\n                    + \"implement ToJson on \" + inputType.getName() + \".\");\n        }\n\n        private static Class<?> resolveInputType(final LALConfig config,\n                                                  final LALSourceTypeProvider spiProvider) throws ModuleStartException {\n            final String yamlType = config.getInputType();\n            if (yamlType != null && !yamlType.isEmpty()) {\n                try {\n                    return Class.forName(yamlType);\n                } catch (ClassNotFoundException e) {\n                    throw new ModuleStartException(\n                        \"LAL rule '\" + config.getName() + \"' declares inputType '\"\n                            + yamlType + \"' but the class was not found.\", e);","sourceCodeStart":456,"sourceCodeEnd":492,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/log/listener/LogFilterListener.java#L456-L492","documentation":"Thrown when validating a LALSourceTypeProvider SPI implementation whose inputType() returns a class outside the accepted contract: LogData/LogData.Builder, a protobuf Message/Message.Builder, or anything implementing ToJson. The check exists because the codegen must know how to surface the input to the rule — typed getter access for protos, JSON conversion via ToJson, or the LogData path. It is an IllegalStateException during provider/rule wiring.","triggerScenarios":"A receiver plugin implements LALSourceTypeProvider and returns a plain POJO class from inputType() that is neither a protobuf Message nor ToJson; returning a collection/Map/record type; generics erased types.","commonSituations":"Writing a custom log receiver and its LAL source provider; porting a v1 provider that had no type contract; returning a DTO class and forgetting the ToJson adapter.","solutions":["Implement ToJson on your input class (simplest for POJOs — LAL converts it to a parsed map)","Or make the input a protobuf Message and return that from inputType()","Or return null from inputType() to fall back to the LogMetadata default path","Register the corrected provider in META-INF/services and rebuild"],"exampleFix":"// before\npublic class MyProvider implements LALSourceTypeProvider {\n    public Class<?> inputType() { return MyPojo.class; }\n}\n\n// after\npublic class MyPojo implements ToJson { ... }\npublic class MyProvider implements LALSourceTypeProvider {\n    public Class<?> inputType() { return MyPojo.class; }\n}","handlingStrategy":"type-guard","validationCode":"// SPI self-check a provider can run in tests:\nClass<?> t = provider.inputType();\nboolean ok = t == null\n    || LogData.class.isAssignableFrom(t)\n    || LogData.Builder.class.isAssignableFrom(t)\n    || com.google.protobuf.Message.class.isAssignableFrom(t)\n    || com.google.protobuf.Message.Builder.class.isAssignableFrom(t)\n    || ToJson.class.isAssignableFrom(t);\nif (!ok) throw new IllegalStateException(\"inputType contract violated: \" + t);","typeGuard":"boolean isValidLalInputType(Class<?> t) {\n    return t == null\n        || LogData.class.isAssignableFrom(t)\n        || LogData.Builder.class.isAssignableFrom(t)\n        || Message.class.isAssignableFrom(t)\n        || Message.Builder.class.isAssignableFrom(t)\n        || ToJson.class.isAssignableFrom(t);\n}","tryCatchPattern":null,"preventionTips":["Default to implementing ToJson on custom POJO inputs","Add a unit test that calls the same contract check for your provider","Return null from inputType() when the LogMetadata fallback is intended"],"tags":["lal","log-analyzer","spi","provider","input-type"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}