直接监控 Lua 脚本执行耗时与异常数,核心是用 lua-resty-prometheus 在关键阶段埋点:init_worker_by_lua_block 中初始化直方图(按 stage 标签记录耗时)和计数器(按 error_type、stage 统计异常),各阶段用 pcall 捕获错误并打点,/metrics 暴露指标支持 P95/P99 与错误聚合分析,并结合 trace_id 关联日志定位根因。

直接监控 Lua 脚本执行耗时与异常数,核心是用 lua-resty-prometheus(或 nginx-lua-prometheus)在关键执行阶段埋点,把耗时打成直方图、异常打成计数器。不依赖日志解析,也不靠外部采样,而是原生、低开销、请求级精度。
在 init_worker_by_lua_block 中初始化指标
这是全局初始化位置,只运行一次,避免重复定义:
- 声明一个直方图指标,记录各阶段 Lua 执行耗时(单位:秒),带 stage 标签区分 access / rewrite / log 等阶段
- 声明一个计数器指标,统计 Lua 异常发生次数,带 error_type 和 stage 标签(如 "nil_value"、"timeout"、"http_fail")
- 确保
lua_shared_dict prometheus_metrics 10M已配置,用于跨 worker 共享指标状态
在各 Lua 阶段包裹 try-catch 并打点
OpenResty 的每个 Lua 阶段(access_by_lua_block、rewrite_by_lua_block 等)都应封装执行逻辑,捕获异常并上报:
- 用
ngx.timer.at(0, ...)或pcall包裹业务 Lua 代码,捕获运行时错误 - 成功时调用直方图
:observe(elapsed_sec, {stage});失败时调用计数器:inc(1, {error_type, stage}) - 例如在
access_by_lua_block中做 JWT 验证,可在 pcall 后记录"jwt_parse_error"或"token_expired"
暴露 /metrics 接口并关联阶段标签
单独配置一个 location /metrics,在 content_by_lua_block 中主动收集并返回:
- 调用
prometheus:collect()输出全部指标 - 直方图自动包含 bucket 指标(如
nginx_lua_execution_seconds_bucket{le="0.01",stage="access"}),可用于计算 P95/P99 - 计数器支持按
error_type聚合,比如sum by (error_type)(rate(nginx_lua_errors_total[1h]))查高频异常类型
告警与排查建议
光采集不够,得能快速定位问题来源:
- 告警规则示例:
rate(nginx_lua_errors_total{stage=~"access|rewrite"}[5m]) > 10,表示某阶段每分钟异常超 10 次 - 结合
ngx.ctx在同一请求中透传 trace_id 或 request_id,让异常指标可关联到具体 access_log 行 - 若发现某
stage="content"耗时突增,可检查是否用了同步 HTTP 调用(应改用 cosocket)或未设 Redis 超时











