RollingFileSystemSink implements MetricsSink, Closeable { @VisibleForTesting protected long getRollInterval() { String rollInterval = properties.getString(ROLL_INTERVAL_KEY, DEFAULT_ROLL_INTERVAL); Pattern pattern = Pattern.compile("^\\s*(\\d+)\\s*([A-Za-z]*)\\s*$"); Matcher match = pattern.matcher(rollInterval); long millis; if (match.matches()) { String flushUnit = match.group(2); int rollIntervalInt; try { rollIntervalInt = Integer.parseInt(match.group(1)); } catch (NumberFormatException ex) { throw new MetricsException("Unrecognized flush interval: " + rollInterval + ". Must be a number followed by an optional " + "unit. The unit must be one of: minute, hour, day", ex); } if ("".equals(flushUnit)) { millis = TimeUnit.HOURS.toMillis(rollIntervalInt); } else { switch (flushUnit.toLowerCase()) { case "m": case "min": case "minute": case "minutes": millis = TimeUnit.MINUTES.toMillis(rollIntervalInt); break; case "h": case "hr": case "hour": case "hours": millis = TimeUnit.HOURS.toMillis(rollIntervalInt); break; case "d": case "day": case "days": millis = TimeUnit.DAYS.toMillis(rollIntervalInt); break; default: throw new MetricsException("Unrecognized unit for flush interval: " + flushUnit + ". Must be one of: minute, hour, day"); } } } else { throw new MetricsException("Unrecognized flush interval: " + rollInterval + ". Must be a number followed by an optional unit." + " The unit must be one of: minute, hour, day"); } if (millis < 60000) { throw new MetricsException("The flush interval property must be " + "at least 1 minute. Value was " + rollInterval); } return millis; } RollingFileSystemSink(); @VisibleForTesting protected  RollingFileSystemSink(long flushIntervalMillis,
      long flushOffsetIntervalMillis); @Override void init(SubsetConfiguration metrics2Properties); @Override void putMetrics(MetricsRecord record); @Override void flush(); @Override void close();  }
@Test public void testGetRollInterval() { doTestGetRollInterval(1, new String[] {"m", "min", "minute", "minutes"}, 60 * 1000L); doTestGetRollInterval(1, new String[] {"h", "hr", "hour", "hours"}, 60 * 60 * 1000L); doTestGetRollInterval(1, new String[] {"d", "day", "days"}, 24 * 60 * 60 * 1000L); ConfigBuilder builder = new ConfigBuilder(); SubsetConfiguration conf = builder.add("sink.roll-interval", "1").subset("sink"); RollingFileSystemSink sink = new RollingFileSystemSink(); sink.init(conf); assertEquals(3600000L, sink.getRollInterval()); for (char c : "abcefgijklnopqrtuvwxyz".toCharArray()) { builder = new ConfigBuilder(); conf = builder.add("sink.roll-interval", "90 " + c).subset("sink"); try { sink.init(conf); sink.getRollInterval(); fail("Allowed flush interval with bad units: " + c); } catch (MetricsException ex) { } } }