]> granicus.if.org Git - sysstat/blob - activity.c
SVG: Add SVG output for task creation and system switching activity.
[sysstat] / activity.c
1 /*
2  * activity.c: Define system activities available for sar/sadc.
3  * (C) 1999-2016 by Sebastien GODARD (sysstat <at> orange.fr)
4  *
5  ***************************************************************************
6  * This program is free software; you can redistribute it and/or modify it *
7  * under the terms of the GNU General Public License as published  by  the *
8  * Free Software Foundation; either version 2 of the License, or (at  your *
9  * option) any later version.                                              *
10  *                                                                         *
11  * This program is distributed in the hope that it  will  be  useful,  but *
12  * WITHOUT ANY WARRANTY; without the implied warranty  of  MERCHANTABILITY *
13  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
14  * for more details.                                                       *
15  *                                                                         *
16  * You should have received a copy of the GNU General Public License along *
17  * with this program; if not, write to the Free Software Foundation, Inc., *
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA              *
19  ***************************************************************************
20  */
21
22 #include "sa.h"
23
24 #ifdef SOURCE_SADC
25 #include "rd_stats.h"
26 #include "rd_sensors.h"
27 #endif
28
29 #ifdef SOURCE_SAR
30 #include "pr_stats.h"
31 #endif
32
33 #ifdef SOURCE_SADF
34 #include "rndr_stats.h"
35 #include "xml_stats.h"
36 #include "json_stats.h"
37 #include "svg_stats.h"
38 #endif
39
40 /*
41  ***************************************************************************
42  * Definitions of system activities.
43  * See sa.h file for activity structure definition.
44  * Activity structure doesn't matter for daily data files.
45  ***************************************************************************
46  */
47
48 /*
49  * Bitmaps needed by activities.
50  * Remember to allocate them before use!
51  */
52
53 /* CPU bitmap */
54 struct act_bitmap cpu_bitmap = {
55         .b_array        = NULL,
56         .b_size         = NR_CPUS
57 };
58
59 /* Interrupts bitmap */
60 struct act_bitmap irq_bitmap = {
61         .b_array        = NULL,
62         .b_size         = NR_IRQS
63 };
64
65
66 /*
67  * CPU statistics.
68  * This is the only activity which *must* be collected by sadc
69  * so that uptime can be filled.
70  */
71 struct activity cpu_act = {
72         .id             = A_CPU,
73         .options        = AO_COLLECTED + AO_VOLATILE + AO_GLOBAL_ITV + AO_MULTIPLE_OUTPUTS,
74         .magic          = ACTIVITY_MAGIC_BASE,
75         .group          = G_DEFAULT,
76 #ifdef SOURCE_SADC
77         .f_count_index  = 0,    /* wrap_get_cpu_nr() */
78         .f_count2       = NULL,
79         .f_read         = wrap_read_stat_cpu,
80 #endif
81 #ifdef SOURCE_SAR
82         .f_print        = print_cpu_stats,
83         .f_print_avg    = print_cpu_stats,
84 #endif
85 #ifdef SOURCE_SADF
86         .f_render       = render_cpu_stats,
87         .f_xml_print    = xml_print_cpu_stats,
88         .f_json_print   = json_print_cpu_stats,
89         .hdr_line       = "CPU;%user;%nice;%system;%iowait;%steal;%idle|"
90                           "CPU;%usr;%nice;%sys;%iowait;%steal;%irq;%soft;%guest;%gnice;%idle",
91         .name           = "A_CPU",
92         .g_nr           = 0,
93 #endif
94         .nr             = -1,
95         .nr2            = 1,
96         .nr_max         = NR_CPUS + 1,
97         .fsize          = STATS_CPU_SIZE,
98         .msize          = STATS_CPU_SIZE,
99         .opt_flags      = AO_F_CPU_DEF,
100         .buf            = {NULL, NULL, NULL},
101         .bitmap         = &cpu_bitmap
102 };
103
104 /* Process (task) creation and context switch activity */
105 struct activity pcsw_act = {
106         .id             = A_PCSW,
107         .options        = AO_COLLECTED,
108         .magic          = ACTIVITY_MAGIC_BASE,
109         .group          = G_DEFAULT,
110 #ifdef SOURCE_SADC
111         .f_count_index  = -1,
112         .f_count2       = NULL,
113         .f_read         = wrap_read_stat_pcsw,
114 #endif
115 #ifdef SOURCE_SAR
116         .f_print        = print_pcsw_stats,
117         .f_print_avg    = print_pcsw_stats,
118 #endif
119 #ifdef SOURCE_SADF
120         .f_render       = render_pcsw_stats,
121         .f_xml_print    = xml_print_pcsw_stats,
122         .f_json_print   = json_print_pcsw_stats,
123         .f_svg_print    = svg_print_pcsw_stats,
124         .hdr_line       = "proc/s;cswch/s",
125         .name           = "A_PCSW",
126         .g_nr           = 2,
127 #endif
128         .nr             = 1,
129         .nr2            = 1,
130         .nr_max         = 1,
131         .fsize          = STATS_PCSW_SIZE,
132         .msize          = STATS_PCSW_SIZE,
133         .opt_flags      = 0,
134         .buf            = {NULL, NULL, NULL},
135         .bitmap         = NULL
136 };
137
138 /* Interrupts statistics */
139 struct activity irq_act = {
140         .id             = A_IRQ,
141         .options        = AO_NULL,
142         .magic          = ACTIVITY_MAGIC_BASE,
143         .group          = G_INT,
144 #ifdef SOURCE_SADC
145         .f_count_index  = 1,    /* wrap_get_irq_nr() */
146         .f_count2       = NULL,
147         .f_read         = wrap_read_stat_irq,
148 #endif
149 #ifdef SOURCE_SAR
150         .f_print        = print_irq_stats,
151         .f_print_avg    = print_irq_stats,
152 #endif
153 #ifdef SOURCE_SADF
154         .f_render       = render_irq_stats,
155         .f_xml_print    = xml_print_irq_stats,
156         .f_json_print   = json_print_irq_stats,
157         .hdr_line       = "INTR;intr/s",
158         .name           = "A_IRQ",
159         .g_nr           = 0,
160 #endif
161         .nr             = -1,
162         .nr2            = 1,
163         .nr_max         = NR_IRQS + 1,
164         .fsize          = STATS_IRQ_SIZE,
165         .msize          = STATS_IRQ_SIZE,
166         .opt_flags      = 0,
167         .buf            = {NULL, NULL, NULL},
168         .bitmap         = &irq_bitmap
169 };
170
171 /* Swapping activity */
172 struct activity swap_act = {
173         .id             = A_SWAP,
174         .options        = AO_COLLECTED,
175         .magic          = ACTIVITY_MAGIC_BASE,
176         .group          = G_DEFAULT,
177 #ifdef SOURCE_SADC
178         .f_count_index  = -1,
179         .f_count2       = NULL,
180         .f_read         = wrap_read_swap,
181 #endif
182 #ifdef SOURCE_SAR
183         .f_print        = print_swap_stats,
184         .f_print_avg    = print_swap_stats,
185 #endif
186 #ifdef SOURCE_SADF
187         .f_render       = render_swap_stats,
188         .f_xml_print    = xml_print_swap_stats,
189         .f_json_print   = json_print_swap_stats,
190         .hdr_line       = "pswpin/s;pswpout/s",
191         .name           = "A_SWAP",
192         .g_nr           = 0,
193 #endif
194         .nr             = 1,
195         .nr2            = 1,
196         .nr_max         = 1,
197         .fsize          = STATS_SWAP_SIZE,
198         .msize          = STATS_SWAP_SIZE,
199         .opt_flags      = 0,
200         .buf            = {NULL, NULL, NULL},
201         .bitmap         = NULL
202 };
203
204 /* Paging activity */
205 struct activity paging_act = {
206         .id             = A_PAGE,
207         .options        = AO_COLLECTED,
208         .magic          = ACTIVITY_MAGIC_BASE,
209         .group          = G_DEFAULT,
210 #ifdef SOURCE_SADC
211         .f_count_index  = -1,
212         .f_count2       = NULL,
213         .f_read         = wrap_read_paging,
214 #endif
215 #ifdef SOURCE_SAR
216         .f_print        = print_paging_stats,
217         .f_print_avg    = print_paging_stats,
218 #endif
219 #ifdef SOURCE_SADF
220         .f_render       = render_paging_stats,
221         .f_xml_print    = xml_print_paging_stats,
222         .f_json_print   = json_print_paging_stats,
223         .hdr_line       = "pgpgin/s;pgpgout/s;fault/s;majflt/s;"
224                           "pgfree/s;pgscank/s;pgscand/s;pgsteal/s;%vmeff",
225         .name           = "A_PAGE",
226         .g_nr           = 0,
227 #endif
228         .nr             = 1,
229         .nr2            = 1,
230         .nr_max         = 1,
231         .fsize          = STATS_PAGING_SIZE,
232         .msize          = STATS_PAGING_SIZE,
233         .opt_flags      = 0,
234         .buf            = {NULL, NULL, NULL},
235         .bitmap         = NULL
236 };
237
238 /* I/O and transfer rate activity */
239 struct activity io_act = {
240         .id             = A_IO,
241         .options        = AO_COLLECTED,
242         .magic          = ACTIVITY_MAGIC_BASE + 1,
243         .group          = G_DEFAULT,
244 #ifdef SOURCE_SADC
245         .f_count_index  = -1,
246         .f_count2       = NULL,
247         .f_read         = wrap_read_io,
248 #endif
249 #ifdef SOURCE_SAR
250         .f_print        = print_io_stats,
251         .f_print_avg    = print_io_stats,
252 #endif
253 #ifdef SOURCE_SADF
254         .f_render       = render_io_stats,
255         .f_xml_print    = xml_print_io_stats,
256         .f_json_print   = json_print_io_stats,
257         .hdr_line       = "tps;rtps;wtps;bread/s;bwrtn/s",
258         .name           = "A_IO",
259         .g_nr           = 0,
260 #endif
261         .nr             = 1,
262         .nr2            = 1,
263         .nr_max         = 1,
264         .fsize          = STATS_IO_SIZE,
265         .msize          = STATS_IO_SIZE,
266         .opt_flags      = 0,
267         .buf            = {NULL, NULL, NULL},
268         .bitmap         = NULL
269 };
270
271 /* Memory and swap space utilization activity */
272 struct activity memory_act = {
273         .id             = A_MEMORY,
274         .options        = AO_COLLECTED + AO_MULTIPLE_OUTPUTS,
275         .magic          = ACTIVITY_MAGIC_BASE,
276         .group          = G_DEFAULT,
277 #ifdef SOURCE_SADC
278         .f_count_index  = -1,
279         .f_count2       = NULL,
280         .f_read         = wrap_read_meminfo,
281 #endif
282 #ifdef SOURCE_SAR
283         .f_print        = print_memory_stats,
284         .f_print_avg    = print_avg_memory_stats,
285 #endif
286 #ifdef SOURCE_SADF
287         .f_render       = render_memory_stats,
288         .f_xml_print    = xml_print_memory_stats,
289         .f_json_print   = json_print_memory_stats,
290         .hdr_line       = "frmpg/s;bufpg/s;campg/s|"
291                           "kbmemfree;kbmemused;%memused;kbbuffers;kbcached;kbcommit;%commit;kbactive;kbinact;kbdirty&kbanonpg;kbslab;kbkstack;kbpgtbl;kbvmused|"
292                           "kbswpfree;kbswpused;%swpused;kbswpcad;%swpcad",
293         .name           = "A_MEMORY",
294         .g_nr           = 0,
295 #endif
296         .nr             = 1,
297         .nr2            = 1,
298         .nr_max         = 1,
299         .fsize          = STATS_MEMORY_SIZE,
300         .msize          = STATS_MEMORY_SIZE,
301         .opt_flags      = 0,
302         .buf            = {NULL, NULL, NULL},
303         .bitmap         = NULL
304 };
305
306 /* Kernel tables activity */
307 struct activity ktables_act = {
308         .id             = A_KTABLES,
309         .options        = AO_COLLECTED,
310         .magic          = ACTIVITY_MAGIC_BASE,
311         .group          = G_DEFAULT,
312 #ifdef SOURCE_SADC
313         .f_count_index  = -1,
314         .f_count2       = NULL,
315         .f_read         = wrap_read_kernel_tables,
316 #endif
317 #ifdef SOURCE_SAR
318         .f_print        = print_ktables_stats,
319         .f_print_avg    = print_avg_ktables_stats,
320 #endif
321 #ifdef SOURCE_SADF
322         .f_render       = render_ktables_stats,
323         .f_xml_print    = xml_print_ktables_stats,
324         .f_json_print   = json_print_ktables_stats,
325         .hdr_line       = "dentunusd;file-nr;inode-nr;pty-nr",
326         .name           = "A_KTABLES",
327         .g_nr           = 0,
328 #endif
329         .nr             = 1,
330         .nr2            = 1,
331         .nr_max         = 1,
332         .fsize          = STATS_KTABLES_SIZE,
333         .msize          = STATS_KTABLES_SIZE,
334         .opt_flags      = 0,
335         .buf            = {NULL, NULL, NULL},
336         .bitmap         = NULL
337 };
338
339 /* Queue and load activity */
340 struct activity queue_act = {
341         .id             = A_QUEUE,
342         .options        = AO_COLLECTED,
343         .magic          = ACTIVITY_MAGIC_BASE + 1,
344         .group          = G_DEFAULT,
345 #ifdef SOURCE_SADC
346         .f_count_index  = -1,
347         .f_count2       = NULL,
348         .f_read         = wrap_read_loadavg,
349 #endif
350 #ifdef SOURCE_SAR
351         .f_print        = print_queue_stats,
352         .f_print_avg    = print_avg_queue_stats,
353 #endif
354 #ifdef SOURCE_SADF
355         .f_render       = render_queue_stats,
356         .f_xml_print    = xml_print_queue_stats,
357         .f_json_print   = json_print_queue_stats,
358         .hdr_line       = "runq-sz;plist-sz;ldavg-1;ldavg-5;ldavg-15;blocked",
359         .name           = "A_QUEUE",
360         .g_nr           = 0,
361 #endif
362         .nr             = 1,
363         .nr2            = 1,
364         .nr_max         = 1,
365         .fsize          = STATS_QUEUE_SIZE,
366         .msize          = STATS_QUEUE_SIZE,
367         .opt_flags      = 0,
368         .buf            = {NULL, NULL, NULL},
369         .bitmap         = NULL
370 };
371
372 /* Serial lines activity */
373 struct activity serial_act = {
374         .id             = A_SERIAL,
375         .options        = AO_COLLECTED,
376         .magic          = ACTIVITY_MAGIC_BASE,
377         .group          = G_DEFAULT,
378 #ifdef SOURCE_SADC
379         .f_count_index  = 2,    /* wrap_get_serial_nr() */
380         .f_count2       = NULL,
381         .f_read         = wrap_read_tty_driver_serial,
382 #endif
383 #ifdef SOURCE_SAR
384         .f_print        = print_serial_stats,
385         .f_print_avg    = print_serial_stats,
386 #endif
387 #ifdef SOURCE_SADF
388         .f_render       = render_serial_stats,
389         .f_xml_print    = xml_print_serial_stats,
390         .f_json_print   = json_print_serial_stats,
391         .hdr_line       = "TTY;rcvin/s;txmtin/s;framerr/s;prtyerr/s;brk/s;ovrun/s",
392         .name           = "A_SERIAL",
393         .g_nr           = 0,
394 #endif
395         .nr             = -1,
396         .nr2            = 1,
397         .nr_max         = MAX_NR_SERIAL_LINES,
398         .fsize          = STATS_SERIAL_SIZE,
399         .msize          = STATS_SERIAL_SIZE,
400         .opt_flags      = 0,
401         .buf            = {NULL, NULL, NULL},
402         .bitmap         = NULL
403 };
404
405 /* Block devices activity */
406 struct activity disk_act = {
407         .id             = A_DISK,
408         .options        = AO_NULL,
409         .magic          = ACTIVITY_MAGIC_BASE + 1,
410         .group          = G_DISK,
411 #ifdef SOURCE_SADC
412         .f_count_index  = 3,    /* wrap_get_disk_nr() */
413         .f_count2       = NULL,
414         .f_read         = wrap_read_disk,
415 #endif
416 #ifdef SOURCE_SAR
417         .f_print        = print_disk_stats,
418         .f_print_avg    = print_disk_stats,
419 #endif
420 #ifdef SOURCE_SADF
421         .f_render       = render_disk_stats,
422         .f_xml_print    = xml_print_disk_stats,
423         .f_json_print   = json_print_disk_stats,
424         .hdr_line       = "DEV;tps;rd_sec/s;wr_sec/s;avgrq-sz;avgqu-sz;await;svctm;%util",
425         .name           = "A_DISK",
426         .g_nr           = 0,
427 #endif
428         .nr             = -1,
429         .nr2            = 1,
430         .nr_max         = MAX_NR_DISKS,
431         .fsize          = STATS_DISK_SIZE,
432         .msize          = STATS_DISK_SIZE,
433         .opt_flags      = 0,
434         .buf            = {NULL, NULL, NULL},
435         .bitmap         = NULL
436 };
437
438 /* Network interfaces activity */
439 struct activity net_dev_act = {
440         .id             = A_NET_DEV,
441         .options        = AO_COLLECTED,
442         .magic          = ACTIVITY_MAGIC_BASE + 2,
443         .group          = G_DEFAULT,
444 #ifdef SOURCE_SADC
445         .f_count_index  = 4,    /* wrap_get_iface_nr() */
446         .f_count2       = NULL,
447         .f_read         = wrap_read_net_dev,
448 #endif
449 #ifdef SOURCE_SAR
450         .f_print        = print_net_dev_stats,
451         .f_print_avg    = print_net_dev_stats,
452 #endif
453 #ifdef SOURCE_SADF
454         .f_render       = render_net_dev_stats,
455         .f_xml_print    = xml_print_net_dev_stats,
456         .f_json_print   = json_print_net_dev_stats,
457         .hdr_line       = "IFACE;rxpck/s;txpck/s;rxkB/s;txkB/s;rxcmp/s;txcmp/s;rxmcst/s;%ifutil",
458         .name           = "A_NET_DEV",
459         .g_nr           = 0,
460 #endif
461         .nr             = -1,
462         .nr2            = 1,
463         .nr_max         = MAX_NR_IFACES,
464         .fsize          = STATS_NET_DEV_SIZE,
465         .msize          = STATS_NET_DEV_SIZE,
466         .opt_flags      = 0,
467         .buf            = {NULL, NULL, NULL},
468         .bitmap         = NULL
469 };
470
471 /* Network interfaces activity */
472 struct activity net_edev_act = {
473         .id             = A_NET_EDEV,
474         .options        = AO_COLLECTED,
475         .magic          = ACTIVITY_MAGIC_BASE + 1,
476         .group          = G_DEFAULT,
477 #ifdef SOURCE_SADC
478         .f_count_index  = 4,    /* wrap_get_iface_nr() */
479         .f_count2       = NULL,
480         .f_read         = wrap_read_net_edev,
481 #endif
482 #ifdef SOURCE_SAR
483         .f_print        = print_net_edev_stats,
484         .f_print_avg    = print_net_edev_stats,
485 #endif
486 #ifdef SOURCE_SADF
487         .f_render       = render_net_edev_stats,
488         .f_xml_print    = xml_print_net_edev_stats,
489         .f_json_print   = json_print_net_edev_stats,
490         .hdr_line       = "IFACE;rxerr/s;txerr/s;coll/s;rxdrop/s;txdrop/s;"
491                           "txcarr/s;rxfram/s;rxfifo/s;txfifo/s",
492         .name           = "A_NET_EDEV",
493         .g_nr           = 0,
494 #endif
495         .nr             = -1,
496         .nr2            = 1,
497         .nr_max         = MAX_NR_IFACES,
498         .fsize          = STATS_NET_EDEV_SIZE,
499         .msize          = STATS_NET_EDEV_SIZE,
500         .opt_flags      = 0,
501         .buf            = {NULL, NULL, NULL},
502         .bitmap         = NULL
503 };
504
505 /* NFS client activity */
506 struct activity net_nfs_act = {
507         .id             = A_NET_NFS,
508         .options        = AO_COLLECTED,
509         .magic          = ACTIVITY_MAGIC_BASE,
510         .group          = G_DEFAULT,
511 #ifdef SOURCE_SADC
512         .f_count_index  = -1,
513         .f_count2       = NULL,
514         .f_read         = wrap_read_net_nfs,
515 #endif
516 #ifdef SOURCE_SAR
517         .f_print        = print_net_nfs_stats,
518         .f_print_avg    = print_net_nfs_stats,
519 #endif
520 #ifdef SOURCE_SADF
521         .f_render       = render_net_nfs_stats,
522         .f_xml_print    = xml_print_net_nfs_stats,
523         .f_json_print   = json_print_net_nfs_stats,
524         .hdr_line       = "call/s;retrans/s;read/s;write/s;access/s;getatt/s",
525         .name           = "A_NET_NFS",
526         .g_nr           = 0,
527 #endif
528         .nr             = 1,
529         .nr2            = 1,
530         .nr_max         = 1,
531         .fsize          = STATS_NET_NFS_SIZE,
532         .msize          = STATS_NET_NFS_SIZE,
533         .opt_flags      = 0,
534         .buf            = {NULL, NULL, NULL},
535         .bitmap         = NULL
536 };
537
538 /* NFS server activity */
539 struct activity net_nfsd_act = {
540         .id             = A_NET_NFSD,
541         .options        = AO_COLLECTED,
542         .magic          = ACTIVITY_MAGIC_BASE,
543         .group          = G_DEFAULT,
544 #ifdef SOURCE_SADC
545         .f_count_index  = -1,
546         .f_count2       = NULL,
547         .f_read         = wrap_read_net_nfsd,
548 #endif
549 #ifdef SOURCE_SAR
550         .f_print        = print_net_nfsd_stats,
551         .f_print_avg    = print_net_nfsd_stats,
552 #endif
553 #ifdef SOURCE_SADF
554         .f_render       = render_net_nfsd_stats,
555         .f_xml_print    = xml_print_net_nfsd_stats,
556         .f_json_print   = json_print_net_nfsd_stats,
557         .hdr_line       = "scall/s;badcall/s;packet/s;udp/s;tcp/s;hit/s;miss/s;"
558                           "sread/s;swrite/s;saccess/s;sgetatt/s",
559         .name           = "A_NET_NFSD",
560         .g_nr           = 0,
561 #endif
562         .nr             = 1,
563         .nr2            = 1,
564         .nr_max         = 1,
565         .fsize          = STATS_NET_NFSD_SIZE,
566         .msize          = STATS_NET_NFSD_SIZE,
567         .opt_flags      = 0,
568         .buf            = {NULL, NULL, NULL},
569         .bitmap         = NULL
570 };
571
572 /* Network sockets activity */
573 struct activity net_sock_act = {
574         .id             = A_NET_SOCK,
575         .options        = AO_COLLECTED,
576         .magic          = ACTIVITY_MAGIC_BASE,
577         .group          = G_DEFAULT,
578 #ifdef SOURCE_SADC
579         .f_count_index  = -1,
580         .f_count2       = NULL,
581         .f_read         = wrap_read_net_sock,
582 #endif
583 #ifdef SOURCE_SAR
584         .f_print        = print_net_sock_stats,
585         .f_print_avg    = print_avg_net_sock_stats,
586 #endif
587 #ifdef SOURCE_SADF
588         .f_render       = render_net_sock_stats,
589         .f_xml_print    = xml_print_net_sock_stats,
590         .f_json_print   = json_print_net_sock_stats,
591         .hdr_line       = "totsck;tcpsck;udpsck;rawsck;ip-frag;tcp-tw",
592         .name           = "A_NET_SOCK",
593         .g_nr           = 0,
594 #endif
595         .nr             = 1,
596         .nr2            = 1,
597         .nr_max         = 1,
598         .fsize          = STATS_NET_SOCK_SIZE,
599         .msize          = STATS_NET_SOCK_SIZE,
600         .opt_flags      = 0,
601         .buf            = {NULL, NULL, NULL},
602         .bitmap         = NULL
603 };
604
605 /* IP network traffic activity */
606 struct activity net_ip_act = {
607         .id             = A_NET_IP,
608         .options        = AO_NULL,
609         .magic          = ACTIVITY_MAGIC_BASE + 1,
610         .group          = G_SNMP,
611 #ifdef SOURCE_SADC
612         .f_count_index  = -1,
613         .f_count2       = NULL,
614         .f_read         = wrap_read_net_ip,
615 #endif
616 #ifdef SOURCE_SAR
617         .f_print        = print_net_ip_stats,
618         .f_print_avg    = print_net_ip_stats,
619 #endif
620 #ifdef SOURCE_SADF
621         .f_render       = render_net_ip_stats,
622         .f_xml_print    = xml_print_net_ip_stats,
623         .f_json_print   = json_print_net_ip_stats,
624         .hdr_line       = "irec/s;fwddgm/s;idel/s;orq/s;asmrq/s;asmok/s;fragok/s;fragcrt/s",
625         .name           = "A_NET_IP",
626         .g_nr           = 0,
627 #endif
628         .nr             = 1,
629         .nr2            = 1,
630         .nr_max         = 1,
631         .fsize          = STATS_NET_IP_SIZE,
632         .msize          = STATS_NET_IP_SIZE,
633         .opt_flags      = 0,
634         .buf            = {NULL, NULL, NULL},
635         .bitmap         = NULL
636 };
637
638 /* IP network traffic (errors) activity */
639 struct activity net_eip_act = {
640         .id             = A_NET_EIP,
641         .options        = AO_NULL,
642         .magic          = ACTIVITY_MAGIC_BASE + 1,
643         .group          = G_SNMP,
644 #ifdef SOURCE_SADC
645         .f_count_index  = -1,
646         .f_count2       = NULL,
647         .f_read         = wrap_read_net_eip,
648 #endif
649 #ifdef SOURCE_SAR
650         .f_print        = print_net_eip_stats,
651         .f_print_avg    = print_net_eip_stats,
652 #endif
653 #ifdef SOURCE_SADF
654         .f_render       = render_net_eip_stats,
655         .f_xml_print    = xml_print_net_eip_stats,
656         .f_json_print   = json_print_net_eip_stats,
657         .hdr_line       = "ihdrerr/s;iadrerr/s;iukwnpr/s;idisc/s;odisc/s;onort/s;asmf/s;fragf/s",
658         .name           = "A_NET_EIP",
659         .g_nr           = 0,
660 #endif
661         .nr             = 1,
662         .nr2            = 1,
663         .nr_max         = 1,
664         .fsize          = STATS_NET_EIP_SIZE,
665         .msize          = STATS_NET_EIP_SIZE,
666         .opt_flags      = 0,
667         .buf            = {NULL, NULL, NULL},
668         .bitmap         = NULL
669 };
670
671 /* ICMP network traffic activity */
672 struct activity net_icmp_act = {
673         .id             = A_NET_ICMP,
674         .options        = AO_NULL,
675         .magic          = ACTIVITY_MAGIC_BASE,
676         .group          = G_SNMP,
677 #ifdef SOURCE_SADC
678         .f_count_index  = -1,
679         .f_count2       = NULL,
680         .f_read         = wrap_read_net_icmp,
681 #endif
682 #ifdef SOURCE_SAR
683         .f_print        = print_net_icmp_stats,
684         .f_print_avg    = print_net_icmp_stats,
685 #endif
686 #ifdef SOURCE_SADF
687         .f_render       = render_net_icmp_stats,
688         .f_xml_print    = xml_print_net_icmp_stats,
689         .f_json_print   = json_print_net_icmp_stats,
690         .hdr_line       = "imsg/s;omsg/s;iech/s;iechr/s;oech/s;oechr/s;itm/s;itmr/s;otm/s;"
691                           "otmr/s;iadrmk/s;iadrmkr/s;oadrmk/s;oadrmkr/s",
692         .name           = "A_NET_ICMP",
693         .g_nr           = 0,
694 #endif
695         .nr             = 1,
696         .nr2            = 1,
697         .nr_max         = 1,
698         .fsize          = STATS_NET_ICMP_SIZE,
699         .msize          = STATS_NET_ICMP_SIZE,
700         .opt_flags      = 0,
701         .buf            = {NULL, NULL, NULL},
702         .bitmap         = NULL
703 };
704
705 /* ICMP network traffic (errors) activity */
706 struct activity net_eicmp_act = {
707         .id             = A_NET_EICMP,
708         .options        = AO_NULL,
709         .magic          = ACTIVITY_MAGIC_BASE,
710         .group          = G_SNMP,
711 #ifdef SOURCE_SADC
712         .f_count_index  = -1,
713         .f_count2       = NULL,
714         .f_read         = wrap_read_net_eicmp,
715 #endif
716 #ifdef SOURCE_SAR
717         .f_print        = print_net_eicmp_stats,
718         .f_print_avg    = print_net_eicmp_stats,
719 #endif
720 #ifdef SOURCE_SADF
721         .f_render       = render_net_eicmp_stats,
722         .f_xml_print    = xml_print_net_eicmp_stats,
723         .f_json_print   = json_print_net_eicmp_stats,
724         .hdr_line       = "ierr/s;oerr/s;idstunr/s;odstunr/s;itmex/s;otmex/s;"
725                           "iparmpb/s;oparmpb/s;isrcq/s;osrcq/s;iredir/s;oredir/s",
726         .name           = "A_NET_EICMP",
727         .g_nr           = 0,
728 #endif
729         .nr             = 1,
730         .nr2            = 1,
731         .nr_max         = 1,
732         .fsize          = STATS_NET_EICMP_SIZE,
733         .msize          = STATS_NET_EICMP_SIZE,
734         .opt_flags      = 0,
735         .buf            = {NULL, NULL, NULL},
736         .bitmap         = NULL
737 };
738
739 /* TCP network traffic activity */
740 struct activity net_tcp_act = {
741         .id             = A_NET_TCP,
742         .options        = AO_NULL,
743         .magic          = ACTIVITY_MAGIC_BASE,
744         .group          = G_SNMP,
745 #ifdef SOURCE_SADC
746         .f_count_index  = -1,
747         .f_count2       = NULL,
748         .f_read         = wrap_read_net_tcp,
749 #endif
750 #ifdef SOURCE_SAR
751         .f_print        = print_net_tcp_stats,
752         .f_print_avg    = print_net_tcp_stats,
753 #endif
754 #ifdef SOURCE_SADF
755         .f_render       = render_net_tcp_stats,
756         .f_xml_print    = xml_print_net_tcp_stats,
757         .f_json_print   = json_print_net_tcp_stats,
758         .hdr_line       = "active/s;passive/s;iseg/s;oseg/s",
759         .name           = "A_NET_TCP",
760         .g_nr           = 0,
761 #endif
762         .nr             = 1,
763         .nr2            = 1,
764         .nr_max         = 1,
765         .fsize          = STATS_NET_TCP_SIZE,
766         .msize          = STATS_NET_TCP_SIZE,
767         .opt_flags      = 0,
768         .buf            = {NULL, NULL, NULL},
769         .bitmap         = NULL
770 };
771
772 /* TCP network traffic (errors) activity */
773 struct activity net_etcp_act = {
774         .id             = A_NET_ETCP,
775         .options        = AO_NULL,
776         .magic          = ACTIVITY_MAGIC_BASE,
777         .group          = G_SNMP,
778 #ifdef SOURCE_SADC
779         .f_count_index  = -1,
780         .f_count2       = NULL,
781         .f_read         = wrap_read_net_etcp,
782 #endif
783 #ifdef SOURCE_SAR
784         .f_print        = print_net_etcp_stats,
785         .f_print_avg    = print_net_etcp_stats,
786 #endif
787 #ifdef SOURCE_SADF
788         .f_render       = render_net_etcp_stats,
789         .f_xml_print    = xml_print_net_etcp_stats,
790         .f_json_print   = json_print_net_etcp_stats,
791         .hdr_line       = "atmptf/s;estres/s;retrans/s;isegerr/s;orsts/s",
792         .name           = "A_NET_ETCP",
793         .g_nr           = 0,
794 #endif
795         .nr             = 1,
796         .nr2            = 1,
797         .nr_max         = 1,
798         .fsize          = STATS_NET_ETCP_SIZE,
799         .msize          = STATS_NET_ETCP_SIZE,
800         .opt_flags      = 0,
801         .buf            = {NULL, NULL, NULL},
802         .bitmap         = NULL
803 };
804
805 /* UDP network traffic activity */
806 struct activity net_udp_act = {
807         .id             = A_NET_UDP,
808         .options        = AO_NULL,
809         .magic          = ACTIVITY_MAGIC_BASE,
810         .group          = G_SNMP,
811 #ifdef SOURCE_SADC
812         .f_count_index  = -1,
813         .f_count2       = NULL,
814         .f_read         = wrap_read_net_udp,
815 #endif
816 #ifdef SOURCE_SAR
817         .f_print        = print_net_udp_stats,
818         .f_print_avg    = print_net_udp_stats,
819 #endif
820 #ifdef SOURCE_SADF
821         .f_render       = render_net_udp_stats,
822         .f_xml_print    = xml_print_net_udp_stats,
823         .f_json_print   = json_print_net_udp_stats,
824         .hdr_line       = "idgm/s;odgm/s;noport/s;idgmerr/s",
825         .name           = "A_NET_UDP",
826         .g_nr           = 0,
827 #endif
828         .nr             = 1,
829         .nr2            = 1,
830         .nr_max         = 1,
831         .fsize          = STATS_NET_UDP_SIZE,
832         .msize          = STATS_NET_UDP_SIZE,
833         .opt_flags      = 0,
834         .buf            = {NULL, NULL, NULL},
835         .bitmap         = NULL
836 };
837
838 /* IPv6 sockets activity */
839 struct activity net_sock6_act = {
840         .id             = A_NET_SOCK6,
841         .options        = AO_NULL,
842         .magic          = ACTIVITY_MAGIC_BASE,
843         .group          = G_IPV6,
844 #ifdef SOURCE_SADC
845         .f_count_index  = -1,
846         .f_count2       = NULL,
847         .f_read         = wrap_read_net_sock6,
848 #endif
849 #ifdef SOURCE_SAR
850         .f_print        = print_net_sock6_stats,
851         .f_print_avg    = print_avg_net_sock6_stats,
852 #endif
853 #ifdef SOURCE_SADF
854         .f_render       = render_net_sock6_stats,
855         .f_xml_print    = xml_print_net_sock6_stats,
856         .f_json_print   = json_print_net_sock6_stats,
857         .hdr_line       = "tcp6sck;udp6sck;raw6sck;ip6-frag",
858         .name           = "A_NET_SOCK6",
859         .g_nr           = 0,
860 #endif
861         .nr             = 1,
862         .nr2            = 1,
863         .nr_max         = 1,
864         .fsize          = STATS_NET_SOCK6_SIZE,
865         .msize          = STATS_NET_SOCK6_SIZE,
866         .opt_flags      = 0,
867         .buf            = {NULL, NULL, NULL},
868         .bitmap         = NULL
869 };
870
871 /* IPv6 network traffic activity */
872 struct activity net_ip6_act = {
873         .id             = A_NET_IP6,
874         .options        = AO_NULL,
875         .magic          = ACTIVITY_MAGIC_BASE + 1,
876         .group          = G_IPV6,
877 #ifdef SOURCE_SADC
878         .f_count_index  = -1,
879         .f_count2       = NULL,
880         .f_read         = wrap_read_net_ip6,
881 #endif
882 #ifdef SOURCE_SAR
883         .f_print        = print_net_ip6_stats,
884         .f_print_avg    = print_net_ip6_stats,
885 #endif
886 #ifdef SOURCE_SADF
887         .f_render       = render_net_ip6_stats,
888         .f_xml_print    = xml_print_net_ip6_stats,
889         .f_json_print   = json_print_net_ip6_stats,
890         .hdr_line       = "irec6/s;fwddgm6/s;idel6/s;orq6/s;asmrq6/s;asmok6/s;"
891                           "imcpck6/s;omcpck6/s;fragok6/s;fragcr6/s",
892         .name           = "A_NET_IP6",
893         .g_nr           = 0,
894 #endif
895         .nr             = 1,
896         .nr2            = 1,
897         .nr_max         = 1,
898         .fsize          = STATS_NET_IP6_SIZE,
899         .msize          = STATS_NET_IP6_SIZE,
900         .opt_flags      = 0,
901         .buf            = {NULL, NULL, NULL},
902         .bitmap         = NULL
903 };
904
905 /* IPv6 network traffic (errors) activity */
906 struct activity net_eip6_act = {
907         .id             = A_NET_EIP6,
908         .options        = AO_NULL,
909         .magic          = ACTIVITY_MAGIC_BASE + 1,
910         .group          = G_IPV6,
911 #ifdef SOURCE_SADC
912         .f_count_index  = -1,
913         .f_count2       = NULL,
914         .f_read         = wrap_read_net_eip6,
915 #endif
916 #ifdef SOURCE_SAR
917         .f_print        = print_net_eip6_stats,
918         .f_print_avg    = print_net_eip6_stats,
919 #endif
920 #ifdef SOURCE_SADF
921         .f_render       = render_net_eip6_stats,
922         .f_xml_print    = xml_print_net_eip6_stats,
923         .f_json_print   = json_print_net_eip6_stats,
924         .hdr_line       = "ihdrer6/s;iadrer6/s;iukwnp6/s;i2big6/s;idisc6/s;odisc6/s;"
925                           "inort6/s;onort6/s;asmf6/s;fragf6/s;itrpck6/s",
926         .name           = "A_NET_EIP6",
927         .g_nr           = 0,
928 #endif
929         .nr             = 1,
930         .nr2            = 1,
931         .nr_max         = 1,
932         .fsize          = STATS_NET_EIP6_SIZE,
933         .msize          = STATS_NET_EIP6_SIZE,
934         .opt_flags      = 0,
935         .buf            = {NULL, NULL, NULL},
936         .bitmap         = NULL
937 };
938
939 /* ICMPv6 network traffic activity */
940 struct activity net_icmp6_act = {
941         .id             = A_NET_ICMP6,
942         .options        = AO_NULL,
943         .magic          = ACTIVITY_MAGIC_BASE,
944         .group          = G_IPV6,
945 #ifdef SOURCE_SADC
946         .f_count_index  = -1,
947         .f_count2       = NULL,
948         .f_read         = wrap_read_net_icmp6,
949 #endif
950 #ifdef SOURCE_SAR
951         .f_print        = print_net_icmp6_stats,
952         .f_print_avg    = print_net_icmp6_stats,
953 #endif
954 #ifdef SOURCE_SADF
955         .f_render       = render_net_icmp6_stats,
956         .f_xml_print    = xml_print_net_icmp6_stats,
957         .f_json_print   = json_print_net_icmp6_stats,
958         .hdr_line       = "imsg6/s;omsg6/s;iech6/s;iechr6/s;oechr6/s;igmbq6/s;igmbr6/s;ogmbr6/s;"
959                           "igmbrd6/s;ogmbrd6/s;irtsol6/s;ortsol6/s;irtad6/s;inbsol6/s;onbsol6/s;"
960                           "inbad6/s;onbad6/s",
961         .name           = "A_NET_ICMP6",
962         .g_nr           = 0,
963 #endif
964         .nr             = 1,
965         .nr2            = 1,
966         .nr_max         = 1,
967         .fsize          = STATS_NET_ICMP6_SIZE,
968         .msize          = STATS_NET_ICMP6_SIZE,
969         .opt_flags      = 0,
970         .buf            = {NULL, NULL, NULL},
971         .bitmap         = NULL
972 };
973
974 /* ICMPv6 network traffic (errors) activity */
975 struct activity net_eicmp6_act = {
976         .id             = A_NET_EICMP6,
977         .options        = AO_NULL,
978         .magic          = ACTIVITY_MAGIC_BASE,
979         .group          = G_IPV6,
980 #ifdef SOURCE_SADC
981         .f_count_index  = -1,
982         .f_count2       = NULL,
983         .f_read         = wrap_read_net_eicmp6,
984 #endif
985 #ifdef SOURCE_SAR
986         .f_print        = print_net_eicmp6_stats,
987         .f_print_avg    = print_net_eicmp6_stats,
988 #endif
989 #ifdef SOURCE_SADF
990         .f_render       = render_net_eicmp6_stats,
991         .f_xml_print    = xml_print_net_eicmp6_stats,
992         .f_json_print   = json_print_net_eicmp6_stats,
993         .hdr_line       = "ierr6/s;idtunr6/s;odtunr6/s;itmex6/s;otmex6/s;"
994                           "iprmpb6/s;oprmpb6/s;iredir6/s;oredir6/s;ipck2b6/s;opck2b6/s",
995         .name           = "A_NET_EICMP6",
996         .g_nr           = 0,
997 #endif
998         .nr             = 1,
999         .nr2            = 1,
1000         .nr_max         = 1,
1001         .fsize          = STATS_NET_EICMP6_SIZE,
1002         .msize          = STATS_NET_EICMP6_SIZE,
1003         .opt_flags      = 0,
1004         .buf            = {NULL, NULL, NULL},
1005         .bitmap         = NULL
1006 };
1007
1008 /* UDPv6 network traffic activity */
1009 struct activity net_udp6_act = {
1010         .id             = A_NET_UDP6,
1011         .options        = AO_NULL,
1012         .magic          = ACTIVITY_MAGIC_BASE,
1013         .group          = G_IPV6,
1014 #ifdef SOURCE_SADC
1015         .f_count_index  = -1,
1016         .f_count2       = NULL,
1017         .f_read         = wrap_read_net_udp6,
1018 #endif
1019 #ifdef SOURCE_SAR
1020         .f_print        = print_net_udp6_stats,
1021         .f_print_avg    = print_net_udp6_stats,
1022 #endif
1023 #ifdef SOURCE_SADF
1024         .f_render       = render_net_udp6_stats,
1025         .f_xml_print    = xml_print_net_udp6_stats,
1026         .f_json_print   = json_print_net_udp6_stats,
1027         .hdr_line       = "idgm6/s;odgm6/s;noport6/s;idgmer6/s",
1028         .name           = "A_NET_UDP6",
1029         .g_nr           = 0,
1030 #endif
1031         .nr             = 1,
1032         .nr2            = 1,
1033         .nr_max         = 1,
1034         .fsize          = STATS_NET_UDP6_SIZE,
1035         .msize          = STATS_NET_UDP6_SIZE,
1036         .opt_flags      = 0,
1037         .buf            = {NULL, NULL, NULL},
1038         .bitmap         = NULL
1039 };
1040
1041 /* CPU frequency */
1042 struct activity pwr_cpufreq_act = {
1043         .id             = A_PWR_CPUFREQ,
1044         .options        = AO_VOLATILE,
1045         .magic          = ACTIVITY_MAGIC_BASE,
1046         .group          = G_POWER,
1047 #ifdef SOURCE_SADC
1048         .f_count_index  = 0,    /* wrap_get_cpu_nr() */
1049         .f_count2       = NULL,
1050         .f_read         = wrap_read_cpuinfo,
1051 #endif
1052 #ifdef SOURCE_SAR
1053         .f_print        = print_pwr_cpufreq_stats,
1054         .f_print_avg    = print_avg_pwr_cpufreq_stats,
1055 #endif
1056 #ifdef SOURCE_SADF
1057         .f_render       = render_pwr_cpufreq_stats,
1058         .f_xml_print    = xml_print_pwr_cpufreq_stats,
1059         .f_json_print   = json_print_pwr_cpufreq_stats,
1060         .hdr_line       = "CPU;MHz",
1061         .name           = "A_PWR_CPUFREQ",
1062         .g_nr           = 0,
1063 #endif
1064         .nr             = -1,
1065         .nr2            = 1,
1066         .nr_max         = NR_CPUS + 1,
1067         .fsize          = STATS_PWR_CPUFREQ_SIZE,
1068         .msize          = STATS_PWR_CPUFREQ_SIZE,
1069         .opt_flags      = 0,
1070         .buf            = {NULL, NULL, NULL},
1071         .bitmap         = &cpu_bitmap
1072 };
1073
1074 /* Fan */
1075 struct activity pwr_fan_act = {
1076         .id             = A_PWR_FAN,
1077         .options        = AO_NULL,
1078         .magic          = ACTIVITY_MAGIC_BASE,
1079         .group          = G_POWER,
1080 #ifdef SOURCE_SADC
1081         .f_count_index  = 5,    /* wrap_get_fan_nr() */
1082         .f_count2       = NULL,
1083         .f_read         = wrap_read_fan,
1084 #endif
1085 #ifdef SOURCE_SAR
1086         .f_print        = print_pwr_fan_stats,
1087         .f_print_avg    = print_avg_pwr_fan_stats,
1088 #endif
1089 #ifdef SOURCE_SADF
1090         .f_render       = render_pwr_fan_stats,
1091         .f_xml_print    = xml_print_pwr_fan_stats,
1092         .f_json_print   = json_print_pwr_fan_stats,
1093         .hdr_line       = "FAN;DEVICE;rpm;drpm",
1094         .name           = "A_PWR_FAN",
1095         .g_nr           = 0,
1096 #endif
1097         .nr             = -1,
1098         .nr2            = 1,
1099         .nr_max         = MAX_NR_FANS,
1100         .fsize          = STATS_PWR_FAN_SIZE,
1101         .msize          = STATS_PWR_FAN_SIZE,
1102         .opt_flags      = 0,
1103         .buf            = {NULL, NULL, NULL},
1104         .bitmap         = NULL
1105 };
1106
1107 /* Temperature */
1108 struct activity pwr_temp_act = {
1109         .id             = A_PWR_TEMP,
1110         .options        = AO_NULL,
1111         .magic          = ACTIVITY_MAGIC_BASE,
1112         .group          = G_POWER,
1113 #ifdef SOURCE_SADC
1114         .f_count_index  = 6,    /* wrap_get_temp_nr() */
1115         .f_count2       = NULL,
1116         .f_read         = wrap_read_temp,
1117 #endif
1118 #ifdef SOURCE_SAR
1119         .f_print        = print_pwr_temp_stats,
1120         .f_print_avg    = print_avg_pwr_temp_stats,
1121 #endif
1122 #ifdef SOURCE_SADF
1123         .f_render       = render_pwr_temp_stats,
1124         .f_xml_print    = xml_print_pwr_temp_stats,
1125         .f_json_print   = json_print_pwr_temp_stats,
1126         .hdr_line       = "TEMP;DEVICE;degC;%temp",
1127         .name           = "A_PWR_TEMP",
1128         .g_nr           = 0,
1129 #endif
1130         .nr             = -1,
1131         .nr2            = 1,
1132         .nr_max         = MAX_NR_TEMP_SENSORS,
1133         .fsize          = STATS_PWR_TEMP_SIZE,
1134         .msize          = STATS_PWR_TEMP_SIZE,
1135         .opt_flags      = 0,
1136         .buf            = {NULL, NULL, NULL},
1137         .bitmap         = NULL
1138 };
1139
1140 /* Voltage inputs */
1141 struct activity pwr_in_act = {
1142         .id             = A_PWR_IN,
1143         .options        = AO_NULL,
1144         .magic          = ACTIVITY_MAGIC_BASE,
1145         .group          = G_POWER,
1146 #ifdef SOURCE_SADC
1147         .f_count_index  = 7,    /* wrap_get_in_nr() */
1148         .f_count2       = NULL,
1149         .f_read         = wrap_read_in,
1150 #endif
1151 #ifdef SOURCE_SAR
1152         .f_print        = print_pwr_in_stats,
1153         .f_print_avg    = print_avg_pwr_in_stats,
1154 #endif
1155 #ifdef SOURCE_SADF
1156         .f_render       = render_pwr_in_stats,
1157         .f_xml_print    = xml_print_pwr_in_stats,
1158         .f_json_print   = json_print_pwr_in_stats,
1159         .hdr_line       = "IN;DEVICE;inV;%in",
1160         .name           = "A_PWR_IN",
1161         .g_nr           = 0,
1162 #endif
1163         .nr             = -1,
1164         .nr2            = 1,
1165         .nr_max         = MAX_NR_IN_SENSORS,
1166         .fsize          = STATS_PWR_IN_SIZE,
1167         .msize          = STATS_PWR_IN_SIZE,
1168         .opt_flags      = 0,
1169         .buf            = {NULL, NULL, NULL},
1170         .bitmap         = NULL
1171 };
1172
1173 /* Hugepages activity */
1174 struct activity huge_act = {
1175         .id             = A_HUGE,
1176         .options        = AO_COLLECTED,
1177         .magic          = ACTIVITY_MAGIC_BASE,
1178         .group          = G_DEFAULT,
1179 #ifdef SOURCE_SADC
1180         .f_count_index  = -1,
1181         .f_count2       = NULL,
1182         .f_read         = wrap_read_meminfo_huge,
1183 #endif
1184 #ifdef SOURCE_SAR
1185         .f_print        = print_huge_stats,
1186         .f_print_avg    = print_avg_huge_stats,
1187 #endif
1188 #ifdef SOURCE_SADF
1189         .f_render       = render_huge_stats,
1190         .f_xml_print    = xml_print_huge_stats,
1191         .f_json_print   = json_print_huge_stats,
1192         .hdr_line       = "kbhugfree;kbhugused;%hugused",
1193         .name           = "A_HUGE",
1194         .g_nr           = 0,
1195 #endif
1196         .nr             = 1,
1197         .nr2            = 1,
1198         .nr_max         = 1,
1199         .fsize          = STATS_HUGE_SIZE,
1200         .msize          = STATS_HUGE_SIZE,
1201         .opt_flags      = 0,
1202         .buf            = {NULL, NULL, NULL},
1203         .bitmap         = NULL
1204 };
1205
1206 /* CPU weighted frequency */
1207 struct activity pwr_wghfreq_act = {
1208         .id             = A_PWR_WGHFREQ,
1209         .options        = AO_VOLATILE,
1210         .magic          = ACTIVITY_MAGIC_BASE,
1211         .group          = G_POWER,
1212 #ifdef SOURCE_SADC
1213         .f_count_index  = 0,    /* wrap_get_cpu_nr() */
1214         .f_count2       = wrap_get_freq_nr,
1215         .f_read         = wrap_read_time_in_state,
1216 #endif
1217 #ifdef SOURCE_SAR
1218         .f_print        = print_pwr_wghfreq_stats,
1219         .f_print_avg    = print_pwr_wghfreq_stats,
1220 #endif
1221 #ifdef SOURCE_SADF
1222         .f_render       = render_pwr_wghfreq_stats,
1223         .f_xml_print    = xml_print_pwr_wghfreq_stats,
1224         .f_json_print   = json_print_pwr_wghfreq_stats,
1225         .hdr_line       = "CPU;wghMHz",
1226         .name           = "A_PWR_WGHFREQ",
1227         .g_nr           = 0,
1228 #endif
1229         .nr             = -1,
1230         .nr2            = -1,
1231         .nr_max         = NR_CPUS + 1,
1232         .fsize          = STATS_PWR_WGHFREQ_SIZE,
1233         .msize          = STATS_PWR_WGHFREQ_SIZE,
1234         .opt_flags      = 0,
1235         .buf            = {NULL, NULL, NULL},
1236         .bitmap         = &cpu_bitmap
1237 };
1238
1239 /* USB devices plugged into the system */
1240 struct activity pwr_usb_act = {
1241         .id             = A_PWR_USB,
1242         .options        = AO_CLOSE_MARKUP,
1243         .magic          = ACTIVITY_MAGIC_BASE,
1244         .group          = G_POWER,
1245 #ifdef SOURCE_SADC
1246         .f_count_index  = 8,    /* wrap_get_usb_nr() */
1247         .f_count2       = NULL,
1248         .f_read         = wrap_read_bus_usb_dev,
1249 #endif
1250 #ifdef SOURCE_SAR
1251         .f_print        = print_pwr_usb_stats,
1252         .f_print_avg    = print_avg_pwr_usb_stats,
1253 #endif
1254 #ifdef SOURCE_SADF
1255         .f_render       = render_pwr_usb_stats,
1256         .f_xml_print    = xml_print_pwr_usb_stats,
1257         .f_json_print   = json_print_pwr_usb_stats,
1258         .hdr_line       = "manufact;product;BUS;idvendor;idprod;maxpower",
1259         .name           = "A_PWR_USB",
1260         .g_nr           = 0,
1261 #endif
1262         .nr             = -1,
1263         .nr2            = 1,
1264         .nr_max         = MAX_NR_USB,
1265         .fsize          = STATS_PWR_USB_SIZE,
1266         .msize          = STATS_PWR_USB_SIZE,
1267         .opt_flags      = 0,
1268         .buf            = {NULL, NULL, NULL},
1269         .bitmap         = NULL
1270 };
1271
1272 /* Filesystem usage activity */
1273 struct activity filesystem_act = {
1274         .id             = A_FILESYSTEM,
1275         .options        = AO_NULL,
1276         .magic          = ACTIVITY_MAGIC_BASE,
1277         .group          = G_XDISK,
1278 #ifdef SOURCE_SADC
1279         .f_count_index  = 9,    /* wrap_get_filesystem_nr() */
1280         .f_count2       = NULL,
1281         .f_read         = wrap_read_filesystem,
1282 #endif
1283 #ifdef SOURCE_SAR
1284         .f_print        = print_filesystem_stats,
1285         .f_print_avg    = print_avg_filesystem_stats,
1286 #endif
1287 #ifdef SOURCE_SADF
1288         .f_render       = render_filesystem_stats,
1289         .f_xml_print    = xml_print_filesystem_stats,
1290         .f_json_print   = json_print_filesystem_stats,
1291         .hdr_line       = "FILESYSTEM;MBfsfree;MBfsused;%fsused;%ufsused;Ifree;Iused;%Iused",
1292         .name           = "A_FILESYSTEM",
1293         .g_nr           = 0,
1294 #endif
1295         .nr             = -1,
1296         .nr2            = 1,
1297         .nr_max         = MAX_NR_FS,
1298         .fsize          = STATS_FILESYSTEM_SIZE,
1299         .msize          = STATS_FILESYSTEM_SIZE,
1300         .opt_flags      = 0,
1301         .buf            = {NULL, NULL, NULL},
1302         .bitmap         = NULL
1303 };
1304
1305 /* Fibre Channel HBA usage activity */
1306 struct activity fchost_act = {
1307         .id             = A_NET_FC,
1308         .options        = AO_CLOSE_MARKUP,
1309         .magic          = ACTIVITY_MAGIC_BASE,
1310         .group          = G_DISK,
1311 #ifdef SOURCE_SADC
1312         .f_count_index  = 10,   /* wrap_get_fchost_nr() */
1313         .f_count2       = NULL,
1314         .f_read         = wrap_read_fchost,
1315 #endif
1316 #ifdef SOURCE_SAR
1317         .f_print        = print_fchost_stats,
1318         .f_print_avg    = print_fchost_stats,
1319 #endif
1320 #ifdef SOURCE_SADF
1321         .f_render       = render_fchost_stats,
1322         .f_xml_print    = xml_print_fchost_stats,
1323         .f_json_print   = json_print_fchost_stats,
1324         .hdr_line       = "FCHOST;fch_rxf/s;fch_txf/s;fch_rxw/s;fch_txw/s",
1325         .name           = "A_FCHOST",
1326         .g_nr           = 0,
1327 #endif
1328         .nr             = -1,
1329         .nr2            = 1,
1330         .nr_max         = MAX_NR_FCHOSTS,
1331         .fsize          = STATS_FCHOST_SIZE,
1332         .msize          = STATS_FCHOST_SIZE,
1333         .opt_flags      = 0,
1334         .buf            = {NULL, NULL, NULL},
1335         .bitmap         = NULL
1336 };
1337
1338 #ifdef SOURCE_SADC
1339 /*
1340  * Array of functions used to count number of items.
1341  */
1342 __nr_t (*f_count[NR_F_COUNT]) (struct activity *) = {
1343         wrap_get_cpu_nr,
1344         wrap_get_irq_nr,
1345         wrap_get_serial_nr,
1346         wrap_get_disk_nr,
1347         wrap_get_iface_nr,
1348         wrap_get_fan_nr,
1349         wrap_get_temp_nr,
1350         wrap_get_in_nr,
1351         wrap_get_usb_nr,
1352         wrap_get_filesystem_nr,
1353         wrap_get_fchost_nr
1354 };
1355 #endif
1356
1357 /*
1358  * Array of activities.
1359  * (Order of activities doesn't matter for daily data files).
1360  */
1361 struct activity *act[NR_ACT] = {
1362         &cpu_act,
1363         &pcsw_act,
1364         &irq_act,
1365         &swap_act,
1366         &paging_act,
1367         &io_act,
1368         &memory_act,
1369         &huge_act,
1370         &ktables_act,
1371         &queue_act,
1372         &serial_act,
1373         &disk_act,
1374         /* <network> */
1375         &net_dev_act,
1376         &net_edev_act,
1377         &net_nfs_act,
1378         &net_nfsd_act,
1379         &net_sock_act,
1380         &net_ip_act,
1381         &net_eip_act,
1382         &net_icmp_act,
1383         &net_eicmp_act,
1384         &net_tcp_act,
1385         &net_etcp_act,
1386         &net_udp_act,
1387         &net_sock6_act,
1388         &net_ip6_act,
1389         &net_eip6_act,
1390         &net_icmp6_act,
1391         &net_eicmp6_act,
1392         &net_udp6_act,
1393         &fchost_act,            /* AO_CLOSE_MARKUP */
1394         /* </network> */
1395         /* <power-management> */
1396         &pwr_cpufreq_act,
1397         &pwr_fan_act,
1398         &pwr_temp_act,
1399         &pwr_in_act,
1400         &pwr_wghfreq_act,
1401         &pwr_usb_act,           /* AO_CLOSE_MARKUP */
1402         /* </power-management> */
1403         &filesystem_act
1404 };