/* * Initialise the agent (both daemon and DSO). */ void __PMDA_INIT_CALL mounts_init(pmdaInterface *dp) { if (isDSO) { int sep = __pmPathSeparator(); snprintf(mypath, sizeof(mypath), "%s%c" "mounts" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_2, "mounts DSO", mypath); } else { __pmSetProcessIdentity(username); } if (dp->status != 0) return; dp->version.two.fetch = mounts_fetch; pmdaSetFetchCallBack(dp, mounts_fetchCallBack); pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); /* Let's grab the info right away just to make sure it's there. */ mounts_grab_config_info(); }
void darwin_init(pmdaInterface *dp) { if (_isDSO) { int sep = __pmPathSeparator(); char helppath[MAXPATHLEN]; sprintf(helppath, "%s%c" "darwin" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_3, "darwin DSO", helppath); } else { __pmSetProcessIdentity(username); } if (dp->status != 0) return; dp->version.two.instance = darwin_instance; dp->version.two.fetch = darwin_fetch; pmdaSetFetchCallBack(dp, darwin_fetchCallBack); pmdaSetFlags(dp, PMDA_EXT_FLAG_DIRECT); pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); mach_host = mach_host_self(); host_page_size(mach_host, &mach_page_size); mach_page_shift = ffs(mach_page_size) - 1; if (refresh_hertz(&mach_hertz) != 0) mach_hertz = 100; init_network(); }
void etw_init(pmdaInterface *dp, const char *configfile) { char helppath[MAXPATHLEN]; int sep = __pmPathSeparator(); snprintf(helppath, sizeof(helppath), "%s%c" "etw" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_5, "etw DSO", helppath); if (dp->status != 0) return; if (event_table_init() < 0) return; if (event_init() < 0) return; dp->version.four.fetch = etw_fetch; dp->version.four.store = etw_store; dp->version.four.profile = etw_profile; dp->version.four.text = etw_text; pmdaSetFetchCallBack(dp, etw_fetchCallBack); pmdaSetEndContextCallBack(dp, etw_end_contextCallBack); pmdaInit(dp, NULL, 0, metrictab, sizeof(metrictab)/sizeof(metrictab[0])); }
void broken_init(pmdaInterface *dp) { #if defined(BUG_5) if (_isDSO) /* * we don't grok PMDA_INTERFACE_77 ... 77 is arbitrary, just needs * to be bigger than currently validand supported */ #if defined(VERSION_1) pmdaDSO(dp, 77, "broken DSO", BROKEN, _helpText); #else pmdaDSO(dp, 77, "broken DSO", _helpText); #endif #elif defined(VERSION_1) if (_isDSO) pmdaDSO(dp, PMDA_PROTOCOL_2, "broken DSO", BROKEN, _helpText); #else if (_isDSO) pmdaDSO(dp, PMDA_INTERFACE_2, "broken DSO", _helpText); #endif if (dp->status != 0) return; pmdaSetFetchCallBack(dp, broken_fetchCallBack); #if defined(BUG_2) pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); #elif defined(BUG_3) pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), (pmdaMetric *)0, -1); #elif defined(BUG_4) pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); #else pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); #endif }
/* * Initialise the agent (daemon only). */ void mailq_init(pmdaInterface *dp) { if (dp->status != 0) return; __pmSetProcessIdentity(username); dp->version.two.fetch = mailq_fetch; pmdaSetFetchCallBack(dp, mailq_fetchCallBack); pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); }
/* * Initialise the agent */ void pmda_ctdb_init(pmdaInterface *dp) { if (dp->status != 0) { return; } dp->version.two.fetch = pmda_ctdb_fetch; pmdaSetFetchCallBack(dp, pmda_ctdb_fetch_cb); pmdaInit(dp, NULL, 0, metrictab, (sizeof(metrictab) / sizeof(metrictab[0]))); }
void broken_init(pmdaInterface *dp) { #if defined(BUG_5) if (_isDSO) /* we don't grok PMDA_INTERFACE_4 ... */ #if defined(VERSION_1) pmdaDSO(dp, 4, "broken DSO", BROKEN, _helpText); #else pmdaDSO(dp, 4, "broken DSO", _helpText); #endif #elif defined(VERSION_1) if (_isDSO) pmdaDSO(dp, PMDA_PROTOCOL_2, "broken DSO", BROKEN, _helpText); #else if (_isDSO) pmdaDSO(dp, PMDA_INTERFACE_2, "broken DSO", _helpText); #endif if (dp->status != 0) return; pmdaSetFetchCallBack(dp, broken_fetchCallBack); #if defined(BUG_2) pmdaInit(dp, (pmdaIndom *)0, 0, metrictab, sizeof(metrictab)/sizeof(metrictab[0])); #elif defined(BUG_3) pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), (pmdaMetric *)0, -1); #elif defined(BUG_4) pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); #else pmdaInit(dp, indomtab, sizeof(indomtab)/sizeof(indomtab[0]), metrictab, sizeof(metrictab)/sizeof(metrictab[0])); #endif }
void summary_init(pmdaInterface *dp) { void (*callback)() = freeResultCallback; dp->version.two.profile = summary_profile; dp->version.two.fetch = summary_fetch; dp->version.two.desc = summary_desc; dp->version.two.instance = summary_instance; dp->version.two.store = summary_store; mainLoopFreeResultCallback(callback); pmdaInit(dp, NULL, 0, NULL, 0); }
void __PMDA_INIT_CALL papi_init(pmdaInterface *dp) { int sts; if (isDSO) { int sep = __pmPathSeparator(); snprintf(helppath, sizeof(helppath), "%s%c" "papi" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_6, "papi DSO", helppath); } if (dp->status != 0) return; dp->comm.flags |= PDU_FLAG_AUTH; if ((sts = papi_internal_init(dp)) < 0) { __pmNotifyErr(LOG_ERR, "papi_internal_init: %s\n", pmErrStr(sts)); dp->status = PM_ERR_GENERIC; return; } if ((sts = papi_setup_auto_af()) < 0) { __pmNotifyErr(LOG_ERR, "papi_setup_auto_af: %s\n", pmErrStr(sts)); dp->status = PM_ERR_GENERIC; return; } dp->version.six.fetch = papi_fetch; dp->version.six.store = papi_store; dp->version.six.attribute = papi_contextAttributeCallBack; dp->version.six.desc = papi_desc; dp->version.any.text = papi_text; dp->version.four.pmid = papi_name_lookup; dp->version.four.children = papi_children; pmdaSetFetchCallBack(dp, papi_fetchCallBack); pmdaSetEndContextCallBack(dp, papi_endContextCallBack); pmdaInit(dp, NULL, 0, NULL, 0); }
/* * Initialise the agent (both daemon and DSO). */ void aix_init(pmdaInterface *dp) { if (_isDSO) { int sep = __pmPathSeparator(); snprintf(mypath, sizeof(mypath), "%s%c" "aix" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_3, "AIX DSO", mypath); } else { __pmSetProcessIdentity(username); } if (dp->status != 0) return; dp->version.two.fetch = aix_fetch; pmdaSetFetchCallBack(dp, aix_fetch_callback); init_data(dp->domain); pmdaInit(dp, indomtab, indomtab_sz, metrictab, metrictab_sz); }
/* * Initialise the agent (both daemon and DSO). */ void generic_init(pmdaInterface *dp) { if (isDSO) { int sep = __pmPathSeparator(); snprintf(mypath, sizeof(mypath), "%s%c" "generic" "%c" "help", pmGetConfig("PCP_PMDAS_DIR"), sep, sep); pmdaDSO(dp, PMDA_INTERFACE_2, "generic DSO", mypath); } /** else { __pmSetProcessIdentity(username); } */ if (dp->status != 0) return; pmdaSetFetchCallBack(dp, generic_fetchCallBack); pmdaInit(dp, NULL, 0, metrictab, sizeof(metrictab)/sizeof(metrictab[0])); }
void logger_init(pmdaInterface *dp, const char *configfile) { size_t size; int i, j, sts, item, numloggers; int numstatics = sizeof(static_metrictab)/sizeof(static_metrictab[0]); int numdynamics = sizeof(dynamic_metrictab)/sizeof(dynamic_metrictab[0]); pmdaMetric *pmetric; char name[MAXPATHLEN * 2]; dynamic_metric_info_t *pinfo; __pmSetProcessIdentity(username); /* Read and parse config file. */ if ((numloggers = event_config(configfile)) < 0) return; /* Create the dynamic metric info table based on the logfile table */ size = sizeof(struct dynamic_metric_info) * numdynamics * numloggers; if ((dynamic_metric_infotab = malloc(size)) == NULL) { __pmNoMem("logger_init(dynamic)", size, PM_FATAL_ERR); return; } pinfo = dynamic_metric_infotab; for (i = 0; i < numloggers; i++) { for (j = 0; j < numdynamics; j++) { pinfo->handle = i; pinfo->pmid_index = j; pinfo->help_text = dynamic_helptab[j]; pinfo++; } } /* Create the metric table based on the static and dynamic metric tables */ nummetrics = numstatics + (numloggers * numdynamics); size = sizeof(pmdaMetric) * nummetrics; if ((metrictab = malloc(size)) == NULL) { free(dynamic_metric_infotab); __pmNoMem("logger_init(static)", size, PM_FATAL_ERR); return; } memcpy(metrictab, static_metrictab, sizeof(static_metrictab)); pmetric = &metrictab[numstatics]; pinfo = dynamic_metric_infotab; item = numstatics; for (i = 0; i < numloggers; i++) { memcpy(pmetric, dynamic_metrictab, sizeof(dynamic_metrictab)); for (j = 0; j < numdynamics; j++) { pmetric[j].m_desc.pmid = PMDA_PMID(0, item++); pmetric[j].m_user = pinfo++; } pmetric += numdynamics; } if (dp->status != 0) return; dp->version.four.fetch = logger_fetch; dp->version.four.store = logger_store; dp->version.four.profile = logger_profile; dp->version.four.pmid = logger_pmid; dp->version.four.name = logger_name; dp->version.four.children = logger_children; dp->version.four.text = logger_text; pmdaSetFetchCallBack(dp, logger_fetchCallBack); pmdaSetEndContextCallBack(dp, logger_end_contextCallBack); pmdaInit(dp, NULL, 0, metrictab, nummetrics); /* Create the dynamic PMNS tree and populate it. */ if ((sts = __pmNewPMNS(&pmns)) < 0) { __pmNotifyErr(LOG_ERR, "%s: failed to create new pmns: %s\n", pmProgname, pmErrStr(sts)); pmns = NULL; return; } pmetric = &metrictab[numstatics]; for (i = 0; i < numloggers; i++) { const char *id = event_pmnsname(i); for (j = 0; j < numdynamics; j++) { snprintf(name, sizeof(name), "logger.perfile.%s.%s", id, dynamic_nametab[j]); __pmAddPMNSNode(pmns, pmetric[j].m_desc.pmid, name); } pmetric += numdynamics; } /* for reverse (pmid->name) lookups */ pmdaTreeRebuildHash(pmns, (numloggers * numdynamics)); /* initialise the event and client tracking code */ event_init(metrictab[2].m_desc.pmid); }
void systemd_init(pmdaInterface *dp) { int sts; int journal_fd; dp->version.six.desc = systemd_desc; dp->version.six.fetch = systemd_fetch; dp->version.six.text = systemd_text; dp->version.six.attribute = systemd_contextAttributeCallBack; pmdaSetFetchCallBack(dp, systemd_fetchCallBack); pmdaSetEndContextCallBack(dp, systemd_end_contextCallBack); pmdaInit(dp, NULL, 0, metrictab, sizeof(metrictab)/sizeof(metrictab[0])); /* Initialize the systemd side. This is failure-tolerant. */ /* XXX: SD_JOURNAL_{LOCAL|RUNTIME|SYSTEM}_ONLY */ sts = sd_journal_open(& journald_context, 0); if (sts < 0) { __pmNotifyErr(LOG_ERR, "sd_journal_open failure: %s", strerror(-sts)); dp->status = sts; return; } sts = sd_journal_open(& journald_context_seeky, 0); if (sts < 0) { __pmNotifyErr(LOG_ERR, "sd_journal_open #2 failure: %s", strerror(-sts)); dp->status = sts; return; } sts = sd_journal_seek_tail(journald_context); if (sts < 0) { __pmNotifyErr(LOG_ERR, "sd_journal_seek_tail failure: %s", strerror(-sts)); } /* Work around RHBZ979487. */ sts = sd_journal_previous_skip(journald_context, 1); if (sts < 0) { __pmNotifyErr(LOG_ERR, "sd_journal_previous_skip failure: %s", strerror(-sts)); } /* Arrange to wake up for journal events. */ journal_fd = sd_journal_get_fd(journald_context); if (journal_fd < 0) { __pmNotifyErr(LOG_ERR, "sd_journal_get_fd failure: %s", strerror(-journal_fd)); /* NB: not a fatal error; the select() loop will still time out and periodically poll. This makes it ok for sd_journal_reliable_fd() to be 0. */ } else { FD_SET(journal_fd, &fds); if (journal_fd > maxfd) maxfd = journal_fd; } /* NB: One queue is used for both .records and .records_raw; they just use different decoder callbacks. */ queue_entries = pmdaEventNewQueue("systemd", maxmem); if (queue_entries < 0) __pmNotifyErr(LOG_ERR, "pmdaEventNewQueue failure: %s", pmErrStr(queue_entries)); }
/* * 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(); }