static int logger_text(int ident, int type, char **buffer, pmdaExt *pmda) { int numstatics = sizeof(static_metrictab)/sizeof(static_metrictab[0]); pmdaEventNewClient(pmda->e_context); if ((type & PM_TEXT_PMID) == PM_TEXT_PMID) { /* Lookup pmid in the metric table. */ int item = pmid_item(ident); /* If the PMID item was for a dynamic metric... */ if (item >= numstatics && item < nummetrics /* and the PMID matches... */ && metrictab[item].m_desc.pmid == (pmID)ident /* and we've got user data... */ && metrictab[item].m_user != NULL) { dynamic_metric_info_t *pinfo = metrictab[item].m_user; /* Return the correct help text. */ *buffer = (char *)pinfo->help_text; return 0; } } return pmdaText(ident, type, buffer, 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; }
/* * 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); }
/* * 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; }
int do_vm_uvmexp_metrics(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom) { int sts; if (inst == PM_IN_NULL) { if (valid == 0) /* refesh failed */ return PM_ERR_AGAIN; sts = 1; /* cluster and domain already checked, just need item ... */ switch (pmid_item(mdesc->m_desc.pmid)) { case 1: /* kernel.all.pswitch */ atom->ull = stats.swtch; break; case 2: /* kernel.all.syscall */ atom->ull = stats.syscalls; break; case 3: /* kernel.all.intr */ atom->ull = stats.intrs; break; case 4: /* mem.util.all */ atom->ul = ((int64_t)stats.npages*stats.pagesize+512)/1024; break; case 5: /* mem.util.used */ atom->ul = ((int64_t)(stats.npages-stats.free)*stats.pagesize+512)/1024; break; case 6: /* mem.util.free */ atom->ul = ((int64_t)stats.free*stats.pagesize+512)/1024; break; case 7: /* mem.util.paging */ atom->ul = ((int64_t)stats.paging*stats.pagesize+512)/1024; break; case 8: /* mem.util.cached */ atom->ul = stats.filepages + stats.execpages; atom->ul = ((int64_t)atom->ul*stats.pagesize+512)/1024; break; case 9: /* mem.util.wired */ atom->ul = ((int64_t)stats.wired*stats.pagesize+512)/1024; break; case 10: /* mem.util.active */ atom->ul = ((int64_t)stats.active*stats.pagesize+512)/1024; break; case 11: /* mem.util.inactive */ atom->ul = ((int64_t)stats.inactive*stats.pagesize+512)/1024; break; case 12: /* mem.util.zeropages */ atom->ul = ((int64_t)stats.zeropages*stats.pagesize+512)/1024; break; case 13: /* mem.util.pagedaemonpages */ atom->ul = ((int64_t)stats.reserve_pagedaemon*stats.pagesize+512)/1024; break; case 14: /* mem.util.kernelpages */ atom->ul = ((int64_t)stats.reserve_kernel*stats.pagesize+512)/1024; break; case 15: /* mem.util.anonpages */ atom->ul = ((int64_t)stats.anonpages*stats.pagesize+512)/1024; break; case 16: /* mem.util.filepages */ atom->ul = ((int64_t)stats.filepages*stats.pagesize+512)/1024; break; case 17: /* mem.util.execpages */ atom->ul = ((int64_t)stats.execpages*stats.pagesize+512)/1024; break; default: sts = PM_ERR_PMID; break; } } else { /* * these metrics don't have an instance domain */ sts = PM_ERR_INST; } return sts; }
int do_netif_metrics(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom) { struct if_msghdr *ifm; int sts; if (!valid) return 0; if (inst != PM_IN_NULL) { /* * per-network interface metrics */ sts = pmdaCacheLookup(indomtab[NETIF_INDOM].it_indom, inst, NULL, (void **)&ifm); if (sts == PMDA_CACHE_ACTIVE) { sts = 1; /* cluster and domain already checked, just need item ... */ switch (pmid_item(mdesc->m_desc.pmid)) { case 0: /* network.interface.mtu */ atom->ull = ifm->ifm_data.ifi_mtu; break; case 1: /* network.interface.up */ atom->ul = (ifm->ifm_flags & IFF_UP) == IFF_UP; break; case 2: /* network.interface.baudrate */ atom->ull = ifm->ifm_data.ifi_baudrate; break; case 3: /* network.interface.in.bytes */ atom->ull = ifm->ifm_data.ifi_ibytes; break; case 4: /* network.interface.in.packets */ atom->ull = ifm->ifm_data.ifi_ipackets; break; case 5: /* network.interface.in.mcasts */ atom->ull = ifm->ifm_data.ifi_imcasts; break; case 6: /* network.interface.in.errors */ atom->ull = ifm->ifm_data.ifi_ierrors; break; case 7: /* network.interface.in.drops */ atom->ull = ifm->ifm_data.ifi_iqdrops; break; case 8: /* network.interface.out.bytes */ atom->ull = ifm->ifm_data.ifi_obytes; break; case 9: /* network.interface.out.packets */ atom->ull = ifm->ifm_data.ifi_opackets; break; case 10: /* network.interface.out.mcasts */ atom->ull = ifm->ifm_data.ifi_omcasts; break; case 11: /* network.interface.out.errors */ atom->ull = ifm->ifm_data.ifi_oerrors; break; case 12: /* network.interface.out.collisions */ atom->ull = ifm->ifm_data.ifi_collisions; break; case 13: /* network.interface.total.bytes */ atom->ull = ifm->ifm_data.ifi_ibytes + ifm->ifm_data.ifi_obytes; break; case 14: /* network.interface.total.packets */ atom->ull = ifm->ifm_data.ifi_ipackets + ifm->ifm_data.ifi_opackets; break; case 15: /* network.interface.total.mcasts */ atom->ull = ifm->ifm_data.ifi_imcasts + ifm->ifm_data.ifi_omcasts; break; case 16: /* network.interface.total.errors */ atom->ull = ifm->ifm_data.ifi_ierrors + ifm->ifm_data.ifi_oerrors; break; default: sts = PM_ERR_PMID; break; } } else sts = 0; } else { /* * most network interface metrics don't have an instance domain * * cluster and domain already checked, just need item ... */ switch (pmid_item(mdesc->m_desc.pmid)) { case 17: /* hinv.interface */ atom->ul = valid; sts = 1; break; default: sts = PM_ERR_INST; break; } } return sts; }