Skip to content

Add changepoint detection algorithms and eval infrastructure#47683

Open
ellataira wants to merge 24 commits intoq-branch-observerfrom
ella/changepoint-detection-algorithms-v2
Open

Add changepoint detection algorithms and eval infrastructure#47683
ellataira wants to merge 24 commits intoq-branch-observerfrom
ella/changepoint-detection-algorithms-v2

Conversation

@ellataira
Copy link
Contributor

@ellataira ellataira commented Mar 10, 2026

Summary

Adds 3 new changepoint detection algorithms (Mann-Whitney, TopK, CorrShift), a passthrough correlator, and shared detector utilities.

New Detector Files

  • comp/observer/impl/metrics_detector_mannwhitney.go (368 lines, SeriesDetector) — Slides a split point across a time series and picks the candidate where a rank-based Mann-Whitney U test shows the strongest before/after shift. Uses 5 layered filters (p-value < 1e-12, effect size > 0.95, deviation > 3 MADs, relative change > 20%, minimum window of 60 points).
  • comp/observer/impl/metrics_detector_topk.go (367 lines, Detector) — Ranks all metrics by |post_median - pre_median| / MAD and reports only the top-K (min of 20 and top 2%). Includes a service diversity bonus so infrastructure metrics don't crowd out all slots.
  • comp/observer/impl/metrics_detector_corrshift.go (711 lines, Detector) — Computes rolling correlation matrices over the top-40-by-variance series, flags when the Frobenius norm of the correlation delta exceeds mean + 2*stddev. Detects cascading failures where previously independent metrics suddenly correlate. Renamed from correlation in commit bdd09f9b69.

New Correlator

  • comp/observer/impl/anomaly_correlator_passthrough.go (104 lines) — Bypasses TimeCluster grouping; emits each anomaly as its own 1-member correlation so downstream consumers see exactly which metrics each detector fires on.
  • comp/observer/impl/anomaly_correlator_passthrough_test.go (93 lines) — Unit tests covering single-anomaly, multi-anomaly, and empty-input cases.

Shared Utilities

  • comp/observer/impl/metrics_detector_util.go (126 lines) — Extracted from duplicate code across detectors: detectorMedian, detectorMAD, detectorMeanValues, detectorSampleStddev, detectorSeriesLabel, detectorMetricID, detectorService, detectorHasServiceTag.

Registry Changes

  • comp/observer/impl/testbench_registry.go (+36 lines) — Registers mannwhitney, corrshift, topk detectors and passthrough correlator, all with DefaultEnabled: false.

Formatting / Cleanup

  • anomaly_correlator_time_cluster.go, metrics_detector_rrcf.go, output.gogofmt alignment fixes only.

Test Plan

  • Unit tests: anomaly_correlator_passthrough_test.go covers passthrough correlator behavior
  • All 3 new detectors registered and runnable via testbench with DefaultEnabled: false
  • Gaussian F1 timestamp scoring still works via cmd/observer-scorer
  • gofmt clean

Eokye and others added 17 commits March 5, 2026 15:59
Introduce a standalone scoring system that evaluates observer anomaly
detection against ground truth disruption timestamps using Gaussian
overlap. The scorer is fully decoupled from the testbench.

- comp/observer/impl/score.go: Gaussian F1 scoring with half-Gaussian
  overlap, warmup filtering (before baseline.start), and cascading
  filtering (beyond 2σ after onset). Infers ground truth from
  scenario metadata.json or accepts explicit timestamps.
- cmd/observer-scorer/main.go: standalone scorer binary
- comp/observer/impl/eval_test.go: integration test that runs all
  benchmark scenarios headless and prints a score summary table.
  Three scenarios with hardcoded ground truths. Run with:
  go test -run TestEval -v ./comp/observer/impl/
- comp/observer/impl/score_test.go: 15 unit tests for scoring logic
- comp/anomalydetection/recorder/impl/recorder.go: add
  NewReadOnlyRecorder() for test use without fx
- cmd/observer-testbench/main.go: remove scoring flags and logic
- scenarios/*/metadata.json: ground truth metadata for three scenarios

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- tasks/q.py: add q.build-scorer and q.eval invoke tasks
  Usage: dda inv q.eval / dda inv q.eval --scenario 213_pagerduty
- eval_test.go: add Baseline FPs column, use text/tabwriter for table
Replace eval_test.go with invoke-based eval that runs the actual
testbench and scorer binaries. This tests the real code path (CLI,
fx, binary entry points) and leaves inspectable output JSONs in /tmp.

- tasks/q.py: rewrite q.eval to build+run binaries, collect JSON
  scores, print summary table with baseline FP counts
- cmd/observer-scorer/main.go: add --json flag for machine-readable output
- Delete eval_test.go and NewReadOnlyRecorder() (no longer needed)

Usage:
  dda inv q.eval
  dda inv q.eval --scenario 213_pagerduty
  dda inv q.eval --sigma 15
Align all defaults to ./comp/observer/scenarios, matching the
convention from the headless mode PR. Updates observer-testbench,
observer-scorer, and invoke tasks.
… truth, detector eval task

                                  - DetectorPassthroughCorrelator: emits one ActiveCorrelation per anomaly
                                    (no clustering), enabling per-detector scoring via the existing scorer
                                  - Extended metadata.json for all 3 scenarios with true_positives and
                                    false_positives (service + metric_name pairs) from scenario YAMLs
                                  - New `dda inv q.eval-detectors` task: runs each detector x scenario x
                                    correlator (passthrough L1 + time_cluster L2), prints comparison matrix
                                  - Registered passthrough correlator in testbench registry (default disabled)
                                  New score_metrics.go (detached from score.go for easy cherry-pick):
                                  - LoadMetricGroundTruth: reads true_positives/false_positives from metadata.json
                                  - ScoreMetrics: classifies each anomaly period's metric as TP, FP, or unknown
                                    by matching anomaly Source against service:metric ground truth pairs
                                  - Handles aggregate suffixes (e.g., "redis.cpu.sys:avg" matches "redis.cpu.sys")
                                  - Reports metric-level precision, recall, F1, plus found/missed TP lists

                                  Wiring:
                                  - observer-scorer: new --score-metrics flag, outputs metrics in JSON
                                  - q.eval-detectors: L1 runs use --verbose + --score-metrics, table shows
                                    mTP/mFP/mUnk/mPrec/mRec columns
Implement Mann-Whitney, TopK, Correlation, PELT, E-Divisive, Hardened CUSUM,
Ensemble, and Cusum_adaptive detectors. Add adapterMetricID() source field fix
for metric scoring, service-level matching fallback in scorer, and eval harness
updates. All detectors registered (new ones default disabled).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…dened, cusum_adaptive

Remove 5 detectors that plateaued or failed during eval iteration, keeping
the 3 promising algorithms (mannwhitney, topk, correlation) alongside the
existing baseline detectors (cusum, bocpd, rrcf).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… truth, detector eval task

                                  - DetectorPassthroughCorrelator: emits one ActiveCorrelation per anomaly
                                    (no clustering), enabling per-detector scoring via the existing scorer
                                  - Extended metadata.json for all 3 scenarios with true_positives and
                                    false_positives (service + metric_name pairs) from scenario YAMLs
                                  - New `dda inv q.eval-detectors` task: runs each detector x scenario x
                                    correlator (passthrough L1 + time_cluster L2), prints comparison matrix
                                  - Registered passthrough correlator in testbench registry (default disabled)
                                  New score_metrics.go (detached from score.go for easy cherry-pick):
                                  - LoadMetricGroundTruth: reads true_positives/false_positives from metadata.json
                                  - ScoreMetrics: classifies each anomaly period's metric as TP, FP, or unknown
                                    by matching anomaly Source against service:metric ground truth pairs
                                  - Handles aggregate suffixes (e.g., "redis.cpu.sys:avg" matches "redis.cpu.sys")
                                  - Reports metric-level precision, recall, F1, plus found/missed TP lists

                                  Wiring:
                                  - observer-scorer: new --score-metrics flag, outputs metrics in JSON
                                  - q.eval-detectors: L1 runs use --verbose + --score-metrics, table shows
                                    mTP/mFP/mUnk/mPrec/mRec columns
…taDog/datadog-agent into ella/changepoint-detection-algorithms

# Conflicts:
#	cmd/observer-scorer/main.go
#	comp/observer/impl/score.go
#	comp/observer/impl/score_metrics.go
#	tasks/q.py
Enrich MetricScoreResult with per-metric detection detail: first-seen
timestamps, detection counts, and delta from disruption start. Surface
in scorer JSON/text output and eval-detectors task.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix gofmt issues in testbench_registry.go and score_metrics.go
- Extract duplicated median/MAD/seriesLabel/metricID/service helpers
  into metrics_detector_util.go, replacing prefixed copies in each detector
- detectorMAD takes scaleToSigma bool to document the intentional
  difference: MW scales (σ comparison), TopK does not (raw denominator)
- Remove unused _count_baseline_fps from tasks/q.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resolve conflicts with upstream interface renames (PR #47485):
- observer.go, testbench.go: take upstream versions with new type names
- Update detector files to use DetectionResult (was MetricsDetectionResult/MultiSeriesDetectionResult)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Split q.py eval_detectors output into two clean tables: L2 timestamp
  detection (TimeCluster, Gaussian F1) and L1 per-metric scoring
  (Passthrough, mPrec/mRec/mF1). L1 no longer redundantly computes
  timestamp F1.
- Add detectorSampleStddev to shared utils; use shared helpers in
  Mann-Whitney detector
- Bound corrshift firedSeries map to prevent unbounded memory growth
- gofmt alignment fixes in output.go, rrcf.go, time_cluster.go,
  score_metrics_test.go

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@ellataira ellataira requested review from a team as code owners March 10, 2026 19:57
@ellataira ellataira requested a review from hush-hush March 10, 2026 19:57
@ellataira ellataira marked this pull request as draft March 10, 2026 19:59
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b3297787c9

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

}
}

return sourceName == metric || strings.Contains(sourceName, metric)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Match service when classifying metric detections

metricMatches ignores the service portion of each service:metric ground-truth key and then accepts substring metric matches, so a source like dispatch-service:trace.http.request.hits can be counted against TP keys for a different service, and trace.http.request.errors can match trace.http.request. Since TP matching runs before FP matching, this can systematically inflate TP counts and distort L1 precision/recall (including non-deterministic outcomes when multiple keys match).

Useful? React with 👍 / 👎.

@github-actions github-actions bot added the long review PR is complex, plan time to review it label Mar 10, 2026
@agent-platform-auto-pr
Copy link
Contributor

agent-platform-auto-pr bot commented Mar 10, 2026

Go Package Import Differences

Baseline: 681899c
Comparison: 2e4c29a

binaryosarchchange
agentlinuxamd64
+61, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/DataDog/ebpf-manager
+github.com/DataDog/ebpf-manager/internal
+github.com/DataDog/ebpf-manager/tracefs
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/cilium/ebpf
+github.com/cilium/ebpf/asm
+github.com/cilium/ebpf/btf
+github.com/cilium/ebpf/features
+github.com/cilium/ebpf/internal
+github.com/cilium/ebpf/link
+github.com/cilium/ebpf/perf
+github.com/cilium/ebpf/ringbuf
+github.com/cilium/ebpf/rlimit
+github.com/goccy/go-json
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/zeebo/xxh3
+go/format
+go/printer
+golang.org/x/exp/mmap
+structs
agentlinuxarm64
+61, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/DataDog/ebpf-manager
+github.com/DataDog/ebpf-manager/internal
+github.com/DataDog/ebpf-manager/tracefs
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/cilium/ebpf
+github.com/cilium/ebpf/asm
+github.com/cilium/ebpf/btf
+github.com/cilium/ebpf/features
+github.com/cilium/ebpf/internal
+github.com/cilium/ebpf/link
+github.com/cilium/ebpf/perf
+github.com/cilium/ebpf/ringbuf
+github.com/cilium/ebpf/rlimit
+github.com/goccy/go-json
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/zeebo/xxh3
+go/format
+go/printer
+golang.org/x/exp/mmap
+structs
agentwindowsamd64
+49, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/goccy/go-json
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/zeebo/xxh3
+golang.org/x/exp/constraints
+golang.org/x/xerrors
+golang.org/x/xerrors/internal
+hash/maphash
agentdarwinamd64
+49, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/goccy/go-json
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/zeebo/xxh3
+golang.org/x/exp/constraints
+golang.org/x/exp/mmap
+golang.org/x/xerrors
+golang.org/x/xerrors/internal
agentdarwinarm64
+49, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/goccy/go-json
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/zeebo/xxh3
+golang.org/x/exp/constraints
+golang.org/x/exp/mmap
+golang.org/x/xerrors
+golang.org/x/xerrors/internal
iot-agentlinuxamd64
+79, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace
+github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace/idx
+github.com/DataDog/datadog-api-client-go/v2
+github.com/DataDog/datadog-api-client-go/v2/api/datadog
+github.com/DataDog/datadog-api-client-go/v2/api/datadogV2
+github.com/DataDog/ebpf-manager
+github.com/DataDog/ebpf-manager/internal
+github.com/DataDog/ebpf-manager/tracefs
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/cilium/ebpf
+github.com/cilium/ebpf/asm
+github.com/cilium/ebpf/btf
+github.com/cilium/ebpf/features
+github.com/cilium/ebpf/internal
+github.com/cilium/ebpf/link
+github.com/cilium/ebpf/perf
+github.com/cilium/ebpf/ringbuf
+github.com/cilium/ebpf/rlimit
+github.com/goccy/go-json
+github.com/golang/snappy
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/pierrec/lz4/v4
+github.com/planetscale/vtprotobuf/protohelpers
+github.com/vishvananda/netlink
+github.com/vishvananda/netlink/nl
+github.com/vishvananda/netns
+github.com/zeebo/xxh3
+go/format
+go/printer
+golang.org/x/exp/constraints
+golang.org/x/exp/mmap
+golang.org/x/exp/slices
+golang.org/x/oauth2
+golang.org/x/oauth2/internal
+golang.org/x/xerrors
+golang.org/x/xerrors/internal
+google.golang.org/protobuf/types/descriptorpb
+structs
iot-agentlinuxarm64
+79, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace
+github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace/idx
+github.com/DataDog/datadog-api-client-go/v2
+github.com/DataDog/datadog-api-client-go/v2/api/datadog
+github.com/DataDog/datadog-api-client-go/v2/api/datadogV2
+github.com/DataDog/ebpf-manager
+github.com/DataDog/ebpf-manager/internal
+github.com/DataDog/ebpf-manager/tracefs
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/cilium/ebpf
+github.com/cilium/ebpf/asm
+github.com/cilium/ebpf/btf
+github.com/cilium/ebpf/features
+github.com/cilium/ebpf/internal
+github.com/cilium/ebpf/link
+github.com/cilium/ebpf/perf
+github.com/cilium/ebpf/ringbuf
+github.com/cilium/ebpf/rlimit
+github.com/goccy/go-json
+github.com/golang/snappy
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/pierrec/lz4/v4
+github.com/planetscale/vtprotobuf/protohelpers
+github.com/vishvananda/netlink
+github.com/vishvananda/netlink/nl
+github.com/vishvananda/netns
+github.com/zeebo/xxh3
+go/format
+go/printer
+golang.org/x/exp/constraints
+golang.org/x/exp/mmap
+golang.org/x/exp/slices
+golang.org/x/oauth2
+golang.org/x/oauth2/internal
+golang.org/x/xerrors
+golang.org/x/xerrors/internal
+google.golang.org/protobuf/types/descriptorpb
+structs
heroku-agentlinuxamd64
+68, -0
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/def
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/fx
+github.com/DataDog/datadog-agent/comp/anomalydetection/recorder/impl
+github.com/DataDog/datadog-agent/comp/observer
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/observer/fx
+github.com/DataDog/datadog-agent/comp/observer/impl
+github.com/DataDog/datadog-agent/pkg/network/protocols
+github.com/DataDog/datadog-agent/pkg/network/protocols/http
+github.com/DataDog/datadog-agent/pkg/network/types
+github.com/DataDog/ebpf-manager
+github.com/DataDog/ebpf-manager/internal
+github.com/DataDog/ebpf-manager/tracefs
+github.com/andybalholm/brotli
+github.com/andybalholm/brotli/matchfinder
+github.com/apache/arrow-go/v18/arrow
+github.com/apache/arrow-go/v18/arrow/array
+github.com/apache/arrow-go/v18/arrow/arrio
+github.com/apache/arrow-go/v18/arrow/bitutil
+github.com/apache/arrow-go/v18/arrow/compute
+github.com/apache/arrow-go/v18/arrow/compute/exec
+github.com/apache/arrow-go/v18/arrow/decimal
+github.com/apache/arrow-go/v18/arrow/decimal128
+github.com/apache/arrow-go/v18/arrow/decimal256
+github.com/apache/arrow-go/v18/arrow/encoded
+github.com/apache/arrow-go/v18/arrow/endian
+github.com/apache/arrow-go/v18/arrow/extensions
+github.com/apache/arrow-go/v18/arrow/flight
+github.com/apache/arrow-go/v18/arrow/flight/gen/flight
+github.com/apache/arrow-go/v18/arrow/float16
+github.com/apache/arrow-go/v18/arrow/internal
+github.com/apache/arrow-go/v18/arrow/ipc
+github.com/apache/arrow-go/v18/arrow/memory
+github.com/apache/arrow-go/v18/arrow/scalar
+github.com/apache/arrow-go/v18/parquet
+github.com/apache/arrow-go/v18/parquet/compress
+github.com/apache/arrow-go/v18/parquet/file
+github.com/apache/arrow-go/v18/parquet/metadata
+github.com/apache/arrow-go/v18/parquet/pqarrow
+github.com/apache/arrow-go/v18/parquet/schema
+github.com/apache/arrow-go/v18/parquet/variant
+github.com/apache/thrift/lib/go/thrift
+github.com/cilium/ebpf
+github.com/cilium/ebpf/asm
+github.com/cilium/ebpf/btf
+github.com/cilium/ebpf/features
+github.com/cilium/ebpf/internal
+github.com/cilium/ebpf/link
+github.com/cilium/ebpf/perf
+github.com/cilium/ebpf/ringbuf
+github.com/cilium/ebpf/rlimit
+github.com/goccy/go-json
+github.com/google/flatbuffers/go
+github.com/klauspost/compress/flate
+github.com/klauspost/compress/gzip
+github.com/klauspost/cpuid/v2
+github.com/vishvananda/netlink
+github.com/vishvananda/netlink/nl
+github.com/vishvananda/netns
+github.com/zeebo/xxh3
+go/format
+go/printer
+golang.org/x/exp/constraints
+golang.org/x/exp/mmap
+golang.org/x/xerrors
+golang.org/x/xerrors/internal
+google.golang.org/protobuf/types/descriptorpb
+structs
cluster-agentlinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
cluster-agentlinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
cluster-agent-cloudfoundrylinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
cluster-agent-cloudfoundrylinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
dogstatsdlinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
dogstatsdlinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
security-agentlinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
security-agentlinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
security-agentwindowsamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
system-probelinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
system-probelinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
system-probewindowsamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
system-probedarwinamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
system-probedarwinarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/observer/def
trace-agentlinuxamd64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
trace-agentlinuxarm64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
trace-agentwindowsamd64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
trace-agentdarwinamd64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
trace-agentdarwinarm64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
heroku-trace-agentlinuxamd64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
otel-agentlinuxamd64
+4, -0
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
otel-agentlinuxarm64
+4, -0
+github.com/DataDog/datadog-agent/comp/observer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
full-host-profilerlinuxamd64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl
full-host-profilerlinuxarm64
+3, -0
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/def
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/fx
+github.com/DataDog/datadog-agent/comp/trace/observerbuffer/impl

  - Revert tasks/q.py to upstream (remove eval_detectors task)
  - Remove scenario metadata.json ground truth files
  - Add metadata.json format documentation with JSON example to
    LoadMetricGroundTruth for future integration
  - Document passthrough correlator output format (ActiveCorrelations):
    pattern naming, title format, one anomaly per correlation
@ellataira ellataira marked this pull request as ready for review March 10, 2026 20:35
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c8aa3baf43

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +242 to +243
if d.fired[fireKey] {
continue

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reset TopK fired cache before rerunning detectors

This detector keeps a process-wide fired map and drops any metric that has fired before, but it does not implement Reset(), while the test bench only clears state for components that expose Reset (comp/observer/impl/testbench.go, resetAllState). After one scenario load/rerun, a second rerun in the same process will skip previously fired metric IDs at this check and can emit no TopK anomalies, which corrupts repeated interactive evaluations and component-toggle experiments.

Useful? React with 👍 / 👎.

Comment on lines +446 to +449
if d.firedSeries[fireKey] {
continue
}
d.firedSeries[fireKey] = true

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clear CorrShift dedup state across scenario reruns

CorrShift deduplicates emissions via firedSeries and accumulates rolling norms in recentNorms, but the type provides no Reset() even though reruns rely on reset-capable components to clear prior state (comp/observer/impl/testbench.go, resetAllState). Replaying another scenario (or rerunning the same one) in the same process reuses old dedup keys and history, suppressing expected anomalies and shifting thresholds with stale data.

Useful? React with 👍 / 👎.

Comment on lines +167 to +170
if source == "" {
result.UnknownCount++
result.UnknownDetectionCount++
continue

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject metric scoring when anomaly sources are unavailable

Metric scoring silently treats missing per-period metric sources as unknown instead of failing, so default non-verbose headless output (which omits nested anomalies/title fields) can produce valid-looking TP/FP zeros and misleading mPrec/mRec. In this branch, an empty source is accepted and counted as unknown here, which can make detector comparisons incorrect unless callers manually remember to generate verbose output.

Useful? React with 👍 / 👎.

@agent-platform-auto-pr
Copy link
Contributor

agent-platform-auto-pr bot commented Mar 10, 2026

Static quality checks

❌ Please find below the results from static quality gates
Comparison made with ancestor 681899c
📊 Static Quality Gates Dashboard

Error

Quality gate Change Size (prev → curr → max)
agent_deb_amd64 (on wire) N/A N/A → 186.266 → 184.810
agent_deb_amd64 (on disk) N/A N/A → 769.175 → 754.830
agent_deb_amd64_fips (on wire) N/A N/A → 177.726 → 177.560
agent_deb_amd64_fips (on disk) N/A N/A → 729.263 → 715.320
agent_heroku_amd64 (on wire) N/A N/A → 91.137 → 88.450
agent_heroku_amd64 (on disk) N/A N/A → 346.823 → 329.530
agent_msi (on wire) N/A N/A → 146.301 → 143.300
agent_rpm_amd64 (on wire) N/A N/A → 188.526 → 188.160
agent_rpm_amd64 (on disk) N/A N/A → 769.158 → 754.800
agent_rpm_amd64_fips (on wire) N/A N/A → 180.389 → 178.900
agent_rpm_amd64_fips (on disk) N/A N/A → 729.246 → 715.310
agent_rpm_arm64 (on wire) N/A N/A → 170.549 → 169.930
agent_rpm_arm64 (on disk) N/A N/A → 744.311 → 737.340
agent_rpm_arm64_fips (on wire) N/A N/A → 163.463 → 163.120
agent_rpm_arm64_fips (on disk) N/A N/A → 706.919 → 698.930
agent_suse_amd64 (on wire) N/A N/A → 188.526 → 188.160
agent_suse_amd64 (on disk) N/A N/A → 769.158 → 754.800
agent_suse_amd64_fips (on wire) N/A N/A → 180.389 → 178.900
agent_suse_amd64_fips (on disk) N/A N/A → 729.246 → 715.310
agent_suse_arm64 (on wire) N/A N/A → 170.549 → 169.930
agent_suse_arm64 (on disk) N/A N/A → 744.311 → 737.340
agent_suse_arm64_fips (on wire) N/A N/A → 163.463 → 163.120
agent_suse_arm64_fips (on disk) N/A N/A → 706.919 → 698.930
docker_agent_amd64 (on wire) N/A N/A → 280.134 → 277.400
docker_agent_amd64 (on disk) N/A N/A → 831.644 → 817.140
docker_agent_arm64 (on wire) N/A N/A → 266.751 → 266.040
docker_agent_arm64 (on disk) N/A N/A → 831.403 → 824.020
docker_agent_jmx_amd64 (on wire) N/A N/A → 348.781 → 346.020
docker_agent_jmx_amd64 (on disk) N/A N/A → 1022.560 → 1008.020
docker_agent_jmx_arm64 (on wire) N/A N/A → 331.400 → 330.660
docker_agent_jmx_arm64 (on disk) N/A N/A → 1011.097 → 1003.620
iot_agent_deb_amd64 (on wire) N/A N/A → 14.617 → 12.040
iot_agent_deb_amd64 (on disk) N/A N/A → 63.865 → 43.290
iot_agent_deb_arm64 (on wire) N/A N/A → 12.256 → 10.450
iot_agent_deb_arm64 (on disk) N/A N/A → 57.103 → 40.920
iot_agent_deb_armhf (on wire) N/A N/A → 12.578 → 10.620
iot_agent_deb_armhf (on disk) N/A N/A → 58.206 → 41.030
iot_agent_rpm_amd64 (on wire) N/A N/A → 14.636 → 12.060
iot_agent_rpm_amd64 (on disk) N/A N/A → 63.865 → 43.290
iot_agent_suse_amd64 (on wire) N/A N/A → 14.636 → 12.060
iot_agent_suse_amd64 (on disk) N/A N/A → 63.865 → 43.290
Gate failure full details
Quality gate Error type Error message
agent_deb_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_agent_deb_amd64 failed!
Wire size 186.3 MB exceeds limit of 184.8 MB by 1.5 MB
Disk size 769.2 MB exceeds limit of 754.8 MB by 14.3 MB�[0m
agent_deb_amd64_fips StaticQualityGateFailed �[91mstatic_quality_gate_agent_deb_amd64_fips failed!
Wire size 177.7 MB exceeds limit of 177.6 MB by 169.9 KB
Disk size 729.3 MB exceeds limit of 715.3 MB by 13.9 MB�[0m
agent_heroku_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_agent_heroku_amd64 failed!
Wire size 91.1 MB exceeds limit of 88.4 MB by 2.7 MB
Disk size 346.8 MB exceeds limit of 329.5 MB by 17.3 MB�[0m
agent_msi StaticQualityGateFailed �[91mstatic_quality_gate_agent_msi failed!
Wire size 146.3 MB exceeds limit of 143.3 MB by 3.0 MB�[0m
agent_rpm_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_agent_rpm_amd64 failed!
Wire size 188.5 MB exceeds limit of 188.2 MB by 374.6 KB
Disk size 769.2 MB exceeds limit of 754.8 MB by 14.4 MB�[0m
agent_rpm_amd64_fips StaticQualityGateFailed �[91mstatic_quality_gate_agent_rpm_amd64_fips failed!
Wire size 180.4 MB exceeds limit of 178.9 MB by 1.5 MB
Disk size 729.2 MB exceeds limit of 715.3 MB by 13.9 MB�[0m
agent_rpm_arm64 StaticQualityGateFailed �[91mstatic_quality_gate_agent_rpm_arm64 failed!
Wire size 170.5 MB exceeds limit of 169.9 MB by 633.7 KB
Disk size 744.3 MB exceeds limit of 737.3 MB by 7.0 MB�[0m
agent_rpm_arm64_fips StaticQualityGateFailed �[91mstatic_quality_gate_agent_rpm_arm64_fips failed!
Wire size 163.5 MB exceeds limit of 163.1 MB by 350.9 KB
Disk size 706.9 MB exceeds limit of 698.9 MB by 8.0 MB�[0m
agent_suse_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_agent_suse_amd64 failed!
Wire size 188.5 MB exceeds limit of 188.2 MB by 374.6 KB
Disk size 769.2 MB exceeds limit of 754.8 MB by 14.4 MB�[0m
agent_suse_amd64_fips StaticQualityGateFailed �[91mstatic_quality_gate_agent_suse_amd64_fips failed!
Wire size 180.4 MB exceeds limit of 178.9 MB by 1.5 MB
Disk size 729.2 MB exceeds limit of 715.3 MB by 13.9 MB�[0m
agent_suse_arm64 StaticQualityGateFailed �[91mstatic_quality_gate_agent_suse_arm64 failed!
Wire size 170.5 MB exceeds limit of 169.9 MB by 633.7 KB
Disk size 744.3 MB exceeds limit of 737.3 MB by 7.0 MB�[0m
agent_suse_arm64_fips StaticQualityGateFailed �[91mstatic_quality_gate_agent_suse_arm64_fips failed!
Wire size 163.5 MB exceeds limit of 163.1 MB by 350.9 KB
Disk size 706.9 MB exceeds limit of 698.9 MB by 8.0 MB�[0m
docker_agent_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_docker_agent_amd64 failed!
Wire size 280.1 MB exceeds limit of 277.4 MB by 2.7 MB
Disk size 831.6 MB exceeds limit of 817.1 MB by 14.5 MB�[0m
docker_agent_arm64 StaticQualityGateFailed �[91mstatic_quality_gate_docker_agent_arm64 failed!
Wire size 266.8 MB exceeds limit of 266.0 MB by 727.7 KB
Disk size 831.4 MB exceeds limit of 824.0 MB by 7.4 MB�[0m
docker_agent_jmx_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_docker_agent_jmx_amd64 failed!
Wire size 348.8 MB exceeds limit of 346.0 MB by 2.8 MB
Disk size 1022.6 MB exceeds limit of 1008.0 MB by 14.5 MB�[0m
docker_agent_jmx_arm64 StaticQualityGateFailed �[91mstatic_quality_gate_docker_agent_jmx_arm64 failed!
Wire size 331.4 MB exceeds limit of 330.7 MB by 757.8 KB
Disk size 1011.1 MB exceeds limit of 1003.6 MB by 7.5 MB�[0m
iot_agent_deb_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_iot_agent_deb_amd64 failed!
Wire size 14.6 MB exceeds limit of 12.0 MB by 2.6 MB
Disk size 63.9 MB exceeds limit of 43.3 MB by 20.6 MB�[0m
iot_agent_deb_arm64 StaticQualityGateFailed �[91mstatic_quality_gate_iot_agent_deb_arm64 failed!
Wire size 12.3 MB exceeds limit of 10.4 MB by 1.8 MB
Disk size 57.1 MB exceeds limit of 40.9 MB by 16.2 MB�[0m
iot_agent_deb_armhf StaticQualityGateFailed �[91mstatic_quality_gate_iot_agent_deb_armhf failed!
Wire size 12.6 MB exceeds limit of 10.6 MB by 2.0 MB
Disk size 58.2 MB exceeds limit of 41.0 MB by 17.2 MB�[0m
iot_agent_rpm_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_iot_agent_rpm_amd64 failed!
Wire size 14.6 MB exceeds limit of 12.1 MB by 2.6 MB
Disk size 63.9 MB exceeds limit of 43.3 MB by 20.6 MB�[0m
iot_agent_suse_amd64 StaticQualityGateFailed �[91mstatic_quality_gate_iot_agent_suse_amd64 failed!
Wire size 14.6 MB exceeds limit of 12.1 MB by 2.6 MB
Disk size 63.9 MB exceeds limit of 43.3 MB by 20.6 MB�[0m

Static quality gates prevent the PR to merge!
You can check the static quality gates confluence page for guidance. We also have a toolbox page available to list tools useful to debug the size increase.

Successful checks

Info

Quality gate Change Size (prev → curr → max)
docker_cluster_agent_amd64 N/A N/A → 180.921 → 181.200
docker_cluster_agent_arm64 N/A N/A → 196.743 → 198.490
docker_cws_instrumentation_amd64 N/A N/A → 7.135 → 7.180
docker_cws_instrumentation_arm64 N/A N/A → 6.689 → 6.920
docker_dogstatsd_amd64 N/A N/A → 38.446 → 39.380
docker_dogstatsd_arm64 N/A N/A → 36.812 → 37.940
dogstatsd_deb_amd64 N/A N/A → 29.664 → 30.610
dogstatsd_deb_arm64 N/A N/A → 27.836 → 29.110
dogstatsd_rpm_amd64 N/A N/A → 29.664 → 30.610
dogstatsd_suse_amd64 N/A N/A → 29.664 → 30.610
On-wire sizes (compressed)
Quality gate Change Size (prev → curr → max)
agent_deb_amd64 N/A N/A → 186.266 → 184.810
agent_deb_amd64_fips N/A N/A → 177.726 → 177.560
agent_heroku_amd64 N/A N/A → 91.137 → 88.450
agent_msi N/A N/A → 146.301 → 143.300
agent_rpm_amd64 N/A N/A → 188.526 → 188.160
agent_rpm_amd64_fips N/A N/A → 180.389 → 178.900
agent_rpm_arm64 N/A N/A → 170.549 → 169.930
agent_rpm_arm64_fips N/A N/A → 163.463 → 163.120
agent_suse_amd64 N/A N/A → 188.526 → 188.160
agent_suse_amd64_fips N/A N/A → 180.389 → 178.900
agent_suse_arm64 N/A N/A → 170.549 → 169.930
agent_suse_arm64_fips N/A N/A → 163.463 → 163.120
docker_agent_amd64 N/A N/A → 280.134 → 277.400
docker_agent_arm64 N/A N/A → 266.751 → 266.040
docker_agent_jmx_amd64 N/A N/A → 348.781 → 346.020
docker_agent_jmx_arm64 N/A N/A → 331.400 → 330.660
iot_agent_deb_amd64 N/A N/A → 14.617 → 12.040
iot_agent_deb_arm64 N/A N/A → 12.256 → 10.450
iot_agent_deb_armhf N/A N/A → 12.578 → 10.620
iot_agent_rpm_amd64 N/A N/A → 14.636 → 12.060
iot_agent_suse_amd64 N/A N/A → 14.636 → 12.060
docker_cluster_agent_amd64 N/A N/A → 63.888 → 64.510
docker_cluster_agent_arm64 N/A N/A → 60.159 → 61.170
docker_cws_instrumentation_amd64 N/A N/A → 2.994 → 3.330
docker_cws_instrumentation_arm64 N/A N/A → 2.726 → 3.090
docker_dogstatsd_amd64 N/A N/A → 14.871 → 15.820
docker_dogstatsd_arm64 N/A N/A → 14.207 → 14.830
dogstatsd_deb_amd64 N/A N/A → 7.834 → 8.790
dogstatsd_deb_arm64 N/A N/A → 6.722 → 7.710
dogstatsd_rpm_amd64 N/A N/A → 7.846 → 8.800
dogstatsd_suse_amd64 N/A N/A → 7.846 → 8.800

ellataira and others added 5 commits March 11, 2026 10:40
…rithms-v2

# Conflicts:
#	comp/observer/impl/testbench_registry.go
…etector

Batch-mode SeriesDetector re-runs from scratch every tick, which is too
expensive under unified scheduling. This converts MannWhitneyDetector to
the streaming Detector interface (same pattern as BOCPD in #47739):

- Per-series state with cursor-based incremental reads
- Fixed baseline from warmup, sliding circular buffer for recent window
- Alert lifecycle with hysteresis and recovery
- All 4 original filters preserved (significance, effect size, deviation, relative change)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

long review PR is complex, plan time to review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants