summaryrefslogtreecommitdiff
path: root/src/pmlogreduce/dometric.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmlogreduce/dometric.c')
-rw-r--r--src/pmlogreduce/dometric.c155
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++;
+}
+