Skip to content

Commit

Permalink
Merge pull request #19125 from hirnpfirsich/master
Browse files Browse the repository at this point in the history
prometheus-node-exporter-lua: add realtek-poe exporter
  • Loading branch information
champtar authored Aug 9, 2022
2 parents 340df5e + 201457c commit 96aa76f
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 1 deletion.
14 changes: 13 additions & 1 deletion utils/prometheus-node-exporter-lua/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
include $(TOPDIR)/rules.mk

PKG_NAME:=prometheus-node-exporter-lua
PKG_VERSION:=2022.08.07
PKG_VERSION:=2022.08.08
PKG_RELEASE:=1

PKG_MAINTAINER:=Etienne CHAMPETIER <[email protected]>
Expand Down Expand Up @@ -224,6 +224,17 @@ define Package/prometheus-node-exporter-lua-snmp6/install
$(INSTALL_BIN) ./files/usr/lib/lua/prometheus-collectors/snmp6.lua $(1)/usr/lib/lua/prometheus-collectors/
endef

define Package/prometheus-node-exporter-lua-realtek-poe
$(call Package/prometheus-node-exporter-lua/Default)
TITLE+= (realtek-poe collector)
DEPENDS:=prometheus-node-exporter-lua +libubus-lua +realtek-poe
endef

define Package/prometheus-node-exporter-lua-realtek-poe/install
$(INSTALL_DIR) $(1)/usr/lib/lua/prometheus-collectors
$(INSTALL_BIN) ./files/usr/lib/lua/prometheus-collectors/realtek-poe.lua $(1)/usr/lib/lua/prometheus-collectors/
endef

$(eval $(call BuildPackage,prometheus-node-exporter-lua))
$(eval $(call BuildPackage,prometheus-node-exporter-lua-bmx6))
$(eval $(call BuildPackage,prometheus-node-exporter-lua-bmx7))
Expand All @@ -240,3 +251,4 @@ $(eval $(call BuildPackage,prometheus-node-exporter-lua-uci_dhcp_host))
$(eval $(call BuildPackage,prometheus-node-exporter-lua-wifi))
$(eval $(call BuildPackage,prometheus-node-exporter-lua-wifi_stations))
$(eval $(call BuildPackage,prometheus-node-exporter-lua-snmp6))
$(eval $(call BuildPackage,prometheus-node-exporter-lua-realtek-poe))
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
require "ubus"

local METRIC_NAMESPACE = "realtek_poe"

-- possible poe modes for a port
-- realtek-poe/src/main.c
-- static int poe_reply_port_ext_config()
local POE_MODES = {
"PoE",
"Legacy",
"pre-PoE+",
"PoE+"
}

-- possible poe states for a port
-- realtek-poe/src/main.c
-- static int poe_reply_4_port_status()
local POE_STATES = {
"Disabled",
"Searching",
"Delivering power",
"Fault",
"Other fault",
"Requesting power"
}

-- --
-- scraping function
-- --
local function scrape()
-- connect to ubus
local conn = ubus.connect()
if not conn then
error("Failed to connect to ubusd")
end

-- call poe info
local poe_info = conn:call("poe", "info", {})
if not poe_info then
error("Failed to call 'poe info'. Is realtek-poe installed and running ?")
end

-- close ubus handle
conn:close()

-- helper vars
local mcu = poe_info["mcu"]
local ports = poe_info["ports"]
local budget = poe_info["budget"]
local firmware = poe_info["firmware"]
local consumption = poe_info["consumption"]

-- push info, budget and consumption metric
metric(METRIC_NAMESPACE .. "_switch_info", "gauge", { mcu=mcu, firmware=firmware }, 1)
metric(METRIC_NAMESPACE .. "_switch_budget_watts", "gauge", nil, budget)
metric(METRIC_NAMESPACE .. "_switch_consumption_watts", "gauge", nil, consumption)

-- push per port priority metrics
local priority_metric = metric(METRIC_NAMESPACE .. "_port_priority", "gauge")
for port, values in pairs(ports) do
priority_metric({ device=port }, values["priority"])
end

-- push per port consumption metrics
local consumption_metric = metric(METRIC_NAMESPACE .. "_port_consumption_watts", "gauge")
for port, values in pairs(ports) do
consumption_metric({ device=port }, (values["consumption"] ~= nil and values["consumption"] or 0))
end

-- push per port state metrics
local state_metric = metric(METRIC_NAMESPACE .. "_port_state", "gauge")
for _, state in ipairs(POE_STATES) do
for port, values in pairs(ports) do
state_metric({ device=port, state=state }, (values["status"] == state and 1 or 0))
end
end

-- push per port mode metrics
local mode_metric = metric(METRIC_NAMESPACE .. "_port_mode", "gauge")
for _, mode in ipairs(POE_MODES) do
for port, values in pairs(ports) do
mode_metric({ device=port, mode=mode }, (values["mode"] == mode and 1 or 0))
end
end
end

return { scrape = scrape }

0 comments on commit 96aa76f

Please sign in to comment.