2a14edd2cec26053f9540ea7c8749182aa5a6bbb
[collectd.git] / src / load.c
1 #include "load.h"
2
3 #if COLLECT_LOAD
4 #define MODULE_NAME "load"
5
6 #include "plugin.h"
7 #include "common.h"
8
9 #ifdef HAVE_SYS_LOADAVG_H
10 #include <sys/loadavg.h>
11 #endif
12
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) */
20
21 static char *load_file = "load.rrd";
22
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;
31
32 extern time_t curtime;
33
34 void load_init (void)
35 {
36         return;
37 }
38
39 void load_write (char *host, char *inst, char *val)
40 {
41         rrd_update_file (host, load_file, val, ds_def, ds_num);
42 }
43
44 #define BUFSIZE 256
45 void load_submit (double snum, double mnum, double lnum)
46 {
47         char buf[BUFSIZE];
48
49         if (snprintf (buf, BUFSIZE, "%u:%.2f:%.2f:%.2f", (unsigned int) curtime,
50                                 snum, mnum, lnum) >= BUFSIZE)
51                 return;
52
53         plugin_submit (MODULE_NAME, "-", buf);
54 }
55 #undef BUFSIZE
56
57 void load_read (void)
58 {
59 #if defined(HAVE_GETLOADAVG)
60         double load[3];
61
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 */
67
68 #elif defined(KERNEL_LINUX)
69         double snum, mnum, lnum;
70         FILE *loadavg;
71         char buffer[16];
72
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         }
81
82         if (fgets (buffer, 16, loadavg) == NULL)
83         {
84                 syslog (LOG_WARNING, "load: fgets: %s", strerror (errno));
85                 return;
86         }
87
88         if (fclose (loadavg))
89                 syslog (LOG_WARNING, "load: fclose: %s", strerror (errno));
90
91         numfields = strsplit (buffer, fields, 8);
92
93         if (numfields < 3)
94                 return;
95
96         snum = atof (fields[0]);
97         mnum = atof (fields[1]);
98         lnum = atof (fields[2]);
99
100         load_submit (snum, mnum, lnum);
101 /* #endif KERNEL_LINUX */
102
103 #elif defined(HAVE_LIBSTATGRAB)
104         double snum, mnum, lnum;
105         sg_load_stats *ls;
106
107         if ((ls = sg_get_load_stats ()) == NULL)
108                 return;
109
110         snum = ls->min1;
111         mnum = ls->min5;
112         lnum = ls->min15;
113
114         load_submit (snum, mnum, lnum);
115 #endif /* HAVE_LIBSTATGRAB */
116 }
117
118 void module_register (void)
119 {
120         plugin_register (MODULE_NAME, load_init, load_read, load_write);
121 }
122
123 #undef MODULE_NAME
124 #endif /* COLLECT_LOAD */