/** Get a list of all measurements and break them into batches. */ List<List<Measurement>> getBatches() { List<List<Measurement>> batches = new ArrayList<>(); List<Measurement> ms = getMeasurements(); for (int i = 0; i < ms.size(); i += batchSize) { List<Measurement> batch = ms.subList(i, Math.min(ms.size(), i + batchSize)); batches.add(batch); } return batches; }
@Override protected Gauge newGauge(Id id) { return new StatelessGauge(id, clock(), meterTTL); }
/** * Stop the scheduler reporting data. */ public void stop() { if (scheduler != null) { scheduler.shutdown(); scheduler = null; logger.info("flushing metrics before stopping the registry"); collectData(); logger.info("stopped collecting metrics every {} reporting to {}", frequency, uri); } else { logger.warn("registry stopped, but was never started"); } }
private void collectData() { try { for (List<Measurement> batch : getBatches()) { byte[] payload = JsonUtils.encode(commonTags, batch); HttpResponse res = client.post(uri) .withConnectTimeout(connectTimeout) .withReadTimeout(readTimeout) .withContent("application/json", payload) .compress(Deflater.BEST_SPEED) .send(); if (res.status() != 200) { logger.warn("failed to send metrics, status {}: {}", res.status(), res.entityAsString()); } } removeExpiredMeters(); } catch (Exception e) { logger.warn("failed to send metrics", e); } }
@Test public void measurementsWithMaxGauge() { registry.maxGauge(registry.createId("test")).set(4.0); Assertions.assertEquals(1, registry.getMeasurements().size()); }
@Test public void batchesExact() { for (int i = 0; i < 9; ++i) { registry.counter("" + i).increment(); } Assertions.assertEquals(3, registry.getBatches().size()); for (List<Measurement> batch : registry.getBatches()) { Assertions.assertEquals(3, batch.size()); } }
@Test public void measurementsWithGauge() { registry.gauge("test").set(4.0); Assertions.assertEquals(1, registry.getMeasurements().size()); }
@Test public void measurementsWithDistributionSummary() { registry.distributionSummary("test").record(42); Assertions.assertEquals(4, registry.getMeasurements().size()); }
@Test public void measurementsWithCounter() { registry.counter("test").increment(); Assertions.assertEquals(1, registry.getMeasurements().size()); }
@Test public void measurementsWithTimer() { registry.timer("test").record(42, TimeUnit.NANOSECONDS); Assertions.assertEquals(4, registry.getMeasurements().size()); }
@Test public void batchesEmpty() { Assertions.assertEquals(0, registry.getBatches().size()); }
/** Get a list of all measurements from the registry. */ List<Measurement> getMeasurements() { return stream() .filter(m -> !m.hasExpired()) .flatMap(m -> StreamSupport.stream(m.measure().spliterator(), false)) .collect(Collectors.toList()); }
private void collectData() { try { for (List<Measurement> batch : getBatches()) { byte[] payload = JsonUtils.encode(commonTags, batch); HttpResponse res = client.post(uri) .withConnectTimeout(connectTimeout) .withReadTimeout(readTimeout) .withContent("application/json", payload) .compress(Deflater.BEST_SPEED) .send(); if (res.status() != 200) { logger.warn("failed to send metrics, status {}: {}", res.status(), res.entityAsString()); } } removeExpiredMeters(); } catch (Exception e) { logger.warn("failed to send metrics", e); } }
@Test public void batchesExpiration() { for (int i = 0; i < 9; ++i) { registry.counter("" + i).increment(); } Assertions.assertEquals(3, registry.getBatches().size()); for (List<Measurement> batch : registry.getBatches()) { Assertions.assertEquals(3, batch.size()); } clock.setWallTime(Duration.ofMinutes(15).toMillis() + 1); Assertions.assertEquals(0, registry.getBatches().size()); }
/** Get a list of all measurements from the registry. */ List<Measurement> getMeasurements() { return stream() .filter(m -> !m.hasExpired()) .flatMap(m -> StreamSupport.stream(m.measure().spliterator(), false)) .collect(Collectors.toList()); }
@Test public void batchesLastPartial() { for (int i = 0; i < 7; ++i) { registry.counter("" + i).increment(); } List<List<Measurement>> batches = registry.getBatches(); Assertions.assertEquals(3, batches.size()); for (int i = 0; i < batches.size(); ++i) { Assertions.assertEquals((i < 2) ? 3 : 1, batches.get(i).size()); } }
@Override protected Gauge newMaxGauge(Id id) { return new StatelessMaxGauge(id, clock(), meterTTL); }
/** Get a list of all measurements and break them into batches. */ List<List<Measurement>> getBatches() { List<List<Measurement>> batches = new ArrayList<>(); List<Measurement> ms = getMeasurements(); for (int i = 0; i < ms.size(); i += batchSize) { List<Measurement> batch = ms.subList(i, Math.min(ms.size(), i + batchSize)); batches.add(batch); } return batches; }
/** * Stop the scheduler reporting data. */ public void stop() { if (scheduler != null) { scheduler.shutdown(); scheduler = null; logger.info("flushing metrics before stopping the registry"); collectData(); logger.info("stopped collecting metrics every {} reporting to {}", frequency, uri); } else { logger.warn("registry stopped, but was never started"); } }
@Override protected Counter newCounter(Id id) { return new StatelessCounter(id, clock(), meterTTL); }