static void dump_metric(int numnames, char **names, pmValueSet *vsp, int index, int indom, int type) { pmValue *vp = &vsp->vlist[index]; char *iname; if (index == 0) { printf(" %s (", pmIDStr(vsp->pmid)); __pmPrintMetricNames(stdout, numnames, names, " or "); printf("):"); if (vsp->numval > 1) { putchar('\n'); printf(" "); } } else printf(" "); if (indom != PM_INDOM_NULL) { printf(" inst ["); if (pmNameInDom(indom, vp->inst, &iname) < 0) printf("%d or ???]", vp->inst); else { printf("%d or \"%s\"]", vp->inst, iname); free(iname); } } printf(" value "); pmPrintValue(stdout, vsp->valfmt, type, vp, 1); putchar('\n'); }
static void mydump(const char *name, pmDesc *dp, pmValueSet *vsp) { int j; char *p; if (vsp->numval == 0) { if (verbose) printf("%s: No value(s) available!\n", name); return; } else if (vsp->numval < 0) { printf("%s: Error: %s\n", name, pmErrStr(vsp->numval)); return; } printf(" %s", name); for (j = 0; j < vsp->numval; j++) { pmValue *vp = &vsp->vlist[j]; if (dp->indom != PM_INDOM_NULL) { if (vsp->numval > 1) printf("\n "); if ((p = lookup(dp->indom, vp->inst)) == NULL) printf("[%d]", vp->inst); else printf("[\"%s\"]", p); } putchar(' '); switch (dp->type) { case PM_TYPE_AGGREGATE: case PM_TYPE_AGGREGATE_STATIC: { /* * pinched from pmPrintValue, just without the preamble of * floating point values */ char *p; int i; putchar('['); p = &vp->value.pval->vbuf[0]; for (i = 0; i < vp->value.pval->vlen - PM_VAL_HDR_SIZE; i++, p++) printf("%02x", *p & 0xff); putchar(']'); putchar('\n'); break; } case PM_TYPE_EVENT: case PM_TYPE_HIGHRES_EVENT: /* odd, nested event type! */ myeventdump(vsp, j, dp->type != PM_TYPE_EVENT); break; default: pmPrintValue(stdout, vsp->valfmt, dp->type, vp, 1); putchar('\n'); } } }
void _dbDumpResult(FILE *f, pmResult *resp, pmDesc *desc_list) { int i; int j; int n; char **names; fprintf(f, "pmResult dump from " PRINTF_P_PFX "%p timestamp: %d.%06d ", resp, (int)resp->timestamp.tv_sec, (int)resp->timestamp.tv_usec); pmPrintStamp(f, &resp->timestamp); fprintf(f, " numpmid: %d\n", resp->numpmid); for (i = 0; i < resp->numpmid; i++) { pmValueSet *vsp = resp->vset[i]; names = NULL; /* silence coverity */ n = pmNameAll(vsp->pmid, &names); if (n < 0) fprintf(f, " %s (%s):", pmIDStr(vsp->pmid), "<noname>"); else { fprintf(f, " %s (", pmIDStr(vsp->pmid)); __pmPrintMetricNames(f, n, names, " or "); fprintf(f, "):"); free(names); } if (vsp->numval == 0) { fprintf(f, " No values returned!\n"); continue; } else if (vsp->numval < 0) { fprintf(f, " %s\n", pmErrStr(vsp->numval)); continue; } fprintf(f, " numval: %d", vsp->numval); fprintf(f, " valfmt: %d vlist[]:\n", vsp->valfmt); for (j = 0; j < vsp->numval; j++) { pmValue *vp = &vsp->vlist[j]; if (vsp->numval > 1 || desc_list[i].indom != PM_INDOM_NULL) { fprintf(f, " inst [%d", vp->inst); fprintf(f, " or ???]"); fputc(' ', f); } else fprintf(f, " "); fprintf(f, "value "); pmPrintValue(f, vsp->valfmt, desc_list[i].type, vp, 1); fputc('\n', f); }/*for*/ }/*for*/ }/*_dbDumpResult*/
/* * we only ever have one metric */ static void mydump(pmDesc *dp, pmValueSet *vsp, char *indent) { int j; char *p; if (indent != NULL) printf("%s", indent); if (vsp->numval == 0) { printf("No value(s) available!\n"); return; } else if (vsp->numval < 0) { printf("Error: %s\n", pmErrStr(vsp->numval)); return; } for (j = 0; j < vsp->numval; j++) { pmValue *vp = &vsp->vlist[j]; if (dp->indom != PM_INDOM_NULL) { if ((p = lookup(dp->indom, vp->inst)) == NULL) { if (p_force) { /* the instance disappeared; ignore it */ printf(" inst [%d \"%s\"]\n", vp->inst, "DISAPPEARED"); continue; } else { /* report the error and give up */ printf("pmNameIndom: indom=%s inst=%d: %s\n", pmInDomStr(dp->indom), vp->inst, pmErrStr(PM_ERR_INST)); printf(" inst [%d]", vp->inst); } } else printf(" inst [%d or \"%s\"]", vp->inst, p); } else printf(" "); printf(" value "); pmPrintValue(stdout, vsp->valfmt, dp->type, vp, 1); putchar('\n'); if (!events) continue; if (dp->type == PM_TYPE_HIGHRES_EVENT) myeventdump(vsp, j, 1); else if (dp->type == PM_TYPE_EVENT) myeventdump(vsp, j, 0); } }
static void dump_parameter(pmValueSet *xvsp, int index, int *flagsp) { int sts, flags = *flagsp; pmDesc desc; char **names; if ((sts = pmNameAll(xvsp->pmid, &names)) >= 0) { if (index == 0) { if (xvsp->pmid == pmid_flags) { flags = *flagsp = xvsp->vlist[0].value.lval; printf(" flags 0x%x", flags); printf(" (%s) ---\n", pmEventFlagsStr(flags)); free(names); return; } printf(" ---\n"); } if ((flags & PM_EVENT_FLAG_MISSED) && index == 1 && (xvsp->pmid == pmid_missed)) { printf(" ==> %d missed event records\n", xvsp->vlist[0].value.lval); free(names); return; } printf(" %s (", pmIDStr(xvsp->pmid)); __pmPrintMetricNames(stdout, sts, names, " or "); printf("):"); free(names); } else printf(" PMID: %s:", pmIDStr(xvsp->pmid)); if ((sts = pmLookupDesc(xvsp->pmid, &desc)) < 0) { printf(" pmLookupDesc: %s\n", pmErrStr(sts)); return; } printf(" value "); pmPrintValue(stdout, xvsp->valfmt, desc.type, &xvsp->vlist[0], 1); putchar('\n'); }
/* * stolen from __pmDumpResult */ static void dumpcontrol(FILE *f, const pmResult *resp, int dovalue) { int i; int j; fprintf(f,"LogControl dump from " PRINTF_P_PFX "%p", resp); fprintf(f, " numpmid: %d\n", resp->numpmid); for (i = 0; i < resp->numpmid; i++) { pmValueSet *vsp = resp->vset[i]; fprintf(f," %s :", pmIDStr(vsp->pmid)); if (vsp->numval == 0) { fprintf(f, " No values!\n"); continue; } else if (vsp->numval < 0) { fprintf(f, " %s\n", pmErrStr(vsp->numval)); continue; } fprintf(f, " numval: %d", vsp->numval); fprintf(f, " valfmt: %d", vsp->valfmt); for (j = 0; j < vsp->numval; j++) { pmValue *vp = &vsp->vlist[j]; if (vsp->numval > 1 || vp->inst != PM_INDOM_NULL) { fprintf(f," inst [%d]", vp->inst); } else fprintf(f, " singular"); if (dovalue) { fprintf(f, " value "); pmPrintValue(f, vsp->valfmt, PM_TYPE_U32, vp, 1); } fputc('\n', f); } } }
/* Print performance metric values */ static void printvals(Context *x, pmValueSet *vset, int cols) { int i, j; pmAtomValue av; int doreal = 0; if (x->desc.type == PM_TYPE_FLOAT || x->desc.type == PM_TYPE_DOUBLE) doreal = 1; /* null instance domain */ if (x->desc.indom == PM_INDOM_NULL) { if (vset->numval == 1) { if (doreal) { pmExtractValue(vset->valfmt, &vset->vlist[0], x->desc.type, &av, PM_TYPE_DOUBLE); printreal(av.d, cols); } else pmPrintValue(stdout, vset->valfmt, x->desc.type, &vset->vlist[0], cols); } else printf("%*s", cols, "?"); putchar('\n'); } /* non-null instance domain */ else { for (i = 0; i < x->inum; i++) { for (j = 0; j < vset->numval; j++) { if (vset->vlist[j].inst == x->ipairs[i].id) break; } if (j < vset->numval) { if (doreal) { pmExtractValue(vset->valfmt, &vset->vlist[j], x->desc.type, &av, PM_TYPE_DOUBLE); printreal(av.d, cols); } else pmPrintValue(stdout, vset->valfmt, x->desc.type, &vset->vlist[j], cols); } else printf("%*s", cols, "?"); putchar(' '); } putchar('\n'); for (j = 0; j < vset->numval; j++) { for (i = 0; i < x->inum; i++) { if (vset->vlist[j].inst == x->ipairs[i].id) break; } if (x->iall == 1 && i == x->inum) { printf("Warning: value="); if (doreal) { pmExtractValue(vset->valfmt, &vset->vlist[j], x->desc.type, &av, PM_TYPE_DOUBLE); printreal(av.d, 1); } else pmPrintValue(stdout, vset->valfmt, x->desc.type, &vset->vlist[j], 1); printf(", but instance=%d is unknown\n", vset->vlist[j].inst); } } } }
int main(int argc, char **argv) { int type = PM_CONTEXT_HOST; int c; int sts; int errflag = 0; char *host = "localhost"; static char *usage = "[-D N] [-h hostname] metric stringvalue"; int len; int n; char *namelist[1]; pmID pmidlist[1]; pmResult *res; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:h:")) != EOF) { switch (c) { #ifdef PCP_DEBUG case 'D': /* debug flag */ sts = __pmParseDebug(optarg); if (sts < 0) { fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", pmProgname, optarg); errflag++; } else pmDebug |= sts; break; #endif case 'h': /* hostname for PMCD to contact */ host = optarg; break; case '?': default: errflag++; break; } } if (errflag || optind != argc-2) { printf("Usage: %s %s\n", pmProgname, usage); exit(1); } if ((sts = pmNewContext(type, host)) < 0) { printf("%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, host, pmErrStr(sts)); exit(1); } namelist[0] = argv[optind]; n = pmLookupName(1, namelist, pmidlist); if (n < 0 || pmidlist[0] == PM_ID_NULL) { printf("pmLookupName: %s\n", pmErrStr(n)); exit(1); } if ((n = pmFetch(1, pmidlist, &res)) < 0) { printf("pmFetch: %s\n", pmErrStr(n)); exit(1); } /* * expecting one value and a pmValueBlock with a type * of PM_TYPE_AGGREGATE */ if (res->vset[0]->numval != 1) { printf("Expecting numval 1, found %d\n", res->vset[0]->numval); __pmDumpResult(stdout, res); exit(1); } if (res->vset[0]->valfmt == PM_VAL_INSITU) { printf("Not expecing PM_VAL_INSITU\n"); __pmDumpResult(stdout, res); exit(1); } if (res->vset[0]->vlist[0].value.pval->vtype != PM_TYPE_AGGREGATE) { printf("Not expecing type %s\n", pmTypeStr(res->vset[0]->vlist[0].value.pval->vtype)); __pmDumpResult(stdout, res); exit(1); } printf("%s old value: ", namelist[0]); pmPrintValue(stdout, res->vset[0]->valfmt, res->vset[0]->vlist[0].value.pval->vtype, &res->vset[0]->vlist[0], 0); /* * old value is probably from a pinned PDU buffer ... don't free * and accept small mem leak here */ len = strlen(argv[optind+1]); res->vset[0]->vlist[0].value.pval = (pmValueBlock *)malloc(len + PM_VAL_HDR_SIZE); res->vset[0]->vlist[0].value.pval->vtype = PM_TYPE_AGGREGATE; res->vset[0]->vlist[0].value.pval->vlen = len + PM_VAL_HDR_SIZE; memcpy(res->vset[0]->vlist[0].value.pval->vbuf, argv[optind+1], len); if ((n = pmStore(res)) < 0) { printf("pmStore: %s\n", pmErrStr(n)); exit(1); } pmFreeResult(res); if ((n = pmFetch(1, pmidlist, &res)) < 0) { printf("pmFetch again: %s\n", pmErrStr(n)); exit(1); } printf(" new value: "); pmPrintValue(stdout, res->vset[0]->valfmt, res->vset[0]->vlist[0].value.pval->vtype, &res->vset[0]->vlist[0], 0); putchar('\n'); pmFreeResult(res); exit(0); }
int main(int argc, char **argv) { int sts; int n; int c; int i; char *p; char *source; char *namelist[1]; pmID pmidlist[1]; pmResult *result; char **instnames = NULL; int numinst = 0; int force = 0; pmDesc desc; pmAtomValue nav; pmValueSet *vsp; char *subopt; while ((c = pmGetOptions(argc, argv, &opts)) != EOF) { switch (c) { case 'f': force++; break; case 'i': /* list of instances */ #define WHITESPACE ", \t\n" subopt = strtok(opts.optarg, WHITESPACE); while (subopt != NULL) { numinst++; n = numinst * sizeof(char *); instnames = (char **)realloc(instnames, n); if (instnames == NULL) __pmNoMem("pmstore.instnames", n, PM_FATAL_ERR); instnames[numinst-1] = subopt; subopt = strtok(NULL, WHITESPACE); } #undef WHITESPACE break; default: opts.errors++; break; } } if (opts.errors || opts.optind != argc - 2) { pmUsageMessage(&opts); exit(1); } if (opts.context == PM_CONTEXT_HOST) source = opts.hosts[0]; else if (opts.context == PM_CONTEXT_LOCAL) source = NULL; else { opts.context = PM_CONTEXT_HOST; source = "local:"; } if ((sts = pmNewContext(opts.context, source)) < 0) { if (opts.context == PM_CONTEXT_LOCAL) fprintf(stderr, "%s: Cannot make standalone local connection: %s\n", pmProgname, pmErrStr(sts)); else fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, source, pmErrStr(sts)); exit(1); } namelist[0] = argv[opts.optind++]; if ((n = pmLookupName(1, namelist, pmidlist)) < 0) { printf("%s: pmLookupName: %s\n", namelist[0], pmErrStr(n)); exit(1); } if (pmidlist[0] == PM_ID_NULL) { printf("%s: unknown metric\n", namelist[0]); exit(1); } if ((n = pmLookupDesc(pmidlist[0], &desc)) < 0) { printf("%s: pmLookupDesc: %s\n", namelist[0], pmErrStr(n)); exit(1); } if (desc.type == PM_TYPE_AGGREGATE || desc.type == PM_TYPE_AGGREGATE_STATIC) { fprintf(stderr, "%s: Cannot modify values for PM_TYPE_AGGREGATE metrics\n", pmProgname); exit(1); } if (desc.type == PM_TYPE_EVENT || desc.type == PM_TYPE_HIGHRES_EVENT) { fprintf(stderr, "%s: Cannot modify values for event type metrics\n", pmProgname); exit(1); } if (instnames != NULL) { pmDelProfile(desc.indom, 0, NULL); for (i = 0; i < numinst; i++) { if ((n = pmLookupInDom(desc.indom, instnames[i])) < 0) { printf("pmLookupInDom %s[%s]: %s\n", namelist[0], instnames[i], pmErrStr(n)); exit(1); } if ((sts = pmAddProfile(desc.indom, 1, &n)) < 0) { printf("pmAddProfile %s[%s]: %s\n", namelist[0], instnames[i], pmErrStr(sts)); exit(1); } } } if ((n = pmFetch(1, pmidlist, &result)) < 0) { printf("%s: pmFetch: %s\n", namelist[0], pmErrStr(n)); exit(1); } /* value is argv[opts.optind] */ mkAtom(&nav, desc.type, argv[opts.optind]); vsp = result->vset[0]; if (vsp->numval < 0) { printf("%s: Error: %s\n", namelist[0], pmErrStr(vsp->numval)); exit(1); } if (vsp->numval == 0) { if (!force) { printf("%s: No value(s) available!\n", namelist[0]); exit(1); } else { pmAtomValue tmpav; mkAtom(&tmpav, PM_TYPE_STRING, "(none)"); vsp->numval = 1; vsp->valfmt = __pmStuffValue(&tmpav, &vsp->vlist[0], PM_TYPE_STRING); } } for (i = 0; i < vsp->numval; i++) { pmValue *vp = &vsp->vlist[i]; printf("%s", namelist[0]); if (desc.indom != PM_INDOM_NULL) { if ((n = pmNameInDom(desc.indom, vp->inst, &p)) < 0) printf(" inst [%d]", vp->inst); else { printf(" inst [%d or \"%s\"]", vp->inst, p); free(p); } } printf(" old value="); pmPrintValue(stdout, vsp->valfmt, desc.type, vp, 1); vsp->valfmt = __pmStuffValue(&nav, &vsp->vlist[i], desc.type); printf(" new value="); pmPrintValue(stdout, vsp->valfmt, desc.type, vp, 1); putchar('\n'); } if ((n = pmStore(result)) < 0) { printf("%s: pmStore: %s\n", namelist[0], pmErrStr(n)); exit(1); } pmFreeResult(result); exit(0); }