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 是否可达、日志路径权限。

六、发布中的日志与指标应用策略(含示例流程)#

  1. 发布前基线:记录 5xx 与 P95 基线
  2. 灰度验证:灰度日志单独统计
  3. 实时监控:Prometheus 采集频率提升
  4. 自动回滚:超阈值触发回滚脚本

示例回滚脚本(伪代码,按实际环境调整):

#!/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. 练习 1:自定义 log_format 增加 request_id,访问一次并在日志中找到该字段。
  2. 练习 2:启用 stub_status 并用 curl 查看连接数变化。
  3. 练习 3:模拟 5xx(后端关闭服务),统计 5xx 比例并验证回滚条件触发。
  4. 练习 4:使用灰度日志目录,比较灰度与全量的 P95 延迟。

通过规范的日志与指标体系,发布过程可量化、可追踪、可回滚,提升 Nginx 与应用发布的稳定性。