Add support for tracking the process count

This commit is contained in:
Pierre Pronchery 2016-02-05 01:12:27 +01:00
parent bbc9ff99cb
commit e0e83edb26

View File

@ -32,33 +32,37 @@
/* damon_refresh */ /* damon_refresh */
typedef enum _SaltFunction typedef enum _SaltFunction
{ {
SF_STATUS_ALL_STATUS = 0 SF_STATUS_ALL_STATUS = 0,
SF_STATUS_PROCS
} SaltFunction; } SaltFunction;
#define SF_LAST SF_STATUS_ALL_STATUS #define SF_LAST SF_STATUS_PROCS
#define SF_COUNT (SF_LAST + 1) #define SF_COUNT (SF_LAST + 1)
static int _refresh_salt(DaMon * damon, static int _refresh_salt(DaMon * damon,
int (*callback)(DaMon * damon, json_t * json), int (*callback)(DaMon * damon, json_t * json),
SaltFunction function, ...); SaltFunction function, ...);
static int _refresh_status(DaMon * damon); static int _refresh_parse_hostname_diskusage(DaMon * damon,
static int _refresh_status_parse(DaMon * damon, json_t * json); char const * hostname, json_t * json);
static int _refresh_status_parse_diskusage(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_diskusage_volume(DaMon * damon,
json_t * json);
static int _refresh_status_parse_diskusage_volume(DaMon * damon,
char const * hostname, char const * volume, json_t * json); char const * hostname, char const * volume, json_t * json);
static int _refresh_status_parse_loadavg(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_loadavg(DaMon * damon, char const * hostname,
json_t * json); json_t * json);
static int _refresh_status_parse_procs(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_procs(DaMon * damon, char const * hostname,
json_t * json); json_t * json);
static int _refresh_status_parse_w(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_w(DaMon * damon, char const * hostname,
json_t * json); json_t * json);
static int _refresh_parse_status_all_status(DaMon * damon, json_t * json);
static int _refresh_parse_status_procs(DaMon * damon, json_t * json);
int damon_refresh(DaMon * damon) int damon_refresh(DaMon * damon)
{ {
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
_refresh_status(damon); _refresh_salt(damon, _refresh_parse_status_all_status,
SF_STATUS_ALL_STATUS);
_refresh_salt(damon, _refresh_parse_status_procs,
SF_STATUS_PROCS);
return 0; return 0;
} }
@ -67,7 +71,9 @@ static int _refresh_salt(DaMon * damon,
SaltFunction function, ...) SaltFunction function, ...)
{ {
char * functions[SF_COUNT] = { char * functions[SF_COUNT] = {
SALT " --out=json '*' status.all_status" }; SALT " --out=json '*' status.all_status",
SALT " --out=json '*' status.procs"
};
FILE * fp; FILE * fp;
const size_t flags = JSON_DISABLE_EOF_CHECK; const size_t flags = JSON_DISABLE_EOF_CHECK;
json_t * json; json_t * json;
@ -97,49 +103,8 @@ static int _refresh_salt(DaMon * damon,
return 0; return 0;
} }
static int _refresh_status(DaMon * damon) static int _refresh_parse_hostname_diskusage(DaMon * damon,
{ char const * hostname, json_t * json)
_refresh_salt(damon, _refresh_status_parse, SF_STATUS_ALL_STATUS);
return 0;
}
static int _refresh_status_parse(DaMon * damon, json_t * json)
{
char const * hostname;
json_t * what;
char const * status;
json_t * value;
if(!json_is_object(json))
return -1;
json_object_foreach(json, hostname, what)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: hostname: %s\n", hostname);
#endif
/* XXX report errors */
if(string_find(hostname, "/") != NULL)
return -1;
if(!json_is_object(what))
return -1;
json_object_foreach(what, status, value)
if(strcmp("diskusage", status) == 0)
_refresh_status_parse_diskusage(damon, hostname,
value);
else if(strcmp("loadavg", status) == 0)
_refresh_status_parse_loadavg(damon, hostname,
value);
else if(strcmp("procs", status) == 0)
_refresh_status_parse_procs(damon, hostname,
value);
else if(strcmp("w", status) == 0)
_refresh_status_parse_w(damon, hostname, value);
}
return 0;
}
static int _refresh_status_parse_diskusage(DaMon * damon, char const * hostname,
json_t * json)
{ {
int ret = 0; int ret = 0;
char const * volume; char const * volume;
@ -156,13 +121,13 @@ static int _refresh_status_parse_diskusage(DaMon * damon, char const * hostname,
if(string_find(volume, "/..") != NULL) if(string_find(volume, "/..") != NULL)
/* XXX report */ /* XXX report */
continue; continue;
ret |= _refresh_status_parse_diskusage_volume(damon, hostname, ret |= _refresh_parse_hostname_diskusage_volume(damon, hostname,
volume, value); volume, value);
} }
return ret; return ret;
} }
static int _refresh_status_parse_diskusage_volume(DaMon * damon, static int _refresh_parse_hostname_diskusage_volume(DaMon * damon,
char const * hostname, char const * volume, json_t * json) char const * hostname, char const * volume, json_t * json)
{ {
int ret; int ret;
@ -200,7 +165,7 @@ static int _refresh_status_parse_diskusage_volume(DaMon * damon,
return ret; return ret;
} }
static int _refresh_status_parse_loadavg(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_loadavg(DaMon * damon, char const * hostname,
json_t * json) json_t * json)
{ {
int ret; int ret;
@ -230,12 +195,12 @@ static int _refresh_status_parse_loadavg(DaMon * damon, char const * hostname,
return ret; return ret;
} }
static int _refresh_status_parse_procs(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_procs(DaMon * damon, char const * hostname,
json_t * json) json_t * json)
{ {
int ret; int ret;
uint64_t count = 0; uint64_t count = 0;
size_t index; char const * key;
json_t * value; json_t * value;
char * rrd; char * rrd;
@ -243,9 +208,9 @@ static int _refresh_status_parse_procs(DaMon * damon, char const * hostname,
fprintf(stderr, "DEBUG: %s(\"%s\", %d)\n", __func__, hostname, fprintf(stderr, "DEBUG: %s(\"%s\", %d)\n", __func__, hostname,
json_typeof(json)); json_typeof(json));
#endif #endif
if(!json_is_array(json)) if(!json_is_object(json))
return -1; return -1;
json_array_foreach(json, index, value) json_object_foreach(json, key, value)
count++; count++;
if((rrd = string_new_append(hostname, "/procs.rrd", NULL)) == NULL) if((rrd = string_new_append(hostname, "/procs.rrd", NULL)) == NULL)
return -1; return -1;
@ -254,7 +219,7 @@ static int _refresh_status_parse_procs(DaMon * damon, char const * hostname,
return ret; return ret;
} }
static int _refresh_status_parse_w(DaMon * damon, char const * hostname, static int _refresh_parse_hostname_w(DaMon * damon, char const * hostname,
json_t * json) json_t * json)
{ {
int ret; int ret;
@ -277,3 +242,62 @@ static int _refresh_status_parse_w(DaMon * damon, char const * hostname,
string_delete(rrd); string_delete(rrd);
return ret; return ret;
} }
static int _refresh_parse_status_all_status(DaMon * damon, json_t * json)
{
char const * hostname;
json_t * what;
char const * status;
json_t * value;
if(!json_is_object(json))
return -1;
json_object_foreach(json, hostname, what)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: hostname: %s\n", hostname);
#endif
/* XXX report errors */
if(string_find(hostname, "/") != NULL
|| strcmp(hostname, ".") == 0
|| strcmp(hostname, "..") == 0)
return -1;
if(!json_is_object(what))
return -1;
json_object_foreach(what, status, value)
if(strcmp("diskusage", status) == 0)
_refresh_parse_hostname_diskusage(damon,
hostname, value);
else if(strcmp("loadavg", status) == 0)
_refresh_parse_hostname_loadavg(damon, hostname,
value);
else if(strcmp("w", status) == 0)
_refresh_parse_hostname_w(damon, hostname,
value);
}
return 0;
}
static int _refresh_parse_status_procs(DaMon * damon, json_t * json)
{
char const * hostname;
json_t * value;
if(!json_is_object(json))
return -1;
json_object_foreach(json, hostname, value)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: hostname: %s\n", hostname);
#endif
/* XXX report errors */
if(string_find(hostname, "/") != NULL
|| strcmp(hostname, ".") == 0
|| strcmp(hostname, "..") == 0)
return -1;
if(!json_is_object(value))
return -1;
_refresh_parse_hostname_procs(damon, hostname, value);
}
return 0;
}