{"record":{"id":"8d5648a47a631df4","repo":"apache/skywalking","slug":"expected-number-argument-for-extension-function-g","errorCode":null,"errorMessage":"Expected number argument for extension function, got {}","messagePattern":"Expected number argument for extension function, got (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/compiler/MALMethodChainCodegen.java","lineNumber":195,"sourceCode":"                                       final MALExpressionModel.Argument arg,\n                                       final Class<?> expectedType) {\n        if (expectedType == String.class) {\n            if (arg instanceof MALExpressionModel.StringArgument) {\n                sb.append('\"')\n                  .append(DslJavaSourceText.toLiteral(\n                      ((MALExpressionModel.StringArgument) arg).getValue()))\n                  .append('\"');\n            } else {\n                throw new IllegalArgumentException(\n                    \"Expected String argument for extension function, got \"\n                        + arg.getClass().getSimpleName());\n            }\n        } else if (expectedType == double.class || expectedType == Double.class\n                || expectedType == float.class || expectedType == Float.class\n                || expectedType == long.class || expectedType == Long.class\n                || expectedType == int.class || expectedType == Integer.class) {\n            if (!(arg instanceof MALExpressionModel.ExprArgument)) {\n                throw new IllegalArgumentException(\n                    \"Expected number argument for extension function, got \"\n                        + arg.getClass().getSimpleName());\n            }\n            final MALExpressionModel.Expr expr =\n                ((MALExpressionModel.ExprArgument) arg).getExpr();\n            if (!(expr instanceof MALExpressionModel.NumberExpr)) {\n                throw new IllegalArgumentException(\n                    \"Expected number argument for extension function\");\n            }\n            final double raw =\n                ((MALExpressionModel.NumberExpr) expr).getValue();\n            if (expectedType == double.class || expectedType == Double.class) {\n                sb.append(raw);\n            } else if (expectedType == float.class\n                    || expectedType == Float.class) {\n                sb.append((float) raw).append('F');\n            } else if (expectedType == long.class\n                    || expectedType == Long.class) {","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/v2/compiler/MALMethodChainCodegen.java#L177-L213","documentation":"Thrown by MALMethodChainCodegen.generateExtensionArg when the extension method declares a numeric parameter (double/Double, float/Float, long/Long, int/Integer) but the MAL argument is not an expression argument (MALExpressionModel.ExprArgument) — e.g. a string literal or string list was passed where a number is required.","triggerScenarios":"Extension 'scale(SampleFamily, double factor)' invoked as '.myext::scale(\"2.0\")' or '.myext::scale([\"2\"])'. The first check tests the argument node type before the inner expression is examined.","commonSituations":"Quoting numeric arguments out of habit from label-name arguments of built-ins like sum(['svc']); switching an extension parameter from String to double without updating the rules.","solutions":["Remove quotes and pass a bare numeric literal: .myext::scale(2.0)","Keep the Java parameter as String and parse inside the method if you genuinely need flexible input","Update all rules referencing the extension after changing its signature"],"exampleFix":"# before\nexpr: m.sum([]).myext::scale(\"2.0\")\n\n# after\nexpr: m.sum([]).myext::scale(2.0)","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"boolean isNumericArg(MALExpressionModel.Argument a) {\n    return a instanceof MALExpressionModel.ExprArgument;\n}","tryCatchPattern":"catch IllegalArgumentException at compile time; log the offending argument text from the rule","preventionTips":["Never quote numeric extension arguments","Keep String-vs-number parameter conventions documented per extension function"],"tags":["mal","extension","type-mismatch","arguments"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}