Streaming histogram drift detection and stability reports for MoonBit.
///|
test {
let spec = BucketSpec::new(0, 100, 5)
let reference = Histogram::new(spec).add_many([42, 45, 48, 51, 54])
let current = Histogram::new(spec).add_many([70, 72, 75, 80, 86])
let report = compare_histograms(reference, current)
assert_true(report.is_alert())
assert_eq(report.level_name(), "drift")
}///|
test {
let spec = BucketSpec::new(0, 100, 5)
let window = DriftWindow::new(spec, 3).push(10).push(20).push(30).push(90)
assert_eq(window.length(), 3)
assert_eq(window.histogram().total, 3)
}///|
test {
let spec = BucketSpec::new(0, 100, 5)
let reference = Histogram::new(spec).add_many([10, 20, 30, 40, 50])
let current = Histogram::new(spec).add_many([10, 20, 30, 60, 90])
let report = compare_histograms_with_policy(
reference,
current,
DriftPolicy::strict(),
)
assert_true(report.level == Drift)
}score_bp = sum(abs(current_share_bp - reference_share_bp)) / 2moon check --target all
moon test --target wasm
moon test --target wasm-gc
moon run cmd/mainfn DriftPolicy::classify(self : DriftPolicy, score_bp : Int, max_delta_bp : Int, shifted : Int) -> DriftLevelpub(all) struct DriftReport {
level : DriftLevel
score_bp : Int
max_delta_bp : Int
shifted_buckets : Int
reference_total : Int
current_total : Int
buckets : Array[BucketDelta]
} derive(Eq, Debug)pub(all) struct DriftWindow {
spec : BucketSpec
capacity : Int
values : Array[Int]
} derive(Eq, Debug)fn compare_histograms_with_policy(reference : Histogram, current : Histogram, policy : DriftPolicy) -> DriftReportStreaming histogram drift detection and stability reports for MoonBit.