首个错误在第几行
按模型,四行里第 2 行是 ERROR,root_line(lines) 交回几?
贯穿本节的运维模型(判题机纯 Python、无网,这是它的确定模型,见 spine.py):服务上线后靠日志/指标/健康/告警盯住它。
从日志定位:每行 {"level":..,"req":..,"ts":..};root_line=首个 ERROR 行号、first_bad=首个出错的请求、failed_reqs=出过错的请求、in_window(lines,lo,hi)=时间窗内几行。
import json
def parse(line):
return json.loads(line)
def root_line(lines):
"""第一条 ERROR 在第几行(从 1 数);没有交回 0。"""
for i, l in enumerate(lines, 1):
if parse(l)["level"] == "ERROR":
return i
return 0
def first_bad(lines):
"""第一条 ERROR 是哪个请求(req 字段)引发的;没有交回空串。"""
for l in lines:
e = parse(l)
if e["level"] == "ERROR":
return e["req"]
return ""
def failed_reqs(lines):
"""出过 ERROR 的请求 id(去重排序)。"""
return sorted(set(parse(l)["req"] for l in lines if parse(l)["level"] == "ERROR"))
def in_window(lines, lo, hi):
"""时间戳 ts 落在 [lo, hi] 里的日志有几行。"""
return sum(1 for l in lines if lo <= parse(l)["ts"] <= hi)
lines = ['{"level":"INFO","req":"r1","ts":10}', '{"level":"ERROR","req":"r2","ts":20}', '{"level":"ERROR","req":"r2","ts":25}', '{"level":"INFO","req":"r3","ts":40}']
print(root_line(lines))
全部评论