in kong/kong/plugins/prometheus/prometheus.lua [857:931]
function Prometheus:metric_data(write_fn)
if not self.initialized then
ngx_log(ngx.ERR, "Prometheus module has not been initialized")
return
end
write_fn = write_fn or ngx_print
self._counter:sync()
local keys = self.dict:get_keys(0)
local count = #keys
for k, v in pairs(self.local_metrics) do
keys[count+1] = k
count = count + 1
end
table_sort(keys)
local seen_metrics = {}
local output = {}
local output_count = 0
local function buffered_print(data)
if data then
output_count = output_count + 1
output[output_count] = data
end
if output_count >= 100 or not data then
write_fn(output)
output_count = 0
tb_clear(output)
end
end
for _, key in ipairs(keys) do
yield()
local value, err
local is_local_metrics = true
value = self.local_metrics[key]
if not value then
is_local_metrics = false
value, err = self.dict:get(key)
end
if value then
local short_name = short_metric_name(key)
if not seen_metrics[short_name] then
local m = self.registry[short_name]
if m then
if m.help then
buffered_print(st_format("# HELP %s%s %s\n",
self.prefix, short_name, m.help))
end
if m.typ then
buffered_print(st_format("# TYPE %s%s %s\n",
self.prefix, short_name, TYPE_LITERAL[m.typ]))
end
end
seen_metrics[short_name] = true
end
if not is_local_metrics then
key = fix_histogram_bucket_labels(key)
end
buffered_print(st_format("%s%s %s\n", self.prefix, key, value))
else
self:log_error("Error getting '", key, "': ", err)
end
end
buffered_print(nil)
end