lua-resty-p8s
用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块
$ opm get bjne/lua-resty-p8s
用于 nginx/openresty 的 prometheus (p8s) 指标库
这是一个 Lua 库,可与 Nginx 一起使用以跟踪指标并在单独的网页上公开它们,以便由 Prometheus 获取。
安装
将 lib 目录的内容递归复制到 lua_package_path
中可用的路径
OpenResty 用户可以在 opm 中找到此库。
快速入门指南
要跟踪按服务器名称细分的请求延迟以及按服务器名称和状态细分的请求计数,请将以下内容添加到 nginx.conf
的 http
部分
lua_shared_dict resty_p8s 10M;
lua_package_path "/path/to/lua-resty-p8s/lib/?.lua;;";
init_by_lua_block {
_G.p8s = require "resty.p8s"
}
init_worker_by_lua_block {
-- set con to nomerge as its generated on request
_G.con = p8s.gauge("con", "state"):help("http connections"):merge(false)
_G.req = p8s.counter("req", "host", "status"):help("http requests")
_G.lat = p8s.histogram("lat", "host"):help("request latency")
}
log_by_lua_block {
req(1, ngx.var.server_name, ngx.var.status)
lat(ngx.var.request_time, ngx.var.server_name)
}
server {
location /enable_internal_metrics {
-- enables internal metrics for a spesific worker (or true for all)
content_by_lua_block {
p8s.enable_internal_metrics(true)
}
}
location /disable_internal_metrics {
-- disables internal metrics for a spesific worker (or true for all)
content_by_lua_block {
p8s.disable_internal_metrics(true)
}
}
location /no_internal_metrics {
content_by_lua_block {
p8s(false)
}
}
location /reset_internal_metrics_for_all_workers {
content_by_lua_block {
p8s.reset_internal_metrics(true)
}
}
location /ordered_output_with_internal_metrics {
content_by_lua_block { p8s(true, true) }
}
}
配置一个名为
resty_p8s
的共享字典,它具有默认名称注册一个名为
con
的 gauge,它有一个名为state
的标签注册一个名为
req
的计数器,它有两个标签:host
和status
注册一个名为
lat
的直方图,它有一个名为host
的标签在每个 HTTP 请求上测量其延迟,将其记录在直方图中并增加计数器,将当前服务器名称设置为
host
标签,将 HTTP 状态代码设置为status
标签。
最后一步是配置一个单独的服务器来公开这些指标。
server {
listen 9145;
allow 10.0.0.0/8;
deny all;
location /metrics {
content_by_lua_block {
con(ngx.var.connections_reading, "reading")
con(ngx.var.connections_waiting, "waiting")
con(ngx.var.connections_writing, "writing")
p8s()
}
}
}
指标将在 http://your.nginx:9145/metrics
上可用。请注意,此示例中的 gauge 指标包含从 nginx 全局状态获得的值,因此它们在指标返回给客户端之前立即设置。
API 参考
init()
语法: require("p8s").init(sync_interval 或 dict_name, sync_interval 或 dict_name)
初始化模块。这应该从 init
和/或 init_worker
中调用一次。如果从 init
中调用,则不会启动同步计时器,但会在任何其他阶段首次创建指标时自动启动(或者在 init_worker
中再次调用 .init 时,不需要参数)。
dict_name
是用于存储所有指标的 nginx 共享字典的名称。如果未指定,则默认为lua_resty_p8s
。也可以指定为共享字典的引用。sync_interval
): 设置每个工作线程的计数器同步间隔(以秒为单位),默认值为 1 秒。
返回一个 p8s
对象,该对象应用于注册指标。
示例
init_worker_by_lua_block {
p8s = require("p8s").init("i_want_to_use_my_own_dict_name_for_some_reason")
}
p8s.counter()
语法: p8s.counter(name, label_name, ...)
name
是指标的名称。label_name
标签名称列表。可选。
Prometheus 文档的命名部分 提供了关于选择指标和标签名称的良好指南。
返回一个 counter
对象,该对象可以稍后被递增。
示例
init_worker_by_lua_block {
p8s = require("p8s").init()
metric_bytes = p8s.counter("nginx_http_request_size_bytes")
metric_requests = p8s.counter("nginx_http_requests_total", "host", "status")
}
p8s.gauge()
语法: p8s.gauge(name, label_name, ...)
name
是指标的名称。label_name
标签名称列表。可选。
返回一个 gauge
对象,该对象可以稍后被设置。
示例
init_worker_by_lua_block {
p8s = require("p8s").init()
metric_connections = p8s.gauge("nginx_http_connections", "state")
}
p8s.histogram()
语法: p8s.histogram(name, buckets, label_name, ...)
name
是指标的名称。buckets
是一个数字数组,定义了桶边界。可选,默认值为 20 个延迟桶,涵盖从 5 毫秒到 10 秒(以秒为单位)的范围。label_name
标签名称列表。可选
返回一个 histogram
对象,该对象可以稍后用于记录样本。
示例
init_worker_by_lua_block {
p8s = require("p8s").init()
metric_latency = p8s.histogram("nginx_http_request_duration_seconds", "host"}
metric_response_sizes = p8s.histogram(
"nginx_http_response_size_bytes", {10,100,1000,10000,100000,1000000}
)
}
p8s()
语法: p8s()
以与 Prometheus 兼容的文本格式呈现所有指标。这应该在 content_by_lua_block 中调用,以在单独的 HTTP 页面上公开这些指标。
示例
location /metrics {
content_by_lua_block { p8s() }
}
counter:incr() 或 counter()
语法: counter:incr(value, label_value, ...)
递增先前注册的计数器。
value
是应该添加到计数器中的值。默认为 1label_value
零个或多个标签值
标签值的数量应与使用 p8s.counter()
注册计数器时定义的标签名称数量匹配。对于没有标签的计数器,不应提供任何标签值。
示例
log_by_lua_block {
metric_bytes(ngx.var.request_length)
metric_requests(1, ngx.var.server_name, ngx.var.status)
}
gauge:set() 或 gauge()
语法: gauge:set(value, label_value, ...)
设置先前注册的 gauge 的当前值。
value
是 gauge 应该设置为的值。必需。label_value
零个或多个标签值
histogram:observe() 或 histogram()
语法: histogram:observe(value, label_value, ...)
在先前注册的直方图中记录一个值。
value
是应该记录的值。必需。label_value
零个或多个标签值
示例
log_by_lua_block {
metric_latency(ngx.var.request_time, ngx.var.server_name)
metric_response_sizes(ngx.var.bytes_sent)
}
(gauge 或 counter 或 histogram):reset(worker)
语法: (gauge 或 counter 或 histogram):reset(worker)
默认情况下,将指标重置为当前工作线程的零。
worker
可以是当前工作线程的 null、id 或true
(表示所有工作线程)。
reset
返回自身,因此可以像这样嵌套:
示例
gauge:reset():set(10, "foo")
(gauge 或 counter 或 histogram):help(help)
语法: (gauge 或 counter 或 histogram):help(help)
为当前指标设置一个 HELP 文本,如果您想浪费字节的话。
help
文本,为 nil 则清除当前 help
(gauge 或 counter 或 histogram):labels(*label,...)
语法: (gauge 或 counter 或 histogram):labels(label, ...)
为指标设置默认标签
示例
local counter = p8s.counter("counter", "worker", "event"):labels(ngx.worker.id())
counter(1, "some event")
local counter2 = p8s.counter("counter", "something", "event"):labels(nil, "some event")
counter(1, "something")
测试
cpan Test::Nginx Test::Nginx::Socket
./test.sh
与替代方案相比有哪些不同
此模块使用 LuaJIT 序列化而不是纯 shm 来在工作线程之间同步指标。这意味着所有计数器更新都只在本地 lua VM 中执行,而跨工作线程更新只是一个 shm 写入/间隔。
Prometheus 输出格式的呈现是 nworkers shm 获取和本地合并。当使用多个计数器时,这应该表现良好。
指标会被垃圾回收,因此无需删除它们,只需让 lua gc 处理它们。但请记住,您需要保留一个引用。
在重新加载时(目前),数据从 shm 加载,但除非再次创建相同的指标,否则垃圾回收可能会在重新创建之前删除数据。在 init_worker
中创建指标将减轻此问题。
作者
Bjørnar Ness
许可证
2bsd
依赖项
luajit
版本
-
bjne/lua-resty-p8s 0.3.1用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-18 21:06:25
-
bjne/lua-resty-p8s 0.3.0用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-18 17:56:32
-
bjne/lua-resty-p8s 0.2.7用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-18 17:28:02
-
bjne/lua-resty-p8s 0.2.6用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-18 12:29:03
-
bjne/lua-resty-p8s 0.2.5用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-17 22:05:39
-
bjne/lua-resty-p8s 0.2.4用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-17 20:52:56
-
bjne/lua-resty-p8s 0.2.3用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-17 20:51:10
-
bjne/lua-resty-p8s 0.2.2用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 22:35:01
-
bjne/lua-resty-p8s 0.2.1用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 16:31:58
-
bjne/lua-resty-p8s 0.2.0用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 16:11:11
-
bjne/lua-resty-p8s 0.1.11用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 15:44:53
-
bjne/lua-resty-p8s 0.1.10用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 12:51:01
-
bjne/lua-resty-p8s 0.1.9用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 12:45:43
-
bjne/lua-resty-p8s 0.1.8用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 12:23:22
-
bjne/lua-resty-p8s 0.1.7用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 10:38:41
-
bjne/lua-resty-p8s 0.1.6用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 01:43:00
-
bjne/lua-resty-p8s 0.1.5用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 01:34:42
-
bjne/lua-resty-p8s 0.1.4用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 00:54:09
-
bjne/lua-resty-p8s 0.1.3用于 ngx_lua 模块的新字符串缓冲区 Prometheus 指标模块 2023-12-16 00:14:17
-
bjne/lua-resty-p8s 0.1.2为 ngx_lua 模块提供新的 string.buffer prometheus 指标模块 2023-12-15 23:45:20
-
bjne/lua-resty-p8s 0.1.1为 ngx_lua 模块提供新的 string.buffer prometheus 指标模块 2023-12-15 23:29:44
-
bjne/lua-resty-p8s 0.1.0为 ngx_lua 模块提供新的 string.buffer prometheus 指标模块 2023-12-15 21:23:14