Update to support logging of the load average to the round-robin

database.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@1474 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Merlin Hughes committed 2002-07-31 14:20:29 +00:00
1 parent 24d3dbac9c
commit 0434eba357
4 files changed
+74 -26

No files matched your search

+10 -3
View File
@@ -43,6 +43,7 @@ int syslogFacility = LOG_LOCAL4;
int doScan = 0;
int doSet = 0;
int doCGI = 0;
int doLoad = 0;
int debug = 0;
sensors_chip_name chipNames[MAX_CHIP_NAMES];
int numChipNames = 0;
@@ -102,6 +103,7 @@ static const char *daemonSyntax =
" -p, --pid-file <file> -- PID file (default /var/run/sensord.pid)\n"
" -f, --syslog-facility <f> -- syslog facility to use (default local4)\n"
" -g, --rrd-cgi <img-dir> -- output an RRD CGI script and exit\n"
" -a, --load-average -- include load average in RRD file\n"
" -d, --debug -- display some debug information\n"
" -v, --version -- display version and exit\n"
" -h, --help -- display help and exit\n"
@@ -116,7 +118,8 @@ static const char *daemonSyntax =
"\n"
"If unspecified, no RRD (round robin database) is used. If specified and the\n"
"file does not exist, it will be created. For RRD updates to be successful,\n"
"the RRD file configuration must EXACTLY match the sensors that are used.\n";
"the RRD file configuration must EXACTLY match the sensors that are used. If\n"
"your configuration changes, delete the old RRD file and restart sensord.\n";
static const char *appSyntax =
" -a, --alarm-scan -- only scan for alarms\n"
@@ -132,7 +135,7 @@ static const char *appSyntax =
"\n"
"If no chips are specified, all chip info will be printed.\n";
static const char *daemonShortOptions = "i:l:t:f:r:c:p:dvhg:";
static const char *daemonShortOptions = "i:l:t:f:r:c:p:advhg:";
static const struct option daemonLongOptions[] = {
{ "interval", required_argument, NULL, 'i' },
@@ -143,6 +146,7 @@ static const struct option daemonLongOptions[] = {
{ "config-file", required_argument, NULL, 'c' },
{ "pid-file", required_argument, NULL, 'p' },
{ "rrd-cgi", required_argument, NULL, 'g' },
{ "load-average", no_argument, NULL, 'a' },
{ "debug", no_argument, NULL, 'd' },
{ "version", no_argument, NULL, 'v' },
{ "help", no_argument, NULL, 'h' },
@@ -192,7 +196,10 @@ parseArgs
return -1;
break;
case 'a':
doScan = 1;
if (isDaemon)
doLoad = 1;
else
doScan = 1;
break;
case 's':
doSet = 1;
+45 -15
View File
@@ -63,9 +63,12 @@
#define RRD_BUFF 64
char rrdBuff[MAX_RRD_SENSORS * RRD_BUFF + 1];
char rrdLabels[MAX_RRD_SENSORS][RAW_LABEL_LENGTH + 1];
static char rrdLabels[MAX_RRD_SENSORS][RAW_LABEL_LENGTH + 1];
typedef int (*FeatureFN) (void *data, const char *rawLabel, char *label, const FeatureDescriptor *feature);
#define LOADAVG "loadavg"
#define LOAD_AVERAGE "Load Average * 10"
typedef int (*FeatureFN) (void *data, const char *rawLabel, const char *label, const FeatureDescriptor *feature);
static char
rrdNextChar
@@ -186,8 +189,8 @@ struct ds {
static int
rrdGetSensors_DS
(void *_data, const char *rawLabel, char *label, const FeatureDescriptor *feature) {
if (feature->rrd) {
(void *_data, const char *rawLabel, const char *label, const FeatureDescriptor *feature) {
if (!feature || feature->rrd) {
struct ds *data = (struct ds *) _data;
char *ptr = rrdBuff + data->num * RRD_BUFF;
data->argv[data->num ++] = ptr;
@@ -202,6 +205,8 @@ rrdGetSensors
int ret = 0;
struct ds data = { 0, argv};
ret = applyToFeatures (rrdGetSensors_DS, &data);
if (!ret && doLoad)
ret = rrdGetSensors_DS (&data, LOADAVG, LOAD_AVERAGE, NULL);
return ret ? -1 : data.num;
}
@@ -262,22 +267,23 @@ struct gr {
char *axisTitle;
char *axisDefn;
char *options;
int loadAvg;
};
static int
rrdCGI_DEF
(void *_data, const char *rawLabel, char *label, const FeatureDescriptor *feature) {
(void *_data, const char *rawLabel, const char *label, const FeatureDescriptor *feature) {
struct gr *data = (struct gr *) _data;
if (feature->rrd && (feature->type == data->type))
if (!feature || (feature->rrd && (feature->type == data->type)))
printf ("\n\tDEF:%s=%s:%s:AVERAGE", rawLabel, rrdFile, rawLabel);
return 0;
}
static int
rrdCGI_LINE
(void *_data, const char *rawLabel, char *label, const FeatureDescriptor *feature) {
(void *_data, const char *rawLabel, const char *label, const FeatureDescriptor *feature) {
struct gr *data = (struct gr *) _data;
if (feature->rrd && (feature->type == data->type))
if (!feature || (feature->rrd && (feature->type == data->type)))
printf ("\n\tLINE2:%s#%.6x:\"%s\"", rawLabel, random () & 0xffffff, label);
return 0;
}
@@ -290,7 +296,8 @@ static struct gr graphs[] = {
"Temperature",
"Temperature (C)",
"HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00",
"-s -1d -l 0"
"-s -1d -l 0",
1
}, {
DataType_rpm,
"Daily Fan Speed Summary",
@@ -298,7 +305,8 @@ static struct gr graphs[] = {
"Fan Speed",
"Speed (RPM)",
"HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00",
"-s -1d -l 0"
"-s -1d -l 0",
0
}, {
DataType_voltage,
"Daily Voltage Summary",
@@ -306,7 +314,8 @@ static struct gr graphs[] = {
"Power Supply",
"Voltage (V)",
"HOUR:1:HOUR:3:HOUR:3:0:%b %d %H:00",
"-s -1d --alt-autoscale"
"-s -1d --alt-autoscale",
0
}, {
DataType_temperature,
"Weekly Temperature Summary",
@@ -314,7 +323,8 @@ static struct gr graphs[] = {
"Temperature",
"Temperature (C)",
"HOUR:6:DAY:1:DAY:1:86400:%a %b %d",
"-s -1w -l 0"
"-s -1w -l 0",
1
}, {
DataType_rpm,
"Weekly Fan Speed Summary",
@@ -322,7 +332,8 @@ static struct gr graphs[] = {
"Fan Speed",
"Speed (RPM)",
"HOUR:6:DAY:1:DAY:1:86400:%a %b %d",
"-s -1w -l 0"
"-s -1w -l 0",
0
}, {
DataType_voltage,
"Weekly Voltage Summary",
@@ -330,7 +341,8 @@ static struct gr graphs[] = {
"Power Supply",
"Voltage (V)",
"HOUR:6:DAY:1:DAY:1:86400:%a %b %d",
"-s -1w --alt-autoscale"
"-s -1w --alt-autoscale",
0
}, {
DataType_other
}
@@ -340,7 +352,21 @@ int
rrdUpdate
(void) {
int ret = rrdChips ();
if (!ret && doLoad) {
FILE *loadavg;
if (!(loadavg = fopen ("/proc/loadavg", "r"))) {
sensorLog (LOG_ERR, "Error opening `/proc/loadavg': %s", strerror (errno));
ret = 1;
} else {
float value;
if (fscanf (loadavg, "%f", &value) != 1) {
sensorLog (LOG_ERR, "Error reading load average");
ret = 2;
} else {
sprintf (rrdBuff + strlen (rrdBuff), ":%f", value * 10.0);
}
}
}
if (!ret) {
const char *argv[] = {
"sensord", rrdFile, rrdBuff, NULL
@@ -371,8 +397,12 @@ rrdCGI
printf ("\t--lazy\n\t-v '%s'\n\t-t '%s'\n\t-x '%s'\n\t%s", graph->axisTitle, graph->title, graph->axisDefn, graph->options);
if (!ret)
ret = applyToFeatures (rrdCGI_DEF, graph);
if (!ret && doLoad && graph->loadAvg)
ret = rrdCGI_DEF (graph, LOADAVG, LOAD_AVERAGE, NULL);
if (!ret)
ret = applyToFeatures (rrdCGI_LINE, graph);
if (!ret && doLoad && graph->loadAvg)
ret = rrdCGI_LINE (graph, LOADAVG, LOAD_AVERAGE, NULL);
printf (">\n</P>\n");
++ graph;
}
+17 -7
View File
@@ -21,7 +21,7 @@
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\"
.TH sensord 8 "April 27, 2002" "Version 0.6.0" "Linux System Administration"
.TH sensord 8 "July 31, 2002" "Version 0.6.2" "Linux System Administration"
.SH NAME
sensord \- Sensor information logging daemon.
.SH SYNOPSIS
@@ -115,6 +115,9 @@ this will be accessed under the `/sensord/' directory on the Webserver. See
the section
.B ROUND ROBIN DATABASES
below for more details.
.IP "-a, --load-average"
Include the load average (multiplied by 10) in the RRD database. You should
also specify this flag when you create the CGI script.
.IP "-d, --debug"
Prints a small amount of additional debugging information.
.IP "-h, --help"
@@ -277,7 +280,9 @@ names and order of sensors read by
.BR sensord (8).
It is recommended that you create the default database and then use
.BR rrdinfo (1)
to obtain this information.
to obtain this information, and/or
.BR rrdtune (1)
to change it.
After creating the round-robin database, you must then configure
your Web server to display the sensor information. This assumes that
@@ -296,14 +301,17 @@ An example of how to set up Web-accessible graphs of recent sensor readings
follows:
.IP
.nf
sensord -i 0 -r /var/log/sensord.rrd
sensord --log-interval 0 \\
--load-average \\
--rrd-cgi /var/log/sensord.rrd
.fi
.PP
Here, we start
.BR sensord (8)
and configure it to store readings in a round-robin database; note
that we disable logging of sensor readings to
.BR syslog (3).
.BR syslog (3),
and enable logging of the load average.
.IP
.nf
mkdir /var/www/sensord
@@ -317,7 +325,8 @@ directory appropriately. You will have to determine the location and
ownership that is appropriate for your machine.
.IP
.nf
sensord --rrd-file /var/log/sensord.rrd \\
sensord --load-average \\
--rrd-file /var/log/sensord.rrd \\
--rrd-cgi /var/www/sensord \\
> /usr/lib/cgi-bin/sensord.cgi
chmod a+rx /usr/lib/cgi-bin/sensord.cgi
@@ -325,8 +334,9 @@ chmod a+rx /usr/lib/cgi-bin/sensord.cgi
.PP
Here, we create
a CGI script that will display sensor readings from the database.
You must specify the location of the round-robin database and the
location of the directory where the images should be stored. The
You must specify the location of the round-robin database, the
location of the directory where the images should be stored,
and whether you want the load average displayed. The
.BR --rrd-cgi
command-line parameter causes
.BR sensord (8)
+2 -1
View File
@@ -20,7 +20,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define version "0.6.0"
#define version "0.6.2"
#include "lib/sensors.h"
@@ -40,6 +40,7 @@ extern int syslogFacility;
extern int doScan;
extern int doSet;
extern int doCGI;
extern int doLoad;
extern int debug;
extern sensors_chip_name chipNames[];
extern int numChipNames;