{"record":{"id":"da13256f2c34c11d","repo":"apache/skywalking","slug":"illegal-rank-value-rank-must-be-positive-da1325","errorCode":null,"errorMessage":"Illegal rank value {rank}, must be positive","messagePattern":"Illegal rank value (.+?), must be positive","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumHistogramPercentileFunction.java","lineNumber":107,"sourceCode":"    @Setter\n    @Column(name = RANKS, storageOnly = true)\n    @BanyanDB.MeasureField\n    private IntList ranks = new IntList(10);\n\n    private boolean isCalculated = false;\n\n    @Override\n    public void accept(final MeterEntity entity, final PercentileArgument value) {\n        if (summation.size() > 0) {\n            if (!value.getBucketedValues().isCompatible(summation)) {\n                throw new IllegalArgumentException(\n                    \"Incompatible BucketedValues [\" + value + \"] for current PercentileFunction[\" + summation + \"]\");\n            }\n        }\n\n        for (final int rank : value.getRanks()) {\n            if (rank <= 0) {\n                throw new IllegalArgumentException(\"Illegal rank value \" + rank + \", must be positive\");\n            }\n        }\n\n        if (ranks.size() > 0) {\n            if (ranks.size() != value.getRanks().length) {\n                throw new IllegalArgumentException(\n                    \"Incompatible ranks size = [\" + value.getRanks().length + \"] for current PercentileFunction[\" + ranks\n                        .size() + \"]\");\n            } else {\n                for (final int rank : value.getRanks()) {\n                    if (!ranks.include(rank)) {\n                        throw new IllegalArgumentException(\n                            \"Rank \" + rank + \" doesn't exist in the previous ranks \" + ranks);\n                    }\n                }\n            }\n        } else {\n            for (final int rank : value.getRanks()) {","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumHistogramPercentileFunction.java#L89-L125","documentation":"SumHistogramPercentileFunction validates each rank in PercentileArgument before merging. Percentile ranks must be positive integers (1-99 style values); a rank of 0 or a negative number is rejected immediately with this IllegalArgumentException, before any bucket/rank-set compatibility checks.","triggerScenarios":"A MAL rule passes 0 or a negative number as a percentile rank: `percentile(0, 50, 75) -> sum_histogram_percentile`, or a meter sender (native SkyWalking meter protocol) transmits a ranks array containing 0/-1.","commonSituations":"Typo in an otel-rules/meter-analyzer-config percentile expression; an agent-side SDK misconfigured with rank 0; a templating bug that renders an empty rank as 0.","solutions":["Change all ranks in the percentile(...) expression to positive integers (e.g. percentile(50, 75, 90, 99))","Fix the sending agent/meter SDK so it never emits 0 or negative ranks","Validate the generated MAL YAML config before deployment (config dry-run)"],"exampleFix":"# before\npercentile(0, 50, 99) -> sum_histogram_percentile\n# after\npercentile(50, 99) -> sum_histogram_percentile","handlingStrategy":"validation","validationCode":"// validate ranks before sending/accepting\nfor (int rank : argument.getRanks()) {\n    if (rank <= 0) {\n        throw new IllegalArgumentException(\"Config error: rank \" + rank + \" must be positive — fix the MAL percentile expression\");\n    }\n}","typeGuard":null,"tryCatchPattern":"Catch IllegalArgumentException at the receiver boundary, reject the whole meter batch with a descriptive error back to the sender/agent config, and log the metric name — the config, not the data, is wrong.","preventionTips":["Config-lint percentile expressions in CI (regex: only positive integers 1-99 allowed)","Never template ranks from possibly-empty variables","Test changed MAL rules against a local OAP before fleet rollout"],"tags":["meter-function","mal","percentile","validation","config-typo"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}