监控不是摆设:一个独立开发者的血泪实战指南

事件循环乘客
2025-12-25 23:05
阅读 1600

上周五晚上十一点,我正瘫在沙发上刷B站,突然手机“叮”一声——不是女朋友消息(毕竟单身狗),而是Grafana发来的告警:“CPU使用率 > 95% 持续5分钟”。我瞬间从“躺平模式”切换到“战备状态”,抄起MacBook就往书房冲。远程办公的自由背后,是随时可能被线上事故叫醒的宿命。

我是谁?一个坐标北京、通勤一小时但基本不用去公司的独立开发者。白天写分布式系统,晚上调Vim配置,偶尔接点爬虫或前端的小活儿贴补家用。没有团队支持,没有运维兜底,所有服务都得自己盯——监控,就成了我活下去的命脉。

今天这篇文章,不讲高大上的SRE理论,就说说像我这样的“一人团队”怎么低成本、高效率地把监控搞起来。顺便聊聊那些让我半夜惊醒的坑,以及为什么面试官总爱问“你怎么设计监控系统”。


一开始,我连日志在哪都找不到

去年双11前,我接了个小项目:给一家电商做数据采集。说白了就是写个爬虫,每天抓几百万商品信息,存进数据库,再用前端展示趋势图。听起来简单?上线第三天,爬虫突然停了,客户电话打爆:“数据断了!你们技术是不是在摸鱼?”

我当时一脸懵。代码跑得好好的啊?后来才发现,爬虫因为反爬机制被封IP,默默退出了进程,而我连它挂了都不知道。更惨的是,前端页面加载超时,用户看到一片空白,还以为我们跑路了。

那一刻我悟了:没有监控的系统,就像没装刹车的车——跑得越快,翻得越惨

于是痛定思痛,开始研究监控。但网上教程动不动就Prometheus+Alertmanager+Loki全家桶,配置文件比我的Vimrc还长。作为一个习惯了vim ~/.bashrc就解决问题的人,我真的不想为了看个CPU占用率搭一套K8s集群。

怎么办?从最痛的点切入。


爬虫挂了?先让它“会说话”

爬虫是我第一个要监控的对象。核心需求就两个:

  1. 它还在跑吗?
  2. 它抓了多少数据?

最简单的办法:让程序定期写心跳。我在爬虫主循环里加了几行代码:

import time
import json
from pathlib import Path

HEARTBEAT_FILE = "/tmp/crawler_heartbeat.json"

def update_heartbeat(count):
    with open(HEARTBEAT_FILE, "w") as f:
        json.dump({
            "last_update": int(time.time()),
            "item_count": count,
            "status": "running"
        }, f)

然后写个Shell脚本每分钟检查一次:

#!/bin/bash
# check_crawler.sh
if [ ! -f /tmp/crawler_heartbeat.json ]; then
  echo "Crawler not started!" | send_alert.sh
  exit 1
fi

last_update=$(jq -r '.last_update' /tmp/crawler_heartbeat.json)
now=$(date +%s)
if [ $((now - last_update)) -gt 300 ]; then  # 超过5分钟没更新
  echo "Crawler stuck!" | send_alert.sh
fi

配合cron,每分钟跑一次。告警方式?直接用微信机器人(别笑,真香)。虽然土,但成本低、见效快。客户再也没因为数据中断骂我了。

开发心得:监控的第一原则不是“全”,而是“有用”。先解决最痛的问题,再慢慢扩展。


前端也不能裸奔

很多人以为监控只是后端的事,前端?F12看看Console不就行了?天真!

有一次我给客户做的数据看板,用户反馈“页面打不开”。我本地测试一切正常。后来发现是某个CDN资源加载失败,导致整个React应用白屏。而我的后端API毫发无损——问题出在前端,但后端监控根本看不到。

于是我在前端加了基础监控:

  • 页面加载性能(用performance.timing
  • JS错误捕获(window.onerror
  • 关键API请求成功率

代码片段如下:

// 简易前端监控SDK
window.addEventListener('error', (e) => {
  fetch('/api/log', {
    method: 'POST',
    body: JSON.stringify({
      type: 'js_error',
      message: e.message,
      stack: e.error?.stack,
      url: window.location.href,
      ua: navigator.userAgent
    })
  });
});

// 记录页面加载时间
window.addEventListener('load', () => {
  const perf = performance.timing;
  const loadTime = perf.loadEventEnd - perf.navigationStart;
  // 上报...
});

后端收到这些日志后,统一存到Elasticsearch(其实是个单机版,别告诉别人),用Kibana看个大概。虽然比不上Sentry专业,但至少知道用户是不是在骂我写的代码。

面试题挑战:如果你去面大厂,八成会被问“如何监控前端异常?” 别只答Sentry,可以说说你的轻量化方案——毕竟不是每个公司都愿意为前端监控付几千美金/月。


分布式系统的“眼睛”:指标监控

作为对分布式系统有点研究的人,我深知:微服务越多,盲点越多。一个请求跨5个服务,到底卡在哪?

这时候就需要指标(Metrics)监控了。我试过Zabbix,太重;试过Datadog,太贵。最后选了 Prometheus + Grafana 这个开源组合。

为什么?

  • Prometheus拉模型适合我的小规模部署
  • Grafana画图漂亮,老板看了直呼“高级”
  • 配置简单,YAML比JSON友好多了(Vim党狂喜)

我的prometheus.yml精简到极致:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'backend'
    static_configs:
      - targets: ['localhost:9090']  # 应用暴露/metrics端点

  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']  # Node Exporter

应用侧用Python的prometheus_client库暴露指标:

from prometheus_client import Counter, start_http_server

REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP requests')
start_http_server(9090)  # 开个端口

@app.route('/')
def home():
    REQUEST_COUNT.inc()
    return "OK"

Grafana里建个Dashboard,CPU、内存、请求量、错误率一目了然。上周我发现某个接口错误率突增,点进去一看,是第三方API改了返回格式——立刻回滚,避免了一场事故。

监控维度 工具选择 成本 上手难度
进程存活 自研心跳 + cron 0元
前端异常 自研SDK + ES ~200元/月(云ES) ⭐⭐
系统指标 Prometheus + Node Exporter 0元 ⭐⭐⭐
日志分析 Loki + Promtail 0元 ⭐⭐⭐⭐

注:Loki我后来也加上了,专门收应用日志。比ELK轻量太多,查询语法类似LogQL,配合Grafana无缝集成。


告警不是越多越好,而是越准越好

早期我犯了个大错:CPU>80%就告警。结果夏天办公室空调坏了,服务器温度升高,CPU飙到85%,手机疯狂震动。我顶着38度高温跑去机房(其实是家里路由器旁边),发现一切正常。

告警疲劳是真实存在的。现在我的告警策略很克制:

  • 只监控关键路径(如爬虫是否运行、核心API是否可用)
  • 设置合理阈值(比如错误率连续5分钟>1%才告警)
  • 告警分级:P0级微信+电话,P1级只微信,P2级只记日志

Grafana的告警规则示例:

# grafana-alert.yaml
- name: critical
  rules:
  - alert: CrawlerDown
    expr: up{job="crawler"} == 0
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "爬虫进程挂了!"

另外,告警必须带上下文。以前只发“CPU高”,现在改成:“服务A的CPU使用率达92%,过去10分钟平均85%,关联日志见[链接]”。这样我一眼就知道要不要立刻处理。


写在最后:监控的本质是“减少不确定性”

远程办公三年,我越来越觉得:自由的前提是可控。没有团队帮你盯着系统,你就得靠工具武装自己。监控不是为了应付面试,也不是为了炫技,而是为了睡个安稳觉。

现在的我,手机里装着Grafana App,地铁上刷到告警能立刻SSH进去排查。上周客户夸我系统“稳如老狗”,其实哪有什么魔法,不过是把每一个可能出错的环节都“照亮”了而已。

如果你也是独立开发者、小团队成员,或者正在准备跳槽面试,不妨从今天开始:

  1. 给你的爬虫加个心跳
  2. 在前端埋个错误上报
  3. 用Prometheus看看你的服务到底在干嘛

成本不高,收益巨大。毕竟,线上不出事,才是最大的KPI

对了,最近在刷LeetCode准备面试,发现“设计一个监控系统”居然成了高频题。看来,这不仅是生存技能,还是涨薪利器啊(笑)。

—— 一个在北京出租屋里和Vim、Prometheus相依为命的独立开发者

评论 0

最热最新
暂无评论
事件循环乘客Lv.1
0
影响力
0
文章
0
粉丝