倒计时从四十七时五十九分五十九秒开始往下走。
周衡没有立刻写代码。
他打开自己写的需求明,在最上面敲了三个字:先做。
他最初列了十六项:日志采集、指标监控、变更审计、告警聚合、值班排班、故障时间线、自动报告、容量预测……任何一项展开,都足够几个人做几个月。
四十八时只能证明一件事。
一个普通团队能不能在告警响起以后,把“什么时候出问题、之前改过什么、现在谁在处理”放进同一条时间线。
周衡把第一版范围砍到三项。
接收告警,登记变更,生成事件时间线。
不接生产数据库,不替用户执行操作,也不自动判断故障原因。它先做一个摆在桌边的记录员,把原本散在群聊、命令历史和人脑里的信息收拢起来。
需求明完成时,倒计时还剩四十六时二十一分。
周衡提交第一版文档,才开始搭框架。
他下单买了云主机和测试域名,一千元的榨实付九百零五元。新电脑跑得快,网络也稳,过去要花一上午搭建的测试环境,很快铺在了屏幕上。
上午十一点,第一个接收接口跑通。
他用一段公开测试脚本模拟服务器响应变慢。红色告警进入页面,带着发生时间、来源和摘要。紧接着,他登记一次版本发布,时间线便多出一条蓝色变更记录。
页面很粗,字体甚至没有对齐。
但两件原本互不相干的事第一次排在了一起。
周衡点了一下那条蓝色记录,发布和异常同时展开。他嘴角往上抬了抬,在清单的第一项后面打了勾。
下午,问题很快出现。
同一个告警源连续上报十次,页面便生成十个事件。用户如果真接入系统,遇到网络波动时,屏幕会在一分钟内被完全刷满。
最简单的办法是按内容去重,可两条文字一样的告警,未必属于同一次故障。全部合并会漏,全部保留又没有意义。
周衡没有追求一步判断正确。他给每个来源设置一个短时间窗口,窗口内相同特征的告警先归进同一事件,页面显示次数和持续时间;超过窗口后重新建事件。用户仍然能展开查看原始记录,不会因为聚合丢掉证据。
改完已经是晚上般。
他煮了一碗面,督桌边吃。屋里太安静,筷子碰到碗沿的声音都很清楚。过去这个时间,隔壁通常已经开了游戏语音。现在没有人催他戴耳机,也没有人从门外挤过来拿外卖。
周衡吃完,把碗洗了,继续写。
凌晨一点,倒计时还剩三十时。
他接入变更记录时,遇到了比重复告警更麻烦的问题。
不同机器的时间并不完全一致。测试环境里一台虚拟机慢了四十七秒,结果页面显示“故障先发生,版本后发布”,实际顺序恰好相反。若把这样的时间线拿去复盘,只会让错误看起来更像证据。
周衡没有偷偷校正显示结果。他把接收时间与来源时间分开保存,页面明确提示时钟偏差;同一来源内部按序号排列,不同来源只给出可验证的先后范围。
两条记录终于排回了正确位置。周衡又换了三组数据,结果都对。
凌晨三点半,他关掉灯,在卧室的大床上睡了三个时。
第二早上,丁卓发来消息:“刚离职就失联,你不会真在写东西吧?”
周衡回了一张只截公开测试数据的页面。
丁卓隔了半分钟才回复:“像事故群聊记录成精了。”
“哪里不好用?”
“没人会主动登记变更。真出事的时候,大家只想先救。”
周衡看着这句话,把原来藏在二级页面的变更入口挪到首页,又增加了一个最接入方式:部署脚本结束后,只需向公开接口发送版本号、环境和操作者标识,便能自动留下一条记录。
丁卓又试了一次,发来一个竖拇指的表情:“这个顺手,省得我两边牵”
中午十二点,倒计时剩下十九时。
页面能够建立事件,也能把告警与附近的变更排在一起。周衡开始做故障时间线的最后一环:确认。
告警发出来以后,如果没有茹开,它只是一个红点。有人接手,系统需要留下接手时间;有人做了操作,需要记下做了什么;恢复以后,还要分清是指标真的恢复,还是值班人为了清净手动关掉告警。
他做了三个简单按钮:接手、记录操作、标记恢复。
没有自动根因分析,也没有所谓智能建议。每个按钮都要求留下人和时间,操作内容可以后补,却不能无痕删除。
下午四点,压力测试把服务打崩了。
周衡一次灌入十万条模拟记录,页面查询越来越慢,最后直接超时。问题出在他为了快速展示,把原始告警和事件列表放进了同一条同步处理链。接收量一高,用户翻一次页面也会拖慢写入。
他可以把机器配置调高,让演示暂时过关。
也可以把接收与展示拆开,让告警先落盘,再由后台归并。
倒计时只剩十五时。
周衡选了后者。
他没有引入一套需要专人维护的复杂中间件,只用轻量队列隔开接收和处理。写入先得到确认,聚合稍后完成;后台停掉时,尚未处理的记录仍然留在磁盘里。
晚上九点,十万条数据再次灌入。
接收接口没有超时,页面虽然慢了几秒,却还能打开。周衡把极限测试条件和已知限制一并写进明:当前版本只适合团队;单节点部署;不保证跨机房高可用;超过建议事件量应先扩容或分流。
倒计时还剩十时。
周衡把测试机留给脚本继续跑,起身走进厨房。冰箱里有丁卓带来的熟食,还有他下午叫人送来的水果。
他切了半盘牛肉,洗了一个苹果,在阳台站着吃完。
楼对面有个人也坐在窗前,不知道在加班还是看电影。以前熬到这个时间,周衡只盼着主管别再往群里丢任务。今他吃完苹果,心里想的却是让那张页面再好看一点。
这么多年攒下来的本事,终于用在了自己的东西上。
他回到桌前,整理好安装包,依赖清单和测试记录随版本自动保存。明别茹开链接,拿到的会是一个能装、能用的产品。
凌晨两点,安装脚本在一台全新的测试机上失败。
原因只是系统缺少一个很常见的运行库。
周衡没有在文档里补一句“请自行安装”就算结束。他重写检测步骤,让脚本在执行前明确列出缺少的条件,并给出对应的公开安装地址。再换一台测试机,十三分钟完成部署。
快亮时,页面终于不再像一张临时作业。
左侧是正在处理的事件,中间是时间线,右侧显示最近变更。每一条记录都能展开看到来源,不会替用户把猜测写成结论。
倒计时剩最后四十七分钟。
周衡给产品起名时,没有用“全能”“智能”或“零故障”。
他在名称栏里输入三个字:刻度云。
刻度不负责替人决定对错,只负责让发生过的事有位置可量。
他写了一页简单介绍,上传0.1版本,在一个独立开发者社区发布了体验地址。基础体验免费,测试期付费版本每月九块九,功能差别只有更长的记录保存时间和报告导出。
最后一分钟,周衡完成公开发布。
倒计时停在零。
周衡把发布链接点开,重新看了一遍自己的介绍。
刻度云,测试期每月九块九。
这三个字第一次出现在公开页面上,下面是他的头像和开发者账号。没有海拓的公章,没有杜维成的名字,也不用等哪个主管来替他领功。
他截了张图,发给丁卓。
“上线了。”
丁卓回得飞快:“名字可以。我先装,别给我开后门,按普通用户走。”
五分钟后,帖子下面多邻一条陌生回复。
“发布记录能和报警一起看?项目能用吗?”
周衡坐直了一点,回了支持的接入方式。对方继续问安装包在哪,他把下载地址贴过去,又补了一张自己刚跑出的演示截图。
原本空着的下载计数跳了一下。
周衡看着那个数字,手指悬在键盘上,忽然笑了。
有人来试了。
他把音量调高,给消息提醒换了一个清脆的声音,然后走到窗边伸了个懒腰。阳光落在新书桌上,窗外早餐店刚刚掀开蒸笼。
他准备下楼吃顿热的。
回来以后,等着他的会是自己的第一批用户。
喜欢神豪:收入按美元,消费按日元请大家收藏:(m.xaoxs.com)神豪:收入按美元,消费按日元笑傲小说更新速度最快。