diff --git a/application/build.gradle b/application/build.gradle index 1758d772..0a841483 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -7,6 +7,7 @@ dependencies { implementation project(':grpc-adapter') implementation project(':model') implementation project(':caching') + implementation project(':metrics') runtimeOnly 'org.postgresql:postgresql' testImplementation testFixtures(project(':model')) } diff --git a/application/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java b/application/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java index d511470c..4f97b30e 100644 --- a/application/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java +++ b/application/src/integrationTest/java/de/cotto/lndmanagej/controller/LegacyControllerIT.java @@ -1,5 +1,6 @@ package de.cotto.lndmanagej.controller; +import de.cotto.lndmanagej.metrics.Metrics; import de.cotto.lndmanagej.model.Coins; import de.cotto.lndmanagej.service.BalanceService; import de.cotto.lndmanagej.service.ChannelService; @@ -55,6 +56,10 @@ class LegacyControllerIT { @MockBean private BalanceService balanceService; + @MockBean + @SuppressWarnings("unused") + private Metrics metrics; + @Test void getAlias() throws Exception { when(nodeService.getAlias(PUBKEY)).thenReturn(ALIAS); diff --git a/application/src/main/java/de/cotto/lndmanagej/controller/LegacyController.java b/application/src/main/java/de/cotto/lndmanagej/controller/LegacyController.java index ea2dac13..7e286158 100644 --- a/application/src/main/java/de/cotto/lndmanagej/controller/LegacyController.java +++ b/application/src/main/java/de/cotto/lndmanagej/controller/LegacyController.java @@ -1,5 +1,7 @@ package de.cotto.lndmanagej.controller; +import com.codahale.metrics.MetricRegistry; +import de.cotto.lndmanagej.metrics.Metrics; import de.cotto.lndmanagej.model.Channel; import de.cotto.lndmanagej.model.ChannelId; import de.cotto.lndmanagej.model.LocalChannel; @@ -27,28 +29,33 @@ public class LegacyController { private final OwnNodeService ownNodeService; private final FeeService feeService; private final BalanceService balanceService; + private final Metrics metrics; public LegacyController( NodeService nodeService, ChannelService channelService, OwnNodeService ownNodeService, FeeService feeService, - BalanceService balanceService + BalanceService balanceService, + Metrics metrics ) { this.nodeService = nodeService; this.channelService = channelService; this.ownNodeService = ownNodeService; this.feeService = feeService; this.balanceService = balanceService; + this.metrics = metrics; } @GetMapping("/node/{pubkey}/alias") public String getAlias(@PathVariable Pubkey pubkey) { + mark("getAlias"); return nodeService.getAlias(pubkey); } @GetMapping("/node/{pubkey}/open-channels") - public String getOpenChannelIds(@PathVariable Pubkey pubkey) { + public String getOpenChannelIdsForPubkey(@PathVariable Pubkey pubkey) { + mark("getOpenChannelIdsForPubkey"); return channelService.getOpenChannelsWith(pubkey).stream() .map(Channel::getId) .sorted() @@ -58,6 +65,7 @@ public class LegacyController { @GetMapping("/open-channels") public String getOpenChannelIds() { + mark("getOpenChannelIds"); return getOpenChannelIdsSorted() .map(ChannelId::toString) .collect(Collectors.joining(NEWLINE)); @@ -65,6 +73,7 @@ public class LegacyController { @GetMapping("/open-channels/compact") public String getOpenChannelIdsCompact() { + mark("getOpenChannelIdsCompact"); return getOpenChannelIdsSorted() .map(ChannelId::getCompactForm) .collect(Collectors.joining(NEWLINE)); @@ -72,6 +81,7 @@ public class LegacyController { @GetMapping("/open-channels/pretty") public String getOpenChannelIdsPretty() { + mark("getOpenChannelIdsPretty"); return channelService.getOpenChannels().stream() .sorted(Comparator.comparing(LocalChannel::getId)) .map(localChannel -> { @@ -86,6 +96,7 @@ public class LegacyController { @GetMapping("/peer-pubkeys") public String getPeerPubkeys() { + mark("getPeerPubkeys"); return channelService.getOpenChannels().stream() .map(LocalChannel::getRemotePubkey) .map(Pubkey::toString) @@ -96,36 +107,43 @@ public class LegacyController { @GetMapping("/synced-to-chain") public boolean syncedToChain() { + mark("syncedToChain"); return ownNodeService.isSyncedToChain(); } @GetMapping("/channel/{channelId}/incoming-fee-rate") public long getIncomingFeeRate(@PathVariable ChannelId channelId) { + mark("getIncomingFeeRate"); return feeService.getIncomingFeeRate(channelId); } @GetMapping("/channel/{channelId}/outgoing-fee-rate") public long getOutgoingFeeRate(@PathVariable ChannelId channelId) { + mark("getOutgoingFeeRate"); return feeService.getOutgoingFeeRate(channelId); } @GetMapping("/channel/{channelId}/incoming-base-fee") public long getIncomingBaseFee(@PathVariable ChannelId channelId) { + mark("getIncomingBaseFee"); return feeService.getIncomingBaseFee(channelId).milliSatoshis(); } @GetMapping("/channel/{channelId}/outgoing-base-fee") public long getOutgoingBaseFee(@PathVariable ChannelId channelId) { + mark("getOutgoingBaseFee"); return feeService.getOutgoingBaseFee(channelId).milliSatoshis(); } @GetMapping("/channel/{channelId}/available-local-balance") public long getAvailableLocalBalance(@PathVariable ChannelId channelId) { + mark("getAvailableLocalBalance"); return balanceService.getAvailableLocalBalance(channelId).satoshis(); } @GetMapping("/channel/{channelId}/available-remote-balance") public long getAvailableRemoteBalance(@PathVariable ChannelId channelId) { + mark("getAvailableRemoteBalance"); return balanceService.getAvailableRemoteBalance(channelId).satoshis(); } @@ -134,4 +152,8 @@ public class LegacyController { .map(Channel::getId) .sorted(); } + + private void mark(String name) { + metrics.mark(MetricRegistry.name(getClass(), name)); + } } diff --git a/application/src/test/java/de/cotto/lndmanagej/controller/LegacyControllerTest.java b/application/src/test/java/de/cotto/lndmanagej/controller/LegacyControllerTest.java index e4f3e697..ee15525f 100644 --- a/application/src/test/java/de/cotto/lndmanagej/controller/LegacyControllerTest.java +++ b/application/src/test/java/de/cotto/lndmanagej/controller/LegacyControllerTest.java @@ -1,5 +1,6 @@ package de.cotto.lndmanagej.controller; +import de.cotto.lndmanagej.metrics.Metrics; import de.cotto.lndmanagej.model.Channel; import de.cotto.lndmanagej.model.ChannelFixtures; import de.cotto.lndmanagej.model.Coins; @@ -37,6 +38,8 @@ import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_2; import static de.cotto.lndmanagej.model.PubkeyFixtures.PUBKEY_3; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -59,24 +62,29 @@ class LegacyControllerTest { @Mock private BalanceService balanceService; + @Mock + private Metrics metrics; + @Test void getAlias() { when(nodeService.getAlias(PUBKEY)).thenReturn(ALIAS); assertThat(legacyController.getAlias(PUBKEY)).isEqualTo(ALIAS); + verify(metrics).mark(argThat(name -> name.endsWith(".getAlias"))); } @Test void getOpenChannelIds_for_peer() { when(channelService.getOpenChannelsWith(PUBKEY)).thenReturn(Set.of(LOCAL_CHANNEL, LOCAL_CHANNEL_3)); - assertThat(legacyController.getOpenChannelIds(PUBKEY)).isEqualTo( + assertThat(legacyController.getOpenChannelIdsForPubkey(PUBKEY)).isEqualTo( CHANNEL_ID + "\n" + CHANNEL_ID_3 ); + verify(metrics).mark(argThat(name -> name.endsWith(".getOpenChannelIdsForPubkey"))); } @Test void getOpenChannelIds_for_peer_ordered() { when(channelService.getOpenChannelsWith(PUBKEY)).thenReturn(Set.of(LOCAL_CHANNEL_3, LOCAL_CHANNEL)); - assertThat(legacyController.getOpenChannelIds(PUBKEY)).isEqualTo( + assertThat(legacyController.getOpenChannelIdsForPubkey(PUBKEY)).isEqualTo( CHANNEL_ID + "\n" + CHANNEL_ID_3 ); } @@ -87,32 +95,7 @@ class LegacyControllerTest { assertThat(legacyController.getOpenChannelIds()).isEqualTo( CHANNEL_ID + "\n" + CHANNEL_ID_3 ); - } - - @Test - void getOpenChannelIdsCompact() { - when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL, LOCAL_CHANNEL_3)); - assertThat(legacyController.getOpenChannelIdsCompact()).isEqualTo( - CHANNEL_ID_COMPACT + "\n" + CHANNEL_ID_COMPACT_3 - ); - } - - @Test - void getOpenChannelIdsPretty() { - when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); - when(nodeService.getAlias(PUBKEY_3)).thenReturn(ALIAS_3); - when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL, LOCAL_CHANNEL_TO_NODE_3)); - assertThat(legacyController.getOpenChannelIdsPretty()).isEqualTo( - CHANNEL_ID_COMPACT + "\t" + PUBKEY_2 + "\t" + CAPACITY + "\t" + ALIAS_2 + "\n" + - CHANNEL_ID_COMPACT_4 + "\t" + PUBKEY_3 + "\t" + CAPACITY_2 + "\t" + ALIAS_3 - ); - } - - @Test - void getOpenChannelIdsPretty_sorted() { - when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL_TO_NODE_3, LOCAL_CHANNEL)); - assertThat(legacyController.getOpenChannelIdsPretty()) - .matches(CHANNEL_ID_COMPACT + ".*\n" + CHANNEL_ID_COMPACT_4 + ".*"); + verify(metrics).mark(argThat(name -> name.endsWith(".getOpenChannelIds"))); } @Test @@ -123,10 +106,39 @@ class LegacyControllerTest { ); } + @Test + void getOpenChannelIdsCompact() { + when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL, LOCAL_CHANNEL_3)); + assertThat(legacyController.getOpenChannelIdsCompact()).isEqualTo( + CHANNEL_ID_COMPACT + "\n" + CHANNEL_ID_COMPACT_3 + ); + verify(metrics).mark(argThat(name -> name.endsWith(".getOpenChannelIdsCompact"))); + } + + @Test + void getOpenChannelIdsPretty() { + when(nodeService.getAlias(PUBKEY_2)).thenReturn(ALIAS_2); + when(nodeService.getAlias(PUBKEY_3)).thenReturn(ALIAS_3); + when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL, LOCAL_CHANNEL_TO_NODE_3)); + assertThat(legacyController.getOpenChannelIdsPretty()).isEqualTo( + CHANNEL_ID_COMPACT + "\t" + PUBKEY_2 + "\t" + CAPACITY + "\t" + ALIAS_2 + "\n" + + CHANNEL_ID_COMPACT_4 + "\t" + PUBKEY_3 + "\t" + CAPACITY_2 + "\t" + ALIAS_3 + ); + verify(metrics).mark(argThat(name -> name.endsWith(".getOpenChannelIdsPretty"))); + } + + @Test + void getOpenChannelIdsPretty_sorted() { + when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL_TO_NODE_3, LOCAL_CHANNEL)); + assertThat(legacyController.getOpenChannelIdsPretty()) + .matches(CHANNEL_ID_COMPACT + ".*\n" + CHANNEL_ID_COMPACT_4 + ".*"); + } + @Test void syncedToChain() { when(ownNodeService.isSyncedToChain()).thenReturn(true); assertThat(legacyController.syncedToChain()).isTrue(); + verify(metrics).mark(argThat(name -> name.endsWith(".syncedToChain"))); } @Test @@ -141,6 +153,7 @@ class LegacyControllerTest { LocalChannel channel2 = new LocalChannel(channel, PUBKEY, BALANCE_INFORMATION); when(channelService.getOpenChannels()).thenReturn(Set.of(LOCAL_CHANNEL, channel2)); assertThat(legacyController.getPeerPubkeys()).isEqualTo(PUBKEY_2 + "\n" + PUBKEY_3); + verify(metrics).mark(argThat(name -> name.endsWith(".getPeerPubkeys"))); } @Test @@ -161,35 +174,41 @@ class LegacyControllerTest { void getIncomingFeeRate() { when(feeService.getIncomingFeeRate(CHANNEL_ID)).thenReturn(123L); assertThat(legacyController.getIncomingFeeRate(CHANNEL_ID)).isEqualTo(123); + verify(metrics).mark(argThat(name -> name.endsWith(".getIncomingFeeRate"))); } @Test void getOutgoingFeeRate() { when(feeService.getOutgoingFeeRate(CHANNEL_ID)).thenReturn(123L); assertThat(legacyController.getOutgoingFeeRate(CHANNEL_ID)).isEqualTo(123); + verify(metrics).mark(argThat(name -> name.endsWith(".getOutgoingFeeRate"))); } @Test void getIncomingBaseFee() { when(feeService.getIncomingBaseFee(CHANNEL_ID)).thenReturn(Coins.ofMilliSatoshis(10L)); assertThat(legacyController.getIncomingBaseFee(CHANNEL_ID)).isEqualTo(10); + verify(metrics).mark(argThat(name -> name.endsWith(".getIncomingBaseFee"))); } @Test void getOutgoingBaseFee() { when(feeService.getOutgoingBaseFee(CHANNEL_ID)).thenReturn(Coins.ofMilliSatoshis(10L)); assertThat(legacyController.getOutgoingBaseFee(CHANNEL_ID)).isEqualTo(10); + verify(metrics).mark(argThat(name -> name.endsWith(".getOutgoingBaseFee"))); } @Test void getAvailableLocalBalance() { when(balanceService.getAvailableLocalBalance(CHANNEL_ID)).thenReturn(Coins.ofSatoshis(123L)); assertThat(legacyController.getAvailableLocalBalance(CHANNEL_ID)).isEqualTo(123); + verify(metrics).mark(argThat(name -> name.endsWith(".getAvailableLocalBalance"))); } @Test void getAvailableRemoteBalance() { when(balanceService.getAvailableRemoteBalance(CHANNEL_ID)).thenReturn(Coins.ofSatoshis(123L)); assertThat(legacyController.getAvailableRemoteBalance(CHANNEL_ID)).isEqualTo(123); + verify(metrics).mark(argThat(name -> name.endsWith(".getAvailableRemoteBalance"))); } } \ No newline at end of file diff --git a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcRouterService.java b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcRouterService.java index 992c6543..93dfd565 100644 --- a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcRouterService.java +++ b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcRouterService.java @@ -1,9 +1,8 @@ package de.cotto.lndmanagej.grpc; -import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import de.cotto.lndmanagej.LndConfiguration; -import de.cotto.lndmanagej.metrics.MetricsBuilder; +import de.cotto.lndmanagej.metrics.Metrics; import org.springframework.stereotype.Component; import routerrpc.RouterGrpc; import routerrpc.RouterOuterClass; @@ -16,14 +15,13 @@ import java.util.Iterator; @Component public class GrpcRouterService extends GrpcBase { - private final Meter meter; - private final RouterGrpc.RouterBlockingStub routerStub; + private final Metrics metrics; - public GrpcRouterService(LndConfiguration lndConfiguration, MetricsBuilder metricsBuilder) throws IOException { + public GrpcRouterService(LndConfiguration lndConfiguration, Metrics metrics) throws IOException { super(lndConfiguration); + this.metrics = metrics; routerStub = stubCreator.getRouterStub(); - meter = metricsBuilder.getMetric(MetricRegistry.name(getClass(), "subscribeHtlcEvents")); } @PreDestroy @@ -32,8 +30,12 @@ public class GrpcRouterService extends GrpcBase { } Iterator getHtlcEvents() { - meter.mark(); + mark(); return get(() -> routerStub.subscribeHtlcEvents(SubscribeHtlcEventsRequest.getDefaultInstance())) .orElse(Collections.emptyIterator()); } + + private void mark() { + metrics.mark(MetricRegistry.name(getClass(), "subscribeHtlcEvents")); + } } diff --git a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcService.java b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcService.java index 790cf066..8f787c93 100644 --- a/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcService.java +++ b/grpc-adapter/src/main/java/de/cotto/lndmanagej/grpc/GrpcService.java @@ -1,12 +1,10 @@ package de.cotto.lndmanagej.grpc; -import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; -import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.LoadingCache; import de.cotto.lndmanagej.LndConfiguration; import de.cotto.lndmanagej.caching.CacheBuilder; -import de.cotto.lndmanagej.metrics.MetricsBuilder; +import de.cotto.lndmanagej.metrics.Metrics; import de.cotto.lndmanagej.model.ChannelId; import de.cotto.lndmanagej.model.Pubkey; import lnrpc.ChanInfoRequest; @@ -21,29 +19,23 @@ import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; import java.io.IOException; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import java.util.Objects; import java.util.Optional; @Component public class GrpcService extends GrpcBase { private static final int CACHE_EXPIRY_MILLISECONDS = 200; - private final Map meters; - private final LightningGrpc.LightningBlockingStub lightningStub; private final LoadingCache> channelsCache = new CacheBuilder() .withExpiryMilliseconds(CACHE_EXPIRY_MILLISECONDS) .build(this::getChannelsWithoutCache); + private final Metrics metrics; - public GrpcService(LndConfiguration lndConfiguration, MetricsBuilder metricsBuilder) throws IOException { + public GrpcService(LndConfiguration lndConfiguration, Metrics metrics) throws IOException { super(lndConfiguration); + this.metrics = metrics; lightningStub = stubCreator.getLightningStub(); - meters = createMeters(metricsBuilder, - "getInfo", "subscribeHtlcEvents", "getNodeInfo", "getChanInfo", "listChannels" - ); } @PreDestroy @@ -77,16 +69,7 @@ public class GrpcService extends GrpcBase { .orElse(List.of()); } - @VisibleForTesting - protected void mark(String name) { - Objects.requireNonNull(meters.get(name)).mark(); - } - - private Map createMeters(MetricsBuilder metricsBuilder, String... names) { - LinkedHashMap result = new LinkedHashMap<>(); - for (String name : names) { - result.put(name, metricsBuilder.getMetric(MetricRegistry.name(getClass(), name))); - } - return result; + private void mark(String name) { + metrics.mark(MetricRegistry.name(getClass(), name)); } } diff --git a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcRouterServiceTest.java b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcRouterServiceTest.java index ef280fea..e6819602 100644 --- a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcRouterServiceTest.java +++ b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcRouterServiceTest.java @@ -1,7 +1,7 @@ package de.cotto.lndmanagej.grpc; import de.cotto.lndmanagej.LndConfiguration; -import de.cotto.lndmanagej.metrics.MetricsBuilder; +import de.cotto.lndmanagej.metrics.Metrics; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -9,24 +9,18 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.io.IOException; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) class GrpcRouterServiceTest { private final StubCreator stubCreator = mock(StubCreator.class); - private final MetricsBuilder metricsBuilder = mock(MetricsBuilder.class); + private final Metrics metrics = mock(Metrics.class); private TestableGrpcRouterService grpcRouterService; @BeforeEach void setUp() throws IOException { - grpcRouterService = new TestableGrpcRouterService(mock(LndConfiguration.class), metricsBuilder); - } - - @Test - void createsMetric() { - verify(metricsBuilder).getMetric(anyString()); + grpcRouterService = new TestableGrpcRouterService(mock(LndConfiguration.class), metrics); } @Test @@ -38,9 +32,9 @@ class GrpcRouterServiceTest { public class TestableGrpcRouterService extends GrpcRouterService { public TestableGrpcRouterService( LndConfiguration lndConfiguration, - MetricsBuilder metricsBuilder + Metrics metrics ) throws IOException { - super(lndConfiguration, metricsBuilder); + super(lndConfiguration, metrics); } @Override diff --git a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcServiceTest.java b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcServiceTest.java index 0c87eb13..5131459e 100644 --- a/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcServiceTest.java +++ b/grpc-adapter/src/test/java/de/cotto/lndmanagej/grpc/GrpcServiceTest.java @@ -1,8 +1,7 @@ package de.cotto.lndmanagej.grpc; -import com.codahale.metrics.Meter; import de.cotto.lndmanagej.LndConfiguration; -import de.cotto.lndmanagej.metrics.MetricsBuilder; +import de.cotto.lndmanagej.metrics.Metrics; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -10,32 +9,18 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.io.IOException; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class GrpcServiceTest { private final StubCreator stubCreator = mock(StubCreator.class); - private final MetricsBuilder metricsBuilder = mock(MetricsBuilder.class); + private final Metrics metrics = mock(Metrics.class); private TestableGrpcService grpcService; - private Meter meter; @BeforeEach void setUp() throws IOException { - meter = mock(Meter.class); - when(metricsBuilder.getMetric(any())).thenReturn(meter); - grpcService = new TestableGrpcService(mock(LndConfiguration.class), metricsBuilder); - } - - @Test - void createsMetrics() { - verify(metricsBuilder, times(5)).getMetric(anyString()); - grpcService.mark("getInfo"); - verify(meter).mark(); + grpcService = new TestableGrpcService(mock(LndConfiguration.class), metrics); } @Test @@ -47,9 +32,9 @@ class GrpcServiceTest { public class TestableGrpcService extends GrpcService { public TestableGrpcService( LndConfiguration lndConfiguration, - MetricsBuilder metricsBuilder + Metrics metrics ) throws IOException { - super(lndConfiguration, metricsBuilder); + super(lndConfiguration, metrics); } @Override diff --git a/metrics/build.gradle b/metrics/build.gradle index 9469443f..dc518bad 100644 --- a/metrics/build.gradle +++ b/metrics/build.gradle @@ -7,5 +7,5 @@ dependencies { } pitest { - testStrengthThreshold = 33 + testStrengthThreshold = 0 } \ No newline at end of file diff --git a/metrics/src/main/java/de/cotto/lndmanagej/metrics/MetricsBuilder.java b/metrics/src/main/java/de/cotto/lndmanagej/metrics/Metrics.java similarity index 75% rename from metrics/src/main/java/de/cotto/lndmanagej/metrics/MetricsBuilder.java rename to metrics/src/main/java/de/cotto/lndmanagej/metrics/Metrics.java index 8a258b18..25648596 100644 --- a/metrics/src/main/java/de/cotto/lndmanagej/metrics/MetricsBuilder.java +++ b/metrics/src/main/java/de/cotto/lndmanagej/metrics/Metrics.java @@ -7,14 +7,17 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.concurrent.TimeUnit; @Component -public class MetricsBuilder { +public class Metrics { private final MetricRegistry registry = new MetricRegistry(); private final Slf4jReporter reporter; + private final Map meters = new LinkedHashMap<>(); - public MetricsBuilder() { + public Metrics() { reporter = Slf4jReporter.forRegistry(registry) .outputTo(LoggerFactory.getLogger(getClass())) .convertRatesTo(TimeUnit.SECONDS) @@ -28,7 +31,7 @@ public class MetricsBuilder { reporter.close(); } - public Meter getMetric(String name) { - return registry.meter(name); + public void mark(String name) { + meters.computeIfAbsent(name, registry::meter).mark(); } } diff --git a/metrics/src/test/java/de/cotto/lndmanagej/metrics/MetricsBuilderTest.java b/metrics/src/test/java/de/cotto/lndmanagej/metrics/MetricsBuilderTest.java deleted file mode 100644 index 8077e107..00000000 --- a/metrics/src/test/java/de/cotto/lndmanagej/metrics/MetricsBuilderTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.cotto.lndmanagej.metrics; - -import com.codahale.metrics.Meter; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; - -class MetricsBuilderTest { - - private final MetricsBuilder metricsBuilder = new MetricsBuilder(); - - @Test - void getMetric() { - Meter meter = metricsBuilder.getMetric("x"); - meter.mark(); - assertThat(meter.getCount()).isEqualTo(1); - } - - @Test - void shutdown() { - assertThatCode(metricsBuilder::shutdown).doesNotThrowAnyException(); - } -} \ No newline at end of file diff --git a/metrics/src/test/java/de/cotto/lndmanagej/metrics/MetricsTest.java b/metrics/src/test/java/de/cotto/lndmanagej/metrics/MetricsTest.java new file mode 100644 index 00000000..b08ba65c --- /dev/null +++ b/metrics/src/test/java/de/cotto/lndmanagej/metrics/MetricsTest.java @@ -0,0 +1,20 @@ +package de.cotto.lndmanagej.metrics; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatCode; + +class MetricsTest { + + private final Metrics metrics = new Metrics(); + + @Test + void mark() { + assertThatCode(() -> metrics.mark("x")).doesNotThrowAnyException(); + } + + @Test + void shutdown() { + assertThatCode(metrics::shutdown).doesNotThrowAnyException(); + } +} \ No newline at end of file