@Test default void recordMax(MeterRegistry registry) { Timer timer = registry.timer("my.timer"); timer.record(10, TimeUnit.MILLISECONDS); timer.record(1, TimeUnit.SECONDS); clock(registry).add(step()); // for Atlas, which is step rather than ring-buffer based assertThat(timer.max(TimeUnit.SECONDS)).isEqualTo(1); assertThat(timer.max(TimeUnit.MILLISECONDS)).isEqualTo(1000); //noinspection ConstantConditions clock(registry).add(Duration.ofMillis(step().toMillis() * DistributionStatisticConfig.DEFAULT.getBufferLength())); assertThat(timer.max(TimeUnit.SECONDS)).isEqualTo(0); }
@Test @DisplayName("function timers respect the base unit of an underlying registry") void functionTimerUnits(MeterRegistry registry) { Object o = new Object(); registry.more().timer("function.timer", emptyList(), o, o2 -> 1, o2 -> 1, TimeUnit.MILLISECONDS); FunctionTimer ft = registry.get("function.timer").functionTimer(); clock(registry).add(step()); assertThat(ft.measure()) .anySatisfy(ms -> { TimeUnit baseUnit = TimeUnit.valueOf(requireNonNull(ft.getId().getBaseUnit()).toUpperCase()); assertThat(ms.getStatistic()).isEqualTo(Statistic.TOTAL_TIME); assertThat(TimeUtils.convert(ms.getValue(), baseUnit, TimeUnit.MILLISECONDS)).isEqualTo(1); }); }
@Test @DisplayName("function-tracking counter increments by change in a monotonically increasing function when observed") default void functionTrackingCounter(MeterRegistry registry) { AtomicLong n = new AtomicLong(0); registry.more().counter("tracking", emptyList(), n); n.incrementAndGet(); clock(registry).add(step()); registry.forEachMeter(Meter::measure); assertThat(registry.get("tracking").functionCounter().count()).isEqualTo(1.0); } }
@DisplayName("multiple increments are maintained") @Test default void increment(MeterRegistry registry) { Counter c = registry.counter("myCounter"); c.increment(); clock(registry).add(step()); assertThat(c.count()).isEqualTo(1.0, offset(1e-12)); c.increment(); c.increment(); clock(registry).add(step()); // in the case of a step aggregating system will be 2, otherwise 3 assertThat(c.count()).isGreaterThanOrEqualTo(2.0); }
@Test @DisplayName("record a runnable task") default void recordWithRunnable(MeterRegistry registry) { Timer t = registry.timer("myTimer"); try { t.record(() -> clock(registry).add(10, TimeUnit.NANOSECONDS)); clock(registry).add(step()); } finally { assertAll(() -> assertEquals(1L, t.count()), () -> assertEquals(10, t.totalTime(TimeUnit.NANOSECONDS), 1.0e-12)); } }
@Test @DisplayName("callable task that throws exception is still recorded") default void recordCallableException(MeterRegistry registry) { Timer t = registry.timer("myTimer"); assertThrows(Exception.class, () -> { t.recordCallable(() -> { clock(registry).add(10, TimeUnit.NANOSECONDS); throw new Exception("uh oh"); }); }); clock(registry).add(step()); assertAll(() -> assertEquals(1L, t.count()), () -> assertEquals(10, t.totalTime(TimeUnit.NANOSECONDS), 1.0e-12)); }
@Test @DisplayName("record with stateful Sample instance") default void recordWithSample(MeterRegistry registry) { Timer timer = registry.timer("myTimer"); Timer.Sample sample = Timer.start(registry); clock(registry).add(10, TimeUnit.NANOSECONDS); sample.stop(timer); clock(registry).add(step()); assertAll(() -> assertEquals(1L, timer.count()), () -> assertEquals(10, timer.totalTime(TimeUnit.NANOSECONDS), 1.0e-12)); }
@Test @DisplayName("scale samples by a fixed factor") default void scale(MeterRegistry registry) { DistributionSummary ds = DistributionSummary.builder("my.summary") .scale(2.0) .register(registry); ds.record(1); clock(registry).add(step()); assertThat(ds.totalAmount()).isEqualTo(2.0); }
@Test @DisplayName("find meters by name and value") void findMetersByValue(MeterRegistry registry) { Counter c = registry.counter("counter"); c.increment(); Timer t = registry.timer("timer"); t.record(10, TimeUnit.NANOSECONDS); clock(registry).add(step()); assertThat(registry.get("counter").counter().count()).isEqualTo(1.0); assertThat(registry.get("timer").timer().count()).isEqualTo(1L); assertThat(registry.get("timer").timer().totalTime(TimeUnit.NANOSECONDS)).isEqualTo(10.0); }
@Test @DisplayName("record durations") default void recordDuration(MeterRegistry registry) { Timer t = registry.timer("myTimer"); t.record(Duration.ofMillis(42)); clock(registry).add(step()); assertAll(() -> assertEquals(1L, t.count()), () -> assertEquals(42, t.totalTime(TimeUnit.MILLISECONDS), 1.0e-12)); }
@Test @DisplayName("increment by a non-negative amount") default void incrementAmount(MeterRegistry registry) { Counter c = registry.counter("myCounter"); c.increment(2); c.increment(0); clock(registry).add(step()); assertEquals(2L, c.count()); }
@Test @DisplayName("record zero") default void recordZero(MeterRegistry registry) { DistributionSummary ds = registry.summary("my.summary"); ds.record(0); clock(registry).add(step()); assertAll(() -> assertEquals(1L, ds.count()), () -> assertEquals(0L, ds.totalAmount())); }
@Test @DisplayName("total time and count are preserved for a single timing") default void record(MeterRegistry registry) { Timer t = registry.timer("myTimer"); t.record(42, TimeUnit.MILLISECONDS); clock(registry).add(step()); assertAll(() -> assertEquals(1L, t.count()), () -> assertEquals(42, t.totalTime(TimeUnit.MILLISECONDS), 1.0e-12)); }
@Test @DisplayName("zero times contribute to the count of overall events but do not add to total time") default void recordZero(MeterRegistry registry) { Timer t = registry.timer("myTimer"); t.record(0, TimeUnit.MILLISECONDS); clock(registry).add(step()); assertAll(() -> assertEquals(1L, t.count()), () -> assertEquals(0L, t.totalTime(TimeUnit.NANOSECONDS))); }
@Test @DisplayName("multiple recordings are maintained") default void record(MeterRegistry registry) { DistributionSummary ds = registry.summary("my.summary"); ds.record(10); clock(registry).add(step()); ds.count(); assertAll(() -> assertEquals(1L, ds.count()), () -> assertEquals(10L, ds.totalAmount())); ds.record(10); ds.record(10); clock(registry).add(step()); assertAll(() -> assertTrue(ds.count() >= 2L), () -> assertTrue(ds.totalAmount() >= 20L)); }
@Test @DisplayName("total time is preserved for a single timing") default void record(MeterRegistry registry) { LongTaskTimer t = registry.more().longTaskTimer("myTimer"); LongTaskTimer.Sample sample = t.start(); clock(registry).add(10, TimeUnit.NANOSECONDS); assertAll(() -> assertEquals(10, t.duration(TimeUnit.NANOSECONDS)), () -> assertEquals(0.01, t.duration(TimeUnit.MICROSECONDS)), () -> assertEquals(10, sample.duration(TimeUnit.NANOSECONDS)), () -> assertEquals(0.01, sample.duration(TimeUnit.MICROSECONDS)), () -> assertEquals(1, t.activeTasks())); clock(registry).add(10, TimeUnit.NANOSECONDS); sample.stop(); assertAll(() -> assertEquals(0, t.duration(TimeUnit.NANOSECONDS)), () -> assertEquals(-1, sample.duration(TimeUnit.NANOSECONDS)), () -> assertEquals(0, t.activeTasks())); } }