{"record":{"id":"e1e041c1b067878b","repo":"apache/skywalking","slug":"output-field-fieldname-requires-outputtype-to","errorCode":null,"errorMessage":"Output field '{fieldName}' requires outputType to be set in the LAL rule config","messagePattern":"Output field '(.+?)' requires outputType to be set in the LAL rule config","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/LALBlockCodegen.java","lineNumber":481,"sourceCode":"     * <p>LAL: {@code latency parsed.latency as Long}\n     * (where {@code latency} is not a standard field but a field on the\n     * {@code outputType} class, e.g. {@code SampledTrace.setLatency(long)})\n     * <br>Generated: {@code _o.setLatency(h.toLong(h.mapVal(\"latency\")))}\n     *\n     * <p>The setter is validated at compile time via reflection on the\n     * output type. If no matching setter exists, compilation fails.\n     */\n    static void generateOutputFieldAssignment(\n            final StringBuilder sb,\n            final LALScriptModel.OutputFieldAssignment field,\n            final LALClassGenerator.GenCtx genCtx) {\n        final String fieldName = field.getFieldName();\n        final String setterName = \"set\"\n            + Character.toUpperCase(fieldName.charAt(0))\n            + fieldName.substring(1);\n\n        if (genCtx.outputType == null) {\n            throw new IllegalArgumentException(\n                \"Output field '\" + fieldName + \"' requires outputType to be set in the LAL rule config\");\n        }\n\n        // Compile-time validation: verify the setter exists on the output type\n        final Method setter = findSetter(genCtx.outputType, setterName);\n        if (setter == null) {\n            throw new IllegalArgumentException(\n                \"Output type \" + genCtx.outputType.getName()\n                + \" has no setter \" + setterName\n                + \"() for output field '\" + fieldName + \"'\");\n        }\n\n        // Generate direct setter call: _o.setXxx(value)\n        // _o is declared once at the top of the extractor method\n        final Class<?> paramType = setter.getParameterTypes()[0];\n        sb.append(\"  _o.\").append(setterName).append(\"(\");\n        final String effectiveCast = resolveEffectiveCast(paramType, field.getCastType());\n        if (paramType.isEnum()) {","sourceCodeStart":463,"sourceCodeEnd":499,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/LALBlockCodegen.java#L463-L499","documentation":"Thrown by Layer.valueOf(int) when no registered layer has that ordinal — mirrors the enum-generated valueOf contract of the pre-registry Layer enum. It fires when an int read from persisted storage, a protocol message, or configuration does not map to any live layer in this OAP process.","triggerScenarios":"Deserializing a storage row, agent/protocol payload, or config value containing a layer ordinal that was never registered in this process — e.g. ordinal 42 from a newer OAP version read by an older one, or a dynamic layer ordinal after a restart that no longer registers it.","commonSituations":"Version skew between the writer and reader of layer ordinals (built-ins are frozen, but new built-ins appear in newer releases); dynamic layers (100_000+) not being re-declared after restart, leaving persisted data pointing at dead ordinals; corrupted or hand-crafted data.","solutions":["Register the missing layer before reading (declare it in layer-extensions.yml or the matching layerDefinitions block) so the ordinal resolves","Use Layer.nameOf(String)/lenient lookups where possible, or Layer.values() to enumerate valid ordinals when validating external input","Resolve version skew: run the OAP version that knows the ordinal, or migrate the stored data"],"exampleFix":"// before\nLayer layer = Layer.valueOf(rawOrdinal); // throws if unregistered\n// after\nLayer layer = java.util.Arrays.stream(Layer.values())\n    .filter(l -> l.value() == rawOrdinal)\n    .findFirst()\n    .orElse(Layer.UNDEFINED);","handlingStrategy":"fallback","validationCode":"Layer layer = java.util.Arrays.stream(Layer.values())\n    .filter(l -> l.value() == rawOrdinal)\n    .findFirst().orElse(Layer.UNDEFINED);","typeGuard":null,"tryCatchPattern":"try { layer = Layer.valueOf(v); } catch (UnexpectedException e) { layer = Layer.UNDEFINED; log.warn(\"unknown layer ordinal {}\", v); }","preventionTips":["Prefer lenient lookups when reading persisted/external ints","Re-declare dynamic layers (layerDefinitions) on every OAP start so persisted ordinals resolve"],"tags":["skywalking","oap","layer","lookup","data-corruption"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}