Implements M1 (base layer) of metric cardinality limits — Linear OSS-11, finding M1–M3.
Problem: Cardinality limits are entirely unimplemented — _ViewInstrumentMatch inserts every distinct attribute set unbounded, with no otel.metric.overflow overflow series, so an attribute explosion grows memory without limit.
Scope of this issue (M1 only): base aggregation_cardinality_limit (default 2000) enforced in _ViewInstrumentMatch.consume_measurement, routing overflow into a single {"otel.metric.overflow":"true"} series. M2 (per-MetricReader default) and M3 (per-View override) remain and will be tracked as their own stacked issues per the Linear note.
Branch / worktree: oss_11_m1_metric_cardinality_limit
Linear issue: https://linear.app/dash0/issue/OSS-11/m1-m3-metric-cardinality-limits-base-per-reader-per-view
Implements M1 (base layer) of metric cardinality limits — Linear OSS-11, finding M1–M3.
Problem: Cardinality limits are entirely unimplemented —
_ViewInstrumentMatchinserts every distinct attribute set unbounded, with nootel.metric.overflowoverflow series, so an attribute explosion grows memory without limit.Scope of this issue (M1 only): base
aggregation_cardinality_limit(default 2000) enforced in_ViewInstrumentMatch.consume_measurement, routing overflow into a single{"otel.metric.overflow":"true"}series. M2 (per-MetricReader default) and M3 (per-View override) remain and will be tracked as their own stacked issues per the Linear note.Branch / worktree:
oss_11_m1_metric_cardinality_limitLinear issue: https://linear.app/dash0/issue/OSS-11/m1-m3-metric-cardinality-limits-base-per-reader-per-view