public void assertStructureIsValid(Time at) { assertGranularitiesAreNested(); assertLayerTimeEncapsulatesChild(at); assertNoCellHasPartialChildren(at); }
/** * @param layersList A list of layers, with granularities in increasing order. Each layer's * granularity must be a multiple of the previous layer. */ public RollUpStructure(List<GranularityLayer> layersList) { layers = unmodifiableList(layersList); layerMap = new HashMap<Granularity, GranularityLayer>(); for (GranularityLayer layer : layersList) { layerMap.put(layer.getGranularity(), layer); } Time fakeNow = Time.inDays(1000); assertStructureIsValid(fakeNow); }
/** * Returns a {@link FrozenRollUpStructure}, frozen at now. */ public FrozenRollUpStructure getStructure() { return struct.freeze(timeSvc.nowNanoTime()); }
public void logStructure(RollUpStructure struct) { if (!logging) { return; } long totCells = 0; log.info("Metric rollup structure constructed:"); for (GranularityLayer layer : struct.getLayers()) { long cells = layer.getNumCells(); totCells += cells; log.info(String.format("Granularity=%-20s %d cells", layer.getGranularity(), Long.valueOf(cells))); } log.info("Total cells used: " + totCells); }
public RollUpStructure build() { if (specs.size() < 1) { throw new IllegalStateException("Attempted to build a structure with < 1 layer"); } if (specs.size() == 1) { return new RollUpStructure(Arrays.asList(makeSingleLayerFromSpec(specs.get(0)))); } sort(specs); massageFinestSpecToAlignOnParentGranularity(); massageSpecsWithAutoEndTimes(); massageSpecsToAlignOnParentGranularities(); massageLargestSpecToContainChildGranularity(); List<GranularityLayer> layers = new ArrayList<GranularityLayer>(); for (int i=0; i<specs.size(); i++) { GranularitySpec spec = specs.get(i); Granularity gran = spec.gran; Granularity parentGran = spec.gran; if (i != specs.size() - 1) { parentGran = specs.get(i+1).gran; } layers.add(new GranularityLayer(gran, parentGran, spec.includeStart.divideBy(gran), spec.excludeStart.divideBy(gran))); } return new RollUpStructure(layers); }
private static GranularityList makeGranularityListFromStruct(RollUpStructure struct) { List<Granularity> grans = new ArrayList<Granularity>(); for (GranularityLayer layer : struct.getLayers()) { grans.add(layer.getGranularity()); } return new GranularityList(grans); }
GranularityTimes getOldestAllowedTimesOrEndTime(Time endTime) { GranularityTimes oldestAllowedTimes = getOldestAllowedTimeForGranularity(); for (GranularityLayer g : struct.getLayers()) { if (endTime.isAfter(oldestAllowedTimes.get(g.getGranularity()))) { oldestAllowedTimes.put(g.getGranularity(), endTime); } } return oldestAllowedTimes; }
/** * Returns a map from granularity to the oldest datapoint which should * exist for it. */ GranularityTimes getOldestAllowedTimeForGranularity() { Time now = timeSvc.nowNanoTime(); FrozenRollUpStructure frozenStruct = this.struct.freeze(now); GranularityTimes res = new GranularityTimes(); for (FrozenGranularityLayer layer : frozenStruct.getFrozenLayers()) { res.put(layer.getGranularity(), layer.getTotalRange().getStartTime()); } return res; }
private void assertStructureValid() { for (GranularityLayer layer : struct.getLayers()) { PageDefinition def = pageDefs.getDefinition(layer.getGranularity()); Granularity width = def.getPageWidth(); if (layer.getTotalTime().isSmallerThan(width.times(numPagesPerLayer)) == false) { throw new IllegalStateException(width + " times " + numPagesPerLayer + " not bigger than layer " + layer.getGranularity() + " width of " + layer.getTotalTime()); } long entriesPerPage = def.getEntriesPerPage(); if (entriesPerPage < 3) { throw new IllegalStateException("Layer " + layer.getGranularity() + " does not have >= 3 entries per page"); } if (entriesPerPage >= 30) { throw new IllegalStateException("Layer " + layer.getGranularity() + " has " + entriesPerPage + "entries per page. We want < 30"); } if (!width.isEvenMultipleOf(layer.getGranularity())) { throw new IllegalStateException("Width of page " + width + " for gran=" + layer.getGranularity() + " is not an even multiple of " + layer.getGranularity()); } } }
public static StorageConfig getDefaultConfig(Granularity maxStoredGran) { RollUpStructureBuilder builder = new RollUpStructureBuilder(); builder.add(MetricConstants.getCollectionGranularity(), Time.inMinutes(-30), Time.inMinutes(10)); // last 15 min builder.discardGranularitiesGreaterThan(maxStoredGran); builder.add(Granularity.inSeconds(30), Time.inMinutes(-60)); // last 30 min builder.add(Granularity.inMinutes(1), Time.inHours(-2)); // last hour builder.add(Granularity.inMinutes(4), Time.inHours(-8)); // last 4 hours builder.add(Granularity.inMinutes(8), Time.inHours(-20)); // last 8 hours builder.add(Granularity.inMinutes(16), Time.inHours(-40)); // 12 hour builder.add(Granularity.inMinutes(32), Time.inDays(-2)); // last day builder.add(Granularity.inMinutes(64), Time.inDays(-6)); // last 3 days builder.add(Granularity.inMinutes(128), Time.inDays(-8)); // last 7 days builder.add(Granularity.inMinutes(256), Time.inDays(-8)); builder.add(Granularity.inMinutes(512), Time.inDays(-8)); builder.add(Granularity.inMinutes(1024), Time.inDays(-16)); // Extend out so we have sufficient entries per page builder.add(Granularity.inMinutes(2048), Time.inDays(-30)); // Extend out so we have sufficient entries per page RollUpStructure struct = builder.build(); int numPagesPerLayer = PAGES_PER_LAYER; PageDefinitions pageDefs = new PageDefinitions(); for (GranularityLayer layer : struct.getLayers()) { pageDefs.addDefinition(makeDefinitionForLayer(layer, numPagesPerLayer)); } return new StorageConfig(struct, pageDefs, numPagesPerLayer); }