From 5a5714b9f614f50de44738fc4ef69a96545c5301 Mon Sep 17 00:00:00 2001 From: kaushal Date: Tue, 28 Dec 2021 21:11:54 +0530 Subject: [PATCH] BAEL-5212 Guide to Netflix Spectator (#11618) * BAEL-4905: Send large messages with Kafka * Bael-5212 Guide to Spectator * Bael-5212 Guide to Spectator * pom rollback * UnitTest Class name update * Pom update --- metrics/pom.xml | 4 +- .../spectator/SpectatorMetersUnitTest.java | 221 ++++++++++++++++++ 2 files changed, 223 insertions(+), 2 deletions(-) create mode 100644 metrics/src/test/java/com/baeldung/metrics/spectator/SpectatorMetersUnitTest.java diff --git a/metrics/pom.xml b/metrics/pom.xml index 6ac1761ca0..abdfb14dc6 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -78,7 +78,7 @@ com.netflix.spectator spectator-api - 0.132.0 + 1.0.11 @@ -92,4 +92,4 @@ 1.1.0 - \ No newline at end of file + diff --git a/metrics/src/test/java/com/baeldung/metrics/spectator/SpectatorMetersUnitTest.java b/metrics/src/test/java/com/baeldung/metrics/spectator/SpectatorMetersUnitTest.java new file mode 100644 index 0000000000..d27ffec6af --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/spectator/SpectatorMetersUnitTest.java @@ -0,0 +1,221 @@ +package com.baeldung.metrics.spectator; + +import com.netflix.spectator.api.*; +import com.netflix.spectator.api.patterns.LongTaskTimer; +import com.netflix.spectator.api.patterns.PolledMeter; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SpectatorMetersUnitTest { + @Test + public void spectatorCounterTest(){ + + class MyListProcessor { + private final Counter insertCounter; + private final Counter removeCounter; + List requestList = new ArrayList(); + + private MyListProcessor(Registry registry){ + insertCounter = registry.counter("list.insert.count"); + removeCounter = registry.counter("list.remove.count"); + } + + private void addToList(String element){ + requestList.add(element); + insertCounter.increment(); + } + + private void removeFromList(){ + requestList.remove(0); + removeCounter.increment(); + } + } + + MyListProcessor myListProcessor = new MyListProcessor(new DefaultRegistry()); + myListProcessor.addToList("element1"); + myListProcessor.addToList("element2"); + myListProcessor.addToList("element3"); + myListProcessor.removeFromList(); + + assertEquals(3, myListProcessor.insertCounter.count()); + assertEquals(1, myListProcessor.removeCounter.count()); + + } + + @Test + public void spectatorTimerTest() throws Exception { + + class MyRequestProcessor { + private final Timer requestLatency; + + private MyRequestProcessor(Registry registry) { + requestLatency = registry.timer("app.request.latency"); + } + + private String processRequest(int input) throws Exception { + return requestLatency.record(() -> handleRequest(input)); + + } + + private String handleRequest(int input) throws InterruptedException { + try { + Thread.sleep(input); + return "Done"; + } catch (InterruptedException e) { + e.printStackTrace(); + throw e; + } + } + } + + MyRequestProcessor myRequestProcessor = new MyRequestProcessor(new DefaultRegistry()); + myRequestProcessor.processRequest(3000); + assertEquals(1, myRequestProcessor.requestLatency.count()); + assertThat(myRequestProcessor.requestLatency.totalTime()).isBetween(3000000000L, 4000000000L); + } + + @Test + public void spectatorLongTaskTimerTest() throws Exception { + + class MyRequestProcessor { + private final LongTaskTimer refreshDuration; + private long duration; + + private MyRequestProcessor(Registry registry) { + refreshDuration = LongTaskTimer.get(registry, registry.createId("metadata.refreshDuration")); + } + + private String processRequest(int input) throws Exception { + final long taskId = refreshDuration.start(); + try { + Thread.sleep(input); + return "Done"; + + } catch (InterruptedException e) { + e.printStackTrace(); + throw e; + } finally { + refreshDuration.stop(taskId); + } + + } + } + + MyRequestProcessor myRequestProcessor = new MyRequestProcessor(new DefaultRegistry()); + myRequestProcessor.processRequest(3000); + System.out.println(myRequestProcessor.refreshDuration.measure()); + System.out.println(myRequestProcessor.duration); + System.out.println(myRequestProcessor.refreshDuration.duration()); + } + + @Test + public void spectatorGauges_polledMeter_Test(){ + class MyList { + + private List list = new ArrayList();; + private AtomicInteger listSize = new AtomicInteger(0); + + private MyList(Registry registry) { + PolledMeter.using(registry) + .withName("list.size") + .monitorValue(listSize); + } + + private void addToList(String element){ + list.add(element); + listSize.incrementAndGet(); + } + private void removeFromList(){ + list.remove(0); + listSize.decrementAndGet(); + } + private int size(){ + return list.size(); + } + } + + MyList myList = new MyList(new DefaultRegistry()); + myList.addToList("element1"); + myList.addToList("element2"); + myList.addToList("element3"); + myList.addToList("element4"); + myList.removeFromList(); + assertEquals(myList.size(), myList.listSize.get()); + } + + @Test + public void spectatorGauges_ActiveGauges_Test(){ + class MyList { + + private List list = new ArrayList();; + private AtomicInteger listSize = new AtomicInteger(0); + private Gauge gauge; + + private MyList(Registry registry) { + gauge = registry.gauge("list.size"); + } + + private void addToList(String element){ + list.add(element); + listSize.incrementAndGet(); + gauge.set(listSize.get()); + } + private void removeFromList(){ + list.remove(0); + listSize.decrementAndGet(); + gauge.set(listSize.get()); + } + private int size(){ + return list.size(); + } + } + + MyList myList = new MyList(new DefaultRegistry()); + myList.addToList("element1"); + myList.addToList("element2"); + myList.addToList("element3"); + myList.addToList("element4"); + myList.removeFromList(); + assertEquals(3.0, myList.gauge.value()); + } + + @Test + public void spectatorDistributionSummaryTest() throws Exception { + + class MyRequestProcessor { + private final DistributionSummary distributionSummary; + + private MyRequestProcessor(Registry registry) { + distributionSummary = registry.distributionSummary("app.request.size"); + } + + private void processRequest(String input) throws Exception { + distributionSummary.record((long) input.length()); + handleRequest(); + } + + private void handleRequest() throws InterruptedException { + try { + Thread.sleep(3000); + return; + } catch (InterruptedException e) { + e.printStackTrace(); + throw e; + } + } + } + + MyRequestProcessor myRequestProcessor = new MyRequestProcessor(new DefaultRegistry()); + myRequestProcessor.processRequest("This is my sample input."); + assertEquals(1, myRequestProcessor.distributionSummary.count()); + assertEquals("This is my sample input.".length(), (int) myRequestProcessor.distributionSummary.totalAmount()); + } + +} +