collectd: Add lua and exec collectors for lantiq dsl metrics
authorJeroen Peelaerts <jeroen.peelaerts@gmail.com>
Fri, 15 May 2020 17:42:48 +0000 (19:42 +0200)
committerjekkos <jeroen.peelaerts@gmail.com>
Fri, 22 Oct 2021 20:10:17 +0000 (22:10 +0200)
Signed-off-by: Jeroen Peelaerts <jeroen.peelaerts@gmail.com>
utils/collectd/Makefile
utils/collectd/files/lua-scripts/dsl.lua [new file with mode: 0644]

index 10bd70ef127fdb91be932b74b9d6bd11465431b5..11f467dc56e1a0caa8e90bfd5dbf01308f501f5c 100644 (file)
@@ -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/ \
@@ -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)
 
@@ -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))
diff --git a/utils/collectd/files/lua-scripts/dsl.lua b/utils/collectd/files/lua-scripts/dsl.lua
new file mode 100644 (file)
index 0000000..29a4be1
--- /dev/null
@@ -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)