/* initialize timezone */ void zoneInit(void) { int sts; int handle = -1; Archive *a; if (timeZone) { /* TZ from timezone string */ if ((sts = pmNewZone(timeZone)) < 0) fprintf(stderr, "%s: cannot set timezone to %s\n" "pmNewZone failed: %s\n", pmProgname, timeZone, pmErrStr(sts)); } else if (! archives && hostZone) { /* TZ from live host */ if ((handle = pmNewContext(PM_CONTEXT_HOST, dfltHostConn)) < 0) fprintf(stderr, "%s: cannot set timezone from %s\n" "pmNewContext failed: %s\n", pmProgname, findsource(dfltHostConn), pmErrStr(handle)); else if ((sts = pmNewContextZone()) < 0) fprintf(stderr, "%s: cannot set timezone from %s\n" "pmNewContextZone failed: %s\n", pmProgname, findsource(dfltHostConn), pmErrStr(sts)); else fprintf(stdout, "%s: timezone set to local timezone of host %s\n", pmProgname, dfltHostConn); if (handle >= 0) pmDestroyContext(handle); } else if (hostZone) { /* TZ from an archive */ a = archives; while (a) { if (strcmp(dfltHostName, a->hname) == 0) break; a = a->next; } if (! a) fprintf(stderr, "%s: no archive supplied for host %s\n", pmProgname, dfltHostName); else if ((handle = pmNewContext(PM_CONTEXT_ARCHIVE, a->fname)) < 0) fprintf(stderr, "%s: cannot set timezone from %s\npmNewContext failed: %s\n", pmProgname, findsource(dfltHostName), pmErrStr(handle)); else if ((sts = pmNewContextZone()) < 0) fprintf(stderr, "%s: cannot set timezone from %s\n" "pmNewContextZone failed: %s\n", pmProgname, findsource(dfltHostName), pmErrStr(sts)); else fprintf(stdout, "%s: timezone set to local timezone of host %s\n", pmProgname, dfltHostName); if (handle >= 0) pmDestroyContext(handle); } }
void QmcSource::retryConnect(int type, QString &source) { int oldTZ; int oldContext; int offset; int sts; char *tzs; QString name; QString hostSpec; switch (type) { case PM_CONTEXT_LOCAL: my.desc = "Local context"; my.host = my.source = localHost; my.proxy = ""; break; case PM_CONTEXT_HOST: my.desc = "host \""; my.desc.append(source); my.desc.append(QChar('\"')); my.host = source; my.proxy = getenv("PMPROXY_HOST"); if ((offset = my.host.indexOf('?')) >= 0) { my.attrs = my.host; my.attrs.remove(0, offset+1); my.host.truncate(offset); name = my.attrs.section(QString("container="), -1); if (name != QString::null && (offset = name.indexOf(',')) > 0) name.truncate(offset); my.context_container = name; } if ((offset = my.host.indexOf('@')) >= 0) { my.proxy = my.host; my.proxy.remove(0, offset+1); } my.source = my.host; break; case PM_CONTEXT_ARCHIVE: my.desc = "archive \""; my.desc.append(source); my.desc.append(QChar('\"')); my.source = source; my.proxy = ""; break; } oldContext = pmWhichContext(); hostSpec = source; my.status = pmNewContext(type | my.flags, (const char *)hostSpec.toAscii()); if (my.status >= 0) { my.handles.append(my.status); // Fetch the server-side host name for this context, properly as of pcp 3.8.3+. my.context_hostname = pmGetContextHostName(my.status); // NB: may leak memory if (my.context_hostname == "") // may be returned for errors or PM_CONTEXT_LOCAL my.context_hostname = localHost; if (my.type == PM_CONTEXT_ARCHIVE) { pmLogLabel lp; sts = pmGetArchiveLabel(&lp); if (sts < 0) { pmprintf("%s: Unable to obtain log label for \"%s\": %s\n", pmProgname, (const char *)my.desc.toAscii(), pmErrStr(sts)); my.host = "unknown?"; my.status = sts; goto done; } else { my.host = lp.ll_hostname; my.start = lp.ll_start; } sts = pmGetArchiveEnd(&my.end); if (sts < 0) { pmprintf("%s: Unable to determine end of \"%s\": %s\n", pmProgname, (const char *)my.desc.toAscii(), pmErrStr(sts)); my.status = sts; goto done; } } else { gettimeofday(&my.start, NULL); my.end = my.start; } if (pmDebug & DBG_TRACE_PMC) { QTextStream cerr(stderr); cerr << "QmcSource::QmcSource: Created context " << my.handles.last() << " to " << my.desc << endl; } oldTZ = pmWhichZone(&tzs); my.tz = pmNewContextZone(); if (my.tz < 0) pmprintf("%s: Warning: Unable to obtain timezone for %s: %s\n", pmProgname, (const char *)my.desc.toAscii(), pmErrStr(my.tz)); else { sts = pmWhichZone(&tzs); if (sts >= 0) my.timezone = tzs; else pmprintf("%s: Warning: Unable to obtain timezone for %s: %s\n", pmProgname, (const char *)my.desc.toAscii(), pmErrStr(sts)); } if (oldTZ >= 0) { sts = pmUseZone(oldTZ); if (sts < 0) { pmprintf("%s: Warning: Unable to switch timezones." " Using timezone for %s: %s\n", pmProgname, (const char *)my.desc.toAscii(), pmErrStr(sts)); } } } else if (pmDebug & DBG_TRACE_PMC) { QTextStream cerr(stderr); cerr << "QmcSource::QmcSource: Context to " << source << " failed: " << pmErrStr(my.status) << endl; } done: sourceList.append(this); if (oldContext >= 0) { sts = pmUseContext(oldContext); if (sts < 0) { pmprintf("%s: Warning: Unable to switch contexts." " Using context to %s: %s\n", pmProgname, (const char *)my.desc.toAscii(), pmErrStr(sts)); } } }
int main(int argc, char **argv) { int c; int sts; int e_sts = 0; int errflag = 0; int ahtype = 0; int verbose = 0; int quick = 0; char *host = NULL; /* pander to gcc */ pmResult *result; pmResult *prev = NULL; struct timeval start = { 0,0 }; struct timeval end; int tzh; off_t trunc_size = 0; __pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "a:D:t:qv?")) != EOF) { switch (c) { case 'a': /* archive name */ if (ahtype != 0) { fprintf(stderr, "%s: at most one of -a and/or -h allowed\n", pmProgname); errflag++; } ahtype = PM_CONTEXT_ARCHIVE; host = optarg; break; #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 't': /* truncate */ trunc_size = atol(optarg); break; case 'q': /* quick */ quick = 1; break; case 'v': /* verbose */ verbose++; break; case '?': default: errflag++; break; } } if (errflag || optind < argc) { fprintf(stderr, "Usage: %s options ...\n\ \n\ Options\n\ -a archive metrics source is an archive log\n\ -t size truncate archive to size bytes\n\ -q quick (read last 3 records, not the whole archive)\n\ -v verbose\n", pmProgname); exit(1); } if (ahtype != PM_CONTEXT_ARCHIVE) { fprintf(stderr, "%s: -a is not optional!\n", pmProgname); exit(1); } /* truncate if -t specified, _before_ opening archive */ if (trunc_size != 0) { if (access(host, W_OK) == 0) { if (truncate(host, trunc_size) != 0) { fprintf(stderr, "%s: file %s exists, but cannot truncate\n", pmProgname, host); exit(1); } } else { char path[MAXPATHLEN]; sprintf(path, "%s.0", host); if (access(path, W_OK) == 0) { if (truncate(path, trunc_size) != 0) { fprintf(stderr, "%s: file %s exists, but cannot truncate\n", pmProgname, path); exit(1); } } else { fprintf(stderr, "%s: cannot find writeable %s or %s\n", pmProgname, host, path); exit(1); } } } if ((sts = pmNewContext(ahtype, host)) < 0) { fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", pmProgname, host, pmErrStr(sts)); exit(1); } /* force -z (timezone of archive */ if ((tzh = pmNewContextZone()) < 0) { fprintf(stderr, "%s: Cannot set context timezone: %s\n", pmProgname, pmErrStr(tzh)); exit(1); } sts = pmGetArchiveEnd(&end); if (sts < 0) { printf("pmGetArchiveEnd: %s\n", pmErrStr(sts)); } else { if (verbose) { printf("pmGetArchiveEnd time: "); printstamp(&end); printf("\n"); } } sts = pmSetMode(PM_MODE_BACK, &end, 0); if (sts < 0) { printf("pmSetMode PM_MODE_BACK: %s\n", pmErrStr(sts)); exit(1); } sts = pmFetchArchive(&result); if (sts < 0) { printf("pmFetchArchive: %s\n", pmErrStr(sts)); e_sts = 1; } else { if (verbose) { printf("last result time (direct): "); printstamp(&result->timestamp); printf("\n"); } if (result->timestamp.tv_sec != end.tv_sec || result->timestamp.tv_usec != end.tv_usec) { printf("Mismatch: end="); printstamp(&end); printf(" direct="); printstamp(&result->timestamp); printf("\n"); e_sts = 1; } start.tv_sec = result->timestamp.tv_sec; start.tv_usec = result->timestamp.tv_usec; pmFreeResult(result); } if (quick && e_sts == 0) { int i; for (i = 0; i < 2; i++) { sts = pmFetchArchive(&result); if (sts >= 0) { start.tv_sec = result->timestamp.tv_sec; start.tv_usec = result->timestamp.tv_usec; pmFreeResult(result); } } } else { /* start from the epoch and move forward */ start.tv_sec = 0; start.tv_usec = 0; } sts = pmSetMode(PM_MODE_FORW, &start, 0); if (sts < 0) { printf("pmSetMode PM_MODE_FORW: %s\n", pmErrStr(sts)); exit(1); } while ((sts = pmFetchArchive(&result)) >= 0) { if (prev != NULL) pmFreeResult(prev); prev = result; } if (verbose) printf("pmFetchArchive: %s\n", pmErrStr(sts)); if (prev == NULL) { printf("no results!\n"); } else { if (verbose) { printf("last result time (serial): "); printstamp(&prev->timestamp); printf("\n"); } if (prev->timestamp.tv_sec != end.tv_sec || prev->timestamp.tv_usec != end.tv_usec) { printf("Mismatch: end="); printstamp(&end); printf(" serial="); printstamp(&prev->timestamp); printf("\n"); e_sts = 1; } pmFreeResult(prev); } exit(e_sts); }
int main(int argc, char **argv) { int c; int i; int sts; int errflag = 0; int type = 0; int verbose = 0; char *host = NULL; /* pander to gcc */ int mode = PM_MODE_INTERP; /* mode for archives */ char *configfile = NULL; char *start = NULL; char *finish = NULL; char *align = NULL; char *offset = NULL; char *logfile = NULL; pmLogLabel label; /* get hostname for archives */ int zflag = 0; /* for -z */ char *tz = NULL; /* for -Z timezone */ int tzh; /* initial timezone handle */ char local[MAXHOSTNAMELEN]; char *pmnsfile = PM_NS_DEFAULT; int samples = -1; double delta = 1.0; char *endnum; struct timeval startTime; struct timeval endTime; struct timeval appStart; struct timeval appEnd; struct timeval appOffset; pmSetProgname(argv[0]); while ((c = getopt(argc, argv, "a:A:c:D:h:l:Ln:O:s:S:t:T:U:VzZ:?")) != EOF) { switch (c) { case 'a': /* archive name */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } type = PM_CONTEXT_ARCHIVE; host = optarg; break; case 'A': /* time alignment */ align = optarg; break; case 'c': /* configfile */ if (configfile != NULL) { fprintf(stderr, "%s: at most one -c option allowed\n", pmGetProgname()); errflag++; } configfile = optarg; break; case 'D': /* debug options */ sts = pmSetDebug(optarg); if (sts < 0) { fprintf(stderr, "%s: unrecognized debug options specification (%s)\n", pmGetProgname(), optarg); errflag++; } break; case 'h': /* contact PMCD on this hostname */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } host = optarg; type = PM_CONTEXT_HOST; break; case 'L': /* LOCAL, no PMCD */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } host = NULL; type = PM_CONTEXT_LOCAL; putenv("PMDA_LOCAL_PROC="); /* if proc PMDA needed */ putenv("PMDA_LOCAL_SAMPLE="); /* if sampledso PMDA needed */ break; case 'l': /* logfile */ logfile = optarg; break; case 'n': /* alternative name space file */ pmnsfile = optarg; break; case 'O': /* sample offset time */ offset = optarg; break; case 's': /* sample count */ samples = (int)strtol(optarg, &endnum, 10); if (*endnum != '\0' || samples < 0) { fprintf(stderr, "%s: -s requires numeric argument\n", pmGetProgname()); errflag++; } break; case 'S': /* start time */ start = optarg; break; case 't': /* delta seconds (double) */ delta = strtod(optarg, &endnum); if (*endnum != '\0' || delta <= 0.0) { fprintf(stderr, "%s: -t requires floating point argument\n", pmGetProgname()); errflag++; } break; case 'T': /* terminate time */ finish = optarg; break; case 'U': /* uninterpolated archive log */ if (type != 0) { fprintf(stderr, "%s: at most one of -a, -h, -L and -U allowed\n", pmGetProgname()); errflag++; } type = PM_CONTEXT_ARCHIVE; mode = PM_MODE_FORW; host = optarg; break; case 'V': /* verbose */ verbose++; break; case 'z': /* timezone from host */ if (tz != NULL) { fprintf(stderr, "%s: at most one of -Z and/or -z allowed\n", pmGetProgname()); errflag++; } zflag++; break; case 'Z': /* $TZ timezone */ if (zflag) { fprintf(stderr, "%s: at most one of -Z and/or -z allowed\n", pmGetProgname()); errflag++; } tz = optarg; break; case '?': default: errflag++; break; } } if (zflag && type == 0) { fprintf(stderr, "%s: -z requires an explicit -a, -h or -U option\n", pmGetProgname()); errflag++; } if (errflag) { fprintf(stderr, "Usage: %s options ...\n\ \n\ Options\n\ -a archive metrics source is an archive log\n\ -A align time alignment\n\ -c configfile file to load configuration from\n\ -D debug standard PCP debug options\n\ -h host metrics source is PMCD on host\n\ -l logfile redirect diagnostics and trace output\n\ -L use local context instead of PMCD\n\ -n pmnsfile use an alternative PMNS\n\ -O offset offset sample time\n\ -s samples terminate after this many iterations\n\ -S start start at this time\n\ -t delta sample interval in seconds(float) [default 1.0]\n\ -T finish finish at this time\n\ -U archive metrics source is an uninterpolated archive log\n\ -V verbose/diagnostic output\n\ -z set reporting timezone to local time for host from -a, -h or -U\n\ -Z timezone set reporting timezone\n", pmGetProgname()); exit(1); } if (logfile != NULL) { pmOpenLog(pmGetProgname(), logfile, stderr, &sts); if (sts < 0) { fprintf(stderr, "%s: Could not open logfile \"%s\"\n", pmGetProgname(), logfile); } } if (pmnsfile != PM_NS_DEFAULT && (sts = pmLoadNameSpace(pmnsfile)) < 0) { printf("%s: Cannot load namespace from \"%s\": %s\n", pmGetProgname(), pmnsfile, pmErrStr(sts)); exit(1); } if (type == 0) { type = PM_CONTEXT_HOST; gethostname(local, sizeof(local)); host = local; } if ((sts = pmNewContext(type, host)) < 0) { if (type == PM_CONTEXT_HOST) fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", pmGetProgname(), host, pmErrStr(sts)); else fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", pmGetProgname(), host, pmErrStr(sts)); exit(1); } if (type == PM_CONTEXT_ARCHIVE) { if ((sts = pmGetArchiveLabel(&label)) < 0) { fprintf(stderr, "%s: Cannot get archive label record: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } if (mode != PM_MODE_INTERP) { if ((sts = pmSetMode(mode, &label.ll_start, 0)) < 0) { fprintf(stderr, "%s: pmSetMode: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } } startTime = label.ll_start; sts = pmGetArchiveEnd(&endTime); if (sts < 0) { fprintf(stderr, "%s: pmGetArchiveEnd: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } } else { gettimeofday(&startTime, NULL); endTime.tv_sec = INT_MAX; } if (zflag) { if ((tzh = pmNewContextZone()) < 0) { fprintf(stderr, "%s: Cannot set context timezone: %s\n", pmGetProgname(), pmErrStr(tzh)); exit(1); } if (type == PM_CONTEXT_ARCHIVE) printf("Note: timezone set to local timezone of host \"%s\" from archive\n\n", label.ll_hostname); else printf("Note: timezone set to local timezone of host \"%s\"\n\n", host); } else if (tz != NULL) { if ((tzh = pmNewZone(tz)) < 0) { fprintf(stderr, "%s: Cannot set timezone to \"%s\": %s\n", pmGetProgname(), tz, pmErrStr(tzh)); exit(1); } printf("Note: timezone set to \"TZ=%s\"\n\n", tz); } else tzh = pmNewContextZone(); /* non-flag args are argv[optind] ... argv[argc-1] */ while (optind < argc) { printf("extra argument[%d]: %s\n", optind, argv[optind]); optind++; } if (align != NULL && type != PM_CONTEXT_ARCHIVE) { fprintf(stderr, "%s: -A option only supported for PCP archives, alignment request ignored\n", pmGetProgname()); align = NULL; } sts = pmParseTimeWindow(start, finish, align, offset, &startTime, &endTime, &appStart, &appEnd, &appOffset, &endnum); if (sts < 0) { fprintf(stderr, "%s: %s\n", pmGetProgname(), endnum); exit(1); } if ((sts = pmLookupName(2, namelist, pmidlist)) < 0) { fprintf(stderr, "%s: pmLookupName failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } /* goto the start */ if ((sts = pmSetMode(PM_MODE_INTERP, &appStart, (int)(delta * 1000))) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } pmCtime(&appStart.tv_sec, timebuf); printf("archive %s\nstartTime: %19.19s.%06d\n", host, timebuf, (int)appStart.tv_usec); pmCtime(&appEnd.tv_sec, timebuf); printf("endTime : %19.19s.%06d\nsamples=%d delta=%dms\n", timebuf, (int)appEnd.tv_usec, samples, (int)(delta * 1000)); /* play forwards over the mark */ for (i=0; i < samples; i++) { if ((sts = pmFetch(2, pmidlist, &result)) < 0) { fprintf(stderr, "%s: pmFetch failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } check_result("forwards ", result); curpos = result->timestamp; /* struct cpy */ pmFreeResult(result); } /* rewind back over the mark */ if ((sts = pmSetMode(PM_MODE_INTERP, &curpos, (int)(delta * -1000))) < 0) { fprintf(stderr, "%s: pmSetMode failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } for (i=0; i < samples; i++) { if ((sts = pmFetch(2, pmidlist, &result)) < 0) { fprintf(stderr, "%s: pmFetch failed: %s\n", pmGetProgname(), pmErrStr(sts)); exit(1); } check_result("rewinding", result); pmFreeResult(result); } return 0; }