FA-10256 / Observability / Open access
Metric series identity: Different instruments collide by omitting the metric name · case 01
Different instruments collide by omitting the metric name.
ROOT CAUSE
The implementation substitutes return (None, for return (name,, so different instruments collide by omitting the metric name.
VERIFIED REPAIR
Include the full metric name.
Unsuccessful approach: The attempted repair substitutes return ('metric',. Fixture 1 still yields ('metric', (('a', '2'), ('z', '1')), 'count', 'counter') instead of ('requests', (('a', '2'), ('z', '1')), 'count', 'counter').
Case contract
A series identity includes metric name, sorted label key-value pairs excluding configured dropped keys, measurement unit, and instrument kind. Dropping values never drops other equal-valued labels.
Why this case matters
An offline model of metric series identity, suitable for testing build and release tooling without external services.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(name, labels, dropped, unit, kind):
return (None, tuple(sorted((k,v) for k,v in labels.items() if k not in dropped)), unit, kind)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve('requests', {'z': '1', 'a': '2'}, [], 'count', 'counter'), ('requests', (('a', '2'), ('z', '1')), 'count', 'counter'))
check('fixture 2', solve('requests', {'a': '2', 'z': '1'}, [], 'count', 'counter'), ('requests', (('a', '2'), ('z', '1')), 'count', 'counter'))
check('fixture 3', solve('requests', {'a': '2', 'z': '1'}, ['z'], 'count', 'counter'), ('requests', (('a', '2'),), 'count', 'counter'))
check('fixture 4', solve('requests', {'a': 'same', 'b': 'same'}, ['a'], 'count', 'counter'), ('requests', (('b', 'same'),), 'count', 'counter'))
check('fixture 5', solve('latency', {}, [], 'seconds', 'histogram'), ('latency', (), 'seconds', 'histogram'))
check('fixture 6', solve('latency', {}, [], 'milliseconds', 'gauge'), ('latency', (), 'milliseconds', 'gauge'))
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | [None, [['a', '2'], ['z', '1']], 'count', 'counter'] | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | Failed |
| fixture 2 | [None, [['a', '2'], ['z', '1']], 'count', 'counter'] | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | Failed |
| fixture 3 | [None, [['a', '2']], 'count', 'counter'] | ['requests', [['a', '2']], 'count', 'counter'] | Failed |
| fixture 4 | [None, [['b', 'same']], 'count', 'counter'] | ['requests', [['b', 'same']], 'count', 'counter'] | Failed |
| fixture 5 | [None, [], 'seconds', 'histogram'] | ['latency', [], 'seconds', 'histogram'] | Failed |
| fixture 6 | [None, [], 'milliseconds', 'gauge'] | ['latency', [], 'milliseconds', 'gauge'] | Failed |
SHA-256 / 24a816ee21d7f6e2a7fba6376dde5bc7b2173511f21d3eb1c9d89d8eb080c661
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(name, labels, dropped, unit, kind):
return ('metric', tuple(sorted((k,v) for k,v in labels.items() if k not in dropped)), unit, kind)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve('requests', {'z': '1', 'a': '2'}, [], 'count', 'counter'), ('requests', (('a', '2'), ('z', '1')), 'count', 'counter'))
check('fixture 2', solve('requests', {'a': '2', 'z': '1'}, [], 'count', 'counter'), ('requests', (('a', '2'), ('z', '1')), 'count', 'counter'))
check('fixture 3', solve('requests', {'a': '2', 'z': '1'}, ['z'], 'count', 'counter'), ('requests', (('a', '2'),), 'count', 'counter'))
check('fixture 4', solve('requests', {'a': 'same', 'b': 'same'}, ['a'], 'count', 'counter'), ('requests', (('b', 'same'),), 'count', 'counter'))
check('fixture 5', solve('latency', {}, [], 'seconds', 'histogram'), ('latency', (), 'seconds', 'histogram'))
check('fixture 6', solve('latency', {}, [], 'milliseconds', 'gauge'), ('latency', (), 'milliseconds', 'gauge'))
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | ['metric', [['a', '2'], ['z', '1']], 'count', 'counter'] | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | Failed |
| fixture 2 | ['metric', [['a', '2'], ['z', '1']], 'count', 'counter'] | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | Failed |
| fixture 3 | ['metric', [['a', '2']], 'count', 'counter'] | ['requests', [['a', '2']], 'count', 'counter'] | Failed |
| fixture 4 | ['metric', [['b', 'same']], 'count', 'counter'] | ['requests', [['b', 'same']], 'count', 'counter'] | Failed |
| fixture 5 | ['metric', [], 'seconds', 'histogram'] | ['latency', [], 'seconds', 'histogram'] | Failed |
| fixture 6 | ['metric', [], 'milliseconds', 'gauge'] | ['latency', [], 'milliseconds', 'gauge'] | Failed |
SHA-256 / 5ab981fbb0b15c1ef4e162dbc8a3750e66164daff4cb803a393394b00f0639fb
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(name, labels, dropped, unit, kind):
return (name, tuple(sorted((k,v) for k,v in labels.items() if k not in dropped)), unit, kind)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('fixture 1', solve('requests', {'z': '1', 'a': '2'}, [], 'count', 'counter'), ('requests', (('a', '2'), ('z', '1')), 'count', 'counter'))
check('fixture 2', solve('requests', {'a': '2', 'z': '1'}, [], 'count', 'counter'), ('requests', (('a', '2'), ('z', '1')), 'count', 'counter'))
check('fixture 3', solve('requests', {'a': '2', 'z': '1'}, ['z'], 'count', 'counter'), ('requests', (('a', '2'),), 'count', 'counter'))
check('fixture 4', solve('requests', {'a': 'same', 'b': 'same'}, ['a'], 'count', 'counter'), ('requests', (('b', 'same'),), 'count', 'counter'))
check('fixture 5', solve('latency', {}, [], 'seconds', 'histogram'), ('latency', (), 'seconds', 'histogram'))
check('fixture 6', solve('latency', {}, [], 'milliseconds', 'gauge'), ('latency', (), 'milliseconds', 'gauge'))
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fixture 1 | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | Passed |
| fixture 2 | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | ['requests', [['a', '2'], ['z', '1']], 'count', 'counter'] | Passed |
| fixture 3 | ['requests', [['a', '2']], 'count', 'counter'] | ['requests', [['a', '2']], 'count', 'counter'] | Passed |
| fixture 4 | ['requests', [['b', 'same']], 'count', 'counter'] | ['requests', [['b', 'same']], 'count', 'counter'] | Passed |
| fixture 5 | ['latency', [], 'seconds', 'histogram'] | ['latency', [], 'seconds', 'histogram'] | Passed |
| fixture 6 | ['latency', [], 'milliseconds', 'gauge'] | ['latency', [], 'milliseconds', 'gauge'] | Passed |
SHA-256 / 9e2ad6d4ea502456262bee663f6abc3f165cc50c3dc77f1f1d028f1f461a694b
Verification & scope
This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:37.363419+00:00.
Case digest / 6a86caf12d30bc60980454e934a6aa74f4b2ca544974e3ca2ef0573b9f8afff1