{"record":{"id":"ca61202ef1bbd770","repo":"apache/skywalking","slug":"incompatible-bucketedvalues-for-current-perce","errorCode":null,"errorMessage":"Incompatible BucketedValues [{}] for current PercentileFunction[{}]","messagePattern":"Incompatible BucketedValues \\[(.+?)\\] for current PercentileFunction\\[(.+?)\\]","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/avg/AvgHistogramPercentileFunction.java","lineNumber":121,"sourceCode":"    @Column(name = DATASET, storageOnly = true)\n    @BanyanDB.MeasureField\n    private DataTable dataset = new DataTable(30);\n    /**\n     * Rank\n     */\n    @Getter\n    @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 (dataset.size() > 0) {\n            if (!value.getBucketedValues().isCompatible(dataset)) {\n                throw new IllegalArgumentException(\n                    \"Incompatible BucketedValues [\" + value + \"] for current PercentileFunction[\" + dataset + \"]\");\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)) {","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/apache/skywalking/blob/102af09b4a56064e22050dded10e2c52e490d040/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java#L103-L139","documentation":"AvgHistogramPercentileFunction (avgHistogramPercentile / meterPercentile in MAL) accepts a PercentileArgument wrapping BucketedValues plus ranks. Before accumulating it checks the bucketed values against the already-populated dataset with isCompatible(); differing bucket key sets throw with both the incoming argument and the current dataset rendered in the message.","triggerScenarios":"A percentile metric defined with one buckets config receives BucketedValues built with another; two MAL rules or agents target the same percentile metric name with different bucket boundaries; buckets were edited in config and new data hits the surviving in-memory dataset.","commonSituations":"Same as other histogram functions: heterogeneous agent bucket defaults, runtime bucket-config edits, mixed collector versions — plus percentile rules copied between services with local bucket overrides.","solutions":["Use one bucket set per percentile metric name across all rules and producers","Version the metric name when bucket boundaries change instead of mutating the existing metric","After correcting config, restart OAP to reset in-memory aggregation state"],"exampleFix":"# before — same metric, two bucket sets\np50:\n  exp: http_duration.bucket({'10','50','100'})\n  meterFunction: avgHistogramPercentile\n# other producer uses {'5','25','45'}\n\n# after — unify, or rename\np50_v2:\n  exp: http_duration.bucket({'5','25','45','95'})\n  meterFunction: avgHistogramPercentile","handlingStrategy":"try-catch","validationCode":"long[] buckets = percentileContract.bucketsFor(metricName); // shared, versioned bucket contract\nif (!Arrays.equals(incoming.getBucketedValues().getBuckets(), buckets)) {\n    log.warn(\"Dropping {} sample with non-contract buckets\", metricName);\n    return;\n}\npercentileMetric.accept(entity, percentileArgument);","typeGuard":null,"tryCatchPattern":"try {\n    percentileMetric.accept(entity, percentileArgument);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"Incompatible BucketedValues\")) {\n        log.error(\"Bucket set drift on percentile metric {}\", metricName, e);\n        return;\n    }\n    throw e;\n}","preventionTips":["Keep the bucket list next to the rank list in the percentile rule and never edit buckets on a live metric name","Version metric names on bucket changes; restart OAP to clear in-memory state after config fixes","Cross-check agent bucket defaults when onboarding a new agent version"],"tags":["meter-system","percentile","bucket-mismatch","mal","agent-config"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}