mirror of
https://github.com/openwrt/packages.git
synced 2025-12-26 11:16:31 +04:00
prometheus-node-exporter-lua: Add ethtool exporter
Based on ethtool-lua library, add interface statistics to the prometheus-node-exporter. As closely as possible, the behaviour of the implementation at400c397993/collector/ethtool_linux.go (L208)is replicated. Signed-off-by: Kevin Jilissen <info@kevinjilissen.nl> [squash commits, bump version, fix permission, use untyped, rename to ethtool] Signed-off-by: Etienne Champetier <champetier.etienne@gmail.com> (cherry picked from commit9f94448b71)
This commit is contained in:
committed by
Etienne Champetier
parent
1cfdaeb792
commit
909a15a64b
@@ -4,8 +4,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=prometheus-node-exporter-lua
|
||||
PKG_VERSION:=2024.06.16
|
||||
PKG_RELEASE:=2
|
||||
PKG_VERSION:=2025.06.08
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_MAINTAINER:=Etienne CHAMPETIER <champetier.etienne@gmail.com>
|
||||
PKG_LICENSE:=Apache-2.0
|
||||
@@ -257,6 +257,17 @@ define Package/prometheus-node-exporter-lua-mwan3/install
|
||||
$(INSTALL_BIN) ./files/usr/lib/lua/prometheus-collectors/mwan3.lua $(1)/usr/lib/lua/prometheus-collectors/
|
||||
endef
|
||||
|
||||
define Package/prometheus-node-exporter-lua-ethtool
|
||||
$(call Package/prometheus-node-exporter-lua/Default)
|
||||
TITLE+= (ethtool collector)
|
||||
DEPENDS:=prometheus-node-exporter-lua +ethtool-lua
|
||||
endef
|
||||
|
||||
define Package/prometheus-node-exporter-lua-ethtool/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/prometheus-collectors
|
||||
$(INSTALL_BIN) ./files/usr/lib/lua/prometheus-collectors/ethtool.lua $(1)/usr/lib/lua/prometheus-collectors/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,prometheus-node-exporter-lua))
|
||||
$(eval $(call BuildPackage,prometheus-node-exporter-lua-bmx7))
|
||||
$(eval $(call BuildPackage,prometheus-node-exporter-lua-dawn))
|
||||
@@ -276,3 +287,4 @@ $(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))
|
||||
$(eval $(call BuildPackage,prometheus-node-exporter-lua-mwan3))
|
||||
$(eval $(call BuildPackage,prometheus-node-exporter-lua-ethtool))
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
local ethtool = require "ethtool"
|
||||
|
||||
local pattern_device = "^%s*([^%s:]+):"
|
||||
local pattern_metric = "_*[^0-9A-Za-z_]+_*"
|
||||
|
||||
local metric_fqnames = {
|
||||
rx_bytes = "node_ethtool_received_bytes_total",
|
||||
rx_dropped = "node_ethtool_received_dropped_total",
|
||||
rx_errors = "node_ethtool_received_errors_total",
|
||||
rx_packets = "node_ethtool_received_packets_total",
|
||||
tx_bytes = "node_ethtool_transmitted_bytes_total",
|
||||
tx_errors = "node_ethtool_transmitted_errors_total",
|
||||
tx_packets = "node_ethtool_transmitted_packets_total",
|
||||
-- link info
|
||||
supported_port = "node_network_supported_port_info",
|
||||
supported_speed = "node_network_supported_speed_bytes",
|
||||
supported_autonegotiate = "node_network_autonegotiate_supported",
|
||||
supported_pause = "node_network_pause_supported",
|
||||
supported_asymmetricpause = "node_network_asymmetricpause_supported",
|
||||
advertised_speed = "node_network_advertised_speed_bytes",
|
||||
advertised_autonegotiate = "node_network_autonegotiate_advertised",
|
||||
advertised_pause = "node_network_pause_advertised",
|
||||
advertised_asymmetricpause = "node_network_asymmetricpause_advertised",
|
||||
autonegotiate = "node_network_autonegotiate",
|
||||
}
|
||||
local metric_replacement_words = {
|
||||
rx = "received",
|
||||
tx = "transmitted",
|
||||
}
|
||||
|
||||
local function get_devices()
|
||||
local devices = {}
|
||||
for line in io.lines("/proc/net/dev") do
|
||||
local dev = string.match(line, pattern_device)
|
||||
if dev then
|
||||
table.insert(devices, dev)
|
||||
end
|
||||
end
|
||||
return devices
|
||||
end
|
||||
|
||||
local function replace_words(metric)
|
||||
return string.gsub(metric, "(%a+)", function(word)
|
||||
local replacement = metric_replacement_words[word]
|
||||
if replacement then
|
||||
return replacement
|
||||
end
|
||||
return word
|
||||
end)
|
||||
end
|
||||
|
||||
local function build_ethtool_fqname(metric)
|
||||
local metricName = metric:gsub(pattern_metric, "_")
|
||||
metricName = metricName:lower():gsub("^[%s_]+", "")
|
||||
metricName = replace_words(metricName)
|
||||
return "node_ethtool_" .. metricName
|
||||
end
|
||||
|
||||
local function scrape()
|
||||
local eth = ethtool.open()
|
||||
local metrics = {}
|
||||
for _, dev in ipairs(get_devices()) do
|
||||
local stats = eth:statistics(dev)
|
||||
if stats then
|
||||
for m_name, m_value in pairs(stats) do
|
||||
fqname = metric_fqnames[m_name]
|
||||
if fqname == nil then
|
||||
fqname = build_ethtool_fqname(m_name)
|
||||
metric_fqnames[m_name] = fqname
|
||||
end
|
||||
local m = metrics[fqname]
|
||||
if m == nil then
|
||||
m = metric(fqname, "untyped")
|
||||
metrics[fqname] = m
|
||||
end
|
||||
m({ device = dev }, m_value)
|
||||
end
|
||||
end
|
||||
end
|
||||
eth:close()
|
||||
end
|
||||
|
||||
return { scrape = scrape }
|
||||
Reference in New Issue
Block a user