public class NetStatReader implements MetricsReader { private static File netstat = new File("/proc/net/dev"); private static final Pattern dline = //rx //tx // device_name -bytes packets errs drops fifo frame com mult -bytes packets errs drops fifo frame com mult Pattern.compile("^ *([A-Za-z]+[0-9]*):\\D*(\\d+)\\D+(\\d+)\\D+(\\d+)\\D+(\\d+)\\D+\\d+\\D+\\d+\\D+\\d+\\D+\\d+\\D+(\\d+)\\D+(\\d+)\\D+(\\d+)\\D+(\\d+)\\D+\\d+\\D+\\d+\\D+\\d+\\D+\\d+.*"); private static final Logger LOG = Logger.getLogger(NetStatReader.class.getName()); @Inject private Configuration conf; private String device_regexp = "eth0"; /** * It creates a wrapper to obtain statistics about a network interface by * reading information from <i>/proc/net/dev</i> * * @param interfaceRegexp a string with a regexp to match with the device to * control <i>(e.g. "sd[ab]")</i> * * */ public NetStatReader(String interfaceRegexp) { LOG.log(Level.INFO, "Sampling interfaces {0}", interfaceRegexp); this.device_regexp = interfaceRegexp; checkArgument(netstat.exists(), "/proc/diskstats does not exists"); checkArgument(netstat.canRead(), "/proc/diskstats can not be read"); } /** * * * * @param interfaceRegexp * @param processPid to bind the statistics to only one process * @deprecated it seems to give the same results when looking for a process * instead of the whole system */ @Deprecated public NetStatReader(String interfaceRegexp, Integer processPid) { LOG.log(Level.INFO, "Sampling interfaces {0} for process {1}", new Object[]{interfaceRegexp, processPid}); this.device_regexp = interfaceRegexp; netstat = new File("proc/" + processPid + "/net/dev"); checkArgument(netstat.exists(), "/proc/diskstats does not exists"); checkArgument(netstat.canRead(), "/proc/diskstats can not be read"); } public NetStatReader() { // checkArgument(diskstats.exists(), "/proc/diskstats does not exists"); // checkArgument(diskstats.canRead(), "/proc/diskstats can not be read"); } @Override public List<Metric> call() throws Exception { Builder<Metric> b = ImmutableList.builder(); LineReader lr = new LineReader(new FileReader(netstat)); String l; while ((l = lr.readLine()) != null) { Matcher m = dline.matcher(l); if (!m.matches()) { continue; } String iface = m.group(1); if (iface.matches(device_regexp)) { b.addAll(Metric.Metric(iface) .addMetric("rx.bytes", Long.parseLong(m.group(2))) .addMetric("rx.packets", Long.parseLong(m.group(3))) .addMetric("rx.errs", Long.parseLong(m.group(4))) .addMetric("rx.drop", Long.parseLong(m.group(5))) .addMetric("tx.bytes", Long.parseLong(m.group(6))) .addMetric("tx.packets", Long.parseLong(m.group(7))) .addMetric("tx.errs", Long.parseLong(m.group(8))) .addMetric("tx.drop", Long.parseLong(m.group(9))).getList()); } } return b.build(); } @Override public void configure() { if (conf.containsKey("netstat-reader.interfaceregexp")) { this.device_regexp = conf.getString("netstat-reader.interfaceregexp"); checkArgument(netstat.exists(), "/proc/diskstats does not exists"); checkArgument(netstat.canRead(), "/proc/diskstats can not be read"); } } @Override public void setConf(Configuration c) { conf = c; } @Override public Configuration getConf() { return conf; } }
NetStatReaderjava