v0.8.6 — DPC/ISR + DiskIO fixes
etw-mcp v0.8.6 — DPC/ISR + DiskIO fixes (Carol's stream)
Merged: #27 (squash commit 4933386) · Branch: fix/etw-dpc
Validated by: Clint (tester) + Heimdall (architect) — both APPROVE
Bug Fixes
get_dpc_per_cpu >100% (#4)
DPC per-CPU percentages now use the trace duration as the denominator (from
trace.duration_seconds / trace_metadata.DurationSeconds). NDIS.SYS CPU40
dropped from 278.7% to 22.27%; no values exceed 100%. Exact xperf-oracle parity
confirmed (NDIS DPC+ISR total: 10,441,034 rows match).
DPC silent exception swallow / wrong remediation (#13)
_get_dpc_df counts raw DPC rows before aggregation. If aggregation fails with
rows present, a ValueError is raised with resolve_symbols(trace_id) guidance
instead of silently returning "No DPC/ISR data".
get_diskio_summary no-data bug (#14)
_gather_diskio() handles xperf slash-key format (DiskIo/Read), native/dotnet
underscore-key format (diskio_read), and combined diskio parquet with
Kind/Type/Operation. Exact match: reads=12, writes=755, flushes=2.
New Tests
- #16 — DPC exception/message paths + metadata-duration handling (12/12 pass)
- #18 — DiskIO Kind/Type/underscore key normalization (all pass)
- #20 — End-to-end real ETL integration (5 pass, 1 expected xfail for BUG-1/#11)
Notes
- Symbolizer lookup failures still degrade to
unknown(acceptable, consistent with sibling aggregators per Heimdall review). - Does not touch the shared symbolizer-init path; safe to merge independently of SYMBOLS/SIDECAR streams.
- The dotnet sidecar stacks xfail (BUG-1/#11) is tracked separately.