/* * wrapper for pmdaFetch ... force value caches to be reloaded if needed, * then do the fetch */ static int freebsd_fetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda) { int i; int done_disk = 0; int done_netif = 0; for (i = 0; i < maplen; i++) { map[i].m_fetched = 0; } /* * pre-fetch all metrics if needed, and update instance domains if * they have changed */ for (i = 0; !done_disk && !done_netif && i < numpmid; i++) { if (pmid_cluster(pmidlist[i]) == CL_DISK) { refresh_disk_metrics(); done_disk = 1; } else if (pmid_cluster(pmidlist[i]) == CL_NETIF) { refresh_netif_metrics(); done_netif = 1; } } return pmdaFetch(numpmid, pmidlist, resp, pmda); }
static int interrupts_text(pmdaExt *pmda, pmID pmid, int type, char **buf) { int item = pmid_item(pmid); int cluster = pmid_cluster(pmid); char *text; switch (cluster) { case CLUSTER_INTERRUPT_LINES: if (item > lines_count) return PM_ERR_PMID; text = interrupt_lines[item].text; if (text == NULL || text[0] == '\0') return PM_ERR_TEXT; *buf = text; return 0; case CLUSTER_INTERRUPT_OTHER: if (item > other_count) return PM_ERR_PMID; text = interrupt_other[item].text; if (text == NULL || text[0] == '\0') return PM_ERR_TEXT; *buf = text; return 0; } return PM_ERR_PMID; }
/* * wrapper for pmdaFetch ... force value caches to be reloaded if needed, * then do the fetch */ static int openbsd_fetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda) { int i; int done_disk = 0; int done_percpu = 0; int done_netif = 0; int done_filesys = 0; int done_swap = 0; int done_vm_uvmexp = 0; for (i = 0; i < maplen; i++) { map[i].m_fetched = 0; } /* * pre-fetch all metrics if needed, and update instance domains if * they have changed */ for (i = 0; i < numpmid; i++) { if (pmid_cluster(pmidlist[i]) == CL_DISK) { if (!done_disk) { refresh_disk_metrics(); done_disk = 1; } } else if (pmid_cluster(pmidlist[i]) == CL_CPUTIME) { if (!done_percpu) { refresh_percpu_metrics(); done_percpu = 1; } } else if (pmid_cluster(pmidlist[i]) == CL_NETIF) { if (!done_netif) { refresh_netif_metrics(); done_netif = 1; } } else if (pmid_cluster(pmidlist[i]) == CL_FILESYS) { if (!done_filesys) { refresh_filesys_metrics(); done_netif = 1; } } else if (pmid_cluster(pmidlist[i]) == CL_SWAP) { if (!done_swap) { refresh_swap_metrics(); done_swap = 1; } } else if (pmid_cluster(pmidlist[i]) == CL_VM_UVMEXP) { if (!done_vm_uvmexp) { refresh_vm_uvmexp_metrics(); done_vm_uvmexp = 1; } } } return pmdaFetch(numpmid, pmidlist, resp, pmda); }
/* * Create a new metric table entry based on an existing one. */ static void refresh_metrictable(pmdaMetric *source, pmdaMetric *dest, int id) { int domain = pmid_domain(source->m_desc.pmid); int cluster = pmid_cluster(source->m_desc.pmid); memcpy(dest, source, sizeof(pmdaMetric)); dest->m_desc.pmid = pmid_build(domain, cluster, id); if (pmDebug & DBG_TRACE_LIBPMDA) fprintf(stderr, "interrupts refresh_metrictable: (%p -> %p) " "metric ID dup: %d.%d.%d -> %d.%d.%d\n", source, dest, domain, cluster, pmid_item(source->m_desc.pmid), domain, cluster, id); }
static int sbstats_text(pmdaExt *pmda, pmID pmid, int type, char **buf) { int item = pmid_item(pmid); static char text[128]; if (pmid_cluster(pmid) != CLUSTER_SBSTATS) return PM_ERR_PMID; if (item < 0 || item >= SBSTATS_COUNT) return PM_ERR_PMID; snprintf(text, sizeof(text), "%s for %s glocks", stattext[item % NUM_LOCKSTATS], locktype[item / NUM_LOCKSTATS]); *buf = text; return 0; }
/* * Create a new metric table entry based on an existing one. * */ static void refresh_metrictable(pmdaMetric *source, pmdaMetric *dest, int lock) { int item = pmid_item(source->m_desc.pmid); int domain = pmid_domain(source->m_desc.pmid); int cluster = pmid_cluster(source->m_desc.pmid); memcpy(dest, source, sizeof(pmdaMetric)); item += lock * NUM_LOCKSTATS; dest->m_desc.pmid = pmid_build(domain, cluster, item); if (pmDebug & DBG_TRACE_APPL0) fprintf(stderr, "GFS2 sbstats refresh_metrictable: (%p -> %p) " "metric ID dup: %d.%d.%d -> %d.%d.%d\n", source, dest, domain, cluster, pmid_item(source->m_desc.pmid), domain, cluster, item); }
/* * Initialise the agent (both daemon and DSO). * * Do mapping from sysclt(3) names to mibs. * Collect some global constants. * Build the system-specific, but not dynamic, instance domains, * e.g. CPU_INDOM. * Initialize the kernel memory reader. */ void openbsd_init(pmdaInterface *dp) { int i; int m; int sts; struct clockinfo clockrates; size_t sz; int mib[CTL_MAXNAME]; /* enough for longest mib key */ char iname[16]; /* enough for cpuNN.. */ if (isDSO) { char mypath[MAXPATHLEN]; int sep = __pmPathSeparator(); snprintf(mypath, sizeof(mypath), "%s%c" "openbsd" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_5, "openbsd DSO", mypath); } else { __pmSetProcessIdentity(username); } if (dp->status != 0) return; dp->version.four.fetch = openbsd_fetch; dp->version.four.instance = openbsd_instance; pmdaSetFetchCallBack(dp, openbsd_fetchCallBack); pmdaInit(dp, indomtab, indomtablen, metrictab, metrictablen); /* * Link metrictab[] entries via m_user to map[] entries based on * matching sysctl(3) name * * also translate the sysctl(3) name to a mib */ for (m = 0; m < metrictablen; m++) { if (pmid_cluster(metrictab[m].m_desc.pmid) != CL_SYSCTL) { /* not using sysctl(3) */ continue; } for (i = 0; i < maplen; i++) { if (matchname(map[i].m_pcpname, (char *)metrictab[m].m_user)) { if (map[i].m_mib == NULL) { /* * multiple metrictab[] entries may point to the same * mib[] entry, but this is the first time for this * mib[] entry ... */ map[i].m_miblen = sizeof(mib); sts = sysctlnametomib(map[i].m_name, mib, &map[i].m_miblen); if (sts == 0) { map[i].m_mib = (int *)malloc(map[i].m_miblen*sizeof(map[i].m_mib[0])); if (map[i].m_mib == NULL) { fprintf(stderr, "Error: %s (%s): failed mib alloc for sysctl metric \"%s\"\n", map[i].m_pcpname, pmIDStr(metrictab[m].m_desc.pmid), map[i].m_name); __pmNoMem("openbsd_init: mib", map[i].m_miblen*sizeof(map[i].m_mib[0]), PM_FATAL_ERR); /*NOTREACHED*/ } memcpy(map[i].m_mib, mib, map[i].m_miblen*sizeof(map[i].m_mib[0])); } else { fprintf(stderr, "Error: %s (%s): failed sysctlnametomib(\"%s\", ...): %s\n", map[i].m_pcpname, pmIDStr(metrictab[m].m_desc.pmid), map[i].m_name, pmErrStr(-errno)); metrictab[m].m_user = (void *)&bad_mib; } } #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL0) { int p; fprintf(stderr, "Info: %s (%s): sysctl metric \"%s\" -> ", (char *)metrictab[m].m_user, pmIDStr(metrictab[m].m_desc.pmid), map[i].m_name); for (p = 0; p < map[i].m_miblen; p++) { if (p > 0) fputc('.', stderr); fprintf(stderr, "%d", map[i].m_mib[p]); } fputc('\n', stderr); } #endif metrictab[m].m_user = (void *)&map[i]; break; } } if (i == maplen) { fprintf(stderr, "Error: %s (%s): cannot match name in sysctl map[]\n", (char *)metrictab[m].m_user, pmIDStr(metrictab[m].m_desc.pmid)); metrictab[m].m_user = (void *)&bad_mib; } } /* * Collect some global constants needed later ... */ mib[0] = CTL_KERN; mib[1] = KERN_CLOCKRATE; sz = sizeof(clockrates); sts = sysctl(mib, 2, &clockrates, &sz, NULL, 0); if (sts < 0) { fprintf(stderr, "Fatal Error: sysctl(\"kern.clockrate\", ...) failed: %s\n", pmErrStr(-errno)); exit(1); } cpuhz = clockrates.stathz; #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL0) fprintf(stderr, "Info: CPU time \"hz\" = %d\n", cpuhz); #endif mib[0] = CTL_HW; mib[1] = HW_NCPU; sz = sizeof(ncpu); sts = sysctl(mib, 2, &ncpu, &sz, NULL, 0); if (sts < 0) { fprintf(stderr, "Fatal Error: sysctl(\"hw.ncpu\", ...) failed: %s\n", pmErrStr(-errno)); exit(1); } #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL0) fprintf(stderr, "Info: ncpu = %d\n", ncpu); #endif mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; sz = sizeof(pagesize); sts = sysctl(mib, 2, &pagesize, &sz, NULL, 0); if (sts < 0) { fprintf(stderr, "Fatal Error: sysctl(\"hw.pagesize\", ...) failed: %s\n", pmErrStr(-errno)); exit(1); } #ifdef PCP_DEBUG if (pmDebug & DBG_TRACE_APPL0) fprintf(stderr, "Info: VM pagesize = %d\n", pagesize); #endif uname(&kernel_uname); /* * Build some instance domains ... */ indomtab[CPU_INDOM].it_numinst = ncpu; indomtab[CPU_INDOM].it_set = (pmdaInstid *)malloc(ncpu * sizeof(pmdaInstid)); if (indomtab[CPU_INDOM].it_set == NULL) { __pmNoMem("openbsd_init: CPU_INDOM it_set", ncpu * sizeof(pmdaInstid), PM_FATAL_ERR); /*NOTREACHED*/ } for (i = 0; i < ncpu; i++) { indomtab[CPU_INDOM].it_set[i].i_inst = i; snprintf(iname, sizeof(iname), "cpu%d", i); indomtab[CPU_INDOM].it_set[i].i_name = strdup(iname); if (indomtab[CPU_INDOM].it_set[i].i_name == NULL) { __pmNoMem("openbsd_init: CPU_INDOM strdup iname", strlen(iname), PM_FATAL_ERR); /*NOTREACHED*/ } } kmemread_init(); }