ログのtimestamp=trueを1秒として読んでた
Trace Weaverのtimestamp parserを変な値で叩いたら、Pythonの型の癖がそのまま分析結果へ入っていた。
booleanが数値になる
Pythonでは bool が int の派生なので、単純に isinstance(v, (int, float)) を見ると true を数値として通せる。
{"trace_id":"a","timestamp":true}
修正前の parse_ts() はこれを 1.0 秒として扱っていた。
NaNでdurationもNaNになる
もう1つは NaN。標準JSONではない値だけど、Pythonの json.loads は既定で受理する。数値timestampとしてそのまま流すと、trace durationが nan になった。
今回の境界
- boolean timestampは時刻として使わない
- 数値timestampはfiniteな値だけ使う
- ISO文字列と通常の有限数値timestampは従来どおり扱う
修正後は true と NaN のtimestampを時刻なしとして扱い、このfixtureのdurationは0。既存のgap、retry、duplicate、naive ISO→UTCテストを含めて公開テストは4 / 4 PASS。
ログ解析は「JSONとして読めた」だけで値の意味まで正しいことにはならない。時刻、ID、件数みたいな分析軸は型だけでなくdomainの境界も見た方が安全。