Code

2a14edd2cec26053f9540ea7c8749182aa5a6bbb
[collectd.git] / src / load.c
1 #include "load.h"
3 #if COLLECT_LOAD
4 #define MODULE_NAME "load"
6 #include "plugin.h"
7 #include "common.h"
9 #ifdef HAVE_SYS_LOADAVG_H
10 #include <sys/loadavg.h>
11 #endif
13 #ifdef HAVE_GETLOADAVG
14 #if !defined(LOADAVG_1MIN) || !defined(LOADAVG_5MIN) || !defined(LOADAVG_15MIN)
15 #define LOADAVG_1MIN  0
16 #define LOADAVG_5MIN  1
17 #define LOADAVG_15MIN 2
18 #endif
19 #endif /* defined(HAVE_GETLOADAVG) */
21 static char *load_file = "load.rrd";
23 static char *ds_def[] =
24 {
25         "DS:shortterm:GAUGE:25:0:100",
26         "DS:midterm:GAUGE:25:0:100",
27         "DS:longterm:GAUGE:25:0:100",
28         NULL
29 };
30 static int ds_num = 3;
32 extern time_t curtime;
34 void load_init (void)
35 {
36         return;
37 }
39 void load_write (char *host, char *inst, char *val)
40 {
41         rrd_update_file (host, load_file, val, ds_def, ds_num);
42 }
44 #define BUFSIZE 256
45 void load_submit (double snum, double mnum, double lnum)
46 {
47         char buf[BUFSIZE];
49         if (snprintf (buf, BUFSIZE, "%u:%.2f:%.2f:%.2f", (unsigned int) curtime,
50                                 snum, mnum, lnum) >= BUFSIZE)
51                 return;
53         plugin_submit (MODULE_NAME, "-", buf);
54 }
55 #undef BUFSIZE
57 void load_read (void)
58 {
59 #if defined(HAVE_GETLOADAVG)
60         double load[3];
62         if (getloadavg (load, 3) == 3)
63                 load_submit (load[LOADAVG_1MIN], load[LOADAVG_5MIN], load[LOADAVG_15MIN]);
64         else
65                 syslog (LOG_WARNING, "load: getloadavg failed: %s", strerror (errno));
66 /* #endif HAVE_GETLOADAVG */
68 #elif defined(KERNEL_LINUX)
69         double snum, mnum, lnum;
70         FILE *loadavg;
71         char buffer[16];
73         char *fields[8];
74         int numfields;
75         
76         if ((loadavg = fopen ("/proc/loadavg", "r")) == NULL)
77         {
78                 syslog (LOG_WARNING, "load: fopen: %s", strerror (errno));
79                 return;
80         }
82         if (fgets (buffer, 16, loadavg) == NULL)
83         {
84                 syslog (LOG_WARNING, "load: fgets: %s", strerror (errno));
85                 return;
86         }
88         if (fclose (loadavg))
89                 syslog (LOG_WARNING, "load: fclose: %s", strerror (errno));
91         numfields = strsplit (buffer, fields, 8);
93         if (numfields < 3)
94                 return;
96         snum = atof (fields[0]);
97         mnum = atof (fields[1]);
98         lnum = atof (fields[2]);
100         load_submit (snum, mnum, lnum);
101 /* #endif KERNEL_LINUX */
103 #elif defined(HAVE_LIBSTATGRAB)
104         double snum, mnum, lnum;
105         sg_load_stats *ls;
107         if ((ls = sg_get_load_stats ()) == NULL)
108                 return;
110         snum = ls->min1;
111         mnum = ls->min5;
112         lnum = ls->min15;
114         load_submit (snum, mnum, lnum);
115 #endif /* HAVE_LIBSTATGRAB */
118 void module_register (void)
120         plugin_register (MODULE_NAME, load_init, load_read, load_write);
123 #undef MODULE_NAME
124 #endif /* COLLECT_LOAD */