static void dumpDesc(__pmContext *ctxp) { int i; int sts; char **names; __pmHashNode *hp; pmDesc *dp; printf("\nDescriptions for Metrics in the Log ...\n"); for (i = 0; i < ctxp->c_archctl->ac_log->l_hashpmid.hsize; i++) { for (hp = ctxp->c_archctl->ac_log->l_hashpmid.hash[i]; hp != NULL; hp = hp->next) { dp = (pmDesc *)hp->data; sts = pmNameAll(dp->pmid, &names); if (sts < 0) printf("PMID: %s (%s)\n", pmIDStr(dp->pmid), "<noname>"); else { printf("PMID: %s (", pmIDStr(dp->pmid)); __pmPrintMetricNames(stdout, sts, names, " or "); printf(")\n"); free(names); } __pmPrintDesc(stdout, dp); } } }
/* * Do a descriptor pdu. * Abstracted here for several calls. */ int dodso_desc(pmID pmid, pmDesc *desc) { int sts; #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_PDU) fprintf(stderr, "DSO desc()\n"); #endif sts = dispatch.version.any.desc(pmid, desc, dispatch.version.four.ext); #ifdef PCP_DEBUG if (sts >= 0 && (pmDebug & DBG_TRACE_PDU)) __pmPrintDesc(stdout, desc); #endif return sts; }/*dodso_desc*/
void dodso(int pdu) { int sts = 0; /* initialize to pander to gcc */ int length; pmDesc desc; pmDesc *desc_list = NULL; pmResult *result; __pmInResult *inresult; int i; int j; char *buffer; struct timeval start; struct timeval end; char name[32]; char **namelist; int *statuslist; pmID pmid; if (timer != 0) __pmtimevalNow(&start); switch (pdu) { case PDU_DESC_REQ: printf("PMID: %s\n", pmIDStr(param.pmid)); if ((sts = dodso_desc(param.pmid, &desc)) >= 0) __pmPrintDesc(stdout, &desc); else printf("Error: DSO desc() failed: %s\n", pmErrStr(sts)); break; case PDU_FETCH: printf("PMID(s):"); for (i = 0; i < param.numpmid; i++) printf(" %s", pmIDStr(param.pmidlist[i])); putchar('\n'); if (get_desc) { desc_list = (pmDesc *)malloc(param.numpmid * sizeof(pmDesc)); if (desc_list == NULL) { printf("Error: DSO fetch() failed: %s\n", pmErrStr(ENOMEM)); return; } for (i = 0; i < param.numpmid; i++) { if ((sts = dodso_desc(param.pmidlist[i], &desc_list[i])) < 0) { printf("Error: DSO desc() failed: %s\n", pmErrStr(sts)); free(desc_list); return; } } } sts = 0; if (profile_changed) { #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_PDU) fprintf(stderr, "DSO profile()\n"); #endif sts = dispatch.version.any.profile(profile, dispatch.version.any.ext); if (sts < 0) printf("Error: DSO profile() failed: %s\n", pmErrStr(sts)); else profile_changed = 0; } if (sts >= 0) { #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_PDU) fprintf(stderr, "DSO fetch()\n"); #endif sts = dispatch.version.any.fetch(param.numpmid, param.pmidlist, &result, dispatch.version.any.ext); if (sts >= 0) { if (desc_list) _dbDumpResult(stdout, result, desc_list); else __pmDumpResult(stdout, result); /* * DSO PMDA will manage the pmResult skelton, but * we need to free the pmValueSets and values here */ __pmFreeResultValues(result); } else { printf("Error: DSO fetch() failed: %s\n", pmErrStr(sts)); } } if (desc_list) free(desc_list); break; case PDU_INSTANCE_REQ: printf("pmInDom: %s\n", pmInDomStr(param.indom)); #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_PDU) fprintf(stderr, "DSO instance()\n"); #endif sts = dispatch.version.any.instance(param.indom, param.number, param.name, &inresult, dispatch.version.any.ext); if (sts >= 0) printindom(stdout, inresult); else printf("Error: DSO instance() failed: %s\n", pmErrStr(sts)); break; case PDU_RESULT: printf("PMID: %s\n", pmIDStr(param.pmid)); printf("Getting description...\n"); desc_list = &desc; if ((sts = dodso_desc(param.pmid, desc_list)) < 0) { printf("Error: DSO desc() failed: %s\n", pmErrStr(sts)); return; } if (profile_changed) { printf("Sending Profile...\n"); sts = dispatch.version.any.profile(profile, dispatch.version.any.ext); if (sts < 0) { printf("Error: DSO profile() failed: %s\n", pmErrStr(sts)); return; } else profile_changed = 0; } printf("Getting Result Structure...\n"); sts = dispatch.version.any.fetch(1, &(desc.pmid), &result, dispatch.version.any.ext); if (sts < 0) { printf("Error: DSO fetch() failed: %s\n", pmErrStr(sts)); return; } #ifdef PCP_DEBUG else if (pmDebug & DBG_TRACE_FETCH) _dbDumpResult(stdout, result, desc_list); #endif sts = fillResult(result, desc.type); if (sts < 0) { pmFreeResult(result); return; } sts = dispatch.version.any.store(result, dispatch.version.any.ext); if (sts < 0) printf("Error: DSO store() failed: %s\n", pmErrStr(sts)); break; case PDU_TEXT_REQ: if (param.number == PM_TEXT_PMID) { printf("PMID: %s\n", pmIDStr(param.pmid)); i = param.pmid; } else { printf("pmInDom: %s\n", pmInDomStr(param.indom)); i = param.indom; } for (j = 0; j < 2; j++) { if (j == 0) param.number |= PM_TEXT_ONELINE; else { param.number &= ~PM_TEXT_ONELINE; param.number |= PM_TEXT_HELP; } sts = dispatch.version.any.text(i, param.number, &buffer, dispatch.version.any.ext); if (sts >= 0) { if (j == 0) { if (*buffer != '\0') printf("[%s]\n", buffer); else printf("[<no one line help text specified>]\n"); } else if (*buffer != '\0') printf("%s\n", buffer); else printf("<no help text specified>\n"); } else printf("Error: DSO text() failed: %s\n", pmErrStr(sts)); } break; case PDU_PMNS_IDS: if (dispatch.comm.pmda_interface < PMDA_INTERFACE_4) { printf("Error: PMDA Interface %d does not support dynamic metric names\n", dispatch.comm.pmda_interface); break; } printf("PMID: %s\n", pmIDStr(param.pmid)); sts = dispatch.version.four.name(param.pmid, &namelist, dispatch.version.four.ext); if (sts > 0) { for (i = 0; i < sts; i++) { printf(" %s\n", namelist[i]); } free(namelist); } else if (sts == 0) printf("Warning: DSO name() returns 0\n"); else printf("Error: DSO name() failed: %s\n", pmErrStr(sts)); break; case PDU_PMNS_NAMES: if (dispatch.comm.pmda_interface < PMDA_INTERFACE_4) { printf("Error: PMDA Interface %d does not support dynamic metric names\n", dispatch.comm.pmda_interface); break; } printf("Metric: %s\n", param.name); sts = dispatch.version.four.pmid(param.name, &pmid, dispatch.version.four.ext); if (sts >= 0) printf(" %s\n", pmIDStr(pmid)); else printf("Error: DSO pmid() failed: %s\n", pmErrStr(sts)); break; case PDU_PMNS_CHILD: if (dispatch.comm.pmda_interface < PMDA_INTERFACE_4) { printf("Error: PMDA Interface %d does not support dynamic metric names\n", dispatch.comm.pmda_interface); break; } printf("Metric: %s\n", param.name); sts = dispatch.version.four.children(param.name, 0, &namelist, &statuslist, dispatch.version.four.ext); if (sts > 0) { for (i = 0; i < sts; i++) { printf(" %8.8s %s\n", statuslist[i] == 1 ? "non-leaf" : "leaf", namelist[i]); } free(namelist); free(statuslist); } else if (sts == 0) printf("Warning: DSO children() returns 0\n"); else printf("Error: DSO children() failed: %s\n", pmErrStr(sts)); break; case PDU_PMNS_TRAVERSE: if (dispatch.comm.pmda_interface < PMDA_INTERFACE_4) { printf("Error: PMDA Interface %d does not support dynamic metric names\n", dispatch.comm.pmda_interface); break; } printf("Metric: %s\n", param.name); sts = dispatch.version.four.children(param.name, 1, &namelist, &statuslist, dispatch.version.four.ext); if (sts > 0) { for (i = 0; i < sts; i++) { printf(" %8.8s %s\n", statuslist[i] == 1 ? "non-leaf" : "leaf", namelist[i]); } free(namelist); free(statuslist); } else if (sts == 0) printf("Warning: DSO children() returns 0\n"); else printf("Error: DSO children() failed: %s\n", pmErrStr(sts)); break; case PDU_AUTH: if (dispatch.comm.pmda_interface < PMDA_INTERFACE_6) { printf("Error: PMDA Interface %d does not support authentication\n", dispatch.comm.pmda_interface); break; } j = param.number; /* attribute key */ buffer = param.name; /* attribute value */ if (buffer) length = strlen(buffer) + 1; /* length of value */ else length = 0; i = 0; /* client ID */ __pmAttrKeyStr_r(j, name, sizeof(name)-1); name[sizeof(name)-1] = '\0'; printf("Attribute: %s=%s\n", name, buffer ? buffer : "''"); sts = dispatch.version.six.attribute(i, j, buffer, length, dispatch.version.six.ext); if (sts >= 0) printf("Success\n"); else printf("Error: DSO attribute() failed: %s\n", pmErrStr(sts)); break; default: printf("Error: DSO PDU (%s) botch!\n", __pmPDUTypeStr(pdu)); break; } if (sts >= 0 && timer != 0) { __pmtimevalNow(&end); printf("Timer: %f seconds\n", __pmtimevalSub(&end, &start)); } }
void pmiDump(void) { FILE *f = stderr; fprintf(f, "pmiDump: context %ld of %d", (long)(current - context_tab), ncontext); if (current == NULL) { fprintf(f, " Error: current context is not defined.\n"); return; } else { fprintf(f, " archive: %s\n", current->archive == NULL ? "<undefined>" : current->archive); } fprintf(f, " state: %d ", current->state); switch (current->state) { case CONTEXT_START: fprintf(f, "(start)"); break; case CONTEXT_ACTIVE: fprintf(f, "(active)"); break; case CONTEXT_END: fprintf(f, "(end)"); break; default: fprintf(f, "(BAD)"); break; } fprintf(f, " hostname: %s timezone: %s\n", current->hostname == NULL ? "<undefined>" : current->hostname, current->timezone == NULL ? "<undefined>" : current->timezone); if (current->nmetric == 0) fprintf(f, " No metrics.\n"); else { int m; char strbuf[20]; for (m = 0; m < current->nmetric; m++) { fprintf(f, " metric[%d] name=%s pmid=%s\n", m, current->metric[m].name, pmIDStr_r(current->metric[m].pmid, strbuf, sizeof(strbuf))); __pmPrintDesc(f, ¤t->metric[m].desc); } } if (current->nindom == 0) fprintf(f, " No indoms.\n"); else { int i; char strbuf[20]; for (i = 0; i < current->nindom; i++) { fprintf(f, " indom[%d] indom=%s", i, pmInDomStr_r(current->indom[i].indom, strbuf, sizeof(strbuf))); if (current->indom[i].ninstance == 0) { fprintf(f, " No instances.\n"); } else { int j; fputc('\n', f); for (j = 0; j < current->indom[i].ninstance; j++) { fprintf(f, " instance[%d] %s (%d)\n", j, current->indom[i].name[j], current->indom[i].inst[j]); } } } } if (current->nhandle == 0) fprintf(f, " No handles.\n"); else { int h; char strbuf[20]; for (h = 0; h < current->nhandle; h++) { fprintf(f, " handle[%d] metric=%s (%s) instance=%d\n", h, current->metric[current->handle[h].midx].name, pmIDStr_r(current->metric[current->handle[h].midx].pmid, strbuf, sizeof(strbuf)), current->handle[h].inst); } } if (current->result == NULL) fprintf(f, " No pmResult.\n"); else __pmDumpResult(f, current->result); }
int main(int argc, char* argv[]) { int sts = 0; int c; char buf[MAXHOSTNAMELEN]; QString source; pmProgname = basename(argv[0]); while ((c = getopt(argc, argv, "D:?")) != EOF) { switch (c) { case 'D': sts = __pmParseDebug(optarg); if (sts < 0) { pmprintf("%s: unrecognized debug flag specification (%s)\n", pmProgname, optarg); sts = 1; } else { pmDebug |= sts; sts = 0; } break; case '?': default: sts = 1; break; } } if (sts) { pmprintf("Usage: %s\n", pmProgname); pmflush(); exit(1); /*NOTREACHED*/ } (void)gethostname(buf, MAXHOSTNAMELEN); buf[MAXHOSTNAMELEN-1] = '\0'; source = buf; fprintf(stderr,"*** Compare metric descriptor with pminfo output ***\n"); QmcSource *src = QmcSource::getSource(PM_CONTEXT_HOST, source, false); if (src->status() < 0) { pmprintf("%s: Error: Unable to create context to \"%s\": %s\n", pmProgname, buf, pmErrStr(src->status())); pmflush(); return 1; } /* Linux hinv.ncpu PMID: 60.0.32 */ pmID hinv_ncpu = pmid_build(60, 0, 32); QmcDesc hinv_ncpu_pmc(hinv_ncpu); pmDesc hinv_ncpu_desc = hinv_ncpu_pmc.desc(); if (hinv_ncpu_pmc.status() < 0) { pmprintf("\n%s: Error: hinv.ncpu: %s\n", pmProgname, pmErrStr(hinv_ncpu_pmc.status())); pmflush(); sts = 1; } printf("hinv.ncpu\n"); __pmPrintDesc(stdout, &hinv_ncpu_desc); fflush(stdout); fflush(stderr); if (system("pminfo -d hinv.ncpu") < 0) { pmprintf("%s: Error: Unable to run pminfo\n", pmProgname); pmflush(); sts = 1; } fflush(stdout); fflush(stderr); fprintf(stderr, "\n*** Fetch a bad descriptor ***\n"); pmID bad = pmid_build(42,42,42); QmcDesc bad_pmc(bad); if (bad_pmc.status() < 0) { pmprintf("%s: Error: Bogus metric: %s\n", pmProgname, pmErrStr(bad_pmc.status())); pmflush(); } else sts = 1; return sts; }
static void report(void) { int i; int sts; pmDesc desc; pmResult *result = NULL; pmResult *xresult = NULL; pmValueSet *vsp = NULL; char *buffer; int all_count; int *all_inst; char **all_names; if (batchidx == 0) return; /* Lookup names. * Cull out names that were unsuccessfully looked up. * However, it is unlikely to fail because names come from a traverse PMNS. */ if (need_pmid) { if ((sts = pmLookupName(batchidx, namelist, pmidlist)) < 0) { int j = 0; for (i = 0; i < batchidx; i++) { if (pmidlist[i] == PM_ID_NULL) { printf("%s: pmLookupName: %s\n", namelist[i], pmErrStr(sts)); free(namelist[i]); } else { /* assert(j <= i); */ pmidlist[j] = pmidlist[i]; namelist[j] = namelist[i]; j++; } } batchidx = j; } } if (p_value || verify) { if (opts.context == PM_CONTEXT_ARCHIVE) { if ((sts = pmSetMode(PM_MODE_FORW, &opts.origin, 0)) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } if ((sts = pmFetch(batchidx, pmidlist, &result)) < 0) { for (i = 0; i < batchidx; i++) printf("%s: pmFetch: %s\n", namelist[i], pmErrStr(sts)); goto done; } } for (i = 0; i < batchidx; i++) { if (p_desc || p_value || verify) { if ((sts = pmLookupDesc(pmidlist[i], &desc)) < 0) { printf("%s: pmLookupDesc: %s\n", namelist[i], pmErrStr(sts)); continue; } } if (p_desc || p_help || p_value) /* Not doing verify, output separator */ putchar('\n'); if (p_value || verify) { vsp = result->vset[i]; if (p_force) { if (result->vset[i]->numval == PM_ERR_PROFILE) { /* indom is non-enumerable; try harder */ if ((all_count = pmGetInDom(desc.indom, &all_inst, &all_names)) > 0) { pmDelProfile(desc.indom, 0, NULL); pmAddProfile(desc.indom, all_count, all_inst); if (xresult != NULL) { pmFreeResult(xresult); xresult = NULL; } if (opts.context == PM_CONTEXT_ARCHIVE) { if ((sts = pmSetMode(PM_MODE_FORW, &opts.origin, 0)) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } if ((sts = pmFetch(1, &pmidlist[i], &xresult)) < 0) { printf("%s: pmFetch: %s\n", namelist[i], pmErrStr(sts)); continue; } vsp = xresult->vset[0]; /* leave the profile in the default state */ free(all_inst); free(all_names); pmDelProfile(desc.indom, 0, NULL); pmAddProfile(desc.indom, 0, NULL); } else if (all_count == 0) { printf("%s: pmGetIndom: No instances?\n", namelist[i]); continue; } else { printf("%s: pmGetIndom: %s\n", namelist[i], pmErrStr(all_count)); continue; } } } } if (verify) { if (desc.type == PM_TYPE_NOSUPPORT) printf("%s: Not Supported\n", namelist[i]); else if (vsp->numval < 0) printf("%s: %s\n", namelist[i], pmErrStr(vsp->numval)); else if (vsp->numval == 0) printf("%s: No value(s) available\n", namelist[i]); continue; } else /* not verify */ printf("%s", namelist[i]); if (p_mid) printf(" PMID: %s", pmIDStr(pmidlist[i])); if (p_fullmid) printf(" = %d = 0x%x", pmidlist[i], pmidlist[i]); if (p_oneline) { if ((sts = pmLookupText(pmidlist[i], PM_TEXT_ONELINE, &buffer)) == 0) { if (p_fullmid) printf("\n "); else putchar(' '); printf("[%s]", buffer); free(buffer); } else printf(" One-line Help: Error: %s\n", pmErrStr(sts)); } putchar('\n'); if (p_desc) __pmPrintDesc(stdout, &desc); if (p_help) { if ((sts = pmLookupText(pmidlist[i], PM_TEXT_HELP, &buffer)) == 0) { char *p; for (p = buffer; *p; p++) ; while (p > buffer && p[-1] == '\n') { p--; *p = '\0'; } if (*buffer != '\0') { printf("Help:\n"); printf("%s", buffer); putchar('\n'); } else printf("Help: <empty entry>\n"); free(buffer); } else printf("Full Help: Error: %s\n", pmErrStr(sts)); } if (p_value) { mydump(&desc, vsp, NULL); } } if (result != NULL) { pmFreeResult(result); result = NULL; } if (xresult != NULL) { pmFreeResult(xresult); xresult = NULL; } done: for (i = 0; i < batchidx; i++) free(namelist[i]); batchidx = 0; }