7.8.8 日志与指标在发布中的应用
日志与指标在发布中的应用#
在发布流程中,日志与指标是验证变更安全性与业务健康度的关键依据。本节以 Nginx 为核心,给出可执行的日志与指标配置、采集与判定方法,并提供排错与练习。
一、日志与指标的发布闭环原理(含草图)#
二、日志格式统一与发布关联(含示例)#
1)配置统一日志格式与 request_id
文件路径:/etc/nginx/nginx.conf
http {
log_format release_main '$remote_addr $request_id [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time urt=$upstream_response_time '
'ust=$upstream_status ua="$http_user_agent"';
# 生成 request_id(需 ngx_http_request_id_module 或 OpenResty)
request_id on;
access_log /var/log/nginx/access.log release_main;
error_log /var/log/nginx/error.log warn;
}
预期效果:access.log 中每条请求都包含 request_id,可与应用日志关联。
2)示例:灰度节点单独日志
upstream app_gray {
server 10.0.0.11:8080;
}
server {
listen 80;
location / {
proxy_pass http://app_gray;
access_log /var/log/nginx/access_gray.log release_main;
}
}
预期效果:灰度流量独立日志便于对比基线。
三、发布指标来源与采集(含安装、命令)#
1)启用 Nginx stub_status(轻量指标)
# /etc/nginx/conf.d/status.conf
server {
listen 8080;
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
nginx -t && systemctl reload nginx
curl -s http://127.0.0.1:8080/nginx_status
预期效果:输出连接与请求计数,用于发布期连接异常判断。
2)Prometheus Nginx Exporter 安装(指标更丰富)
# 安装(示例以二进制方式)
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.1.0/nginx-prometheus-exporter_1.1.0_linux_amd64.tar.gz
tar -xf nginx-prometheus-exporter_1.1.0_linux_amd64.tar.gz
sudo mv nginx-prometheus-exporter /usr/local/bin/
# 启动 exporter,绑定 stub_status 地址
/usr/local/bin/nginx-prometheus-exporter \
-nginx.scrape-uri http://127.0.0.1:8080/nginx_status \
-web.listen-address :9113
curl -s http://127.0.0.1:9113/metrics | head -n 20
预期效果:Prometheus 可抓取 Nginx 连接、请求等指标。
四、发布判定门槛与对比方法(含命令)#
1)基线采集:发布前 5 分钟日志统计
# 统计 5xx 比例
awk '{total++; if($9 ~ /^5/) err++} END{printf("5xx=%.2f%%\n", err/total*100)}' \
/var/log/nginx/access.log
# 统计 P95 request_time
awk '{print $NF}' /var/log/nginx/access.log | grep -o 'rt=[0-9\.]*' | \
cut -d= -f2 | sort -n | \
awk 'BEGIN{p=0.95} {a[NR]=$1} END{print a[int(NR*p)]}'
2)灰度阶段对比
# 灰度日志 5xx
awk '{total++; if($9 ~ /^5/) err++} END{printf("gray 5xx=%.2f%%\n", err/total*100)}' \
/var/log/nginx/access_gray.log
3)示例阈值
- 5xx > 0.5% 且持续 5 分钟触发回滚
- P95 request_time > 基线 2 倍触发回滚
五、典型发布排错(含命令与解释)#
场景 1:发布后 5xx 激增
# 快速定位错误码与上游状态
awk '{print $9, $NF}' /var/log/nginx/access.log | \
grep '^5' | head -n 20
解释:查看 status 与 upstream_response_time/ust=,判断是上游超时还是应用异常。
场景 2:连接数异常飙升
curl -s http://127.0.0.1:8080/nginx_status
# Active connections 与 Reading/Writing/Waiting 异常
处理思路:检查长连接、后端连接池、是否未开启 keepalive。
场景 3:灰度流量未生效
grep -c 'access_gray' /var/log/nginx/access_gray.log
处理思路:检查灰度路由条件、upstream 是否可达、日志路径权限。
六、发布中的日志与指标应用策略(含示例流程)#
- 发布前基线:记录 5xx 与 P95 基线
- 灰度验证:灰度日志单独统计
- 实时监控:Prometheus 采集频率提升
- 自动回滚:超阈值触发回滚脚本
示例回滚脚本(伪代码,按实际环境调整):
#!/bin/bash
# /opt/release/rollback.sh
if [ "$(cat /opt/release/flag_5xx)" = "rollback" ]; then
ln -sfn /opt/app/releases/prev /opt/app/current
systemctl reload nginx
echo "rollback done"
fi
七、练习与验证(必做)#
- 练习 1:自定义
log_format增加request_id,访问一次并在日志中找到该字段。 - 练习 2:启用
stub_status并用curl查看连接数变化。 - 练习 3:模拟 5xx(后端关闭服务),统计 5xx 比例并验证回滚条件触发。
- 练习 4:使用灰度日志目录,比较灰度与全量的 P95 延迟。
通过规范的日志与指标体系,发布过程可量化、可追踪、可回滚,提升 Nginx 与应用发布的稳定性。