diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmlogreduce/dometric.c | |
download | pcp-debian/3.9.10.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmlogreduce/dometric.c')
-rw-r--r-- | src/pmlogreduce/dometric.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/pmlogreduce/dometric.c b/src/pmlogreduce/dometric.c new file mode 100644 index 0000000..6ba0fdc --- /dev/null +++ b/src/pmlogreduce/dometric.c @@ -0,0 +1,155 @@ +#include "pmlogreduce.h" + +void +dometric(const char *name) +{ + int sts; + metric_t *mp; + + if ((namelist = (char **)realloc(namelist, (numpmid+1)*sizeof(namelist[0]))) == NULL) { + fprintf(stderr, + "%s: dometric: Error: cannot realloc space for %d names\n", + pmProgname, numpmid+1); + exit(1); + } + namelist[numpmid] = strdup(name); + if ((pmidlist = (pmID *)realloc(pmidlist, (numpmid+1)*sizeof(pmidlist[0]))) == NULL) { + fprintf(stderr, + "%s: dometric: Error: cannot realloc space for %d pmIDs\n", + pmProgname, numpmid+1); + exit(1); + } + if ((sts = pmLookupName(1, (char **)&name, &pmidlist[numpmid])) < 0) { + fprintf(stderr, + "%s: dometric: Error: cannot lookup pmID for metric \"%s\": %s\n", + pmProgname, name, pmErrStr(sts)); + exit(1); + } + if ((metriclist = (metric_t *)realloc(metriclist, (numpmid+1)*sizeof(metriclist[0]))) == NULL) { + fprintf(stderr, + "%s: dometric: Error: cannot realloc space for %d metric_t's\n", + pmProgname, numpmid+1); + exit(1); + } + mp = &metriclist[numpmid]; + mp->first = NULL; + if ((sts = pmLookupDesc(pmidlist[numpmid], &mp->idesc)) < 0) { + fprintf(stderr, + "%s: dometric: Error: cannot lookup pmDesc for metric \"%s\": %s\n", + pmProgname, name, pmErrStr(sts)); + exit(1); + } + mp->odesc = mp->idesc; /* struct assignment */ + mp->mode = MODE_NORMAL; + mp->idp = NULL; + + /* + * some metrics cannot sensibly be processed ... skip these ones + */ + if (mp->idesc.type == PM_TYPE_AGGREGATE || + mp->idesc.type == PM_TYPE_AGGREGATE_STATIC || + mp->idesc.type == PM_TYPE_EVENT) { + fprintf(stderr, + "%s: %s: Warning: skipping %s metric\n", + pmProgname, name, pmTypeStr(mp->idesc.type)); + mp->mode = MODE_SKIP; + goto done; + } + + /* + * input -> output descriptor mapping ... has to be the same + * logic as we apply to the pmResults later on. + */ + switch (mp->idesc.sem) { + case PM_SEM_COUNTER: + switch (mp->idesc.type) { + case PM_TYPE_32: + mp->odesc.type = PM_TYPE_64; + mp->mode = MODE_REWRITE; + break; + case PM_TYPE_U32: + mp->odesc.type = PM_TYPE_U64; + mp->mode = MODE_REWRITE; + break; + } +#if 0 + mp->odesc.sem = PM_SEM_INSTANT; + if (mp->idesc.units.dimTime == 0) { + /* rate convert */ + mp->odesc.units.dimTime = -1; + mp->odesc.units.scaleTime = PM_TIME_SEC; + } + else if (mp->idesc.units.dimTime == 1) { + /* becomes (time) utilization */ + mp->odesc.units.dimTime = 0; + mp->odesc.units.scaleTime = 0; + } + else { + fprintf(stderr, "Cannot rate convert \"%s\" yet,", namelist[numpmid]); + __pmPrintDesc(stderr, &mp->idesc); + exit(1); + } + break; +#endif + } +#if PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL0) { + fprintf(stderr, "metric: \"%s\" (%s)\n", + namelist[numpmid], pmIDStr(pmidlist[numpmid])); + fprintf(stderr, "input descriptor:\n"); + __pmPrintDesc(stderr, &mp->idesc); + fprintf(stderr, "output descriptor (added to archive):\n"); + __pmPrintDesc(stderr, &mp->odesc); + } +#endif + + if ((sts = __pmLogPutDesc(&logctl, &mp->odesc, 1, &namelist[numpmid])) < 0) { + fprintf(stderr, + "%s: Error: failed to add pmDesc for %s (%s): %s\n", + pmProgname, namelist[numpmid], pmIDStr(pmidlist[numpmid]), pmErrStr(sts)); + exit(1); + } + + /* + * instance domain initialization + */ + if (mp->idesc.indom != PM_INDOM_NULL) { + /* + * has an instance domain, check to see if it has already been seen + */ + int j; + + for (j = 0; j <= numpmid; j++) { + if (metriclist[j].idp != NULL && + metriclist[j].idp->indom == mp->idesc.indom) { + mp->idp = metriclist[j].idp; + break; + } + } + if (j > numpmid) { + /* first sighting, allocate a new one */ + if ((mp->idp = (indom_t *)malloc(sizeof(indom_t))) == NULL) { + fprintf(stderr, + "%s: dometric: Error: cannot malloc indom_t for %s\n", + pmProgname, pmInDomStr(mp->idesc.indom)); + exit(1); + } + mp->idp->indom = mp->idesc.indom; + mp->idp->numinst = 0; + mp->idp->inst = NULL; + mp->idp->name = NULL; + } + } + +#if PCP_DEBUG + if (pmDebug & DBG_TRACE_APPL0) { + if (mp->idp != NULL) + fprintf(stderr, " indom %s -> (" PRINTF_P_PFX "%p)\n", pmInDomStr(mp->idp->indom), mp->idp); + } +#endif + +done: + + numpmid++; +} + |