Skip to content

collectd: Add collector for lantiq dsl metrics #12175

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion utils/collectd/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk

PKG_NAME:=collectd
PKG_VERSION:=5.12.0
PKG_RELEASE:=13
PKG_RELEASE:=15

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=https://collectd.org/files/ \
Expand Down Expand Up @@ -397,6 +397,32 @@ define BuildPlugin

endef

define BuildScriptLuaPlugin
PKG_CONFIG_DEPENDS+= CONFIG_PACKAGE_collectd-mod-$(1)

define Package/collectd-mod-$(1)
$$(call Package/collectd/Default)
TITLE:=$(2) plugin
DEPENDS:= $(4)
endef

define Package/collectd-mod-$(1)/install
$(INSTALL_DIR) $$(1)/usr/lib/collectd-mod-lua
for m in $(3); do \
${INSTALL_DATA} \
./files/lua-scripts/$$$$$$$${m}.lua $$(1)/usr/lib/collectd-mod-lua/ ; \
done
if [ -f ./files/usr/share/collectd/plugin/$(1).json ]; then \
$(INSTALL_DIR) $$(1)/usr/share/collectd/plugin ; \
$(INSTALL_DATA) ./files/usr/share/collectd/plugin/$(1).json \
$$(1)/usr/share/collectd/plugin/$(1).json ; \
fi
endef

$$(eval $$(call BuildPackage,collectd-mod-$(1)))

endef

define BuildScriptPlugin
PKG_CONFIG_DEPENDS+= CONFIG_PACKAGE_collectd-mod-$(1)

Expand Down Expand Up @@ -503,3 +529,4 @@ $(eval $(call BuildPlugin,write-graphite,Carbon/Graphite output,write_graphite,+
$(eval $(call BuildPlugin,write-http,HTTP POST output,write_http,+PACKAGE_collectd-mod-write-http:libcurl))

$(eval $(call BuildScriptPlugin,sqm,SQM/qdisc collection,sqm_collectd,+PACKAGE_collectd-mod-sqm:collectd-mod-exec))
$(eval $(call BuildScriptLuaPlugin,ltq-dsl,Lantiq DSL collection,dsl,@TARGET_lantiq_xrx200 +PACKAGE_collectd-mod-ltq-dsl:collectd-mod-lua +libubus-lua))
170 changes: 170 additions & 0 deletions utils/collectd/files/lua-scripts/dsl.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
-- Copyright 2019 Florian Eckert <fe@dev.tdt.de>
-- Copyright 2021 Jeroen Peelaerts <jeroen@steganos.dev>
-- Licensed to the public under the GNU General Public License v2.

local ubus = require("ubus")

local hostname_file = "/proc/sys/kernel/hostname"

local line_vars = {
{
name = "vector",
type = "bool"
},
{
name = "trellis",
type = "bool"
},
{
name = "bitswap",
type = "bool"
},
{
name = "retx",
type = "bool"
},
{
name = "satn",
type = "snr"
},
{
name = "latn",
type = "snr"
},
{
name = "attndr",
type = "bitrate"
},
{
name = "snr",
type = "snr"
},
{
name = "data_rate",
type = "bitrate"
},
{
name = "latn",
type = "latency"
}
}

local errors = {
{
name = "uas",
type = "gauge"
},
{
name = "rx_corrupted",
type = "gauge"
},
{
name = "rx_retransmitted",
type = "gauge"
},
{
name = "tx_retransmitted",
type = "gauge"
}
}

local erb_vars = {
{
name = "sent",
type = "gauge"
},
{
name = "discarded",
type = "gauge"
}
}

local general_vars = {
{
name = "profile",
type = "gauge"
},
{
name = "mode",
type = "gauge"
},
{
name = "state_num",
type = "gauge"
},
{
name = "power_state_num",
type = "gauge"
},
{
name = "uptime",
type = "uptime"
}
}

local function build_metric(name, direction)
if direction ~= '' then
return string.format("%s_%s", name, direction)
else
return name
end
end

local function get_values(hostname, variables, metrics, direction)
for _, information in pairs(variables) do
local name = information["name"]

if metrics and metrics[name] ~= nil then
local value = metrics[name]
local metric = build_metric(name, direction)

local t = {
host = host,
plugin = 'dsl',
type = information["type"],
type_instance = metric,
values = {value}
}
collectd.log_debug(string.format("%s: %s=%s", "collectd-mod-dsl(lua)", metric, tostring(value)))
collectd.dispatch_values(t)
else
collectd.log_info(string.format("%s: Unable to get %s", "collectd-mod-dsl(lua)", name))
end
end
end

local function read()
local lines = io.lines(hostname_file)
local hostname = lines()

local conn = ubus.connect()
if not conn then
collectd.log_error("collectd-mod-dsl(lua): Failed to connect to ubus")
return 0
end

local metrics = conn:call("dsl", "metrics", {})

if metrics then
if metrics["up"] then
local near_errors = metrics["errors"]["near"]
local far_errors = metrics["errors"]["far"]
local down_line = metrics["downstream"]
local up_line = metrics["upstream"]
local erb = metrics["erb"]

get_values(hostname, errors, near_errors, "near")
get_values(hostname, errors, far_errors, "far")
get_values(hostname, line_vars, down_line, "down")
get_values(hostname, line_vars, up_line, "up")
get_values(hostname, erb_vars, erb, "")
end
get_values(hostname, general_vars, metrics, "")
return 0
end

collectd.log_error("collectd-mod-dsl(lua): No ubus dsl object found")
return 0
end

collectd.register_read(read)