openwrt-packages/utils/prometheus-node-exporter-lua/files/usr/bin/prometheus-node-exporter-lua

129 lines
3.0 KiB
Lua
Executable File

#!/usr/bin/lua
-- Metrics web server
-- Copyright (c) 2016 Jeff Schornick <jeff@schornick.org>
-- Copyright (c) 2015 Kevin Lyda <kevin@lyda.ie>
-- Licensed under the Apache License, Version 2.0
socket = require("socket")
-- get configs
local omit_zero_values = os.getenv("OMIT_ZERO_VALUES") == "1"
-- Parsing
function space_split(s)
local elements = {}
for element in s:gmatch("%S+") do
table.insert(elements, element)
end
return elements
end
function get_contents(filename)
local f = io.open(filename, "rb")
local contents = ""
if f then
contents = f:read("*a")
f:close()
end
return contents
end
-- Metric printing
function print_metric(metric, labels, value)
local label_string = ""
if labels then
for label, value in pairs(labels) do
label_string = label_string .. label .. '="' .. value .. '",'
end
label_string = "{" .. string.sub(label_string, 1, -2) .. "}"
end
output(string.format("%s%s %s", metric, label_string, value))
end
function metric(name, mtype, labels, value)
output("# TYPE " .. name .. " " .. mtype)
local outputter = function(labels, value)
if not (omit_zero_values and tonumber(value) == 0) then
print_metric(name, labels, value)
end
end
if value then
outputter(labels, value)
end
return outputter
end
function timed_scrape(collector)
local start_time = socket.gettime()
local success = 1
local status, err = pcall(collector.scrape)
if not status then
success = 0
io.stderr:write(err)
end
return (socket.gettime() - start_time), success
end
function run_all_collectors(collectors)
local metric_duration = metric("node_scrape_collector_duration_seconds", "gauge")
local metric_success = metric("node_scrape_collector_success", "gauge")
for _, cname in pairs(collectors) do
if col_mods[cname] ~= nil then
local duration, success = timed_scrape(col_mods[cname])
local labels = { collector = cname }
metric_duration(labels, duration)
metric_success(labels, success)
end
end
end
-- Web server-specific functions
function handle_request(env)
if env.PATH_INFO ~= "/metrics" then
uhttpd.send("Status: 404 Not Found\r\n")
uhttpd.send("Server: lua-metrics\r\n")
uhttpd.send("Content-Type: text/plain\r\n\r\n")
uhttpd.send("ERROR: File Not Found.")
else
uhttpd.send("Status: 200 OK\r\n")
uhttpd.send("Server: lua-metrics\r\n")
uhttpd.send("Content-Type: text/plain; version=0.0.4\r\n\r\n")
local cols = {}
for c in env.QUERY_STRING:gmatch("collect[^=]*=([^&]+)") do
cols[#cols + 1] = c
end
if #cols == 0 then
cols = col_names
end
run_all_collectors(cols)
end
end
-- Main program
col_mods = {}
col_names = {}
ls_fd = io.popen("ls -1 /usr/lib/lua/prometheus-collectors/*.lua")
for c in ls_fd:lines() do
c = c:match("([^/]+)%.lua$")
col_mods[c] = require("prometheus-collectors." .. c)
col_names[#col_names + 1] = c
end
ls_fd:close()
output = function(str)
uhttpd.send(str .. "\n")
end
if arg ~= nil then
output = print
run_all_collectors(col_names)
end