private void pulseCollectStats() { statsCollector = executorService.scheduleAtFixedRate(() -> { if(!nodeStats.collect(ledger,config)) { //config changed. stats aren't collected and being reset statsCollector.cancel(false); statsCollector = null; pulseCollectStats(); } },config.getStatsIntervalSmall().getSeconds(),config.getStatsIntervalSmall().getSeconds(),TimeUnit.SECONDS); }
private void dbSanitationFinished() { sanitationFinished.fire(); nodeStats.init(ledger,config); pulseCollectStats(); }
public Binder provideStats(Integer showDays) { if(nodeStats.nodeStartTime == null) throw new IllegalStateException("node state are not initialized. wait for node initialization to finish."); Binder result = Binder.of( "uptime", Instant.now().getEpochSecond() - nodeStats.nodeStartTime.toEpochSecond(), "ledgerSize", nodeStats.ledgerSize.isEmpty() ? 0 : nodeStats.ledgerSize.values().stream().reduce((i1, i2) -> i1 + i2).get(), "smallIntervalApproved", nodeStats.smallIntervalApproved, "bigIntervalApproved", nodeStats.bigIntervalApproved, "uptimeApproved", nodeStats.uptimeApproved, "coreVersion", Core.VERSION, "nodeNumber", myInfo.getNumber() ); if(showDays != null) { result.put("payments",nodeStats.getPaymentStats(ledger,showDays)); } return result; }
@Test public void paymentSaveTest() throws Exception { try (PooledDb db = (PooledDb) ledger.getDb()) { try (PreparedStatement statement = db.statement("delete from payments_summary;") ) { statement.executeUpdate(); } } NodeStats stats = new NodeStats(); Config config = new Config(); stats.init(ledger,config); ZonedDateTime now = ZonedDateTime.now(); ZonedDateTime dateTime = now.minusDays(now.getDayOfMonth()-1).minusMonths(1); while (dateTime.isBefore(ZonedDateTime.now().plusSeconds(1))) { ledger.savePayment(100,dateTime); ledger.savePayment(100,dateTime); dateTime = dateTime.plusDays(1); } stats.collect(ledger,config); //assertEquals(stats.todayPaidAmount,200); //assertEquals(stats.yesterdayPaidAmount,200); //assertEquals(stats.thisMonthPaidAmount,200*now.getDayOfMonth()); //assertEquals(stats.lastMonthPaidAmount,200*now.minusMonths(1).getMonth().length(now.getYear() % 4 == 0)); }
public boolean collect(Ledger ledger, Config config) { if(!config.getStatsIntervalSmall().equals(smallInterval) || !config.getStatsIntervalBig().equals(bigInterval)) { //intervals changed. need to reset node init(ledger,config); return false; } ZonedDateTime now = ZonedDateTime.now(); Map<ItemState, Integer> lastIntervalStats = ledger.getLedgerSize(lastStatsBuildTime); ledgerStatsHistory.addLast(lastIntervalStats); ledgerHistoryTimestamps.addLast(lastStatsBuildTime); smallIntervalApproved = lastIntervalStats.getOrDefault(ItemState.APPROVED,0)+lastIntervalStats.getOrDefault(ItemState.REVOKED,0); bigIntervalApproved += smallIntervalApproved; uptimeApproved += smallIntervalApproved; lastIntervalStats.keySet().forEach(is -> ledgerSize.put(is, ledgerSize.getOrDefault(is,0) + lastIntervalStats.get(is))); while (ledgerHistoryTimestamps.getFirst().plus(bigInterval).isBefore(now)) { ledgerHistoryTimestamps.removeFirst(); bigIntervalApproved -= ledgerStatsHistory.removeFirst().get(ItemState.APPROVED) + lastIntervalStats.getOrDefault(ItemState.REVOKED,0); } lastStatsBuildTime = now; Map<Integer, Integer> payments = ledger.getPayments(now.truncatedTo(ChronoUnit.DAYS).minusDays(now.getDayOfMonth()-1).minusMonths(1)); payments.keySet().forEach( day -> { }); return true; }