aboutsummaryrefslogtreecommitdiff
path: root/utils/prometheus-node-exporter-lua/files/usr/lib/lua/prometheus-collectors/ubnt-manager.lua
blob: 0093859d24724c2426780c944d2f9f31e60c2e03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
local function get_devices()
    local handle = io.popen("ubnt-manager -l")
    local result = handle:read("*a")
    handle:close()

    local devices = {}
    for device in result:gmatch("%S+") do table.insert(devices, device) end
    return devices
end

local function get_metric_airos6(device_data, label, label_full)
    -- host
    metric("ubnt_uptime", "counter", label_full, device_data['host']['uptime'])
    metric("ubnt_totalram", "gauge", label, device_data['host']['totalram'])
    metric("ubnt_freeram", "gauge", label, device_data['host']['freeram'])
    metric("ubnt_cpuload", "gauge", label, device_data['host']['cpuload'])
    metric("ubnt_cpubusy", "gauge", label, device_data['host']['cpubusy'])
    metric("ubnt_cputotal", "gauge", label, device_data['host']['cputotal'])

    -- wireless
    metric("ubnt_channel", "gauge", label, device_data['wireless']['channel'])
    local freqstring = {}
    for freq in device_data['wireless']['frequency']:gmatch("%S+") do
        table.insert(freqstring, freq)
    end
    if freqstring[1] then
        metric("ubnt_frequency", "gauge", label, tonumber(freqstring[1]))
    end

    metric("ubnt_dfs", "gauge", label, tonumber(device_data['wireless']['dfs']))
    metric("ubnt_signal", "gauge", label, device_data['wireless']['signal'])
    metric("ubnt_rssi", "gauge", label, device_data['wireless']['rssi'])
    metric("ubnt_noisef", "gauge", label, device_data['wireless']['noisef'])
    metric("ubnt_txpower", "gauge", label, device_data['wireless']['txpower'])
    metric("ubnt_distance", "gauge", label, device_data['wireless']['distance'])
    metric("ubnt_txrate", "gauge", label,
           tonumber(device_data['wireless']['txrate']))
    metric("ubnt_rxrate", "gauge", label,
           tonumber(device_data['wireless']['rxrate']))
    metric("ubnt_count", "gauge", label, device_data['wireless']['count'])
end

local function get_metric_airos8(device_data, label, label_full)
    -- host
    metric("ubnt_uptime", "counter", label_full, device_data['host']['uptime'])
    metric("ubnt_loadavg", "gauge", label, device_data['host']['loadavg'])
    metric("ubnt_totalram", "gauge", label, device_data['host']['totalram'])
    metric("ubnt_freeram", "gauge", label, device_data['host']['freeram'])
    metric("ubnt_temperature", "gauge", label,
           device_data['host']['temperature'])
    metric("ubnt_cpuload", "gauge", label, device_data['host']['cpuload'])
    metric("ubnt_timestamp", "counter", label, device_data['host']['timestamp'])

    -- wireless
    metric("ubnt_band", "gauge", label, device_data['wireless']['band'])
    metric("ubnt_frequency", "gauge", label,
           device_data['wireless']['frequency'])
    metric("ubnt_center1_freq", "gauge", label,
           device_data['wireless']['center1_freq'])
    metric("ubnt_dfs", "gauge", label, device_data['wireless']['dfs'])
    metric("ubnt_distance", "gauge", label, device_data['wireless']['distance'])
    metric("ubnt_noisef", "gauge", label, device_data['wireless']['noisef'])
    metric("ubnt_txpower", "gauge", label, device_data['wireless']['txpower'])
    metric("ubnt_aprepeater", "gauge", label,
           device_data['wireless']['aprepeater'])
    metric("ubnt_rstatus", "gauge", label, device_data['wireless']['rstatus'])
    metric("ubnt_chanbw", "gauge", label, device_data['wireless']['chanbw'])
    metric("ubnt_rx_chainmask", "gauge", label,
           device_data['wireless']['rx_chainmask'])
    metric("ubnt_tx_chainmask", "gauge", label,
           device_data['wireless']['tx_chainmask'])
    metric("ubnt_cac_state", "gauge", label,
           device_data['wireless']['cac_state'])
    metric("ubnt_cac_timeout", "gauge", label,
           device_data['wireless']['cac_timeout'])
    metric("ubnt_rx_idx", "gauge", label, device_data['wireless']['rx_idx'])
    metric("ubnt_rx_nss", "gauge", label, device_data['wireless']['rx_nss'])
    metric("ubnt_tx_idx", "gauge", label, device_data['wireless']['tx_idx'])
    metric("ubnt_tx_nss", "gauge", label, device_data['wireless']['tx_nss'])
    metric("ubnt_count", "gauge", label, device_data['wireless']['count'])

    -- wireless throughput
    metric("ubnt_throughput_tx", "gauge", label,
           device_data['wireless']['throughput']['tx'])
    metric("ubnt_throughput_rx", "gauge", label,
           device_data['wireless']['throughput']['rx'])

    -- wireless polling
    metric("ubnt_polling_cb_capacity", "gauge", label,
           device_data['wireless']['polling']['cb_capacity'])
    metric("ubnt_polling_dl_capacity", "gauge", label,
           device_data['wireless']['polling']['dl_capacity'])
    metric("ubnt_polling_ul_capacity", "gauge", label,
           device_data['wireless']['polling']['ul_capacity'])
    metric("ubnt_use", "gauge", label, device_data['wireless']['polling']['use'])
    metric("ubnt_tx_use", "gauge", label,
           device_data['wireless']['polling']['tx_use'])
    metric("ubnt_rx_use", "gauge", label,
           device_data['wireless']['polling']['rx_use'])
    metric("ubnt_atpc_status", "gauge", label,
           device_data['wireless']['polling']['atpc_status'])
    metric("ubnt_atpc_status", "gauge", label,
           device_data['wireless']['polling']['atpc_status'])
end

local function get_metric(device)
    local json = require('cjson')
    local handle = io.popen("ubnt-manager -j -t " .. device)
    local result = handle:read("*a")
    handle:close()
    local device_data = json.decode(result)

    if not device_data['host'] then return end
    if not device_data['wireless'] then return end

    local hostname = device_data['host']['hostname']
    local devmodel = device_data['host']['devmodel']
    local fwversion = device_data['host']['fwversion']
    local essid = device_data['wireless']['essid']

    local label_short = {
       device = device
    }

    local label_full = {
       device = device,
       hostname = hostname,
       devmodel = devmodel,
       fwversion = fwversion,
       essid = essid
   }

    -- v6. vs v8.
    if fwversion:find("v8.", 1, true) then
        get_metric_airos8(device_data, label_short, label_full)
    elseif fwversion:find("v6.", 1, true) then
        get_metric_airos6(device_data, label_short, label_full)
    end
end

local function scrape()
    for _, device in ipairs(get_devices()) do get_metric(device) end
end

return {scrape = scrape}