int main(int argc, char **argv) { int c; int sts; int samples; int pauseFlag = 0; int lines = 0; char *source; const char *host; info_t info; /* values to report each sample */ char timebuf[26]; /* for pmCtime result */ setlinebuf(stdout); while ((c = pmGetOptions(argc, argv, &opts)) != EOF) { switch (c) { case 'P': pauseFlag++; break; default: opts.errors++; break; } } if (pauseFlag && opts.context != PM_CONTEXT_ARCHIVE) { pmprintf("%s: pause can only be used with archives\n", pmProgname); opts.errors++; } if (opts.errors || opts.optind < argc - 1) { pmUsageMessage(&opts); exit(1); } if (opts.context == PM_CONTEXT_ARCHIVE) { source = opts.archives[0]; } else if (opts.context == PM_CONTEXT_HOST) { source = opts.hosts[0]; } else { opts.context = PM_CONTEXT_HOST; source = "local:"; } if ((sts = c = pmNewContext(opts.context, source)) < 0) { if (opts.context == PM_CONTEXT_HOST) fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, source, pmErrStr(sts)); else fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", pmProgname, source, pmErrStr(sts)); exit(1); } /* complete TZ and time window option (origin) setup */ if (pmGetContextOptions(c, &opts)) { pmflush(); exit(1); } host = pmGetContextHostName(c); ncpu = get_ncpu(); if ((opts.context == PM_CONTEXT_ARCHIVE) && (opts.start.tv_sec != 0 || opts.start.tv_usec != 0)) { if ((sts = pmSetMode(PM_MODE_FORW, &opts.start, 0)) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmProgname, pmErrStr(sts)); exit(1); } } get_sample(&info); /* set a default sampling interval if none has been requested */ if (opts.interval.tv_sec == 0 && opts.interval.tv_usec == 0) opts.interval.tv_sec = 5; /* set sampling loop termination via the command line options */ samples = opts.samples ? opts.samples : -1; while (samples == -1 || samples-- > 0) { if (lines % 15 == 0) { if (opts.context == PM_CONTEXT_ARCHIVE) printf("Archive: %s, ", opts.archives[0]); printf("Host: %s, %d cpu(s), %s", host, ncpu, pmCtime((const time_t *)&info.timestamp.tv_sec, timebuf)); /* - report format CPU Busy Busy Free Mem Disk Load Average Util CPU Util (Mbytes) IOPS 1 Min 15 Min X.XXX XXX X.XXX XXXXX.XXX XXXXXX XXXX.XX XXXX.XX */ printf(" CPU"); if (ncpu > 1) printf(" Busy Busy"); printf(" Free Mem Disk Load Average\n"); printf(" Util"); if (ncpu > 1) printf(" CPU Util"); printf(" (Mbytes) IOPS 1 Min 15 Min\n"); } if (opts.context != PM_CONTEXT_ARCHIVE || pauseFlag) __pmtimevalSleep(opts.interval); get_sample(&info); printf("%5.2f", info.cpu_util); if (ncpu > 1) printf(" %3d %5.2f", info.peak_cpu, info.peak_cpu_util); printf(" %9.3f", info.freemem); printf(" %6d", info.dkiops); printf(" %7.2f %7.2f\n", info.load1, info.load15); lines++; } exit(0); }
int main(int argc, char *argv[]) { int c; int sts; char *endnum; pmDesc desc; int one_trip = 1; while ((c = pmGetOptions(argc, argv, &opts)) != EOF) { switch (c) { case 'w': /* wide flag */ line_fmt = "%.1024s"; break; case 'p': /* show flag */ if (one_trip) { show_spec = 0; one_trip = 0; } if ((sts = parse_show_spec(opts.optarg)) < 0) { pmprintf("%s: unrecognized print flag specification (%s)\n", pmProgname, opts.optarg); opts.errors++; } else { show_spec |= sts; } break; case 'm': /* top N */ top = (int)strtol(opts.optarg, &endnum, 10); if (top <= 0) { pmprintf("%s: -m requires a positive integer\n", pmProgname); opts.errors++; } break; } } if (opts.optind < argc) opts.errors++; if (opts.errors) { pmUsageMessage(&opts); exit(1); } create_namelist(); if (opts.interval.tv_sec == 0) opts.interval.tv_sec = 2; if (opts.nhosts > 0) hostname = opts.hosts[0]; else hostname = "local:"; if ((sts = c = pmNewContext(PM_CONTEXT_HOST, hostname)) < 0) { fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmProgname, hostname, pmErrStr(sts)); exit(1); } hostname = (char *)pmGetContextHostName(c); if (pmGetContextOptions(c, &opts)) { pmflush(); exit(1); } if ((sts = pmLookupName(num_pmid, namelist, pmidlist)) < 0) { fprintf(stderr, "%s: Failed to lookup metrics : %s\n", pmProgname, pmErrStr(sts)); exit(1); } for (c = 0; c < num_pmid; c++) { if ((sts = pmLookupDesc(pmidlist[c], &desc)) < 0) { fprintf(stderr, "%s: Failed to lookup descriptor for metric \"%s\": %s\n", pmProgname, namelist[c], pmErrStr(sts)); exit(1); } type_tab[c] = desc.type; /* ASSUMES that the first metric will always be a proc metric */ if (c == 0) { proc_indom = desc.indom; } } for (;;) { doit(); __pmtimevalSleep(opts.interval); } return 0; }
void rawwrite(pmOptions *opts, const char *name, struct timeval *delta, unsigned int nsamples, char midnightflag) { pmRecordHost *record; struct timeval elapsed; double duration; double interval; char args[MAXPATHLEN]; char *host; int sts; host = (opts->nhosts > 0) ? opts->hosts[0] : "local:"; interval = __pmtimevalToReal(delta); duration = interval * nsamples; if (midnightflag) { time_t now = time(NULL); struct tm *tp; tp = localtime(&now); tp->tm_hour = 23; tp->tm_min = 59; tp->tm_sec = 59; duration = (double) (mktime(tp) - now); } if (pmDebug & DBG_TRACE_APPL1) { fprintf(stderr, "%s: start recording, %.2fsec duration [%s].\n", pmProgname, duration, name); } if (__pmMakePath(name, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) < 0) { fprintf(stderr, "%s: making folio path %s for recording: %s\n", pmProgname, name, osstrerror()); cleanstop(1); } if (chdir(name) < 0) { fprintf(stderr, "%s: entering folio %s for recording: %s\n", pmProgname, name, strerror(oserror())); cleanstop(1); } /* ** Non-graphical application using libpcp_gui services - never want ** to see popup dialogs from pmlogger(1) here, so force the issue. */ putenv("PCP_XCONFIRM_PROG=/bin/true"); snprintf(args, sizeof(args), "%s.folio", basename((char *)name)); args[sizeof(args)-1] = '\0'; if (pmRecordSetup(args, pmProgname, 1) == NULL) { fprintf(stderr, "%s: cannot setup recording to %s: %s\n", pmProgname, name, osstrerror()); cleanstop(1); } if ((sts = pmRecordAddHost(host, 1, &record)) < 0) { fprintf(stderr, "%s: adding host %s to recording: %s\n", pmProgname, host, pmErrStr(sts)); cleanstop(1); } rawconfig(record->f_config, interval); /* ** start pmlogger with a deadhand timer, ensuring it will stop */ snprintf(args, sizeof(args), "-T%.3fseconds", duration); args[sizeof(args)-1] = '\0'; if ((sts = pmRecordControl(record, PM_REC_SETARG, args)) < 0) { fprintf(stderr, "%s: setting loggers arguments: %s\n", pmProgname, pmErrStr(sts)); cleanstop(1); } if ((sts = pmRecordControl(NULL, PM_REC_ON, "")) < 0) { fprintf(stderr, "%s: failed to start recording: %s\n", pmProgname, pmErrStr(sts)); cleanstop(1); } __pmtimevalFromReal(duration, &elapsed); __pmtimevalSleep(elapsed); if ((sts = pmRecordControl(NULL, PM_REC_OFF, "")) < 0) { fprintf(stderr, "%s: failed to stop recording: %s\n", pmProgname, pmErrStr(sts)); cleanstop(1); } if (pmDebug & DBG_TRACE_APPL1) { fprintf(stderr, "%s: cleanly stopped recording.\n", pmProgname); } }
int main(int argc, char **argv) { int c; int sts; int samples; int pauseFlag = 0; int lines = 0; char *source; const char *host; char timebuf[26]; /* for pmCtime result */ setlinebuf(stdout); while ((c = pmGetOptions(argc, argv, &opts)) != EOF) { switch (c) { case 'P': pauseFlag++; break; default: opts.errors++; break; } } if (pauseFlag && opts.context != PM_CONTEXT_ARCHIVE) { pmprintf("%s: pause can only be used with archives\n", pmGetProgname()); opts.errors++; } if (opts.errors || opts.optind < argc - 1) { pmUsageMessage(&opts); exit(1); } if (opts.context == PM_CONTEXT_ARCHIVE) { source = opts.archives[0]; } else if (opts.context == PM_CONTEXT_HOST) { source = opts.hosts[0]; } else { opts.context = PM_CONTEXT_HOST; source = "local:"; } sts = pmCreateFetchGroup(& pmfg, opts.context, source); if (sts < 0) { if (opts.context == PM_CONTEXT_HOST) fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmGetProgname(), source, pmErrStr(sts)); else fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", pmGetProgname(), source, pmErrStr(sts)); exit(1); } c = pmGetFetchGroupContext(pmfg); /* complete TZ and time window option (origin) setup */ if (pmGetContextOptions(c, &opts)) { pmflush(); exit(1); } host = pmGetContextHostName(c); /* set a default sampling interval if none has been requested */ if (opts.interval.tv_sec == 0 && opts.interval.tv_usec == 0) opts.interval.tv_sec = 5; if (opts.context == PM_CONTEXT_ARCHIVE) { if ((sts = pmSetMode(PM_MODE_INTERP, &opts.start, (int)(opts.interval.tv_sec*1000 + opts.interval.tv_usec/1000))) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } } if (opts.context == PM_CONTEXT_ARCHIVE) get_sample(); /* fetch the separate early ncpu record */ get_sample(); /* fetch other rate metrics */ /* set sampling loop termination via the command line options */ samples = opts.samples ? opts.samples : -1; while (samples == -1 || samples-- > 0) { if (lines % 15 == 0) { time_t now = info.timestamp.tv_sec; if (opts.context == PM_CONTEXT_ARCHIVE) printf("Archive: %s, ", opts.archives[0]); printf("Host: %s, %d cpu(s), %s", host, info.ncpu.l, pmCtime(&now, timebuf)); /* - report format CPU Busy Busy Free Mem Disk Load Average Util CPU Util (Mbytes) IOPS 1 Min 15 Min X.XXX XXX X.XXX XXXXX.XXX XXXXXX XXXX.XX XXXX.XX */ printf(" CPU"); if (info.ncpu.l > 1) printf(" Busy Busy"); printf(" Free Mem Disk Load Average\n"); printf(" Util"); if (info.ncpu.l > 1) printf(" CPU Util"); printf(" (Mbytes) IOPS 1 Min 15 Min\n"); } if (opts.context != PM_CONTEXT_ARCHIVE || pauseFlag) __pmtimevalSleep(opts.interval); get_sample(); printf("%5.2f", info.cpu_util); if (info.ncpu.l > 1) printf(" %3d %5.2f", info.peak_cpu, info.peak_cpu_util); printf(" %9.3f", info.freemem.d); printf(" %6d", info.dkiops.l); printf(" %7.2f %7.2f\n", info.load1.d, info.load15.d); lines++; } exit(0); }
void onevent(int afid, void *data) { struct timeval now; static int delay = -3; int evnum; double elapsed; struct timeval sec = { 0, 0 }; gettimeofday(&now, NULL); if (pmDebug & DBG_TRACE_AF) { fprintf(stderr, "onevent(%d, " PRINTF_P_PFX "%p) called: ", afid, data); printstamp(&now); fputc('\n', stderr); } elapsed = now.tv_sec - start.tv_sec + (double)(now.tv_usec - start.tv_usec) / 1000000.0; if (afid == reg[2]) printf("event %d callback\n", afid); else { if (afid == reg[0]) evnum = (int)(elapsed / 2.5); else evnum = (int)(elapsed / 1.5); /* evnum not reliable for small elapsed intervals */ if (evnum >= 3) printf("event %d callback #%d\n", afid, evnum); else printf("event %d callback #?\n", afid); } if (delay > 6) { /* only report the unexpected */ if (__pmAFunregister(reg[0]) < 0) printf("unregister %d failed\n", reg[0]); if (__pmAFunregister(reg[1]) == 0) printf("unregister %d success\n", reg[1]); if (__pmAFunregister(reg[2]) == 0) printf("unregister %d success\n", reg[2]); if (__pmAFunregister(reg[3]) < 0) printf("unregister %d failed\n", reg[0]); exit(0); } if (delay > 0) { /* * was sginap(delay * CLK_TCK) ... usleep() for * delay*CLK_TCK*10^6/CLK_TCK microseconds so "delay" sec */ sec.tv_sec = delay; __pmtimevalSleep(sec); } delay++; if (pmDebug & DBG_TRACE_AF) { gettimeofday(&now, NULL); fprintf(stderr, "onevent done: "); printstamp(&now); fputc('\n', stderr); } fflush(stderr); fflush(stdout); }