int NET_IF_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result) { #if defined(HAVE_LIBPERFSTAT) int rc, i, ret = SYSINFO_RET_FAIL; perfstat_id_t ps_id; perfstat_netinterface_t *ps_netif = NULL; struct zbx_json j; /* check how many perfstat_netinterface_t structures are available */ if (-1 == (rc = perfstat_netinterface(NULL, NULL, sizeof(perfstat_netinterface_t), 0))) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain system information: %s", zbx_strerror(errno))); return SYSINFO_RET_FAIL; } zbx_json_init(&j, ZBX_JSON_STAT_BUF_LEN); zbx_json_addarray(&j, ZBX_PROTO_TAG_DATA); if (0 == rc) /* no network interfaces found */ { ret = SYSINFO_RET_OK; goto end; } ps_netif = zbx_malloc(ps_netif, rc * sizeof(perfstat_netinterface_t)); /* set name to first interface */ strscpy(ps_id.name, FIRST_NETINTERFACE); /* pseudo-name for the first network interface */ /* ask to get all the structures available in one call */ /* return code is number of structures returned */ if (-1 != (rc = perfstat_netinterface(&ps_id, ps_netif, sizeof(perfstat_netinterface_t), rc))) ret = SYSINFO_RET_OK; /* collecting of the information for each of the interfaces */ for (i = 0; i < rc; i++) { zbx_json_addobject(&j, NULL); zbx_json_addstring(&j, "{#IFNAME}", ps_netif[i].name, ZBX_JSON_TYPE_STRING); zbx_json_close(&j); } zbx_free(ps_netif); end: zbx_json_close(&j); SET_STR_RESULT(result, strdup(j.buffer)); zbx_json_free(&j); return ret; #else SET_MSG_RESULT(result, zbx_strdup(NULL, "Agent was compiled without support for Perfstat API.")); return SYSINFO_RET_FAIL; #endif }
static int get_net_stat(const char *if_name, net_stat_t *ns) { #if defined(HAVE_LIBPERFSTAT) perfstat_id_t ps_id; perfstat_netinterface_t ps_netif; #endif assert(ns); #if defined(HAVE_LIBPERFSTAT) strscpy(ps_id.name, if_name); if (-1 == perfstat_netinterface(&ps_id, &ps_netif, sizeof(ps_netif), 1)) return SYSINFO_RET_FAIL; ns->ibytes = (zbx_uint64_t)ps_netif.ibytes; ns->ipackets = (zbx_uint64_t)ps_netif.ipackets; ns->ierr = (zbx_uint64_t)ps_netif.ierrors; ns->obytes = (zbx_uint64_t)ps_netif.obytes; ns->opackets = (zbx_uint64_t)ps_netif.opackets; ns->oerr = (zbx_uint64_t)ps_netif.oerrors; ns->colls = (zbx_uint64_t)ps_netif.collisions; return SYSINFO_RET_OK; #else return SYSINFO_RET_FAIL; #endif }
void net_collect(char * tags) { gettimeofday(&tv2, NULL); char data[16] = ""; perfstat_id_t name; perfstat_netinterface_t *ub; int nnetinterface, i; nnetinterface = perfstat_netinterface(NULL, NULL, sizeof(perfstat_netinterface_t), 0); ub = malloc(sizeof(perfstat_netinterface_t) * nnetinterface); strcpy(name.name, ""); if (perfstat_netinterface(&name, ub, sizeof(perfstat_netinterface_t), nnetinterface) >= 0) { for (i = 0; i < nnetinterface; i++) { /* IN */ char * tagsin = mktag(tags, sin, ub[i].name); /* bytes */ sprintf(data, "%8llu", ub[i].ibytes); sendCollectedData(tv2.tv_sec, "proc.net.bytes", data, tagsin); /* errors */ sprintf(data, "%8llu", ub[i].ierrors); sendCollectedData(tv2.tv_sec, "proc.net.errs", data, tagsin); free(tagsin); /* OUT */ char * tagsout = mktag(tags, sout, ub[i].name); /* bytes */ sprintf(data, "%8llu", ub[i].obytes); sendCollectedData(tv2.tv_sec, "proc.net.bytes", data, tagsout); /* errors */ sprintf(data, "%8llu", ub[i].oerrors); sendCollectedData(tv2.tv_sec, "proc.net.errs", data, tagsout); free(tagsout); } } free(ub); }
static int get_net_stat(const char *if_name, net_stat_t *ns, char **error) { #if defined(HAVE_LIBPERFSTAT) perfstat_id_t ps_id; perfstat_netinterface_t ps_netif; if (NULL == if_name || '\0' == *if_name) { *error = zbx_strdup(NULL, "Network interface name cannot be empty."); return SYSINFO_RET_FAIL; } strscpy(ps_id.name, if_name); if (-1 == perfstat_netinterface(&ps_id, &ps_netif, sizeof(ps_netif), 1)) { *error = zbx_dsprintf(NULL, "Cannot obtain system information: %s", zbx_strerror(errno)); return SYSINFO_RET_FAIL; } ns->ibytes = (zbx_uint64_t)ps_netif.ibytes; ns->ipackets = (zbx_uint64_t)ps_netif.ipackets; ns->ierr = (zbx_uint64_t)ps_netif.ierrors; ns->obytes = (zbx_uint64_t)ps_netif.obytes; ns->opackets = (zbx_uint64_t)ps_netif.opackets; ns->oerr = (zbx_uint64_t)ps_netif.oerrors; ns->colls = (zbx_uint64_t)ps_netif.collisions; return SYSINFO_RET_OK; #else SET_MSG_RESULT(result, zbx_strdup(NULL, "Agent was compiled without support for Perfstat API.")); return SYSINFO_RET_FAIL; #endif }
static int interface_read (void) { #if HAVE_GETIFADDRS struct ifaddrs *if_list; struct ifaddrs *if_ptr; /* Darwin/Mac OS X and possible other *BSDs */ #if HAVE_STRUCT_IF_DATA # define IFA_DATA if_data # define IFA_RX_BYTES ifi_ibytes # define IFA_TX_BYTES ifi_obytes # define IFA_RX_PACKT ifi_ipackets # define IFA_TX_PACKT ifi_opackets # define IFA_RX_ERROR ifi_ierrors # define IFA_TX_ERROR ifi_oerrors /* #endif HAVE_STRUCT_IF_DATA */ #elif HAVE_STRUCT_NET_DEVICE_STATS # define IFA_DATA net_device_stats # define IFA_RX_BYTES rx_bytes # define IFA_TX_BYTES tx_bytes # define IFA_RX_PACKT rx_packets # define IFA_TX_PACKT tx_packets # define IFA_RX_ERROR rx_errors # define IFA_TX_ERROR tx_errors #else # error "No suitable type for `struct ifaddrs->ifa_data' found." #endif struct IFA_DATA *if_data; if (getifaddrs (&if_list) != 0) return (-1); for (if_ptr = if_list; if_ptr != NULL; if_ptr = if_ptr->ifa_next) { if (if_ptr->ifa_addr != NULL && if_ptr->ifa_addr->sa_family == AF_LINK) { if_data = (struct IFA_DATA *) if_ptr->ifa_data; if_submit (if_ptr->ifa_name, "if_octets", if_data->IFA_RX_BYTES, if_data->IFA_TX_BYTES); if_submit (if_ptr->ifa_name, "if_packets", if_data->IFA_RX_PACKT, if_data->IFA_TX_PACKT); if_submit (if_ptr->ifa_name, "if_errors", if_data->IFA_RX_ERROR, if_data->IFA_TX_ERROR); } } freeifaddrs (if_list); /* #endif HAVE_GETIFADDRS */ #elif KERNEL_LINUX FILE *fh; char buffer[1024]; derive_t incoming, outgoing; char *device; char *dummy; char *fields[16]; int numfields; if ((fh = fopen ("/proc/net/dev", "r")) == NULL) { char errbuf[1024]; WARNING ("interface plugin: fopen: %s", sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } while (fgets (buffer, 1024, fh) != NULL) { if (!(dummy = strchr(buffer, ':'))) continue; dummy[0] = '\0'; dummy++; device = buffer; while (device[0] == ' ') device++; if (device[0] == '\0') continue; numfields = strsplit (dummy, fields, 16); if (numfields < 11) continue; incoming = atoll (fields[0]); outgoing = atoll (fields[8]); if_submit (device, "if_octets", incoming, outgoing); incoming = atoll (fields[1]); outgoing = atoll (fields[9]); if_submit (device, "if_packets", incoming, outgoing); incoming = atoll (fields[2]); outgoing = atoll (fields[10]); if_submit (device, "if_errors", incoming, outgoing); incoming = atoll (fields[3]); outgoing = atoll (fields[11]); if_submit (device, "if_dropped", incoming, outgoing); } fclose (fh); /* #endif KERNEL_LINUX */ #elif HAVE_LIBKSTAT int i; derive_t rx; derive_t tx; char iname[DATA_MAX_NAME_LEN]; if (kc == NULL) return (-1); for (i = 0; i < numif; i++) { if (kstat_read (kc, ksp[i], NULL) == -1) continue; if (unique_name) ssnprintf(iname, sizeof(iname), "%s_%d_%s", ksp[i]->ks_module, ksp[i]->ks_instance, ksp[i]->ks_name); else sstrncpy(iname, ksp[i]->ks_name, sizeof(iname)); /* try to get 64bit counters */ rx = get_kstat_value (ksp[i], "rbytes64"); tx = get_kstat_value (ksp[i], "obytes64"); /* or fallback to 32bit */ if (rx == -1LL) rx = get_kstat_value (ksp[i], "rbytes"); if (tx == -1LL) tx = get_kstat_value (ksp[i], "obytes"); if ((rx != -1LL) || (tx != -1LL)) if_submit (iname, "if_octets", rx, tx); /* try to get 64bit counters */ rx = get_kstat_value (ksp[i], "ipackets64"); tx = get_kstat_value (ksp[i], "opackets64"); /* or fallback to 32bit */ if (rx == -1LL) rx = get_kstat_value (ksp[i], "ipackets"); if (tx == -1LL) tx = get_kstat_value (ksp[i], "opackets"); if ((rx != -1LL) || (tx != -1LL)) if_submit (iname, "if_packets", rx, tx); /* no 64bit error counters yet */ rx = get_kstat_value (ksp[i], "ierrors"); tx = get_kstat_value (ksp[i], "oerrors"); if ((rx != -1LL) || (tx != -1LL)) if_submit (iname, "if_errors", rx, tx); } /* #endif HAVE_LIBKSTAT */ #elif defined(HAVE_LIBSTATGRAB) sg_network_io_stats *ios; int i, num; ios = sg_get_network_io_stats (&num); for (i = 0; i < num; i++) if_submit (ios[i].interface_name, "if_octets", ios[i].rx, ios[i].tx); /* #endif HAVE_LIBSTATGRAB */ #elif defined(HAVE_PERFSTAT) perfstat_id_t id; int i, ifs; if ((nif = perfstat_netinterface(NULL, NULL, sizeof(perfstat_netinterface_t), 0)) < 0) { char errbuf[1024]; WARNING ("interface plugin: perfstat_netinterface: %s", sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } if (pnif != nif || ifstat == NULL) { free(ifstat); ifstat = malloc(nif * sizeof (*ifstat)); } pnif = nif; id.name[0]='\0'; if ((ifs = perfstat_netinterface(&id, ifstat, sizeof(perfstat_netinterface_t), nif)) < 0) { char errbuf[1024]; WARNING ("interface plugin: perfstat_netinterface (interfaces=%d): %s", nif, sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } for (i = 0; i < ifs; i++) { if_submit (ifstat[i].name, "if_octets", ifstat[i].ibytes, ifstat[i].obytes); if_submit (ifstat[i].name, "if_packets", ifstat[i].ipackets ,ifstat[i].opackets); if_submit (ifstat[i].name, "if_errors", ifstat[i].ierrors, ifstat[i].oerrors ); } #endif /* HAVE_PERFSTAT */ return (0); } /* int interface_read */