Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Netbsd #47

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion common.am
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
MANCENTER="Munin C Documentation"
RELEASE="$(shell $(top_srcdir)/getversion)"

%.1:%.pod
.pod.1:
$(AM_V_GEN)pod2man --section=1 --release=$(RELEASE) --center=$(MANCENTER) $< > $@

SUFFIXES = .1 .pod

# vim:ft=make
10 changes: 10 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ AM_INIT_AUTOMAKE([foreign subdir-objects])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AM_MAINTAINER_MODE([enable])

AC_CANONICAL_HOST
case $host in
*bsd* | *darwin* )
SYS_API='sysctl' ;;
*)
SYS_API='proc' ;;
esac

AC_SUBST([SYS_API])

AC_PROG_CC
AC_PROG_CC_C_O

Expand Down
7 changes: 7 additions & 0 deletions src/common/xctype.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* put here extended versions of <ctype.h>
* Only use #define tricks to avoid the overhead of func call
*/

/* Defined by the ctype(3) in NetBSD */
#define xisdigit(x) isdigit((int)(unsigned char) (x))
#define xisspace(x) isspace((int)(unsigned char) (x))
3 changes: 2 additions & 1 deletion src/plugins/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ include $(top_srcdir)/common.am

pkglibexec_PROGRAMS = munin-plugins-c
munin_plugins_c_SOURCES = \
load-$(SYS_API).c \
common.c \
common.h \
plugins.h \
Expand All @@ -21,7 +22,6 @@ munin_plugins_c_SOURCES = \
fw_packets.c \
if_err_.c \
interrupts.c \
load.c \
main.c \
open_files.c \
open_inodes.c \
Expand All @@ -30,6 +30,7 @@ munin_plugins_c_SOURCES = \
threads.c \
memory.c \
uptime.c

man_MANS = munin-plugins-c.1
CLEANFILES = $(man_MANS)
EXTRA_DIST = munin-plugins-c.pod
189 changes: 189 additions & 0 deletions src/plugins/cpu-sysctl.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
/*
* Copyright (C) 2015 Steve Schnepp <[email protected]> - All rights reserved.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU General Public License v.2 or v.3.
*/
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include "common.h"
#include "plugins.h"

#define SYSWARNING 30
#define SYSCRITICAL 50
#define USRWARNING 80

/* TODO: port support for env.foo_warning and env.foo_critical from mainline plugin */

static int print_stat_value(const char* field_name, const char* stat_value, int hz_) {
return printf("%s.value %llu\n", field_name, strtoull(stat_value, NULL, 0) * 100 / hz_);
}

int cpu(int argc, char **argv) {
FILE *f;
char buff[256], *s;
int ncpu=0, extinfo=0, hz_;
bool scaleto100 = false;
if(argc > 1) {
if(!strcmp(argv[1], "config")) {
s = getenv("scaleto100");
if(s && !strcmp(s, "yes"))
scaleto100 = true;

if(!(f=fopen(PROC_STAT, "r")))
return fail("cannot open " PROC_STAT);
while(fgets(buff, 256, f)) {
if(!strncmp(buff, "cpu", 3)) {
if(isdigit(buff[3]))
ncpu++;
if(buff[3] == ' ' && 0 == extinfo) {
strtok(buff+4, " \t");
for(extinfo=1;strtok(NULL, " \t");extinfo++)
;
}
}
}
fclose(f);

if(ncpu < 1 || extinfo < 4)
return fail("cannot parse " PROC_STAT);

puts("graph_title CPU usage");
if(extinfo >= 7)
puts("graph_order system user nice idle iowait irq softirq");
else
puts("graph_order system user nice idle");
if(scaleto100)
puts("graph_args --base 1000 -r --lower-limit 0 --upper-limit 100");
else
printf("graph_args --base 1000 -r --lower-limit 0 --upper-limit %d\n", 100 * ncpu);
puts("graph_vlabel %\n"
"graph_scale no\n"
"graph_info This graph shows how CPU time is spent.\n"
"graph_category system\n"
"graph_period second\n"
"system.label system\n"
"system.draw AREA");
printf("system.max %d\n", 100 * ncpu);
puts("system.min 0\n"
"system.type DERIVE");
printf("system.warning %d\n", SYSWARNING * ncpu);
printf("system.critical %d\n", SYSCRITICAL * ncpu);
puts("system.info CPU time spent by the kernel in system activities\n"
"user.label user\n"
"user.draw STACK\n"
"user.min 0");
printf("user.max %d\n", 100 * ncpu);
printf("user.warning %d\n", USRWARNING * ncpu);
puts("user.type DERIVE\n"
"user.info CPU time spent by normal programs and daemons\n"
"nice.label nice\n"
"nice.draw STACK\n"
"nice.min 0");
printf("nice.max %d\n", 100 * ncpu);
puts("nice.type DERIVE\n"
"nice.info CPU time spent by nice(1)d programs\n"
"idle.label idle\n"
"idle.draw STACK\n"
"idle.min 0");
printf("idle.max %d\n", 100 * ncpu);
puts("idle.type DERIVE\n"
"idle.info Idle CPU time");
if(scaleto100)
printf("system.cdef system,%d,/\n"
"user.cdef user,%d,/\n"
"nice.cdef nice,%d,/\n"
"idle.cdef idle,%d,/\n", ncpu, ncpu, ncpu, ncpu);
if(extinfo >= 7) {
puts("iowait.label iowait\n"
"iowait.draw STACK\n"
"iowait.min 0");
printf("iowait.max %d\n", 100 * ncpu);
puts("iowait.type DERIVE\n"
"iowait.info CPU time spent waiting for I/O operations to finish\n"
"irq.label irq\n"
"irq.draw STACK\n"
"irq.min 0");
printf("irq.max %d\n", 100 * ncpu);
puts("irq.type DERIVE\n"
"irq.info CPU time spent handling interrupts\n"
"softirq.label softirq\n"
"softirq.draw STACK\n"
"softirq.min 0");
printf("softirq.max %d\n", 100 * ncpu);
puts("softirq.type DERIVE\n"
"softirq.info CPU time spent handling \"batched\" interrupts");
if(scaleto100)
printf("iowait.cdef iowait,%d,/\n"
"irq.cdef irq,%d,/\n"
"softirq.cdef softirq,%d,/\n", ncpu, ncpu, ncpu);
}
if(extinfo >= 8) {
puts("steal.label steal\n"
"steal.draw STACK\n"
"steal.min 0");
printf("steal.max %d\n", 100 * ncpu);
puts("steal.type DERIVE\n"
"steal.info The time that a virtual CPU had runnable tasks, but the virtual CPU itself was not running");
if(scaleto100)
printf("steal.cdef steal,%d,/\n", ncpu);
}
if(extinfo >= 9) {
puts("guest.label guest\n"
"guest.draw STACK\n"
"guest.min 0");
printf("guest.max %d\n", 100 * ncpu);
puts("guest.type DERIVE\n"
"guest.info The time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.");
if(scaleto100)
printf("guest.cdef guest,%d,/\n", ncpu);
}
return 0;
}
if(!strcmp(argv[1], "autoconf"))
return autoconf_check_readable(PROC_STAT);
}
if(!(f=fopen(PROC_STAT, "r")))
return fail("cannot open " PROC_STAT);
hz_ = getenvint("HZ", 100);
while(fgets(buff, 256, f)) {
if(!strncmp(buff, "cpu ", 4)) {
fclose(f);
if(!(s = strtok(buff+4, " \t")))
break;
print_stat_value("user", s, hz_);
if(!(s = strtok(NULL, " \t")))
break;
print_stat_value("nice", s, hz_);
if(!(s = strtok(NULL, " \t")))
break;
print_stat_value("system", s, hz_);
if(!(s = strtok(NULL, " \t")))
break;
print_stat_value("idle", s, hz_);
if(!(s = strtok(NULL, " \t")))
return 0;
print_stat_value("iowait", s, hz_);
if(!(s = strtok(NULL, " \t")))
return 0;
print_stat_value("irq", s, hz_);
if(!(s = strtok(NULL, " \t")))
return 0;
print_stat_value("softirq", s, hz_);
if(!(s = strtok(NULL, " \t")))
return 0;
print_stat_value("steal", s, hz_);
if(!(s = strtok(NULL, " \t")))
return 0;
print_stat_value("guest", s, hz_);
return 0;
}
}
fclose(f);
return fail("no cpu line found in " PROC_STAT);
}
File renamed without changes.
56 changes: 56 additions & 0 deletions src/plugins/load-sysctl.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright (C) 2015 Steve Schnepp <[email protected]> - All rights reserved.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU General Public License v.2 or v.3.
*/

/* This plugin is compatible with munin-mainline version 2.0.25. */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include "common.h"
#include "plugins.h"

#include <sys/vmmeter.h>

int load(int argc, char **argv) {
if(argc > 1) {
if(!strcmp(argv[1], "config")) {
puts("graph_title Load average\n"
"graph_args --base 1000 -l 0\n"
"graph_vlabel load\n"
"graph_scale no\n"
"graph_category system\n"
"load.label load");
print_warncrit("load");
puts("graph_info The load average of the machine describes how many processes are in the run-queue (scheduled to run \"immediately\").\n"
"load.info 5 minute load average");
return 0;
}
if(!strcmp(argv[1], "autoconf"))
return writeyes();
}

struct loadavg l;
size_t len = sizeof(l);

if (sysctlbyname("vm.loadavg", &l, &len, NULL, 0) < 0) {
return fail("sysctl");
}

double ldavg = l.ldavg[0];
double fscale = l.fscale;

printf("# vm.loadavg, ldavg:%f fscale:%f -", ldavg, fscale);
printf("\n");

double load_1 = ldavg / fscale;
printf("load.value %.2f\n", load_1);
return 0;
}
Loading