--- /dev/null 2006-10-26 23:11:53.000000000 +0200 +++ hobbitd/rrd/do_trends.c 2007-01-17 15:20:55.184807439 +0100 @@ -0,0 +1,127 @@ +/*----------------------------------------------------------------------------*/ +/* Hobbit RRD handler module. */ +/* */ +/* This module handles custom "trends" data. */ +/* */ +/* Copyright (C) 2007 Henrik Storner */ +/* */ +/* This program is released under the GNU General Public License (GPL), */ +/* version 2. See the file "COPYING" for details. */ +/* */ +/*----------------------------------------------------------------------------*/ + +static char trends_rcsid[] = "$Id: do_counts.c,v 1.5 2006/06/09 22:23:49 henrik Rel $"; + +/* + * This module was inspired by a mail from Stef Coene: + * + * Date: Wed, 17 Jan 2007 14:04:29 +0100 + * From: Stef Coene + * Subject: Re: [hobbit] hobbit monitoring + * + * On Wednesday 17 January 2007 10:38, Stef Coene wrote: + * > Same for trending, hobbit is not powerfull enough for our needs. And we + * > don't have the C knowledge to change hobbit. One of the problems is that + * > there is 1 rrd file / check. But we have checks where the number on 1 page + * > we want to graph can change over time. + * Just wondering, how hard would it be to create an extra channel for trending? + * So you can use the bb client to send "numbers" to the hobbit server together + * with some extra control information. + * + * bb trends + * + * + */ + +/* + * To use this, send a "data" message to hobbit like this: + * + * data $MACHINE.trends + * [filename.rrd] + * DS-definition1 VALUE2 + * DS-definition2 VALUE2 + * + * E.g. to create/update a custom RRD file "weather.rrd" with two + * GAUGE datasets "temp" and "wind", with current values "21" and + * "8" respectively, send this message: + * + * [weather.rrd] + * DS:temp:GAUGE:600:0:U 21 + * DS:wind:GAUGE:600:0:U 8 + */ + +static int do_trends_rrd(char *hostname, char *testname, char *msg, time_t tstamp) +{ + char *boln, *eoln, *p; + char *rrdfn = NULL; + int dscount = 0; + char **creparams; + + creparams = (char **)calloc(7, sizeof(char *)); + + boln = strchr(msg, '\n'); if (boln) boln++; + while (boln && *boln) { + eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; + + if (*boln == '[') { + /* Flush the current RRD file */ + if (rrdfn && (dscount > 0)) { + /* Setup the static RRD create-parameters */ + creparams[0] = "rrdcreate"; + creparams[1] = rrdfn; + creparams[2+dscount] = rra1; dscount++; + creparams[2+dscount] = rra2; dscount++; + creparams[2+dscount] = rra3; dscount++; + creparams[2+dscount] = rra4; dscount++; + creparams[2+dscount] = NULL; dscount++; + + create_and_update_rrd(hostname, rrdfn, creparams, NULL); + + xfree(rrdfn); rrdfn = NULL; + creparams = (char **)realloc(creparams, 7*sizeof(char *)); + memset(creparams, 0, 7*sizeof(char *)); + dscount = 0; + } + + /* Get the RRD filename */ + p = strchr(boln+1, ']'); if (p) *p = '\0'; + rrdfn = strdup(boln+1); + + /* And setup the initial rrdvalues string */ + sprintf(rrdvalues, "%d", (int)tstamp); + } + else if (strncmp(boln, "DS:", 3) == 0) { + char *valptr = boln + strcspn(boln, " \t"); + + if ((*valptr == ' ') || (*valptr == '\t')) { + *valptr = '\0'; valptr += 1 + strspn(valptr+1, " \t"); + dscount++; + creparams = (char **)realloc(creparams, (7+dscount)*sizeof(char **)); + creparams[1+dscount] = boln; + sprintf(rrdvalues+strlen(rrdvalues), ":%s", valptr); + } + } + + boln = (eoln ? eoln+1 : NULL); + } + + /* Do the last RRD set */ + if (rrdfn && (dscount > 0)) { + /* Setup the static RRD create-parameters */ + creparams[0] = "rrdcreate"; + creparams[1] = rrdfn; + creparams[2+dscount] = rra1; dscount++; + creparams[2+dscount] = rra2; dscount++; + creparams[2+dscount] = rra3; dscount++; + creparams[2+dscount] = rra4; dscount++; + creparams[2+dscount] = NULL; dscount++; + + create_and_update_rrd(hostname, rrdfn, creparams, NULL); + } + + if (rrdfn) xfree(rrdfn); + xfree(creparams); + + return 0; +} + --- ../hobbit-4.2.0/hobbitd/do_rrd.c 2006-08-09 22:10:05.000000000 +0200 +++ hobbitd/do_rrd.c 2007-01-17 15:21:19.516361306 +0100 @@ -309,6 +309,7 @@ #include "rrd/do_external.c" #include "rrd/do_filesizes.c" #include "rrd/do_counts.c" +#include "rrd/do_trends.c" #ifdef USE_BEA2 #include "rrd/do_bea2.c" @@ -368,6 +369,7 @@ else if (strcmp(id, "proccounts") == 0) res = do_counts_rrd("processes", hostname, testname, msg, tstamp); else if (strcmp(id, "portcounts") == 0) res = do_counts_rrd("ports", hostname, testname, msg, tstamp); else if (strcmp(id, "linecounts") == 0) res = do_derives_rrd("lines", hostname, testname, msg, tstamp); + else if (strcmp(id, "trends") == 0) res = do_trends_rrd(hostname, testname, msg, tstamp); #ifdef DO_ORCA else if (strcmp(id, "orca") == 0) res = do_orca_rrd(hostname, testname, msg, tstamp);