diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/src/hp-mib.c | |
download | pcp-47e6e7c84f008a53061e661f31ae96629bc694ef.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/src/hp-mib.c')
-rw-r--r-- | qa/src/hp-mib.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/qa/src/hp-mib.c b/qa/src/hp-mib.c new file mode 100644 index 0000000..fb31b93 --- /dev/null +++ b/qa/src/hp-mib.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved. + */ + +/* short test program for hp-mib metrics */ + +#include <pcp/pmapi.h> +#include <pcp/impl.h> + +static char *metrics[] = { + "proc.nprocs", + "proc.psinfo.pid", + "proc.psinfo.uid", + "proc.psinfo.ppid", + "proc.psinfo.nice", + "proc.psinfo.ttydev", + "proc.psinfo.gid", + "proc.psinfo.pgrp", + "proc.psinfo.pri", + "proc.psinfo.oldpri", + "proc.psinfo.addr", + "proc.psinfo.cpu", + "proc.psinfo.uname", + "proc.psinfo.gname", + "proc.psinfo.ttyname", + "proc.pstatus.utime", + "proc.pstatus.stime", + "proc.psusage.starttime", + "proc.pstatus.flags", + "proc.psinfo.state", + "proc.psinfo.sname", + "proc.psinfo.wchan", + "proc.psinfo.fname", + "proc.psinfo.psargs", + "proc.psinfo.time", + "proc.psusage.tstamp", + "proc.psusage.starttime", + "proc.psinfo.clname", + "proc.psinfo.time", + "proc.psusage.rss", + "proc.pscred.suid", + "proc.psinfo.ttydev", + "proc.memory.virtual.txt", + "proc.memory.virtual.dat", + "proc.memory.virtual.bss", + "proc.memory.virtual.stack", + "proc.memory.virtual.shm", + "proc.memory.physical.txt", + "proc.memory.physical.dat", + "proc.memory.physical.bss", + "proc.memory.physical.stack", + "proc.memory.physical.shm" +}; + +#define NMETRICS (sizeof(metrics) / sizeof(metrics[0])) +static pmID pmids[NMETRICS]; + +static int +int_compare(int *a, int *b) +{ + return *a - *b; +} + +int +main(int argc, char **argv) +{ + int c; + int sts; + int errflag = 0; + char *namespace = PM_NS_DEFAULT; + pmResult *result; + pmDesc desc; + int all_n; + int *all_inst; + char **all_names; + int (*int_cmp)() = int_compare; +#ifdef PCP_DEBUG + static char *debug = "[-D N]"; +#else + static char *debug = ""; +#endif + static char *usage = " [-n namespace]"; + + __pmSetProgname(argv[0]); + + while ((c = getopt(argc, argv, "D:n:")) != 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 'n': /* alternative name space file */ + namespace = optarg; + break; + + case '?': + default: + errflag++; + break; + } + } + + if (errflag) { + fprintf(stderr, "Usage: %s %s%s\n", pmProgname, debug, usage); + exit(1); + } + + + /* + * Startup: + * a) load the name space + * b) lookup the metrics in the name space + * c) establish a context + * d) get the instance domain identifier + * [Note: these steps only have to be done once on startup] + */ + if ((sts = pmLoadNameSpace(namespace)) < 0) { + printf("%s: Cannot load namespace from \"%s\": %s\n", pmProgname, namespace, pmErrStr(sts)); + exit(1); + } + if ((sts = pmLookupName(NMETRICS, metrics, pmids)) < 0) { + printf("%s: %s\n", pmProgname, pmErrStr(sts)); + exit(1); + } + putenv("PMDA_LOCAL_PROC="); + if ((sts = pmNewContext(PM_CONTEXT_LOCAL, NULL)) < 0) { + printf("%s: Cannot make local connection: %s\n", pmProgname, pmErrStr(sts)); + exit(1); + } + if ((sts = pmLookupDesc(pmids[1], &desc)) < 0) { + fprintf(stderr, "pmLookupDesc: %s\n", pmErrStr(sts)); + exit(1); + } + + + + /* + * Enumerate the instance domain + * [This has to be done before every fetch] + */ + if (desc.indom != PM_INDOM_NULL) { + all_n = pmGetInDom(desc.indom, &all_inst, &all_names); + if (all_n < 0) { + printf("%s: pmGetInDom: %s\n", pmProgname, pmErrStr(all_n)); + exit(1); + } + } + else { + printf("%s: botch: metric %s (%s) should have an instance domain\n", pmProgname, metrics[1], pmIDStr(pmids[1])); + exit(1); + } + + /* + * sort the instance identifiers + * [This has to be done before every fetch] + */ + qsort(all_inst, all_n, sizeof(int), int_cmp); + + /* + * establish an explicit instance profile + * [This has to be done before every fetch] + */ + pmDelProfile(desc.indom, 0, (int *)0); /* exclude everything first */ + pmAddProfile(desc.indom, all_n, all_inst); /* and then explicitly include our list of pids */ + + /* + * fetch the desired metrics + */ + sts = pmFetch(NMETRICS, pmids, &result); + if (sts < 0) { + printf("%s: fetch all %d instances : %s\n", pmProgname, all_n, pmErrStr(sts)); + exit(1); + } + + + + printf("\n\n-------- Result Dump --------------\n"); + __pmDumpResult(stdout, result); + + /* note: in a loop, you need to free(all_inst); free(all_names); on every iteration */ + + free(all_inst); + free(all_names); + pmFreeResult(result); + if ((sts = pmWhichContext()) < 0) { + printf("%s: pmWhichContext: %s\n", pmProgname, pmErrStr(sts)); + exit(1); + } + pmDestroyContext(sts); + exit(0); +} + |