Add support for rrdcached(1) (1/2: update)

This commit is contained in:
Pierre Pronchery 2016-02-07 18:58:12 +01:00
parent edb8efe603
commit 9b15ff87e6
3 changed files with 44 additions and 17 deletions

View File

@ -55,6 +55,7 @@ typedef struct _Host
struct _DaMon struct _DaMon
{ {
char const * prefix; char const * prefix;
char const * rrdcached;
unsigned int refresh; unsigned int refresh;
Host * hosts; Host * hosts;
unsigned int hosts_cnt; unsigned int hosts_cnt;
@ -161,7 +162,7 @@ int damon_update(DaMon * damon, RRDType type, char const * filename,
== NULL) == NULL)
return -1; return -1;
va_start(args, args_cnt); va_start(args, args_cnt);
ret = rrd_updatev(type, path, args_cnt, args); ret = rrd_updatev(type, damon->rrdcached, path, args_cnt, args);
va_end(args); va_end(args);
string_delete(path); string_delete(path);
return ret; return ret;
@ -203,6 +204,7 @@ static int _init_config(DaMon * damon, char const * filename)
if((config = config_new()) == NULL) if((config = config_new()) == NULL)
return 1; return 1;
damon->prefix = NULL; damon->prefix = NULL;
damon->rrdcached = NULL;
damon->refresh = DAMON_DEFAULT_REFRESH; damon->refresh = DAMON_DEFAULT_REFRESH;
damon->hosts = NULL; damon->hosts = NULL;
damon->hosts_cnt = 0; damon->hosts_cnt = 0;
@ -221,6 +223,13 @@ static int _init_config(DaMon * damon, char const * filename)
config_delete(config); config_delete(config);
return -1; return -1;
} }
if((p = config_get(config, "", "rrdcached")) != NULL
&& (damon->rrdcached = strdup(p)) == NULL)
{
free(damon->prefix);
config_delete(config);
return -1;
}
if((p = config_get(config, "", "refresh")) != NULL) if((p = config_get(config, "", "refresh")) != NULL)
{ {
tmp = strtol(p, &q, 10); tmp = strtol(p, &q, 10);
@ -353,5 +362,6 @@ static void _damon_destroy(DaMon * damon)
} }
event_delete(damon->event); event_delete(damon->event);
free(damon->hosts); free(damon->hosts);
free(damon->rrdcached);
free(damon->prefix); free(damon->prefix);
} }

View File

@ -63,7 +63,7 @@ static char * _rrd_timestamp(off_t offset);
/* rrd_create */ /* rrd_create */
static int _create_directories(char const * filename); static int _create_directories(char const * filename);
int rrd_create(RRDType type, char const * filename) int rrd_create(RRDType type, char const * rrdcached, char const * filename)
{ {
int ret; int ret;
char * argv[16] = { RRDTOOL, "create", NULL, "--start", NULL, NULL }; char * argv[16] = { RRDTOOL, "create", NULL, "--start", NULL, NULL };
@ -167,27 +167,30 @@ static int _create_directories(char const * filename)
/* rrd_update */ /* rrd_update */
int rrd_update(RRDType type, char const * filename, int args_cnt, ...) int rrd_update(RRDType type, char const * rrdcached, char const * filename, int
args_cnt, ...)
{ {
int ret; int ret;
va_list args; va_list args;
va_start(args, args_cnt); va_start(args, args_cnt);
ret = rrd_updatev(type, filename, args_cnt, args); ret = rrd_updatev(type, rrdcached, filename, args_cnt, args);
va_end(args); va_end(args);
return ret; return ret;
} }
/* rrd_updatev */ /* rrd_updatev */
int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args) int rrd_updatev(RRDType type, char const * rrdcached, char const * filename,
int args_cnt, va_list args)
{ {
struct stat st; struct stat st;
char * argv[] = { RRDTOOL, "update", NULL, NULL, NULL }; char * argv[] = { RRDTOOL, "update", NULL, NULL, NULL, NULL, NULL };
size_t i = 3;
struct timeval tv; struct timeval tv;
size_t s; size_t s;
int pos; int pos;
int i; int arg;
int ret; int ret;
#ifdef DEBUG #ifdef DEBUG
@ -198,7 +201,7 @@ int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args)
{ {
if(errno != ENOENT) if(errno != ENOENT)
return _rrd_perror(filename, -errno); return _rrd_perror(filename, -errno);
if(rrd_create(type, filename) != 0) if(rrd_create(type, rrdcached, filename) != 0)
return -1; return -1;
} }
/* prepare the parameters */ /* prepare the parameters */
@ -206,19 +209,32 @@ int rrd_updatev(RRDType type, char const * filename, int args_cnt, va_list args)
return _rrd_perror("gettimeofday", -errno); return _rrd_perror("gettimeofday", -errno);
if((argv[2] = string_new(filename)) == NULL) if((argv[2] = string_new(filename)) == NULL)
return 1; return 1;
s = (args_cnt + 1) * 12; if(rrdcached != NULL)
if((argv[3] = malloc(s)) == NULL)
{ {
argv[i++] = "--daemon";
if((argv[i++] = string_new(rrdcached)) == NULL)
{
string_delete(argv[2]);
return 1;
}
}
s = (args_cnt + 1) * 12;
if((argv[i] = malloc(s)) == NULL)
{
if(rrdcached != NULL)
string_delete(argv[4]);
string_delete(argv[2]); string_delete(argv[2]);
return _rrd_perror(NULL, -errno); return _rrd_perror(NULL, -errno);
} }
pos = snprintf(argv[3], s, "%ld", tv.tv_sec); pos = snprintf(argv[i], s, "%ld", tv.tv_sec);
for(i = 0; i < args_cnt; i++) for(arg = 0; arg < args_cnt; arg++)
pos += snprintf(&argv[3][pos], s - pos, ":%"PRIu64, pos += snprintf(&argv[i][pos], s - pos, ":%"PRIu64,
va_arg(args, uint64_t)); va_arg(args, uint64_t));
/* update the database */ /* update the database */
ret = _rrd_exec(argv); ret = _rrd_exec(argv);
free(argv[3]); free(argv[i]);
if(rrdcached != NULL)
string_delete(argv[4]);
string_delete(argv[2]); string_delete(argv[2]);
return ret; return ret;
} }

View File

@ -35,10 +35,11 @@ typedef enum _RRDType
/* functions */ /* functions */
int rrd_create(RRDType type, char const * filename); int rrd_create(RRDType type, char const * rrdcached, char const * filename);
int rrd_update(RRDType type, char const * filename, int args_cnt, ...); int rrd_update(RRDType type, char const * rrdcached, char const * filename,
int rrd_updatev(RRDType type, char const * filename, int args_cnt, ...);
int rrd_updatev(RRDType type, char const * rrdcached, char const * filename,
int args_cnt, va_list args); int args_cnt, va_list args);
#endif /* !DAMON_RRD_H */ #endif /* !DAMON_RRD_H */