10 #include "built_in_parsers.h"
12 #define STATFILE "/proc/stat"
14 static int cpu_parser(char *data, const char **p, void **state)
18 FILE *file = fopen(STATFILE, "r");
19 long long user, nice, sys, idle, wait, irq, softirq;
22 pr_err("Failed to open file %s\n", STATFILE);
26 if (!fgets(buf, sizeof(buf), file)) {
27 pr_err("Failed to read file %s\n", STATFILE);
32 user = dec_to_longlong(str, &str);
33 nice = dec_to_longlong(str, &str);
34 sys = dec_to_longlong(str, &str);
35 idle = dec_to_longlong(str, &str);
36 wait = dec_to_longlong(str, &str);
37 irq = dec_to_longlong(str, &str);
38 softirq = dec_to_longlong(str, &str);
40 snprintf(data, RRD_DATA_MAX_LEN, "%lld:%lld:%lld:%lld:%lld:%lld:%lld",
41 user, nice, sys, idle, wait, irq, softirq);
47 #define MEMFILE "/proc/meminfo"
49 static int mem_parser(char *data, const char **p, void **state)
51 char buf[1024], word[1024];
52 int free = 0, buffered = 0, cache = 0, active = 0, inactive = 0,
53 swapfree = 0, anon = 0, slab = 0, tables = 0, other = 0,
54 swaptotal = 0, total = 0;
55 FILE *file = fopen(MEMFILE, "r");
58 pr_err("Failed to open file %s\n", MEMFILE);
62 while (fgets(buf, sizeof(buf), file)) {
63 get_word(buf, 0, word, sizeof(word));
65 if (!strcmp(word, "MemFree:")) {
66 free = dec_to_int(buf, NULL);
67 } else if (!strcmp(word, "MemTotal:")) {
68 total = dec_to_int(buf, NULL);
69 } else if (!strcmp(word, "Buffers:")) {
70 buffered = dec_to_int(buf, NULL);
71 } else if (!strcmp(word, "Cached:")) {
72 cache = dec_to_int(buf, NULL);
73 } else if (!strcmp(word, "Active:")) {
74 active = dec_to_int(buf, NULL);
75 } else if (!strcmp(word, "Inactive:")) {
76 inactive = dec_to_int(buf, NULL);
77 } else if (!strcmp(word, "SwapFree:")) {
78 swapfree = dec_to_int(buf, NULL);
79 } else if (!strcmp(word, "AnonPages:")) {
80 anon = dec_to_int(buf, NULL);
81 } else if (!strcmp(word, "Slab:")) {
82 slab = dec_to_int(buf, NULL);
83 } else if (!strcmp(word, "PageTables:")) {
84 tables = dec_to_int(buf, NULL);
85 } else if (!strcmp(word, "SwapTotal:")) {
86 swaptotal = dec_to_int(buf, NULL);
91 other = total - free - buffered - cache - anon - slab - tables;
93 snprintf(data, RRD_DATA_MAX_LEN, "%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f",
104 (swaptotal - swapfree) / 1024.0);
109 int cpu_mem_parser(char *data, const char **p, void **state)
111 char cpu[RRD_DATA_MAX_LEN], mem[RRD_DATA_MAX_LEN];
113 cpu_parser(cpu, p, state);
114 mem_parser(mem, p, state);
115 snprintf(data, RRD_DATA_MAX_LEN, "%s:%s", cpu, mem);
120 /* Run a command and feed the output from stdout directly to rrdtool */
121 static int script_parser(char *rrd_data, const char **parser_data, void **state)
125 void *tmp = parser_data;
128 pid = run_piped_stream(cmd[0], &cmd[1], NULL, &readf, NULL);
129 ret = fread(rrd_data, 1, RRD_DATA_MAX_LEN - 1, readf);
131 pr_err("Error on read: %m\n");
136 pr_info("Read %d bytes :%s\n", ret, rrd_data);
148 long long rx_packets;
150 long long tx_packets;
153 #define PROC_NETDEV "/proc/net/dev"
155 static int get_iface_stats(const char *iface, struct iface_stats *stat)
163 netdev = fopen(PROC_NETDEV, "r");
165 if (netdev == NULL) {
167 pr_err("Failed to open file %s: %d (%m)\n",
172 while (fgets(buf, sizeof(buf), netdev)) {
173 get_word(buf, &str, if_name, sizeof(if_name));
175 /* Remove the ':' at the end of the if_name */
176 if_name[strlen(if_name) - 1] = 0;
177 if (strncmp(iface, if_name, sizeof(if_name)))
180 stat->rx_bytes = dec_to_longlong(str, &str);
181 stat->rx_packets = dec_to_longlong(str, &str);
182 /* errs */ dec_to_longlong(str, &str);
183 /* drop */ dec_to_longlong(str, &str);
184 /* fifo */ dec_to_longlong(str, &str);
185 /* frame */ dec_to_longlong(str, &str);
186 /* compressed */ dec_to_longlong(str, &str);
187 /* multicast */ dec_to_longlong(str, &str);
188 stat->tx_bytes = dec_to_longlong(str, &str);
189 stat->tx_packets = dec_to_longlong(str, &str);
191 pr_info("rx_b %lld rx_p %lld tx_b %lld tx_p %lld\n",
192 stat->rx_bytes, stat->rx_packets,
193 stat->tx_bytes, stat->tx_packets);
200 pr_err("Interface %s not found\n", iface);
204 int netstats_parser(char *rrd_data, const char **parser_data, void **state)
206 struct iface_stats stat;
207 const char **iface_name = parser_data;
208 int max_str = RRD_DATA_MAX_LEN;
212 pr_err("No device names specified\n");
217 pr_info("getting data for iface %s\n", *iface_name);
218 ret = get_iface_stats(*iface_name, &stat);
221 ret = snprintf(rrd_data, max_str, "%lld:%lld:%lld:%lld",
222 stat.rx_bytes, stat.rx_packets,
223 stat.tx_bytes, stat.tx_packets);
225 ret = snprintf(rrd_data, max_str, "U:U:U:U");
235 ret = snprintf(rrd_data, max_str, ":");
243 static struct parser_info built_in_parsers[] = {
254 .parse = cpu_mem_parser,
258 .parse = script_parser,
262 .parse = netstats_parser,
266 int register_built_in_parsers(void)
270 for (i = 0; i < ARRAY_SIZE(built_in_parsers); i++) {
271 ret = register_parser(&built_in_parsers[i]);