prometheus-client是最轻量直接的Python监控入口,支持任意爬虫快速接入;需在主进程调用start_http_server暴露指标,正确区分Counter(累计)与Gauge(瞬时)用途,并确保targets地址、防火墙、进程常驻三方面配置无误。

prometheus-client 是最轻量、最直接的监控入口,不用改架构、不依赖 Scrapy,任何 Python 爬虫(requests + BeautifulSoup、httpx、甚至 asyncio 爬虫)都能立刻接入。
关键判断:别先折腾 scrapy-prometheus-exporter,除非你已在用 Scrapy 且项目稳定;否则从 prometheus-client 手动埋点起步,可控性高、调试快、出问题能一眼定位。
怎么暴露指标:start_http_server 要放在主进程里,不能藏在子线程
常见错误是把 start_http_server(8000) 放在某个回调函数或线程启动后执行——结果 Prometheus 抓不到数据,curl http://localhost:8000/metrics 直接超时或返回 404。
原因:HTTP 服务必须由主线程维持运行;子线程里起的服务无法响应外部请求。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 在爬虫主脚本最顶部(
if __name__ == '__main__':下第一行)调用start_http_server(8000) - 确保该端口未被占用(
lsof -i :8000或netstat -an | grep 8000) - 如果用
asyncio,不要用start_http_server,改用make_wsgi_app()配合uvicorn或aiohttp.web暴露接口
哪些指标真正有用:Counter 和 Gauge 的分工必须分清
很多人一上来就堆 Gauge,结果发现“当前请求数”忽高忽低、图表毛刺严重,根本没法看趋势。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
核心原则:Counter 记累计发生的事(如总请求数、总成功数、总异常数),Gauge 记瞬时状态(如当前并发请求数、内存占用 MB、队列剩余任务数)。
推荐埋点组合:
-
REQUEST_TOTAL = Counter('spider_requests_total', 'Total requests made')—— 每次requests.get()前调用.inc() -
ERROR_TOTAL = Counter('spider_errors_total', 'Total request errors', ['error_type'])——.inc({'error_type': 'timeout'})区分错误类型 -
CURRENT_TASKS = Gauge('spider_current_tasks', 'Number of active crawling tasks')——.set(len(active_tasks))动态更新 -
RESPONSE_TIME = Histogram('spider_response_time_seconds', 'Response time distribution')—— 用.time()上下文管理器自动打点
Prometheus 抓不到数据?先检查这三件事
不是配置写错,就是网络/权限卡住了。90% 的“监控没数据”问题出在这三处:
-
scrape_configs中的targets写的是localhost:8000,但爬虫和 Prometheus 不在同一台机器 → 改成宿主机 IP(Docker 环境下用host.docker.internal或实际内网 IP) - Linux 服务器默认防火墙(
ufw或firewalld)拦了 8000 端口 → 运行sudo ufw allow 8000或临时关防火墙验证 - 爬虫脚本跑完就退出,HTTP 服务跟着挂了 → 必须让主进程持续存活,例如加个
while True: time.sleep(60)或用signal.pause()
Grafana 里看不到 label 分组?标签名里不能有空格或特殊字符
比如定义了 Counter('spider_requests_total', 'Total requests', ['site_name']),然后调用 .inc({'site_name': '知乎专栏'}) —— Grafana 查 spider_requests_total{site_name="知乎专栏"} 会查不到。
原因:prometheus-client 对 label 值做严格校验,中文、空格、破折号都会导致指标注册失败,但不会报错,只是静默丢弃。
安全做法:
- label 值统一转小写 + 下划线,例如
'zhihu_zhuanlan' - 避免用动态 URL 作 label 值(太长且不可聚合),改用域名提取:
urlparse(url).netloc.replace('.', '_') - 上线前用
curl http://localhost:8000/metrics手动确认 label 是否出现在输出里
真实场景中,最难的不是埋点,而是让指标含义对齐业务目标。比如“成功率”不能只算 2xx 响应占比,还得排除反爬返回的 200 但 HTML 里含“访问过于频繁”的页面——这种判断必须在爬虫解析逻辑里完成,再通过 ERROR_TOTAL.inc({'error_type': 'anti_crawl'}) 单独计数。指标本身没智能,靠你定义清楚什么叫“异常”。

















