static char * rawlocalhost(pmOptions *opts) { int ctxt; char *host; if (opts->nhosts > 0) return opts->hosts[0]; if ((ctxt = pmNewContext(PM_CONTEXT_LOCAL, NULL)) < 0) { fprintf(stderr, "%s: cannot create local context: %s\n", pmProgname, pmErrStr(ctxt)); cleanstop(1); } host = (char *)pmGetContextHostName(ctxt); pmDestroyContext(ctxt); if (host[0] == '\0') { fprintf(stderr, "%s: cannot find local hostname\n", pmProgname); cleanstop(1); } return host; }
void darwin_init(pmdaInterface *dp) { int sts; if (_isDSO) { int sep = __pmPathSeparator(); char helppath[MAXPATHLEN]; sprintf(helppath, "%s%c" "darwin" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_3, "darwin DSO", helppath); } else { __pmSetProcessIdentity(username); } if (dp->status != 0) return; dp->version.two.instance = darwin_instance; dp->version.two.fetch = darwin_fetch; pmdaSetFetchCallBack(dp, darwin_fetchCallBack); pmdaSetFlags(dp, PMDA_EXT_FLAG_DIRECT); pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); mach_host = mach_host_self(); host_page_size(mach_host, &mach_page_size); mach_page_shift = ffs(mach_page_size) - 1; if (refresh_hertz(&mach_hertz) != 0) mach_hertz = 100; if ((sts = refresh_hinv()) != 0) fprintf(stderr, "darwin_init: refresh_hinv failed: %s\n", pmErrStr(sts)); init_network(); }
static void mounts_config_file_check(void) { struct stat statbuf; static int last_error; int sep = __pmPathSeparator(); snprintf(mypath, sizeof(mypath), "%s%c" "mounts" "%c" "mounts.conf", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); if (stat(mypath, &statbuf) == -1) { if (oserror() != last_error) { last_error = oserror(); __pmNotifyErr(LOG_WARNING, "stat failed on %s: %s\n", mypath, pmErrStr(last_error)); } } else { last_error = 0; #if defined(HAVE_ST_MTIME_WITH_E) if (statbuf.st_mtime != file_change.st_mtime) #elif defined(HAVE_ST_MTIME_WITH_SPEC) if (statbuf.st_mtimespec.tv_sec != file_change.st_mtimespec.tv_sec || statbuf.st_mtimespec.tv_nsec != file_change.st_mtimespec.tv_nsec) #else if (statbuf.st_mtim.tv_sec != file_change.st_mtim.tv_sec || statbuf.st_mtim.tv_nsec != file_change.st_mtim.tv_nsec) #endif { mounts_clear_config_info(); mounts_grab_config_info(); file_change = statbuf; } } }
/* * Set the origin position and interval for PMAPI context fetching */ static int setup_origin(pmOptions *opts) { int sts = 0; curtime = origin = opts->origin; /* initial archive mode, position and delta */ if (opts->context == PM_CONTEXT_ARCHIVE) { if (opts->interval.tv_sec || opts->interval.tv_usec) interval = opts->interval; setup_step_mode(opts, 1); if ((sts = pmSetMode(fetchmode, &curtime, fetchstep)) < 0) { pmprintf( "%s: pmSetMode failure: %s\n", pmProgname, pmErrStr(sts)); opts->flags |= PM_OPTFLAG_RUNTIME_ERR; opts->errors++; } } return sts; }
int fetch_metrics(const char *purpose, int nmetrics, pmID *pmids, pmResult **result) { int sts; pmSetMode(fetchmode, &curtime, fetchstep); if ((sts = pmFetch(nmetrics, pmids, result)) < 0) { if (sts != PM_ERR_EOL) fprintf(stderr, "%s: %s query: %s\n", pmProgname, purpose, pmErrStr(sts)); cleanstop(1); } if (pmDebug & DBG_TRACE_APPL1) { pmResult *rp = *result; struct tm tmp; time_t sec; sec = (time_t)rp->timestamp.tv_sec; pmLocaltime(&sec, &tmp); fprintf(stderr, "%s: got %d %s metrics @%02d:%02d:%02d.%03d\n", pmProgname, rp->numpmid, purpose, tmp.tm_hour, tmp.tm_min, tmp.tm_sec, (int)(rp->timestamp.tv_usec / 1000)); } return sts; }
static void SignalReloadPMNS(void) { int sts; /* Reload PMNS if necessary. * Note: this will only stat() the base name i.e. ASCII pmns, * typically $PCP_VAR_DIR/pmns/root and not $PCP_VAR_DIR/pmns/root.bin . * This is considered a very low risk problem, as the binary * PMNS is always compiled from the ASCII version; * when one changes so should the other. * This caveat was allowed to make the code a lot simpler. */ if (__pmHasPMNSFileChanged(pmnsfile)) { __pmNotifyErr(LOG_INFO, "Reloading PMNS \"%s\"", (pmnsfile==PM_NS_DEFAULT)?"DEFAULT":pmnsfile); pmUnloadNameSpace(); sts = pmLoadASCIINameSpace(pmnsfile, dupok); if (sts < 0) { __pmNotifyErr(LOG_ERR, "pmLoadASCIINameSpace(%s, %d): %s\n", (pmnsfile == PM_NS_DEFAULT) ? "DEFAULT" : pmnsfile, dupok, pmErrStr(sts)); } } else { __pmNotifyErr(LOG_INFO, "PMNS file \"%s\" is unchanged", (pmnsfile == PM_NS_DEFAULT) ? "DEFAULT" : pmnsfile); } }
/* * with -e come here for every metric in the PMNS ... */ void dometric(const char *name) { int sts; pmID pmid; char *tp; sts = pmLookupName(1, (char **)&name, &pmid); if (sts < 0) { fprintf(stderr, "pmLookupName: failed for \"%s\": %s\n", name, pmErrStr(sts)); return; } if (sts == 0) { fprintf(stderr, "pmLookupName: failed for \"%s\"\n", name); return; } tp = pmdaGetHelp(handle, pmid, PM_TEXT_ONELINE); if (tp != NULL) return; tp = pmdaGetHelp(handle, pmid, PM_TEXT_HELP); if (tp != NULL) return; /* no help text, report metric */ printf("%s\n", name); }
static void * func2(void *arg) { char *fn = "func2"; int i; int j; FILE *f; if ((f = fopen("/tmp/func2.out", "w")) == NULL) { perror("func2 fopen"); pthread_exit("botch"); } j = pmUseContext(ctx2); if ( j < 0) { fprintf(f, "Error: %s: pmUseContext(%d) -> %s\n", fn, ctx2, pmErrStr(j)); fclose(f); pthread_exit("botch"); } pthread_barrier_wait(&barrier); for (j = 0; j < 100; j++) { for (i = NMETRIC-1; i >= 0; i--) foo(f, fn, i); } fclose(f); pthread_exit(NULL); }
static void _e(int since) { int i; int j; int sts; int inst; indom = pmInDom_build(FORQA, 11); sts = pmdaCacheOp(indom, PMDA_CACHE_LOAD); if (sts < 0) { fprintf(stderr, "PMDA_CACHE_LOAD failed: %s\n", pmErrStr(sts)); return; } j = 1; for (i = 0; i < 10; i++) { pmsprintf(nbuf, sizeof(nbuf), "boring-instance-%03d", i); inst = pmdaCacheStore(indom, PMDA_CACHE_ADD, nbuf, (void *)((__psint_t)(0xcaffe000+i))); if (inst < 0) fprintf(stderr, "PMDA_CACHE_ADD failed for \"%s\": %s\n", nbuf, pmErrStr(inst)); if (i == j) { j <<= 1; inst = pmdaCacheStore(indom, PMDA_CACHE_HIDE, nbuf, NULL); if (inst < 0) fprintf(stderr, "PMDA_CACHE_HIDE failed for \"%s\": %s\n", nbuf, pmErrStr(inst)); } } sts = pmdaCacheOp(indom, PMDA_CACHE_SAVE); fprintf(stderr, "Save -> %d\n", sts); fprintf(stderr, "Before purge ...\n"); __pmdaCacheDump(stderr, indom, 0); sleep(1); sts = pmdaCachePurge(indom, since); if (sts < 0) { fprintf(stderr, "pmdaCachePurge failed: %s\n", pmErrStr(sts)); return; } fprintf(stderr, "Purged %d entries\nAfter purge ...\n", sts); sts = pmdaCacheOp(indom, PMDA_CACHE_SAVE); fprintf(stderr, "Save -> %d\n", sts); __pmdaCacheDump(stderr, indom, 0); }
int main(int argc, char **argv) { char *msg; char buffer[512]; __pmHashCtl attrs; pmHostSpec *hosts; int count, sts, i, j; if (argc != 2) { fprintf(stderr, "Usage: parsehostattrs spec\n"); exit(1); } __pmHashInit(&attrs); printf("pmParseHostAttrsSpec(\"%s\", ...)\n", argv[1]); sts = __pmParseHostAttrsSpec(argv[1], &hosts, &count, &attrs, &msg); if (sts < 0) { if (sts == PM_ERR_GENERIC) printf("pmParseHostAttrsSpec error:\n%s\n", msg); else printf("Error: %s\n", pmErrStr(sts)); exit(1); } for (i = 0; i < count; i++) { printf("host[%d]: \"%s\"", i, hosts[i].name); if (hosts[i].nports == 1) printf(" port:"); else if (hosts[i].nports > 1) printf(" ports:"); for (j = 0; j < hosts[i].nports; j++) printf(" %d", hosts[i].ports[j]); putchar('\n'); } __pmHashWalkCB(print_attribute, NULL, &attrs); sts = __pmUnparseHostAttrsSpec(hosts, count, &attrs, buffer, sizeof(buffer)); if (sts < 0) { printf("pmUnparseHostAttrsSpec: %s\n", pmErrStr(sts)); exit(1); } printf("pmUnparseHostAttrsSpec(\"%s\") -> \"%s\"\n", argv[1], buffer); __pmFreeHostAttrsSpec(hosts, count, &attrs); __pmHashClear(&attrs); exit(0); }
static int refresh_net_dev_hw_addr(pmInDom indom) { int sts; DIR *dp; char *devname; struct dirent *dentry; char path[MAXPATHLEN]; net_addr_t *netip; static uint32_t cache_err; snprintf(path, sizeof(path), "%s/sys/class/net", linux_statspath); if ((dp = opendir(path)) != NULL) { while ((dentry = readdir(dp)) != NULL) { if (dentry->d_name[0] == '.') continue; devname = dentry->d_name; sts = pmdaCacheLookupName(indom, devname, NULL, (void **)&netip); if (sts == PM_ERR_INST || (sts >= 0 && netip == NULL)) { /* first time since re-loaded, else new one */ netip = (net_addr_t *)calloc(1, sizeof(net_addr_t)); } else if (sts < 0) { if (cache_err++ < 10) { fprintf(stderr, "refresh_net_dev_hw_addr: " "pmdaCacheLookupName(%s, %s, ...) failed: %s\n", pmInDomStr(indom), devname, pmErrStr(sts)); } continue; } if ((sts = pmdaCacheStore(indom, PMDA_CACHE_ADD, devname, (void *)netip)) < 0) { if (cache_err++ < 10) { fprintf(stderr, "refresh_net_dev_hw_addr: " "pmdaCacheStore(%s, PMDA_CACHE_ADD, %s, " PRINTF_P_PFX "%p) failed: %s\n", pmInDomStr(indom), devname, netip, pmErrStr(sts)); } continue; } refresh_net_hw_addr(devname, netip); } closedir(dp); } return 0; }
int main(int argc, char *argv[]) { int ctx; int sts; char buf[1024]; char *name = buf; char *p; pmID pmid; pmDesc desc; ctx = pmNewContext(PM_CONTEXT_HOST, "local:"); if (ctx < 0) { fprintf(stderr, "Error: pmNewContext %s\n", pmErrStr(ctx)); exit(1); } printf("/* This file is automatically generated .. do not edit! */\n"); printf("#include \"metrics.h\"\n\n"); printf("metric_t metrics[] = {\n"); while (fgets(buf, sizeof(buf), stdin)) { if ((p = strrchr(buf, '\n')) != NULL) *p = '\0'; if ((sts = pmLookupName(1, &name, &pmid)) < 0) { fprintf(stderr, "Error: pmLookupName \"%s\": %s\n", name, pmErrStr(sts)); exit(1); } if ((sts = pmLookupDesc(pmid, &desc)) < 0) { fprintf(stderr, "Error: pmLookupDesc \"%s\": %s\n", name, pmErrStr(sts)); exit(1); } printf(" /* %-8s */ { \"%s\", { 0x%04x, PM_TYPE_%s, %s, %s,\n" " { .dimSpace=%d, .dimTime=%d, .dimCount=%d, " ".scaleSpace=%d, .scaleTime=%d, .scaleCount=%d } } },\n", pmIDStr(desc.pmid), name, desc.pmid, pmTypeStr(desc.type), indomStr(desc.indom), semStr[desc.sem], desc.units.dimSpace, desc.units.dimTime, desc.units.dimCount, desc.units.scaleSpace, desc.units.scaleTime, desc.units.scaleCount); } printf(" { NULL }\n};\n"); exit(0); }
static int traverse(const char *str, double scale) { pmMetricSpec *theMetric; char *msg; int sts = 0; sts = pmParseMetricSpec((char *)str, 0, (char *)0, &theMetric, &msg); if (sts < 0) { pmprintf("%s: Error: Unable to parse metric spec:\n%s\n", pmProgname, msg); free(msg); return sts; } // If the metric has instances, then it cannot be traversed if (theMetric->ninst) { QmcMetric *metric = group->addMetric(theMetric, scale); if (metric->status() >= 0) { checkUnits(metric); metrics.append(metric); numValues += metric->numValues(); } else sts = -1; } else { if (theMetric->isarch == 0) doMetricType = PM_CONTEXT_HOST; else if (theMetric->isarch == 1) doMetricType = PM_CONTEXT_ARCHIVE; else if (theMetric->isarch == 2) doMetricType = PM_CONTEXT_LOCAL; else { pmprintf("%s: Error: invalid metric source (%d): %s\n", pmProgname, theMetric->isarch, theMetric->metric); sts = -1; } doMetricSource = theMetric->source; if (sts >= 0) sts = group->use(doMetricType, doMetricSource); if (sts >= 0) { doMetricScale = scale; sts = pmTraversePMNS(theMetric->metric, dometric); if (sts >= 0 && doMetricFlag == false) sts = -1; else if (sts < 0) { pmprintf("%s: Error: %s: %s\n", pmProgname, theMetric->metric, pmErrStr(sts)); } } } free(theMetric); return sts; }
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'); } } }
/* * PMAPI context creation and initial command line option handling. */ static int setup_context(pmOptions *opts) { char *source; int sts, ctx; if (opts->context == PM_CONTEXT_ARCHIVE) source = opts->archives[0]; else 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 = ctx = pmNewContext(opts->context, source)) < 0) { if (opts->context == PM_CONTEXT_HOST) pmprintf( "%s: Cannot connect to pmcd on host \"%s\": %s\n", pmProgname, source, pmErrStr(sts)); else if (opts->context == PM_CONTEXT_LOCAL) pmprintf( "%s: Cannot make standalone connection on localhost: %s\n", pmProgname, pmErrStr(sts)); else pmprintf( "%s: Cannot open archive \"%s\": %s\n", pmProgname, source, pmErrStr(sts)); } else if ((sts = pmGetContextOptions(ctx, opts)) == 0) sts = setup_origin(opts); if (sts < 0) { pmflush(); cleanstop(1); } return ctx; }
int main(int argc, char *argv[]) { int c; int sts; int errflag = 0; char *usage = "[-D debug] errcode ..."; pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "D:")) != EOF) { switch (c) { case 'D': /* debug options */ sts = pmSetDebug(optarg); if (sts < 0) { fprintf(stderr, "%s: unrecognized debug options specification (%s)\n", pmGetProgname(), optarg); errflag++; } break; case '?': default: errflag++; break; } } if (errflag || optind >= argc) { fprintf(stderr, "Usage: %s %s\n", pmGetProgname(), usage); exit(1); } while (optind < argc) { sts = atoi(argv[optind]); printf("%s (%d) -> %s\n", argv[optind], sts, pmErrStr(sts)); sts = -sts; printf("-(%s) (%d) -> %s\n", argv[optind], sts, pmErrStr(sts)); optind++; } exit(0); }
void QmcMetric::dumpValue(QTextStream &stream, uint inst) const { if (error(inst) < 0) stream << pmErrStr(error(inst)); else if (!real()) stream << stringValue(inst); else if (!event()) stream << value(inst) << " " << desc().units(); }
static void newHashInst(pmValue *vp, checkData *checkdata, /* updated by this function */ int valfmt, struct timeval *timestamp, /* timestamp for this sample */ int pos) /* position of this inst in instlist */ { int sts; size_t size; pmAtomValue av; if ((sts = pmExtractValue(valfmt, vp, checkdata->desc.type, &av, PM_TYPE_DOUBLE)) < 0) { fprintf(stderr, "%s.%d:[", l_archname, l_ctxp->c_archctl->ac_vol); print_stamp(stderr, timestamp); fprintf(stderr, "] "); print_metric(stderr, checkdata->desc.pmid); fprintf(stderr, ": pmExtractValue failed: %s\n", pmErrStr(sts)); fprintf(stderr, "%s: possibly corrupt archive?\n", pmProgname); exit(EXIT_FAILURE); } size = (pos+1)*sizeof(instData*); checkdata->instlist = (instData**) realloc(checkdata->instlist, size); if (!checkdata->instlist) __pmNoMem("newHashInst.instlist", size, PM_FATAL_ERR); size = sizeof(instData); checkdata->instlist[pos] = (instData*) malloc(size); if (!checkdata->instlist[pos]) __pmNoMem("newHashInst.instlist[pos]", size, PM_FATAL_ERR); checkdata->instlist[pos]->inst = vp->inst; checkdata->instlist[pos]->lastval = av.d; checkdata->instlist[pos]->lasttime = *timestamp; checkdata->listsize++; #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL1) { char *name; fprintf(stderr, "%s.%d:[", l_archname, l_ctxp->c_archctl->ac_vol); print_stamp(stderr, timestamp); fprintf(stderr, "] "); print_metric(stderr, checkdata->desc.pmid); if (vp->inst == PM_INDOM_NULL) fprintf(stderr, ": new singular metric\n"); else { fprintf(stderr, ": new metric-instance pair "); if (pmNameInDom(checkdata->desc.indom, vp->inst, &name) < 0) fprintf(stderr, "%d\n", vp->inst); else { fprintf(stderr, "\"%s\"\n", name); free(name); } } } #endif }
void __PMDA_INIT_CALL papi_init(pmdaInterface *dp) { int sts; if (isDSO) { int sep = __pmPathSeparator(); snprintf(helppath, sizeof(helppath), "%s%c" "papi" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_6, "papi DSO", helppath); } if (dp->status != 0) return; dp->comm.flags |= PDU_FLAG_AUTH; if ((sts = papi_internal_init(dp)) < 0) { __pmNotifyErr(LOG_ERR, "papi_internal_init: %s\n", pmErrStr(sts)); dp->status = PM_ERR_GENERIC; return; } if ((sts = papi_setup_auto_af()) < 0) { __pmNotifyErr(LOG_ERR, "papi_setup_auto_af: %s\n", pmErrStr(sts)); dp->status = PM_ERR_GENERIC; return; } dp->version.six.fetch = papi_fetch; dp->version.six.store = papi_store; dp->version.six.attribute = papi_contextAttributeCallBack; dp->version.six.desc = papi_desc; dp->version.any.text = papi_text; dp->version.four.pmid = papi_name_lookup; dp->version.four.children = papi_children; pmdaSetFetchCallBack(dp, papi_fetchCallBack); pmdaSetEndContextCallBack(dp, papi_endContextCallBack); pmdaInit(dp, NULL, 0, NULL, 0); }
void watch(char *fname) { char cmd[MYCMDSZ]; pmsprintf(cmd, MYCMDSZ, "xterm -hold -title \"dbpmda watch %s\" -geom 80x16 -bg dodgerblue4 -e tail -f %s &", fname, fname); if (system(cmd) != 0) fprintf(stderr, "watch cmd: %s failed: %s\n", cmd, pmErrStr(-oserror())); }
int QmcGroup::useContext() { int sts = 0; if ((context()->status() == 0) && (sts = pmUseContext(context()->handle())) < 0) pmprintf("%s: Error: Unable to reuse context to %s: %s\n", pmProgname, context()->source().sourceAscii(), pmErrStr(sts)); return sts; }
static void _j(void) { int inst; int sts; int i; indomp->domain = 123; indomp->serial = 10; fprintf(stderr, "\nPopulate the instance domain ...\n"); for (i = 0; i < 20; i++) { strncpy(nbuf, xxx, ncount+3); sprintf(nbuf, "%03d", ncount); ncount++; inst = pmdaCacheStore(indom, PMDA_CACHE_ADD, nbuf, (void *)((__psint_t)(0xbeef0000+ncount))); if (inst < 0) fprintf(stderr, "PMDA_CACHE_ADD failed for \"%s\": %s\n", nbuf, pmErrStr(inst)); } sts = pmdaCacheOp(indom, PMDA_CACHE_SAVE); fprintf(stderr, "Save -> %d\n", sts); __pmdaCacheDump(stderr, indom, 0); /* We've now got a cache with 20 items. Try to resize the cache. */ sts = pmdaCacheResize(indom, 1234); fprintf(stderr, "Resize (good) -> %d", sts); if (sts < 0) fprintf(stderr, ": %s", pmErrStr(sts)); fputc('\n', stderr); /* This should fail, since we've got more than 10 items in this cache. */ sts = pmdaCacheResize(indom, 10); fprintf(stderr, "Resize (bad) -> %d", sts); if (sts < 0) fprintf(stderr, ": %s", pmErrStr(sts)); fputc('\n', stderr); /* Since we've changed the max, we'll need to save again. PMDA_CACHE_SAVE won't resave the cache with just a dirty cache header, but PMDA_CACHE_SYNC will. */ sts = pmdaCacheOp(indom, PMDA_CACHE_SYNC); fprintf(stderr, "Sync -> %d\n", sts); }
void setup_metrics(char **metrics, pmID *pmidlist, pmDesc *desclist, int nmetrics) { int i, sts; if ((sts = pmLookupName(nmetrics, metrics, pmidlist)) < 0) { fprintf(stderr, "%s: pmLookupName: %s\n", pmProgname, pmErrStr(sts)); cleanstop(1); } if (nmetrics != sts) { for (i=0; i < nmetrics; i++) { if (pmidlist[i] != PM_ID_NULL) continue; if (pmDebug & DBG_TRACE_APPL0) fprintf(stderr, "%s: pmLookupName failed for %s\n", pmProgname, metrics[i]); } } for (i=0; i < nmetrics; i++) { if (pmidlist[i] == PM_ID_NULL) { desclist[i].pmid = PM_ID_NULL; continue; } if ((sts = pmLookupDesc(pmidlist[i], &desclist[i])) < 0) { if (pmDebug & DBG_TRACE_APPL0) fprintf(stderr, "%s: pmLookupDesc failed for %s: %s\n", pmProgname, metrics[i], pmErrStr(sts)); pmidlist[i] = desclist[i].pmid = PM_ID_NULL; } } }
void dump(QmcMetric const* num, QmcMetric const* discrete, QmcMetric const* instant, QmcMetric const* counter) { cout << "dynamic.numinsts = " << num->value(0) << endl << endl; for (int i = 0; i < discrete->numInst(); i++) { cout << '[' << discrete->instName(i) << "] = "; if (discrete->error(i) < 0) { cout << pmErrStr(discrete->error(i)) << endl; } else { cout << '\"' << discrete->stringValue(i) << "\" = " << instant->value(i) << " ("; if (counter->error(i) < 0) cout << pmErrStr(counter->error(i)) << ")" << endl; else cout << counter->currentValue(i) << ")" << endl; } } cout << endl; discrete->indom()->dump(cout); }
/* translate new metric name to internal pmid for agent mode */ static pmID agentId(char *name) { int sts; pmID pmid; if ((sts = pmLookupName(1, &name, &pmid)) < 0) { fprintf(stderr, "%s: agentId: metric %s not found in namespace: %s\n", pmProgname, name, pmErrStr(sts)); exit(1); } return pmid; }
/* * This routine opens the config file and stores the information in the * mounts structure. The mounts structure must be reallocated as * necessary, and also the num_procs structure needs to be reallocated * as we define new mounts. When all of that is done, we fill in the * values in the indomtab structure, those being the number of instances * and the pointer to the mounts structure. */ static void mounts_grab_config_info(void) { FILE *fp; char mount_name[MAXPATHLEN]; char *q; size_t size; int mount_number = 0; int sep = __pmPathSeparator(); snprintf(mypath, sizeof(mypath), "%s%c" "mounts" "%c" "mounts.conf", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); if ((fp = fopen(mypath, "r")) == NULL) { __pmNotifyErr(LOG_ERR, "fopen on %s failed: %s\n", mypath, pmErrStr(-oserror())); if (mounts) { free(mounts); mounts = NULL; mount_number = 0; } goto done; } while (fgets(mount_name, sizeof(mount_name), fp) != NULL) { if (mount_name[0] == '#') continue; /* Remove the newline */ if ((q = strchr(mount_name, '\n')) != NULL) { *q = '\0'; } else { /* This means the line was too long */ __pmNotifyErr(LOG_WARNING, "line %d in the config file too long\n", mount_number+1); } size = (mount_number + 1) * sizeof(pmdaInstid); if ((mounts = realloc(mounts, size)) == NULL) __pmNoMem("process", size, PM_FATAL_ERR); mounts[mount_number].i_name = malloc(strlen(mount_name) + 1); strcpy(mounts[mount_number].i_name, mount_name); mounts[mount_number].i_inst = mount_number; mount_number++; } fclose(fp); done: if (mounts == NULL) __pmNotifyErr(LOG_WARNING, "\"mounts\" instance domain is empty"); indomtab[MOUNTS_INDOM].it_set = mounts; indomtab[MOUNTS_INDOM].it_numinst = mount_number; mount_list = realloc(mount_list, (mount_number)*sizeof(mountinfo)); }
int /* > 0: context handle, -1: retry later */ newContext(char *host) { Archive *a; int sts = -1; if (archives) { a = archives; while (a) { /* find archive for host */ if (strcmp(host, a->hname) == 0) break; a = a->next; } if (a) { /* archive found */ if ((sts = pmNewContext(PM_CONTEXT_ARCHIVE, a->fname)) < 0) { fprintf(stderr, "%s: cannot open archive %s\n", pmProgname, a->fname); fprintf(stderr, "pmNewContext: %s\n", pmErrStr(sts)); exit(1); } } else { /* no archive for host */ fprintf(stderr, "%s: no archive for host %s\n", pmProgname, host); exit(1); } } else if ((sts = pmNewContext(PM_CONTEXT_HOST, host)) < 0) { if (host_state_changed(host, STATE_FAILINIT) == 1) { if (sts == -ECONNREFUSED) fprintf(stderr, "%s: warning - pmcd " "on host %s does not respond\n", pmProgname, host); else if (sts == PM_ERR_PERMISSION) fprintf(stderr, "%s: warning - host %s does not " "permit delivery of metrics to the local host\n", pmProgname, host); else if (sts == PM_ERR_CONNLIMIT) fprintf(stderr, "%s: warning - pmcd " "on host %s has exceeded its connection limit\n", pmProgname, host); else fprintf(stderr, "%s: warning - host %s is unreachable\n", pmProgname, host); } sts = -1; } else if (clientid != NULL) /* register client id with pmcd */ __pmSetClientId(clientid); return sts; }
/* * main */ int main(int argc, char **argv) { int sts; set_proc_fmt(); printf("pid=%" FMT_PID " ppid=%" FMT_PID "\n", getpid(), getppid()); getargs(argc, argv); if (pmnsfile != PM_NS_DEFAULT) { if ((sts = pmLoadNameSpace(pmnsfile)) < 0) { printf("%s: Cannot load pmnsfile from \"%s\": %s\n", pmProgname, pmnsfile, pmErrStr(sts)); exit(1); } } if ((sts = pmNewContext(PM_CONTEXT_HOST, host)) < 0) { printf("%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, host, pmErrStr(sts)); exit(1); } test_PMNS(); test_desc(); test_instance(); test_prof_fetch(); if (!is_hotproc) test_store(); if ((sts = pmWhichContext()) < 0) { printf("%s: pmWhichContext: %s\n", pmProgname, pmErrStr(sts)); exit(1); } pmDestroyContext(sts); exit(0); }
void CleanupClient(ClientInfo *cp, int sts) { char *caddr; int i, msg; int force; force = pmDebug & DBG_TRACE_APPL0; if (sts != 0 || force) { /* for access violations, only print the message if this host hasn't * been dinged for an access violation since startup or reconfiguration */ if (sts == PM_ERR_PERMISSION || sts == PM_ERR_CONNLIMIT) { if ( (msg = AddBadHost(cp->addr)) ) { caddr = __pmSockAddrToString(cp->addr); fprintf(stderr, "access violation from host %s\n", caddr); free(caddr); } } else msg = 0; if (msg || force) { for (i = 0; i < nClients; i++) { if (cp == &client[i]) break; } fprintf(stderr, "endclient client[%d]: (fd %d) %s (%d)\n", i, cp->fd, pmErrStr(sts), sts); } } /* If the client is being cleaned up because its connection was refused * don't do this because it hasn't actually contributed to the connection * count */ if (sts != PM_ERR_PERMISSION && sts != PM_ERR_CONNLIMIT) __pmAccDelClient(cp->addr); pmcd_trace(TR_DEL_CLIENT, cp->fd, sts, 0); DeleteClient(cp); if (maxClientFd < maxReqPortFd) maxClientFd = maxReqPortFd; for (i = 0; i < nAgents; i++) if (agent[i].profClient == cp) agent[i].profClient = NULL; }
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*/