小王最近上线了一个电商后台服务,本地跑得飞快,测试环境也稳稳当当,结果一上预发环境就卡顿,切到生产环境更糟——接口响应时间飙到3秒,CPU占用率忽高忽低。他翻日志、查数据库、重试部署,折腾两天才发现问题出在 Redis 连接池配置没随环境变化,测试环境用的单机版,生产却连了集群,但连接数压根没调上去。
为什么不能一套监控打天下?
开发环境跑着 Docker Compose,三五个容器凑合着;测试环境加了 Nginx 和真实数据库;预发环境镜像和生产一致,但没开全链路追踪;生产环境还套着 Kubernetes、Service Mesh 和自动扩缩容。每个环节的资源形态、流量特征、依赖组件版本都不一样——硬塞同一套监控规则进去,就像拿体温计去测锅炉温度,读数不准,告警乱跳。
分环境配监控,关键在三点
第一,指标采集要‘带环境标签’。Prometheus 抓取时,在 targets 配置里加 static_configs + labels:
scrape_configs:
- job_name: 'app-backend'
static_configs:
- targets: ['192.168.1.10:9100']
labels:
env: 'dev'
service: 'order-api'
- job_name: 'app-backend'
static_configs:
- targets: ['10.20.30.40:9100']
labels:
env: 'prod'
service: 'order-api'
这样在 Grafana 查看 CPU 使用率时,就能直接筛选 env="prod",不被开发机的噪音干扰。
第二,告警阈值得按环境分级。开发环境 API 响应慢点无所谓,但生产环境 P95 超过 800ms 就该响铃。用 Alertmanager 的 route 分级路由配合标签匹配:
route:
group_by: ['alertname', 'env']
routes:
- match:
env: 'prod'
receiver: 'dingtalk-prod'
continue: false
- match:
env: 'dev'
receiver: 'silence'
第三,数据存储别混着存。开发/测试环境的监控数据保留7天足够;生产环境建议至少保留30天,方便回溯故障周期。在 Prometheus 启动参数里区分:
# 开发环境启动命令
./prometheus --storage.tsdb.retention.time=7d --config.file=prometheus-dev.yml
# 生产环境启动命令
./prometheus --storage.tsdb.retention.time=30d --config.file=prometheus-prod.yml
实战小技巧:快速识别环境差异
写个简单 Bash 脚本,每次部署前自动上报当前环境指纹:
#!/bin/bash
ENV=$(hostname | cut -d'-' -f1)
TIMESTAMP=$(date +%s)
curl -X POST http://monitor-api/heartbeat \
-H 'Content-Type: application/json' \
-d "{\"env\": \"$ENV\", \"host\": \"$(hostname)\", \"ts\": $TIMESTAMP}"
配合 Grafana 的变量下拉菜单,选中 $env,面板自动切换对应环境的数据源和阈值线,不用手动改查询语句。
多环境不是麻烦,是把“上线即崩”变成“上线即稳”的必经路径。监控不是堆工具,而是让每个环境都说话——你听清了,问题就露头了。