diff --git a/utils/prometheus-node-exporter-ucode/Makefile b/utils/prometheus-node-exporter-ucode/Makefile index 8319cc4e8ed0f..be7f115a84f46 100644 --- a/utils/prometheus-node-exporter-ucode/Makefile +++ b/utils/prometheus-node-exporter-ucode/Makefile @@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=prometheus-node-exporter-ucode PKG_VERSION:=2024.02.07 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_MAINTAINER:=Andre Heider PKG_LICENSE:=Apache-2.0 @@ -72,3 +72,4 @@ $(eval $(call Collector,snmp6,snmp6 collector,)) $(eval $(call Collector,uci_dhcp_host,UCI DHCP host collector,)) $(eval $(call Collector,wifi,Wi-Fi collector,+ucode-mod-nl80211)) $(eval $(call Collector,wireguard,Wireguard collector,+rpcd-mod-wireguard)) +$(eval $(call Collector,go2rtc,go2rtc collector,+ucode-mod-uclient +ucode-mod-uloop go2rtc)) diff --git a/utils/prometheus-node-exporter-ucode/files/extra/go2rtc.uc b/utils/prometheus-node-exporter-ucode/files/extra/go2rtc.uc new file mode 100644 index 0000000000000..31a6386950d83 --- /dev/null +++ b/utils/prometheus-node-exporter-ucode/files/extra/go2rtc.uc @@ -0,0 +1,105 @@ +let uloop = require("uloop"); +let uclient = require("uclient"); + +const api_url = config["api_url"]; +if (!api_url) + return false; + +let m_up = gauge("go2rtc_up"); +let m_producer_info = gauge("go2rtc_producer_info"); +let m_consumer_info = gauge("go2rtc_consumer_info"); +let m_producer_rx = counter("go2rtc_producer_received_bytes_total"); +let m_consumer_tx = counter("go2rtc_consumer_sent_bytes_total"); + + +function get_streams_info(api_url) { + let data = ''; + + const url = `${api_url}/api/streams`; + + uloop.init(); + uc = uclient.new(url, null, { + data_read: (cb) => { + let chunk; + while (length(chunk = uc.read()) > 0) + data += chunk; + }, + data_eof: (cb) => { + uloop.end(); + }, + error: (cb, code) => { + warn(`failed to get url: ${url}: ${code}\n`); + data = null; + uloop.end(); + } + }); + + if (!uc.set_timeout(5000)) { + warn("failed to set timeout\n"); + return null; + } + + if (!uc.ssl_init({verify: false})) { + warn("failed to initialize SSL\n"); + return null; + } + + if (!uc.connect()) { + warn("failed to connect\n"); + return null; + } + + if (!uc.request("GET", {headers: {"User-Agent": "prometheus-node-exporter-ucode/1.0"}})) { + warn("failed to send request\n"); + return null; + } + + uloop.run(); + + if (data == null) { + return null; + } + + return json(data); +} + +const x = get_streams_info(api_url); + +if (!x) { + m_up({url: api_url}, 0); + return false; +} + +m_up({url: api_url}, 1); + +for (let stream, info in x) { + + for (let producer in info.producers) { + m_producer_info({ + stream: stream, + format_name: producer.format_name, + protocol: producer.protocol, + remote_addr: producer.remote_addr, + user_agent: producer.user_agent, + }, (!producer.remote_addr) ? 0 : 1); + m_producer_rx({ + stream: stream, + remote_addr: producer.remote_addr, + }, producer.bytes_recv); + } + + for (let consumer in info.consumers) { + m_consumer_info({ + stream: stream, + format_name: consumer.format_name, + protocol: consumer.protocol, + remote_addr: consumer.remote_addr, + user_agent: consumer.user_agent, + }, 1); + m_consumer_tx({ + stream: stream, + remote_addr: consumer.remote_addr, + }, consumer.bytes_send); + } + +} diff --git a/utils/prometheus-node-exporter-ucode/files/init b/utils/prometheus-node-exporter-ucode/files/init index 826ea27581037..8b532829126c9 100644 --- a/utils/prometheus-node-exporter-ucode/files/init +++ b/utils/prometheus-node-exporter-ucode/files/init @@ -40,10 +40,11 @@ start_service() { [ $keepalive -gt 0 ] && procd_append_param command -k $keepalive procd_add_jail prometheus-node-exporter-ucode log procfs sysfs ubus - procd_add_jail_mount "/usr/lib/uhttpd_ucode.so" procd_add_jail_mount "/lib/libubus.so*" procd_add_jail_mount "/lib/libuci.so*" - procd_add_jail_mount "/usr/lib/ucode" + procd_add_jail_mount "/lib/libustream-ssl.so" + procd_add_jail_mount "/usr/lib/uhttpd_ucode.so" + procd_add_jail_mount "/usr/lib/ucode/*.so" procd_add_jail_mount "/usr/lib/libnl*.so*" procd_add_jail_mount "/usr/share/ucode/node-exporter" procd_add_jail_mount "/etc/config"