{"record":{"id":"c22c50f431335212","repo":"apache/skywalking","slug":"incompatible-bucketedvalues-for-current-histo-c22c50","errorCode":null,"errorMessage":"Incompatible BucketedValues [{}] for current HistogramFunction[{}]","messagePattern":"Incompatible BucketedValues \\[(.+?)\\] for current HistogramFunction\\[(.+?)\\]","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/AvgHistogramFunction.java","lineNumber":90,"sourceCode":"    @BanyanDB.MeasureField\n    protected DataTable summation = new DataTable(30);\n    @Getter\n    @Setter\n    @Column(name = COUNT, storageOnly = true)\n    @ElasticSearch.Column(legacyName = \"count\")\n    @BanyanDB.MeasureField\n    protected DataTable count = new DataTable(30);\n    @Getter\n    @Setter\n    @Column(name = DATASET, dataType = Column.ValueDataType.HISTOGRAM, storageOnly = true, defaultValue = 0)\n    @BanyanDB.MeasureField\n    private DataTable dataset = new DataTable(30);\n\n    @Override\n    public void accept(final MeterEntity entity, final BucketedValues value) {\n        if (dataset.size() > 0) {\n            if (!value.isCompatible(dataset)) {\n                throw new IllegalArgumentException(\n                    \"Incompatible BucketedValues [\" + value + \"] for current HistogramFunction[\" + dataset + \"]\");\n            }\n        }\n\n        this.entityId = entity.id();\n\n        final long[] values = value.getValues();\n        for (int i = 0; i < values.length; i++) {\n            long bucket = value.getBuckets()[i];\n            String bucketName = bucket == Long.MIN_VALUE ? Bucket.INFINITE_NEGATIVE : String.valueOf(bucket);\n            summation.valueAccumulation(bucketName, values[i]);\n            count.valueAccumulation(bucketName, 1L);\n        }\n    }\n\n    @Override\n    public boolean combine(final Metrics metrics) {\n        AvgHistogramFunction histogram = (AvgHistogramFunction) metrics;","sourceCodeStart":72,"sourceCodeEnd":108,"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/AvgHistogramFunction.java#L72-L108","documentation":"AvgHistogramFunction (avgHistogram in MAL) keeps summation and count DataTables keyed by bucket name and averages them at calculation time. accept() enforces the same compatibility rule as HistogramFunction: once the dataset is non-empty, incoming BucketedValues must carry the identical bucket key set or the accept is rejected.","triggerScenarios":"An avgHistogram MAL metric is fed BucketedValues whose bucket boundaries differ from those already accumulated — different agent bucket defaults for one metric name, edited valueBuckets in the rule, or the infinity-negative sentinel bucket (Long.MIN_VALUE -> 'InfiniteNegative' key) present in one stream and absent in another.","commonSituations":"Mixed agent versions reporting the same avgHistogram metric; per-service bucket overrides; OTel collector exporters translating explicit-bucket histograms with changed boundaries.","solutions":["Pin one bucket definition per metric name and configure all producers (agents, collectors, MAL rules) to use it","Introduce a versioned metric name (e.g. _v2) when bucket boundaries must change, keeping datasets homogeneous","Restart OAP to clear in-memory datasets after fixing the producer config; drop the old persisted model if it holds incompatible keys"],"exampleFix":"# before\nservice_latency_percentile:\n  exp: otel...duration.bucket({'10','50','100'})\n  meterFunction: avgHistogram\n# another producer sends buckets {'20','80'} for the same metric\n\n# after — single bucket set for the metric name across all producers\nservice_latency_percentile:\n  exp: otel...duration.bucket({'10','50','100'})\n  meterFunction: avgHistogram","handlingStrategy":"try-catch","validationCode":"// before emitting an avgHistogram metric, verify the bucket set matches the metric's contract\nif (!Arrays.equals(buckets, expectedBucketsForMetric.get(metricName))) {\n    log.warn(\"Ignoring {} with foreign bucket set {}\", metricName, Arrays.toString(buckets));\n    return;\n}","typeGuard":null,"tryCatchPattern":"try {\n    avgHistogramMetric.accept(entity, bucketedValues);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"Incompatible BucketedValues\")) {\n        log.error(\"Bucket drift on avgHistogram metric {}\", metricName, e);\n        return;\n    }\n    throw e;\n}","preventionTips":["Pin a single valueBuckets list per avgHistogram metric name across agents and rules","Standardize agent default buckets fleet-wide before metrics go live","Version metric names when bucket boundaries must evolve"],"tags":["meter-system","avg-histogram","bucket-mismatch","mal","agent-config"],"backgroundTag":null,"analyzedSha":"102af09b4a56064e22050dded10e2c52e490d040","analyzedAt":"2026-08-14T10:47:52.647Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}