这个坑值得记一笔。接入 Datadog 之后,抓取面板上 Googlebot 每天只有 4 万次,源站日志实际是 6 万。查了索引配置,发现管道里对 4xx 状态做了 50% 的采样丢弃。
刚开始盯着「排除过滤器把静态资源的请求整个丢掉,爬虫抓图片也不计」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。日志管道按状态码分流,4xx 分支单独设了采样率;蜘蛛抓 404 的比例本来就高,采样后这部分被砍掉一半;面板统计的是采样后的条数,没有乘回采样系数。
动手时先确认管道的采样与排除规则
curl -s -H "DD-API-KEY:$DD_KEY" https://api.datadoghq.com/api/v1/logs/config/indexes | jq '.indexes[].filter'
然后在 Datadog 里按 service 与状态码对账
sum:nginx.requests{service:web,status:4xx}.as_count()
接着关掉 4xx 采样并观察一天
curl -X PUT -H "DD-API-KEY:$DD_KEY" https://api.datadoghq.com/api/v1/logs/config/indexes/main -d '{"filter":{"query":"service:web"}}'
末了用源站日志做基线比对
zcat access.log.*.gz | grep -c 'Googlebot'
别只看报错消失,验证要多做一步。面板上的抓取量与源站日志计数差值收敛到 3% 以内,404 分支的曲线重新变得完整,采样系数也在文档里写清楚了。
补一句。采样在成本上合理,但蜘蛛流量本身占比小,任何按状态码的抽样都会把长尾放大成误差,做 SEO 报表时要用原始计数。这类问题最好一次改到位,反复小改反而容易把原因搅混。
