prometheus-node-exporter-lua: fix corner case in hostapd_stations
authorMartin Weinelt <hexa@darmstadt.ccc.de>
Sat, 26 Jun 2021 00:15:17 +0000 (02:15 +0200)
committerEtienne Champetier <champetier.etienne@gmail.com>
Tue, 6 Jul 2021 17:37:36 +0000 (13:37 -0400)
There was a corner case, when a vif had no stations, that
evaluate_metrics for a station that was nil and had no collected metrics
would have been called.

Comment the code, to make it easier to understand and follow, and
simplify some variable names along the way.

Signed-off-by: Martin Weinelt <hexa@darmstadt.ccc.de>
utils/prometheus-node-exporter-lua/files/usr/lib/lua/prometheus-collectors/hostapd_stations.lua

index 9f7f6e4ad37ace4443dc52e8a0c5cc52f09156f2..a3e6c331a2c8b091efa6770a290e294d1dfb8d44 100644 (file)
@@ -139,26 +139,33 @@ local function scrape()
     local all_sta = handle:read("*a")
     handle:close()
 
-    local current_station = nil
-    local current_station_values = {}
+    local station = nil
+    local metrics = {}
 
     for line in all_sta:gmatch("[^\r\n]+") do
       if string.match(line, "^%x[0123456789aAbBcCdDeE]:%x%x:%x%x:%x%x:%x%x:%x%x$") then
-        if current_station ~= nil then
-          labels.station = current_station
-          evaluate_metrics(labels, current_station_values)
+        -- the first time we see a mac we have no previous station to eval, so don't
+        if station ~= nil then
+          labels.station = station
+          evaluate_metrics(labels, metrics)
         end
-        current_station = line
-        current_station_values = {}
+
+        -- remember current station bssid and truncate metrics
+        station = line
+        metrics = {}
       else
-        local name, value = string.match(line, "(.+)=(.+)")
-        if name ~= nil then
-          current_station_values[name] = value
+        local key, value = string.match(line, "(.+)=(.+)")
+        if key ~= nil then
+          metrics[key] = value
         end
       end
     end
-    labels.station = current_station
-    evaluate_metrics(labels, current_station_values)
+
+    -- the final station, check if there ever was one, will need a metrics eval as well
+    if station ~= nil then
+      labels.station = station
+      evaluate_metrics(labels, metrics)
+    end
   end
 end