summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-statistics/luasrc/statistics
diff options
context:
space:
mode:
Diffstat (limited to 'applications/luci-app-statistics/luasrc/statistics')
-rw-r--r--applications/luci-app-statistics/luasrc/statistics/datatree.lua14
-rw-r--r--applications/luci-app-statistics/luasrc/statistics/rrdtool.lua12
-rw-r--r--applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua175
-rw-r--r--applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua23
-rw-r--r--applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua53
5 files changed, 249 insertions, 28 deletions
diff --git a/applications/luci-app-statistics/luasrc/statistics/datatree.lua b/applications/luci-app-statistics/luasrc/statistics/datatree.lua
index 806b054cb6..5176a19a22 100644
--- a/applications/luci-app-statistics/luasrc/statistics/datatree.lua
+++ b/applications/luci-app-statistics/luasrc/statistics/datatree.lua
@@ -13,9 +13,17 @@ local sections = uci:get_all("luci_statistics")
Instance = util.class()
function Instance.__init__( self, host )
- self._host = host or sections.collectd.Hostname or sys.hostname()
- self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd"
- self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd"
+ self._host = host or sys.hostname()
+ self._libdir = "/usr/lib/collectd"
+ self._rrddir = "/tmp/rrd"
+
+ if sections and sections.collectd then
+ self._host = host or sections.collectd.Hostname or sys.hostname()
+ self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd"
+ end
+ if sections and sections.collectd_rrdtool then
+ self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd"
+ end
self._libdir = self._libdir:gsub("/$","")
self._rrddir = self._rrddir:gsub("/$","")
diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua
index 4e00e7f1fc..47e1696ece 100644
--- a/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua
+++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua
@@ -87,7 +87,7 @@ function Graph._rrdtool( self, def, rrd )
fs.mkdirr( dir )
-- construct commandline
- local cmdline = "rrdtool graph"
+ local cmdline = { "rrdtool", "graph" }
-- copy default arguments to def stack
for i, opt in ipairs(self.args) do
@@ -102,15 +102,11 @@ function Graph._rrdtool( self, def, rrd )
opt = opt:gsub( "{file}", rrd )
end
- if opt:match("[^%w]") then
- cmdline = cmdline .. " '" .. opt .. "'"
- else
- cmdline = cmdline .. " " .. opt
- end
+ cmdline[#cmdline+1] = luci.util.shellquote(opt)
end
-- execute rrdtool
- local rrdtool = io.popen( cmdline )
+ local rrdtool = io.popen(table.concat(cmdline, " "))
rrdtool:close()
end
@@ -278,7 +274,7 @@ function Graph._generic( self, opts, plugin, plugin_instance, dtype, index )
-- create line1 statement
_tif( _args, "LINE%d:%s_%s#%s:%s",
- source.noarea and 2 or 1,
+ source.width or (source.noarea and 2 or 1),
source.sname, var, line_color, legend )
end
diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua
new file mode 100644
index 0000000000..9f7a51a868
--- /dev/null
+++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/apcups.lua
@@ -0,0 +1,175 @@
+-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.apcups",package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance )
+
+ local lu = require("luci.util")
+ local rv = { }
+
+ -- Types and instances supported by APC UPS
+ -- e.g. ups_types -> { 'timeleft', 'charge', 'percent', 'voltage' }
+ -- e.g. ups_inst['voltage'] -> { 'input', 'battery' }
+
+ local ups_types = graph.tree:data_types( plugin, plugin_instance )
+
+ local ups_inst = {}
+ for _, t in ipairs(ups_types) do
+ ups_inst[t] = graph.tree:data_instances( plugin, plugin_instance, t )
+ end
+
+
+ -- Check if hash table or array is empty or nil-filled
+
+ local function empty( t )
+ for _, v in pairs(t) do
+ if type(v) then return false end
+ end
+ return true
+ end
+
+
+ -- Append graph definition but only types/instances which are
+ -- supported and available to the plugin and UPS.
+
+ local function add_supported( t, defs )
+ local def_inst = defs['data']['instances']
+
+ if type(def_inst) == "table" then
+ for k, v in pairs( def_inst ) do
+ if lu.contains( ups_types, k) then
+ for j = #v, 1, -1 do
+ if not lu.contains( ups_inst[k], v[j] ) then
+ table.remove( v, j )
+ end
+ end
+ if #v == 0 then
+ def_inst[k] = nil -- can't assign v: immutable
+ end
+ else
+ def_inst[k] = nil -- can't assign v: immutable
+ end
+ end
+ if empty(def_inst) then return end
+ end
+ table.insert( t, defs )
+ end
+
+
+ -- Graph definitions for APC UPS measurements MUST use only 'instances':
+ -- e.g. instances = { voltage = { "input", "output" } }
+
+ local voltagesdc = {
+ title = "%H: Voltages on APC UPS - Battery",
+ vlabel = "Volts DC",
+ alt_autoscale = true,
+ number_format = "%5.1lfV",
+ data = {
+ instances = {
+ voltage = { "battery" }
+ },
+ options = {
+ voltage = { title = "Battery voltage", noarea=true }
+ }
+ }
+ }
+ add_supported( rv, voltagesdc )
+
+ local voltagesac = {
+ title = "%H: Voltages on APC UPS - AC",
+ vlabel = "Volts AC",
+ alt_autoscale = true,
+ number_format = "%5.1lfV",
+ data = {
+ instances = {
+ voltage = { "input", "output" }
+ },
+ options = {
+ voltage_output = { color = "00e000", title = "Output voltage", noarea=true, overlay=true },
+ voltage_input = { color = "ffb000", title = "Input voltage", noarea=true, overlay=true }
+ }
+ }
+ }
+ add_supported( rv, voltagesac )
+
+ local percentload = {
+ title = "%H: Load on APC UPS ",
+ vlabel = "Percent",
+ y_min = "0",
+ y_max = "100",
+ number_format = "%5.1lf%%",
+ data = {
+ instances = {
+ percent = { "load" }
+ },
+ options = {
+ percent_load = { color = "00ff00", title = "Load level" }
+ }
+ }
+ }
+ add_supported( rv, percentload )
+
+ local charge_percent = {
+ title = "%H: Battery charge on APC UPS ",
+ vlabel = "Percent",
+ y_min = "0",
+ y_max = "100",
+ number_format = "%5.1lf%%",
+ data = {
+ instances = {
+ charge = { "" }
+ },
+ options = {
+ charge = { color = "00ff0b", title = "Charge level" }
+ }
+ }
+ }
+ add_supported( rv, charge_percent )
+
+ local temperature = {
+ title = "%H: Battery temperature on APC UPS ",
+ vlabel = "\176C",
+ number_format = "%5.1lf\176C",
+ data = {
+ instances = {
+ temperature = { "" }
+ },
+ options = {
+ temperature = { color = "ffb000", title = "Battery temperature" } }
+ }
+ }
+ add_supported( rv, temperature )
+
+ local timeleft = {
+ title = "%H: Time left on APC UPS ",
+ vlabel = "Minutes",
+ number_format = "%.1lfm",
+ data = {
+ instances = {
+ timeleft = { "" }
+ },
+ options = {
+ timeleft = { color = "0000ff", title = "Time left" }
+ }
+ }
+ }
+ add_supported( rv, timeleft )
+
+ local frequency = {
+ title = "%H: Incoming line frequency on APC UPS ",
+ vlabel = "Hz",
+ number_format = "%5.0lfhz",
+ data = {
+ instances = {
+ frequency = { "input" }
+ },
+ options = {
+ frequency_input = { color = "000fff", title = "Line frequency" }
+ }
+ }
+ }
+ add_supported( rv, frequency )
+
+ return rv
+end
diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua
new file mode 100644
index 0000000000..6826e12adb
--- /dev/null
+++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/contextswitch.lua
@@ -0,0 +1,23 @@
+-- Licensed to the public under the Apache License 2.0.
+
+module("luci.statistics.rrdtool.definitions.contextswitch",package.seeall)
+
+function rrdargs( graph, plugin, plugin_instance, dtype )
+
+ return {
+ title = "%H: Context switches",
+ alt_autoscale = true,
+ vlabel = "Switches/s",
+ number_format = "%5.0lf",
+ data = {
+ types = { "contextswitch" },
+ sources = {
+ contextswitch = { "value" }
+ },
+ options = {
+ contextswitch = { color = "0000ff", title = "Context switches", noarea=true, overlay=true }
+ }
+ }
+ }
+end
+
diff --git a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua
index d48441abd2..62d0545973 100644
--- a/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua
+++ b/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua
@@ -5,28 +5,30 @@ module("luci.statistics.rrdtool.definitions.processes", package.seeall)
function rrdargs( graph, plugin, plugin_instance, dtype )
+ if plugin_instance == "" then
return {
- {
title = "%H: Processes",
vlabel = "Processes/s",
data = {
instances = {
ps_state = {
- "sleeping", "running", "paging", "blocked", "stopped", "zombies"
+ "sleeping", "running", "paging",
+ "blocked", "stopped", "zombies"
}
},
options = {
- ps_state_sleeping = { color = "0000ff" },
- ps_state_running = { color = "008000" },
- ps_state_paging = { color = "ffff00" },
- ps_state_blocked = { color = "ff5000" },
- ps_state_stopped = { color = "555555" },
- ps_state_zombies = { color = "ff0000" }
+ ps_state_sleeping = { color = "0000ff", title = "Sleeping" },
+ ps_state_running = { color = "008000", title = "Running" },
+ ps_state_paging = { color = "ffff00", title = "Paging" },
+ ps_state_blocked = { color = "ff5000", title = "Blocked" },
+ ps_state_stopped = { color = "555555", title = "Stopped" },
+ ps_state_zombies = { color = "ff0000", title = "Zombies" }
}
}
- },
-
+ }
+ else
+ return {
{
title = "%H: CPU time used by %pi",
vlabel = "Jiffies",
@@ -38,11 +40,13 @@ function rrdargs( graph, plugin, plugin_instance, dtype )
options = {
ps_cputime__user = {
color = "0000ff",
+ title = "User",
overlay = true
},
ps_cputime__syst = {
color = "ff0000",
+ title = "System",
overlay = true
}
}
@@ -59,15 +63,15 @@ function rrdargs( graph, plugin, plugin_instance, dtype )
},
options = {
- ps_count__threads = { color = "00ff00" },
- ps_count__processes = { color = "0000bb" }
+ ps_count__threads = { color = "00ff00", title = "Threads" },
+ ps_count__processes = { color = "0000bb", title = "Processes" }
}
}
},
{
title = "%H: Page faults in %pi",
- vlabel = "Pagefaults",
+ vlabel = "Page faults",
detail = true,
data = {
sources = {
@@ -75,14 +79,14 @@ function rrdargs( graph, plugin, plugin_instance, dtype )
},
options = {
- ps_pagefaults__minflt = { color = "ff0000" },
- ps_pagefaults__majflt = { color = "ff5500" }
+ ps_pagefaults__minflt = { color = "0000ff", title = "Minor" },
+ ps_pagefaults__majflt = { color = "ff0000", title = "Major" }
}
}
},
{
- title = "%H: Virtual memory size of %pi",
+ title = "%H: Resident segment size (RSS) of %pi",
vlabel = "Bytes",
detail = true,
number_format = "%5.1lf%sB",
@@ -90,9 +94,24 @@ function rrdargs( graph, plugin, plugin_instance, dtype )
types = { "ps_rss" },
options = {
- ps_rss = { color = "0000ff" }
+ ps_rss = { color = "0000ff", title = "Resident segment" }
+ }
+ }
+ },
+
+ {
+ title = "%H: Virtual memory size (VSZ) of %pi",
+ vlabel = "Bytes",
+ detail = true,
+ number_format = "%5.1lf%sB",
+ data = {
+ types = { "ps_vm" },
+
+ options = {
+ ps_vm = { color = "0000ff", title = "Virtual memory" }
}
}
}
}
+ end
end