apache/skywalking · error · IllegalArgumentException
Incompatible BucketedValues [{}] for current PercentileFunct
Error message
Incompatible BucketedValues [{}] for current PercentileFunction[{}] What it means
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.
Source
Thrown at oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java:121
@Column(name = DATASET, storageOnly = true)
@BanyanDB.MeasureField
private DataTable dataset = new DataTable(30);
/**
* Rank
*/
@Getter
@Setter
@Column(name = RANKS, storageOnly = true)
@BanyanDB.MeasureField
private IntList ranks = new IntList(10);
private boolean isCalculated = false;
@Override
public void accept(final MeterEntity entity, final PercentileArgument value) {
if (dataset.size() > 0) {
if (!value.getBucketedValues().isCompatible(dataset)) {
throw new IllegalArgumentException(
"Incompatible BucketedValues [" + value + "] for current PercentileFunction[" + dataset + "]");
}
}
for (final int rank : value.getRanks()) {
if (rank <= 0) {
throw new IllegalArgumentException("Illegal rank value " + rank + ", must be positive");
}
}
if (ranks.size() > 0) {
if (ranks.size() != value.getRanks().length) {
throw new IllegalArgumentException(
"Incompatible ranks size = [" + value.getRanks().length + "] for current PercentileFunction[" + ranks
.size() + "]");
} else {
for (final int rank : value.getRanks()) {
if (!ranks.include(rank)) {View on GitHub (pinned to 102af09b4a)
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
Example fix
# before — same metric, two bucket sets
p50:
exp: http_duration.bucket({'10','50','100'})
meterFunction: avgHistogramPercentile
# other producer uses {'5','25','45'}
# after — unify, or rename
p50_v2:
exp: http_duration.bucket({'5','25','45','95'})
meterFunction: avgHistogramPercentile Defensive patterns
Strategy: try-catch
Validate before calling
long[] buckets = percentileContract.bucketsFor(metricName); // shared, versioned bucket contract
if (!Arrays.equals(incoming.getBucketedValues().getBuckets(), buckets)) {
log.warn("Dropping {} sample with non-contract buckets", metricName);
return;
}
percentileMetric.accept(entity, percentileArgument); Try / catch
try {
percentileMetric.accept(entity, percentileArgument);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Incompatible BucketedValues")) {
log.error("Bucket set drift on percentile metric {}", metricName, e);
return;
}
throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Incompatible BucketedValues [{}] for current HistogramFuncti
- Incompatible BucketedValues [{}] for current HistogramFuncti
- Illegal rank value {rank}, must be positive
- Incompatible ranks size = [{value.getRanks().length}] for cu
- MeterSystem unavailable for MAL compile of {sourceName}
AI-assisted analysis of apache/skywalking@102af09b4a (2026-08-14).
Data as JSON: /api/errors/ca61202ef1bbd770.
Report an issue: GitHub.