Aggregation(Resource resource, Timestamp start, Timestamp end, ResultDescriptor resultDescriptor, Duration resolution, Iterator<Row<Measurement>> input) { m_resultDescriptor = checkNotNull(resultDescriptor, "result descriptor argument"); m_resource = checkNotNull(resource, "resource argument"); checkNotNull(start, "start argument"); checkNotNull(end, "end argument"); m_resolution = checkNotNull(resolution, "resolution argument"); m_input = checkNotNull(input, "input argument"); Duration interval = resultDescriptor.getInterval(); checkArgument(resolution.isMultiple(interval), "resolution must be a multiple of interval"); m_timestamps = new IntervalGenerator(start.stepFloor(m_resolution), end.stepCeiling(m_resolution), m_resolution); m_intervalsPer = (double) resolution.divideBy(interval); m_working = m_input.hasNext() ? m_input.next() : null; m_nextOut = m_timestamps.hasNext() ? new Row<Measurement>(m_timestamps.next(), m_resource) : null; // If the input stream contains any Samples earlier than what's relevant, iterate past them. if (m_nextOut != null) { while (m_working != null && m_working.getTimestamp().lte(m_nextOut.getTimestamp().minus(m_resolution))) { m_working = nextWorking(); } } }
/** * Construct a new {@link DriverAdapter}. * * @param input * cassandra driver {@link ResultSet} * @param metrics * the set of result metrics to include; an empty set indicates that all metrics * should be included */ DriverAdapter(Iterator<com.datastax.driver.core.Row> input, Set<String> metrics) { m_results = checkNotNull(input, "input argument"); m_metrics = checkNotNull(metrics, "metrics argument"); if (m_results.hasNext()) { Sample m = getNextSample(); m_next = new Results.Row<>(m.getTimestamp(), m.getResource()); addSample(m_next, m); } }
@Override public Row<Measurement> next() { if (!hasNext()) throw new NoSuchElementException(); Row<Measurement> result = new Row<>(m_current.getTimestamp(), m_current.getResource()); for (String export : m_exports) { result.addElement(getMeasurement(export)); } try { return result; } finally { m_current = m_input.hasNext() ? m_input.next() : null; } }
Row<Measurement> output = new Row<>(intervalCeiling, m_resource);
m_nextOut = m_timestamps.hasNext() ? new Row<Measurement>(m_timestamps.next(), m_resource) : null;
@Override public Results.Row<Sample> next() { if (!hasNext()) throw new NoSuchElementException(); Results.Row<Sample> nextNext = null; while (m_results.hasNext()) { Sample m = getNextSample(); if (m.getTimestamp().gt(m_next.getTimestamp())) { nextNext = new Results.Row<>(m.getTimestamp(), m.getResource()); addSample(nextNext, m); break; } addSample(m_next, m); } try { return m_next; } finally { m_next = nextNext; } }
@Override public Row<Sample> next() { if (!hasNext()) throw new NoSuchElementException(); Row<Sample> working = m_input.next(); Row<Sample> result = new Row<>(working.getTimestamp(), working.getResource()); for (String metricName : m_metrics) { Sample sample = working.getElement(metricName); if (sample == null) { continue; } // Use rate as result if one of counter types, else pass through as-is. result.addElement(COUNTERS.contains(sample.getType()) ? getRate(sample) : sample); m_prevSamples.put(sample.getName(), sample); } return result; }
public void addElement(T sample) { Row<T> row = m_rows.get(sample.getTimestamp()); if (row == null) { row = new Row<>(sample.getTimestamp(), sample.getResource()); addRow(row); } row.addElement(sample); }