mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-12 16:46:35 +00:00
new Module 32_SYSSTAT to monitor system load and disk usage on linux FHEM hosts
git-svn-id: https://svn.fhem.de/fhem/trunk@2656 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d5b8c90ad4
commit
c83e002fda
@ -1,4 +1,6 @@
|
||||
- SVN
|
||||
- feature: new Module 32_SYSSTAT to monitor system load and disk usage
|
||||
on linux FHEM hosts (by justme1968)
|
||||
- feature: new Module 73_PRESENCE to make automatic presence detection of mobile
|
||||
phones or other mobile devices (like tablets) via ping or
|
||||
bluetooth checks (by M. Bloch)
|
||||
|
192
fhem/FHEM/32_SYSSTAT.pm
Normal file
192
fhem/FHEM/32_SYSSTAT.pm
Normal file
@ -0,0 +1,192 @@
|
||||
|
||||
package main;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Sys::Statistics::Linux;
|
||||
|
||||
sub
|
||||
SYSSTAT_Initialize($)
|
||||
{
|
||||
my ($hash) = @_;
|
||||
|
||||
$hash->{DefFn} = "SYSSTAT_Define";
|
||||
$hash->{UndefFn} = "SYSSTAT_Undefine";
|
||||
$hash->{AttrFn} = "SYSSTAT_Attr";
|
||||
$hash->{AttrList} = "filesystems showpercent useregex loglevel:0,1,2,3,4,5,6 ".
|
||||
$readingFnAttributes;
|
||||
}
|
||||
|
||||
#####################################
|
||||
|
||||
sub
|
||||
SYSSTAT_Define($$)
|
||||
{
|
||||
my ($hash, $def) = @_;
|
||||
|
||||
my @a = split("[ \t][ \t]*", $def);
|
||||
|
||||
return "Usage: define <name> SYSSTAT [interval]" if(@a < 2);
|
||||
|
||||
my $interval = 60;
|
||||
if(int(@a)>=3) { $interval = $a[2]; }
|
||||
if( $interval < 60 ) { $interval = 60; }
|
||||
|
||||
$hash->{STATE} = "Initialized";
|
||||
$hash->{INTERVAL} = $interval;
|
||||
|
||||
$hash->{xls} = Sys::Statistics::Linux->new( loadavg => 1 );
|
||||
|
||||
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "SYSSTAT_GetUpdate", $hash, 0);
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub
|
||||
SYSSTAT_Undefine($$)
|
||||
{
|
||||
my ($hash, $arg) = @_;
|
||||
|
||||
RemoveInternalTimer($hash);
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub
|
||||
SYSSTAT_Attr($$$)
|
||||
{
|
||||
my ($cmd, $name, $attrName, $attrVal) = @_;
|
||||
my $hash = $defs{$name};
|
||||
|
||||
$attrVal= "" unless defined($attrVal);
|
||||
$attrVal= "" if($cmd eq "useregex");
|
||||
$attrVal= "" if($cmd eq "showpercent");
|
||||
|
||||
if( $attrName eq "filesystems") {
|
||||
my @filesystems = split(",",$attrVal);
|
||||
@{$hash->{filesystems}} = @filesystems;
|
||||
|
||||
if( $#filesystems >= 0 ) {
|
||||
$hash->{xls}->set( loadavg => 1,
|
||||
diskusage => 1 );
|
||||
} else {
|
||||
$hash->{xls}->set( loadavg => 1,
|
||||
diskusage => 0 );
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sub
|
||||
SYSSTAT_GetUpdate($)
|
||||
{
|
||||
my ($hash) = @_;
|
||||
|
||||
if(!$hash->{LOCAL}) {
|
||||
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "SYSSTAT_GetUpdate", $hash, 1);
|
||||
}
|
||||
|
||||
my $stat = $hash->{xls}->get;
|
||||
|
||||
my $load = $stat->{loadavg};
|
||||
|
||||
$hash->{STATE} = $load->{avg_1} . " " . $load->{avg_5} . " " . $load->{avg_15};
|
||||
|
||||
readingsSingleUpdate($hash,"load",$load->{avg_1},defined($hash->{LOCAL} ? 0 : 1));
|
||||
|
||||
if( defined(my $usage = $stat->{diskusage}) ){
|
||||
|
||||
my $type = 'free';
|
||||
if( AttrVal($hash->{NAME}, "showpercent", "") ne "" ) {
|
||||
$type = 'usageper';
|
||||
}
|
||||
|
||||
if( AttrVal($hash->{NAME}, "useregex", "") eq "" ) {
|
||||
for my $filesystem (@{$hash->{filesystems}}) {
|
||||
my $fs = $usage->{$filesystem};
|
||||
readingsSingleUpdate($hash,$fs->{mountpoint},$fs->{$type},defined($hash->{LOCAL} ? 0 : 1));
|
||||
}
|
||||
} else {
|
||||
for my $filesystem (@{$hash->{filesystems}}) {
|
||||
foreach my $key (keys %$usage) {
|
||||
if( $key =~ /$filesystem/ ) {
|
||||
my $fs = $usage->{$key};
|
||||
readingsSingleUpdate($hash,$fs->{mountpoint},$fs->{$type},defined($hash->{LOCAL} ? 0 : 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
=begin html
|
||||
|
||||
<a name="SYSSTAT"></a>
|
||||
<h3>SYSSTAT</h3>
|
||||
<ul>
|
||||
Provides system statistics for the host FHEM runs on.<br><br>
|
||||
|
||||
Notes:
|
||||
<ul>
|
||||
<li>currently only Linux is supported.</li>
|
||||
<li>This module needs <code>Sys::Statistics::Linux</code> on Linux.<br>
|
||||
It can be installed with '<code>cpan install Sys::Statistics::Linux</code>'<br>
|
||||
or on debian with '<code>apt-get install libsys-statistics-linux-perl</code>'</li>
|
||||
<li>To plot the load values the following code can be used:
|
||||
<PRE>
|
||||
define sysstatlog FileLog /usr/local/FHEM/var/log/sysstat-%Y-%m.log sysstat
|
||||
attr sysstatlog nrarchive 1
|
||||
define wl_sysstat weblink fileplot sysstatlog:sysstat:CURRENT
|
||||
attr wl_sysstat label "Load Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}"
|
||||
attr wl_sysstat room System
|
||||
</PRE></li>
|
||||
</ul>
|
||||
|
||||
<a name="SYSSTAT_Define"></a>
|
||||
<b>Define</b>
|
||||
<ul>
|
||||
<code>define <name> SYSSTAT [<interval>]</code><br>
|
||||
<br>
|
||||
|
||||
Defines a SYSSTAT device.<br><br>
|
||||
|
||||
The statistics are updated <interval> seconds. The default is 60.<br><br>
|
||||
|
||||
Examples:
|
||||
<ul>
|
||||
<code>define sysstat SYSSTAT</code><br>
|
||||
<code>define sysstat SYSSTAT 30</code><br>
|
||||
</ul>
|
||||
</ul><br>
|
||||
|
||||
<a name="SYSSTAT_Readings"></a>
|
||||
<b>Readings</b>
|
||||
<ul>
|
||||
<li>load<br>
|
||||
the 1 minute load average</li>
|
||||
<li>state<br>
|
||||
the 1, 5 and 15 minute load averages</li>
|
||||
<li><mountpoint><br>
|
||||
free bytes for <mountpoint></li>
|
||||
</ul><br>
|
||||
|
||||
<a name="SYSSTAT_Attr"></a>
|
||||
<b>Attributes</b>
|
||||
<li>filesystems<br>
|
||||
List of comma separated filesystems that should be monitored.<br>
|
||||
Examples:
|
||||
<ul>
|
||||
<code>attr sysstat filesystems /dev/md0,/dev/md2</code><br>
|
||||
<code>attr sysstat filesystems /dev/.*</code><br>
|
||||
</ul></lu>
|
||||
<li>showpercent<br>
|
||||
If set the usage is shown in percent. If not set the remaining free space in bytes is shown.</li>
|
||||
<li>useregex<br>
|
||||
If set the entries of the filesystems list are treated as regex.</li>
|
||||
</ul>
|
||||
|
||||
=end html
|
||||
=cut
|
24
fhem/www/gplot/sysstat.gplot
Normal file
24
fhem/www/gplot/sysstat.gplot
Normal file
@ -0,0 +1,24 @@
|
||||
############################
|
||||
# Display the system load values
|
||||
#
|
||||
# Corresponding FileLog definition:
|
||||
# define sysstatlog FileLog /usr/local/FHEM/var/log/sysstat-%Y-%m.log sysstat
|
||||
# attr sysstatlog nrarchive 1
|
||||
#
|
||||
# Corresponding FileLog definition:
|
||||
# define wl_sysstat weblink fileplot sysstatlog:sysstat:CURRENT
|
||||
# attr wl_sysstat label "Load Min: $data{min1}, Max: $data{max1}, Aktuell: $data{currval1}"
|
||||
# attr wl_sysstat room System
|
||||
|
||||
set terminal png transparent size <SIZE> crop
|
||||
set output '<OUT>.png'
|
||||
set xdata time
|
||||
set timefmt "%Y-%m-%d_%H:%M:%S"
|
||||
set xlabel " "
|
||||
set title '<L1>'
|
||||
|
||||
set ylabel "Load"
|
||||
|
||||
#FileLog 4:load:0:
|
||||
|
||||
plot "< awk '/load:/ {print $1, $4}' <IN>" using 1:2 ls l0 axes x1y1 title 'Load' with lines
|
Loading…
x
Reference in New Issue
Block a user