如何结合平均运行时长评估脚本单次运行时长的异常严重性?
基于脚本平均时长的运行偏差严重性评估方案
背景数据
脚本平均运行时长
const averageRunTime = [ { srt_id: 1, avg: 8 }, // 8秒 { srt_id: 2, avg: 600 }, // 10分钟 { srt_id: 3, avg: 3600 } // 1小时 ];
单次运行时长记录
const runs = [ { id: 1, srt_id: 1, run_time: 320 }, // 5分钟 { id: 2, srt_id: 1, run_time: 32 }, // 32秒 { id: 6, srt_id: 3, run_time: 5400 }, // 1.5小时 { id: 7, srt_id: 3, run_time: 600 } // 10分钟 ];
现有比例评估的不合理性
直接用「单次时长/平均时长」的比例判断异常严重性存在明显缺陷:
- 脚本1单次运行32秒,是平均时长的600%,但属于可接受范围
- 脚本3单次运行1.5小时,仅为平均时长的150%,却可能存在需排查的错误
- 单纯对比比例会误导异常严重程度的感知
- 脚本1单次运行5分钟(是平均时长的3700%)虽有异常,但严重性远低于脚本3的150%偏差
解决方案
方法1:Z-score标准分数(行业通用统计方法)
Z-score是统计领域衡量数据偏离正常波动范围的标准手段,能有效消除不同脚本时长量级的干扰:
- 核心公式:
Z = (单次运行时长 - 平均时长) / 该脚本运行时长的标准差 - 逻辑:Z值越大,说明单次运行偏离该脚本正常水平的程度越高,与脚本本身长短无关。通常Z>3即可视为严重异常。
- 示例:
- 若脚本1的运行时长标准差为10秒,32秒运行的Z值为
(32-8)/10=2.4;5分钟运行的Z值为(320-8)/10=31.2 - 若脚本3的运行时长标准差为360秒,1.5小时运行的Z值为
(5400-3600)/360=5
- 若脚本1的运行时长标准差为10秒,32秒运行的Z值为
- 补充:如果没有足够历史数据计算标准差,可固定变异系数(标准差/平均时长,比如取0.2),公式调整为
Z = (单次运行时长 - 平均时长) / (平均时长 * 0.2)
方法2:自定义0-100区间担忧值计算
若需要输出直观的0-100(极端情况可超出)担忧值,可结合绝对超时时长和脚本时长权重设计公式,核心逻辑是让长脚本的绝对时间偏差获得更高权重:
推荐公式
concern = min( (delta / 1800) * 100 * (avg_time / 3600 + 1) + max(0, (run_time/avg_time - 2) * 10), 150 )
参数说明:
delta = max(单次运行时长 - 平均时长, 0):仅计算超时的正偏差,未超时则担忧值为0avg_time:脚本平均时长(单位:秒)(delta / 1800)*100:以超时30分钟为基准,对应100分的基础严重度(avg_time / 3600 +1):给长脚本的基础严重度加权,时长越长权重越高max(0, (run_time/avg_time -2)*10):对比例超过200%的情况附加惩罚,每超出100%加10分min(...,150):限制极端值上限,避免分数溢出
示例计算
- 脚本1(avg=8秒)32秒运行:delta=24,比例=400%,担忧值=(24/1800)100(0.0022+1)+(4-2)*10≈1.33+20=21.33(低担忧)
- 脚本1(avg=8秒)5分钟运行:delta=312,比例=4000%,担忧值=(312/1800)100(0.0022+1)+(40-2)*10≈17.37+380=397.37→150(高担忧,但优先级低于长脚本的同分数)
- 脚本3(avg=3600秒)1.5小时运行:delta=1800,比例=150%,担忧值=(1800/1800)100(1+1)+0=200→150(高担忧,优先级高于短脚本的150分)
优化建议
如果需要更明确区分长/短脚本的同分数优先级,可在担忧值之外附加脚本时长等级标签(如「短脚本」「长脚本」),告警时优先处理长脚本的高担忧值记录。
内容的提问来源于stack exchange,提问作者Travis Heeter
相关产品推荐
相关产品推荐

